Browse Source

增加客户排名,产品型号排名, 业务员排名统计表工具

longjoedyy 1 week ago
parent
commit
062bc485cb
7 changed files with 619 additions and 5 deletions
  1. 195 2
      config/tool_config.json
  2. 4 2
      core/agent.py
  3. 8 0
      tools/base_tool.py
  4. 56 0
      tools/cust_data_tools.py
  5. 63 0
      tools/mtrl_data_tools.py
  6. 246 1
      tools/sale_tools.py
  7. 47 0
      tools/ware_tools.py

+ 195 - 2
config/tool_config.json

@@ -129,7 +129,7 @@
             "lastdate": "结束日期,格式YYYY-MM-DD 23:59:59,如果不指定,传None"
         },
         "返回值说明": {
-            "格式": "返回多行字符串,每行代表一个销售订单,字段以逗号分隔。每行包含:taskcode(销售订单号)、cusname(客户名称)、taskdate(销售订单日期)、flag_str(单据状态)、mx(JSON字符串,包含物料明细列表)",
+            "格式": "返回多行字符串,每行代表一个销售订单,字段以逗号分隔。每行包含:taskcode(销售订单号)、cusname(客户名称)、taskdate(销售订单日期)、flag_str(单据状态)、mx(JSON字符串,包含物料明细列表)、jdmx(JSON字符串,包含进度项列)",
             "mx字段结构": "mx字段是一个JSON字符串列表,每个元素包含:mtrlcode(物料代码)、mtrlname(物料名称)、mtrlmode(规格型号)、unit(单位)、saleqty(销售数量)、consignedqty(发货数量)"
         },
         "输出格式要求": [
@@ -137,11 +137,204 @@
             "2. 为每个销售订单按以下格式输出:",
             "   a) 表头信息(以文字描述输出):",
             "      销售订单:[taskcode]   |    状态:[flag_str]",
-            "      客户:[cusname]   |   下单日期:[taskdate]",
+            "      客户:[cusname]",
             "   b) 明细表格(以Markdown表格输出)",
+            "   c) 进度跟踪(以Markdown表格输出)",
+            "       列:进度项,值 , 对应输出 {lable}和 {value}",
             "3. 不同销售订单之间要有多个空行分隔",
             "4. 如果工具返回警告或错误,要直接输出错误信息,不进行格式化"
         ],
         "使用示例": "用户输入:'查询客户A的订单进度' -> (只说订单,默认是销售订单)系统调用此工具获取客户A的销售订单进度,如果没有明确日期范围,传None -> 返回结果后,按上述格式要求格式化输出"
+    },
+    "get_saleqty_max_by_cust": {
+        "基础描述": "获取指定客户销售数量最多的产品",
+        "入参说明": {
+            "backend_url": "后端API地址",
+            "token": "认证令牌",
+            "cusname": "客户名称",
+            "firstdate": "开始日期,格式YYYY-MM-DD,如果不指定,默认是过去半年前的日期",
+            "lastdate": "结束日期,格式YYYY-MM-DD 23:59:59,如果不指定,默认是当前日期的23:59:59"
+        },
+        "返回值说明": {
+            "格式": "一个包含销售数量最多的产品的字符串",
+            "字段含义": "produce_name:产品名称,saleqty:销售数量,unit:单位"
+        },
+        "输出格式要求": [
+            "必须说明数据的时间范围,如果不指定日期范围,默认过去半年",
+            "输出格式:以下是客户[cusname]在[开始日期]到[结束日期]销售数量最多的产品:",
+            "以表格输出数据内容",
+            "如果查找不到数据,输出:没有找到客户[cusname]在[开始日期]到[结束日期]的销售数据"
+        ],
+        "使用示例": "张三公司在2024年1月到12月拿得最多的是什么型号"
+    },
+    "get_mtrlware_max_by_storage": {
+        "基础描述": "获取指定仓库最多库存产品",
+        "入参说明": {
+            "backend_url": "后端API地址",
+            "token": "认证令牌",
+            "storagename": "仓库名称,支持模糊查询,如果不指定,返回所有仓库的库存"
+        },
+        "返回值说明": {
+            "格式": "一个包含最多库存产品信息的字符串",
+            "字段含义": "mtrlname:产品名称,noallocqty:销售数量,unit:单位,storagename:仓库名称, pzinfo:配置信息"
+        },
+        "输出格式要求": [
+            "以表格输出数据内容",
+            "如有错误提示,直接输出错误信息,不进行格式化",
+            "最多只能查库存数前10的产品,如果用户要求更多,提示用户使用系统的库存查询功能"
+        ],
+        "使用示例": "安吉仓库最多的库存哪个型号"
+    },
+    "get_cust_info": {
+        "基础描述": "获取指定客户的详细信息",
+        "入参说明": {
+            "backend_url": "后端API地址",
+            "token": "认证令牌",
+            "cusname": "客户名称"
+        },
+        "返回值说明": {
+            "格式": "一个包含客户信息的字符串"
+        },
+        "输出格式要求": [
+            "**客户:**{cusname}",
+            "**性质:**{state}",
+            "**地区:**{areaname}",
+            "**业务员:**{custype}",
+            "**联系人:**{rep}",
+            "**联系方式:**{contact}",
+            "**地址:**{address}",
+            "**常购型号**",
+            "| 型号 | 产品名称 |  单位  |  近6个月采购量  |  上月采购量  |",
+            "| :--- | :--- | :--- | :--- | :--- |",
+            "| mtrlcode      | mtrlname   |   unit   |   saleqty_halfyear   |  saleqty_lastmonth  |"
+        ],
+        "使用示例": "查一下客户 南华家具"
+    },
+    "get_mtrl_info": {
+        "基础描述": "获取指定产品的详细信息",
+        "入参说明": {
+            "backend_url": "后端API地址",
+            "token": "认证令牌",
+            "mtrlname": "产品名称"
+        },
+        "返回值说明": {
+            "格式": "一个包含产品信息的字符串"
+        },
+        "输出格式要求": [
+            "**产品编码:**{mtrlcode}",
+            "**产品名称:**{mtrlname}",
+            "**产品规格:**{mtrlmode}",
+            "**当前库存:**{noallocqty}{unit}",
+            "**销售分析**",
+            "销售周期:最近一年",
+            "*销售概况*",
+            "| 指标 | 数据 |  同比  |",
+            "| :--- | :--- | :--- |",
+            "| indicator | current_value   |   last_year_value  |",
+            "*客户排名*",
+            "| 排名 | 客户名称 |  销售量  |  销售额(万元)  |  占比  |",
+            "| :--- | :--- | :--- | :--- | :--- |",
+            "| rank_no | cusname | saleqty | amt | percentage |",
+            "*业务员排名*",
+            "| 排名 | 业务员 |  销售量  |  销售额(万元)  |  占比  |",
+            "| :--- | :--- | :--- | :--- | :--- |",
+            "| rank_no | saler | saleqty | amt | percentage |"
+        ],
+        "使用示例": "查产品 A388餐椅"
+    },
+    "get_saler_ranking": {
+        "基础描述": "业务员销售排行统计表",
+        "入参说明": {
+            "backend_url": "后端API地址",
+            "token": "认证令牌",
+            "beginmonth": "开始月份,格式YYYYMM",
+            "endmonth": "结束月份,格式YYYYMM"
+        },
+        "返回值说明": {
+            "格式": "一个包含业务员销售额排名的字符串"
+        },
+        "输出格式要求": [
+            "# 业务员销售排行统计表",
+            "##国内",
+            "(输出国内业务员销售额echarts饼图,如果图表功能可用)",
+            "| 业务员 | 销售额 |  占比  |",
+            "| :--- | :--- | :--- |",
+            "| inSaleRankingList.outrep | inSaleRankingList.saleamt   |   inSaleRankingList.percent  |",
+            "",
+            "##国外",
+            "(输出国外业务员销售额echarts饼图,如果图表功能可用)",
+            "| 业务员 | 销售额 |  占比  |",
+            "| :--- | :--- | :--- |",
+            "| outSaleRankingList.outrep | outSaleRankingList.saleamt   |   outSaleRankingList.percent  |"
+        ],
+        "使用示例": [
+            "2024年业务员销售排名",
+            "帮我看看2024年业务员谁卖得最好",
+            "需要2024年全年的销售数据,按业务员排名",
+            "统计2024年业务员销售业绩"
+        ]
+    },
+    "get_cust_ranking": {
+        "基础描述": "客户销售排名统计表",
+        "入参说明": {
+            "backend_url": "后端API地址",
+            "token": "认证令牌",
+            "beginmonth": "开始月份,格式YYYYMM",
+            "endmonth": "结束月份,格式YYYYMM"
+        },
+        "返回值说明": {
+            "格式": "一个包含客户销售额排名的字符串"
+        },
+        "输出格式要求": [
+            "# 客户销售排名统计表",
+            "##国内",
+            "(输出国内客户销售额echarts饼图,如果图表功能可用)",
+            "| 客户 | 销售额 |  占比  |",
+            "| :--- | :--- | :--- |",
+            "| inSaleRankingList.cusname | inSaleRankingList.saleamt   |   inSaleRankingList.percent  |",
+            "##国外",
+            "(输出国外客户销售额echarts饼图,如果图表功能可用)",
+            "| 客户 | 销售额 |  占比  |",
+            "| :--- | :--- | :--- |",
+            "| outSaleRankingList.cusname | outSaleRankingList.saleamt   |   outSaleRankingList.percent  |"
+        ],
+        "使用示例": [
+            "2024年我们的主要客户是哪些?",
+            "帮我查一下2024年哪些客户买得最多",
+            "2024客户销售业绩排名",
+            "需要2024年全年的客户销售数据"
+        ]
+    },
+    "get_mtrl_ranking": {
+        "基础描述": "产品型号销售统计表",
+        "入参说明": {
+            "backend_url": "后端API地址",
+            "token": "认证令牌",
+            "beginmonth": "开始月份,格式YYYYMM",
+            "endmonth": "结束月份,格式YYYYMM"
+        },
+        "返回值说明": {
+            "格式": "一个包含产品型号销售额排名的字符串"
+        },
+        "输出格式要求": [
+            "# 产品型号销售排名统计表",
+            "##国内",
+            "(输出国内产品型号销售额echarts饼图,如果图表功能可用)",
+            "| 产品型号 | 销量 | 销售额 |  金额占比  |",
+            "| :--- | :--- | :--- |",
+            "| inSaleRankingList.model | inSaleRankingList.saleqty | inSaleRankingList.saleamt   |   inSaleRankingList.percent  |",
+            "##国外",
+            "(输出国外产品型号销售额echarts饼图,如果图表功能可用)",
+            "| 产品型号 | 销量 | 销售额 |  金额占比  |",
+            "| :--- | :--- | :--- |",
+            "| outSaleRankingList.model | outSaleRankingList.saleqty | outSaleRankingList.saleamt   |   outSaleRankingList.percent  |"
+        ],
+        "使用示例": [
+            "查2024年产品型号销售排名",
+            "2024年第一季度哪些产品型号卖得最好?",
+            "2024年销售旺季(7-9月)产品型号排名",
+            "2024年前十大畅销产品型号排名",
+            "今年哪些产品卖得好?国内外市场分开看"
+        ]
     }
 }

+ 4 - 2
core/agent.py

@@ -33,9 +33,11 @@ def create_system_prompt(
     knowledge_status = (
         "知识库可用" if settings.KNOWLEDGE_BASE_ENABLED else "知识库已禁用"
     )
+    echart_status = "图表可用" if settings.ECHARTS_ENABLED else "图表已禁用"
+
     if settings.KNOWLEDGE_BASE_ENABLED:
         # 知识库启用时的提示词
-        system_prompt = f"""龙嘉软件助手- 用户:{username} 认证:{auth_status} 服务:{backend_available} 知识库:{knowledge_status}
+        system_prompt = f"""龙嘉软件助手- 用户:{username} 认证:{auth_status} 服务:{backend_available} 知识库:{knowledge_status} 图表:{echart_status}
     职责:ERP数据查询和问题解答,按用户语言回答。
 
     **核心安全指令 (必遵)**:
@@ -65,7 +67,7 @@ def create_system_prompt(
     """
     else:
         # 知识库禁用时的提示词 - 灵活处理工具返回结果
-        system_prompt = f"""龙嘉软件助手- 用户:{username} 认证:{auth_status} 服务:{backend_available} 知识库:{knowledge_status}
+        system_prompt = f"""龙嘉软件助手- 用户:{username} 认证:{auth_status} 服务:{backend_available} 知识库:{knowledge_status} 图表:{echart_status}
     职责:处理ERP数据查询类问题,按用户语言回答。
     **核心安全指令 (必遵)**:
     1.  **当前凭据 (每次工具调用必须使用)**:

+ 8 - 0
tools/base_tool.py

@@ -202,6 +202,13 @@ def call_csharp_api(
 
         if response.status_code == 200:
             data = response.json()
+
+            # 检查是否存在ErrMsg字段,如果有则直接返回错误信息
+            if "ErrMsg" in data and data["ErrMsg"]:
+                error_msg = f"API返回错误: {data['ErrMsg']}"
+                print(f"❌ {error_msg}")
+                return error_msg
+
             return process_api_response(data)
         else:
             error_msg = f"API请求失败,状态码: {response.status_code}"
@@ -217,6 +224,7 @@ def process_api_response(data: Dict[str, Any]) -> str:
     """处理API响应"""
     try:
         inner_json_str = data.get("reJob", {}).get("0", "{}")
+        print("inner_json_str:" + inner_json_str)
         inner_data = json.loads(inner_json_str)
 
         if "err_msg" in inner_data:

+ 56 - 0
tools/cust_data_tools.py

@@ -0,0 +1,56 @@
+from langchain.tools import tool
+from .base_tool import call_csharp_api, get_tool_prompt
+from typing import Optional
+
+
+def get_cust_info_default_config():
+    """get_cust_info 工具的默认配置"""
+    return {
+        "get_cust_info": {
+            "基础描述": "获取指定客户的详细信息",
+            "入参说明": {
+                "backend_url": "后端API地址",
+                "token": "认证令牌",
+                "cusname": "客户名称",
+            },
+            "返回值说明": {"格式": "一个包含客户信息的字符串"},
+            "输出格式要求": [
+                "**客户:**{cusname}",
+                "**性质:**{state}",
+                "**地区:**{areaname}",
+                "**业务员:**{custype}",
+                "**联系人:**{rep}",
+                "**联系方式:**{contact}",
+                "**地址:**{address}",
+                "**常购型号**",
+                "| 型号 | 产品名称 |  单位  |  近6个月采购量  |  上月采购量  |",
+                "| :--- | :--- | :--- | :--- | :--- |",
+                "| mtrlcode      | mtrlname   |   unit   |   saleqty_halfyear   |  saleqty_lastmonth  |",
+            ],
+            "使用示例": "查一下客户 南华家具",
+        }
+    }
+
+
+tool_description = get_tool_prompt("get_cust_info", get_cust_info_default_config())
+
+
+def get_cust_info_func(
+    backend_url: str,
+    token: str,
+    cusname: str = "",
+) -> str:
+    """实际的函数实现"""
+    print(f"正在获取客户信息{cusname}")
+
+    return call_csharp_api(
+        backend_url,
+        token,
+        "cust_data_ai",
+        "get_cust_info",
+        {"arg_cusname": cusname},
+    )
+
+
+get_cust_info_func.__doc__ = tool_description
+get_cust_info = tool(get_cust_info_func)

+ 63 - 0
tools/mtrl_data_tools.py

@@ -0,0 +1,63 @@
+from langchain.tools import tool
+from .base_tool import call_csharp_api, get_tool_prompt
+from typing import Optional
+
+
+def get_mtrl_info_default_config():
+    """get_mtrl_info 工具的默认配置"""
+    return {
+        "get_mtrl_info": {
+            "基础描述": "获取指定产品的详细信息",
+            "入参说明": {
+                "backend_url": "后端API地址",
+                "token": "认证令牌",
+                "mtrlname": "产品名称",
+            },
+            "返回值说明": {"格式": "一个包含产品信息的字符串"},
+            "输出格式要求": [
+                "**产品编码:**{mtrlcode}",
+                "**产品名称:**{mtrlname}",
+                "**产品规格:**{mtrlmode}",
+                "**当前库存:**{noallocqty}{unit}",
+                "**销售分析**",
+                "销售周期:最近一年",
+                "*销售概况*",
+                "| 指标 | 数据 |  同比  |",
+                "| :--- | :--- | :--- |",
+                "| indicator | current_value   |   last_year_value  |",
+                "*客户排名*",
+                "| 排名 | 客户名称 |  销售量  |  销售额(万元)  |  占比  |",
+                "| :--- | :--- | :--- | :--- | :--- |",
+                "| rank_no | cusname | saleqty | amt | percentage |",
+                "*业务员排名*",
+                "| 排名 | 业务员 |  销售量  |  销售额(万元)  |  占比  |",
+                "| :--- | :--- | :--- | :--- | :--- |",
+                "| rank_no | saler | saleqty | amt | percentage |",
+            ],
+            "使用示例": "查产品 A388餐椅",
+        }
+    }
+
+
+tool_description = get_tool_prompt("get_mtrl_info", get_mtrl_info_default_config())
+
+
+def get_mtrl_info_func(
+    backend_url: str,
+    token: str,
+    mtrlname: str = "",
+) -> str:
+    """实际的函数实现"""
+    print(f"正在获取产品信息{mtrlname}")
+
+    return call_csharp_api(
+        backend_url,
+        token,
+        "mtrl_data_ai",
+        "get_mtrl_info",
+        {"arg_mtrlname": mtrlname},
+    )
+
+
+get_mtrl_info_func.__doc__ = tool_description
+get_mtrl_info = tool(get_mtrl_info_func)

+ 246 - 1
tools/sale_tools.py

@@ -1,5 +1,6 @@
 from langchain.tools import tool
 from .base_tool import call_csharp_api, get_tool_prompt
+from typing import Optional
 
 
 def get_sale_amt_default_config():
@@ -10,7 +11,7 @@ def get_sale_amt_default_config():
             "入参说明": {
                 "backend_url": "后端API地址",
                 "token": "认证令牌",
-                "funtion_name": "函数名称; get_sale_amt_by_month:按月汇总销售额; get_sale_amt_by_day:按天汇总销售额; get_sale_amt_by_produce:产品销售额; get_sale_amt_by_cus:客户销售额;get_sale_amt_by_saler:业务员销售额;get_sale_amt_by_cus_produce:客户产品销售额;get_hot_produce_not_buy:客户未购买过的热销产品;get_first_buy_list:客户指定时间范围内第一次下单的产品",
+                "funtion_name": "函数名称; get_sale_amt_by_month:按月汇总销售额; get_sale_amt_by_day:按天汇总销售额; get_sale_amt_by_cus_produce:客户产品销售额;get_hot_produce_not_buy:客户未购买过的热销产品;get_first_buy_list:客户指定时间范围内第一次下单的产品",
                 "cusname": "客户名称,只有get_hot_produce_not_buy和get_first_buy_list需要",
                 "firstdate": "开始日期,格式YYYY-MM-DD",
                 "lastdate": "结束日期,格式YYYY-MM-DD 23:59:59",
@@ -52,3 +53,247 @@ def get_sale_amt_func(
 
 get_sale_amt_func.__doc__ = tool_description
 get_sale_amt = tool(get_sale_amt_func)
+
+
+# 查询指定客户指定时间范围销售数量最多的产品
+def get_saleqty_max_by_cust_config():
+    """get_saleqty_max_by_cust 工具的默认配置"""
+    return {
+        "get_saleqty_max_by_cust": {
+            "基础描述": "查询指定客户指定时间范围销售数量最多的产品",
+            "入参说明": {
+                "backend_url": "后端API地址",
+                "token": "认证令牌",
+                "cusname": "客户名称",
+                "firstdate": "开始日期,格式YYYY-MM-DD",
+                "lastdate": "结束日期,格式YYYY-MM-DD 23:59:59",
+            },
+            "返回值说明": {
+                "格式": "一个包含销售数量最多的产品的字符串",
+                "字段含义": "mtrlname:产品名称,noallocqty:销售数量,unit:单位,storagename:仓库名称",
+            },
+            "输出格式要求": [
+                "重复信息要总结归纳,精简显示",
+            ],
+            "使用示例": "用户输入:'恒林椅业拿最多是什么型号'",
+        }
+    }
+
+
+tool_description_saleqty_max_by_cust = get_tool_prompt(
+    "get_saleqty_max_by_cust", get_saleqty_max_by_cust_config()
+)
+
+
+def get_saleqty_max_by_cust_func(
+    backend_url: str,
+    token: str,
+    cusname: str,
+    firstdate: Optional[str] = None,
+    lastdate: Optional[str] = None,
+) -> str:
+    """实际的函数实现"""
+    print(f"正在获取客户{cusname}销售数量最多的产品")
+
+    return call_csharp_api(
+        backend_url,
+        token,
+        "sale_data_ai",
+        "get_saleqty_max_by_cust",
+        {"arg_cusname": cusname, "arg_firstdate": firstdate, "arg_lastdate": lastdate},
+    )
+
+
+get_saleqty_max_by_cust_func.__doc__ = tool_description_saleqty_max_by_cust
+get_saleqty_max_by_cust = tool(get_saleqty_max_by_cust_func)
+
+
+# 业务员销售排行统计表
+def get_saler_ranking_config():
+    """get_saler_ranking 工具的默认配置"""
+    return {
+        "get_saler_ranking": {
+            "基础描述": "业务员销售排行统计表",
+            "入参说明": {
+                "backend_url": "后端API地址",
+                "token": "认证令牌",
+                "beginmonth": "开始月份,格式YYYYMM",
+                "endmonth": "结束月份,格式YYYYMM",
+            },
+            "返回值说明": {"格式": "一个包含业务员销售额排名的字符串"},
+            "输出格式要求": [
+                "# 业务员销售排行统计表",
+                "##国内",
+                "(输出国内业务员销售额echarts饼图,如果图表功能可用)",
+                "| 业务员 | 销售额 |  占比  |",
+                "| :--- | :--- | :--- |",
+                "| inSaleRankingList.outrep | inSaleRankingList.saleamt   |   inSaleRankingList.percent  |",
+                "",
+                "##国外",
+                "(输出国外业务员销售额echarts饼图,如果图表功能可用)",
+                "| 业务员 | 销售额 |  占比  |",
+                "| :--- | :--- | :--- |",
+                "| outSaleRankingList.outrep | outSaleRankingList.saleamt   |   outSaleRankingList.percent  |",
+            ],
+            "使用示例": [
+                "2024年业务员销售排名",
+                "帮我看看2024年业务员谁卖得最好",
+                "需要2024年全年的销售数据,按业务员排名",
+                "统计2024年业务员销售业绩",
+            ],
+        }
+    }
+
+
+tool_description_get_saler_ranking = get_tool_prompt(
+    "get_saler_ranking", get_saler_ranking_config()
+)
+
+
+def get_saler_ranking_func(
+    backend_url: str,
+    token: str,
+    beginmonth: int,
+    endmonth: int,
+) -> str:
+    """实际的函数实现"""
+    print(f"正在获取业务员{beginmonth}至{endmonth}的销售排行")
+
+    return call_csharp_api(
+        backend_url,
+        token,
+        "AiSaleToolHelper",
+        "GetSaleRankingData",
+        {"beginmonth": beginmonth, "endmonth": endmonth, "rankType": 1},
+    )
+
+
+get_saler_ranking_func.__doc__ = tool_description_get_saler_ranking
+get_saler_ranking = tool(get_saler_ranking_func)
+
+
+# 客户销售排名统计表
+def get_cust_ranking_config():
+    """get_cust_ranking 工具的默认配置"""
+    return {
+        "get_cust_ranking": {
+            "基础描述": "客户销售排名统计表",
+            "入参说明": {
+                "backend_url": "后端API地址",
+                "token": "认证令牌",
+                "beginmonth": "开始月份,格式YYYYMM",
+                "endmonth": "结束月份,格式YYYYMM",
+            },
+            "返回值说明": {"格式": "一个包含客户销售额排名的字符串"},
+            "输出格式要求": [
+                "# 客户销售排名统计表",
+                "##国内",
+                "(输出国内客户销售额echarts饼图,如果图表功能可用)",
+                "| 客户 | 销售额 |  占比  |",
+                "| :--- | :--- | :--- |",
+                "| inSaleRankingList.cusname | inSaleRankingList.saleamt   |   inSaleRankingList.percent  |",
+                "##国外",
+                "(输出国外客户销售额echarts饼图,如果图表功能可用)",
+                "| 客户 | 销售额 |  占比  |",
+                "| :--- | :--- | :--- |",
+                "| outSaleRankingList.cusname | outSaleRankingList.saleamt   |   outSaleRankingList.percent  |",
+            ],
+            "使用示例": [
+                "2024年我们的主要客户是哪些?",
+                "帮我查一下2024年哪些客户买得最多",
+                "2024客户销售业绩排名",
+                "需要2024年全年的客户销售数据",
+            ],
+        }
+    }
+
+
+tool_description_get_cust_ranking = get_tool_prompt(
+    "get_cust_ranking", get_cust_ranking_config()
+)
+
+
+def get_cust_ranking_func(
+    backend_url: str,
+    token: str,
+    beginmonth: int,
+    endmonth: int,
+) -> str:
+    """实际的函数实现"""
+    print(f"正在获取客户{beginmonth}至{endmonth}的销售排行")
+
+    return call_csharp_api(
+        backend_url,
+        token,
+        "AiSaleToolHelper",
+        "GetSaleRankingData",
+        {"beginmonth": beginmonth, "endmonth": endmonth, "rankType": 2},
+    )
+
+
+get_cust_ranking_func.__doc__ = tool_description_get_cust_ranking
+get_cust_ranking = tool(get_cust_ranking_func)
+
+
+# 产品型号销售统计表
+def get_mtrl_ranking_config():
+    """get_mtrl_ranking 工具的默认配置"""
+    return {
+        "get_mtrl_ranking": {
+            "基础描述": "产品型号销售统计表",
+            "入参说明": {
+                "backend_url": "后端API地址",
+                "token": "认证令牌",
+                "beginmonth": "开始月份,格式YYYYMM",
+                "endmonth": "结束月份,格式YYYYMM",
+            },
+            "返回值说明": {"格式": "一个包含产品型号销售额排名的字符串"},
+            "输出格式要求": [
+                "# 产品型号销售排名统计表",
+                "##国内",
+                "(输出国内产品型号销售额echarts饼图,如果图表功能可用)",
+                "| 产品型号 | 销量 | 销售额 |  金额占比  |",
+                "| :--- | :--- | :--- |",
+                "| inSaleRankingList.model | inSaleRankingList.saleqty | inSaleRankingList.saleamt   |   inSaleRankingList.percent  |",
+                "##国外",
+                "(输出国外产品型号销售额echarts饼图,如果图表功能可用)",
+                "| 产品型号 | 销量 | 销售额 |  金额占比  |",
+                "| :--- | :--- | :--- |",
+                "| outSaleRankingList.model | outSaleRankingList.saleqty | outSaleRankingList.saleamt   |   outSaleRankingList.percent  |",
+            ],
+            "使用示例": [
+                "查2024年产品型号销售排名",
+                "2024年第一季度哪些产品型号卖得最好?",
+                "2024年销售旺季(7-9月)产品型号排名",
+                "2024年前十大畅销产品型号排名",
+                "今年哪些产品卖得好?国内外市场分开看",
+            ],
+        }
+    }
+
+
+tool_description_get_mtrl_ranking = get_tool_prompt(
+    "get_mtrl_ranking", get_mtrl_ranking_config()
+)
+
+
+def get_mtrl_ranking_func(
+    backend_url: str,
+    token: str,
+    beginmonth: int,
+    endmonth: int,
+) -> str:
+    """实际的函数实现"""
+    print(f"正在获取产品型号{beginmonth}至{endmonth}的销售排行")
+
+    return call_csharp_api(
+        backend_url,
+        token,
+        "AiSaleToolHelper",
+        "GetSaleRankingData",
+        {"beginmonth": beginmonth, "endmonth": endmonth, "rankType": 4},
+    )
+
+
+get_mtrl_ranking_func.__doc__ = tool_description_get_mtrl_ranking
+get_mtrl_ranking = tool(get_mtrl_ranking_func)

+ 47 - 0
tools/ware_tools.py

@@ -1,3 +1,4 @@
+from httpx import get
 from langchain.tools import tool
 from .base_tool import call_csharp_api, get_tool_prompt
 
@@ -44,3 +45,49 @@ get_mtrlware_data_func.__doc__ = tool_description
 
 # 4. 最后应用装饰器
 get_mtrlware_data = tool(get_mtrlware_data_func)
+
+
+def get_mtrlware_max_by_storage_config():
+    """get_mtrlware_max_by_storage 工具的默认配置"""
+    return {
+        "get_mtrlware_max_by_storage": {
+            "基础描述": "获取指定仓库的库存数量最多的产品",
+            "入参说明": {
+                "backend_url": "后端API地址",
+                "token": "认证令牌",
+                "storagename": "仓库名称",
+            },
+            "返回值说明": {
+                "格式": "一个包含物料库存数据的字符串",
+                "字段含义": "mtrlname:物料名称, storagename:仓库名称, noallocqty:库存数量, unit:单位,query_status:查询状态",
+            },
+            "输出格式要求": ["重复信息要总结归纳,精简显示"],
+            "使用示例": "安吉仓库最多的库存哪个型号",
+        }
+    }
+
+
+tool_description_max_by_storage = get_tool_prompt(
+    "get_mtrlware_max_by_storage", get_mtrlware_max_by_storage_config
+)
+
+
+def get_mtrlware_max_by_storage_func(
+    backend_url: str, token: str, storagename: str
+) -> str:
+    """实际的函数实现"""
+    print(f"正在获取仓库{storagename}的最多库存产品")
+
+    return call_csharp_api(
+        backend_url,
+        token,
+        "ware_data_ai",
+        "get_mtrlware_max_by_storage",
+        {"arg_storagename": storagename},
+    )
+
+
+# 3. 设置文档字符串
+get_mtrlware_max_by_storage_func.__doc__ = tool_description_max_by_storage
+
+get_mtrlware_max_by_storage = tool(get_mtrlware_max_by_storage_func)