sale_tools.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. from langchain.tools import tool
  2. from .base_tool import call_csharp_api, get_tool_prompt
  3. from typing import Optional
  4. def get_sale_amt_default_config():
  5. """get_sale_amt 工具的默认配置"""
  6. return {
  7. "get_sale_amt": {
  8. "基础描述": "获取指定时间范围的销售金额,按月汇总",
  9. "入参说明": {
  10. "backend_url": "后端API地址",
  11. "token": "认证令牌",
  12. "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:客户指定时间范围内第一次下单的产品",
  13. "cusname": "客户名称,只有get_hot_produce_not_buy和get_first_buy_list需要",
  14. "firstdate": "开始日期,格式YYYY-MM-DD",
  15. "lastdate": "结束日期,格式YYYY-MM-DD 23:59:59",
  16. },
  17. "返回值说明": {
  18. "格式": "一个包含销售金额的字符串",
  19. "字段含义": "sale_month:月份, amt:销售金额,sale_day:日期,produce_name:产品名称,cus_name:客户,saler_name:业务员,mtrlcode:产品编码,taskdate:订单日期,taskcode:订单号,saleqty:销售数量,unit:单位",
  20. },
  21. "输出格式要求": [
  22. "重复信息要总结归纳,精简显示",
  23. ],
  24. "使用示例": "用户输入:'查看2023年1月1日至2023年12月31日的销售金额' -> 获取2023年1月至12月的销售金额;'2024年前5热销产品是哪些?' -> 获取2024年产品销售额;'2025年前10销售额最高的客户是?' -> 获取2025年客户销售额';'客户A还没买过的热销型号有哪些?'->get_hot_produce_not_buy(没有指定时间范围默认近半年);'客户A最近半个月买了哪些产品是首购?'->get_first_buy_list(没有指定时间范围默认近半个月)",
  25. }
  26. }
  27. tool_description = get_tool_prompt("get_sale_amt", get_sale_amt_default_config())
  28. def get_sale_amt_func(
  29. backend_url: str,
  30. token: str,
  31. funtion_name: str,
  32. firstdate: str,
  33. lastdate: str,
  34. cusname: str = "",
  35. ) -> str:
  36. """实际的函数实现"""
  37. print(f"正在获取销售金额{funtion_name},时间范围:{firstdate} 至 {lastdate}")
  38. return call_csharp_api(
  39. backend_url,
  40. token,
  41. "sale_data_ai",
  42. funtion_name,
  43. {"arg_firstdate": firstdate, "arg_lastdate": lastdate, "arg_cusname": cusname},
  44. )
  45. get_sale_amt_func.__doc__ = tool_description
  46. get_sale_amt = tool(get_sale_amt_func)
  47. # 查询指定客户指定时间范围销售数量最多的产品
  48. def get_saleqty_max_by_cust_config():
  49. """get_saleqty_max_by_cust 工具的默认配置"""
  50. return {
  51. "get_saleqty_max_by_cust": {
  52. "基础描述": "查询指定客户指定时间范围销售数量最多的产品",
  53. "入参说明": {
  54. "backend_url": "后端API地址",
  55. "token": "认证令牌",
  56. "cusname": "客户名称",
  57. "firstdate": "开始日期,格式YYYY-MM-DD",
  58. "lastdate": "结束日期,格式YYYY-MM-DD 23:59:59",
  59. },
  60. "返回值说明": {
  61. "格式": "一个包含销售数量最多的产品的字符串",
  62. "字段含义": "mtrlname:产品名称,noallocqty:销售数量,unit:单位,storagename:仓库名称",
  63. },
  64. "输出格式要求": [
  65. "重复信息要总结归纳,精简显示",
  66. ],
  67. "使用示例": "用户输入:'恒林椅业拿最多是什么型号'",
  68. }
  69. }
  70. tool_description_saleqty_max_by_cust = get_tool_prompt(
  71. "get_saleqty_max_by_cust", get_saleqty_max_by_cust_config()
  72. )
  73. def get_saleqty_max_by_cust_func(
  74. backend_url: str,
  75. token: str,
  76. cusname: str,
  77. firstdate: Optional[str] = None,
  78. lastdate: Optional[str] = None,
  79. ) -> str:
  80. """实际的函数实现"""
  81. print(f"正在获取客户{cusname}销售数量最多的产品")
  82. return call_csharp_api(
  83. backend_url,
  84. token,
  85. "sale_data_ai",
  86. "get_saleqty_max_by_cust",
  87. {"arg_cusname": cusname, "arg_firstdate": firstdate, "arg_lastdate": lastdate},
  88. )
  89. get_saleqty_max_by_cust_func.__doc__ = tool_description_saleqty_max_by_cust
  90. get_saleqty_max_by_cust = tool(get_saleqty_max_by_cust_func)
  91. # 业务员销售排行统计表
  92. def get_saler_ranking_config():
  93. """get_saler_ranking 工具的默认配置"""
  94. return {
  95. "get_saler_ranking": {
  96. "基础描述": "业务员销售排行统计表",
  97. "入参说明": {
  98. "backend_url": "后端API地址",
  99. "token": "认证令牌",
  100. "beginmonth": "开始月份,格式YYYYMM",
  101. "endmonth": "结束月份,格式YYYYMM",
  102. },
  103. "返回值说明": {"格式": "一个包含业务员销售额排名的字符串"},
  104. "输出格式要求": [
  105. "# 业务员销售排行统计表",
  106. "##国内",
  107. "(输出国内业务员销售额echarts饼图,如果图表功能可用)",
  108. "| 业务员 | 销售额 | 占比 |",
  109. "| :--- | :--- | :--- |",
  110. "| inSaleRankingList.outrep | inSaleRankingList.saleamt | inSaleRankingList.percent |",
  111. "",
  112. "##国外",
  113. "(输出国外业务员销售额echarts饼图,如果图表功能可用)",
  114. "| 业务员 | 销售额 | 占比 |",
  115. "| :--- | :--- | :--- |",
  116. "| outSaleRankingList.outrep | outSaleRankingList.saleamt | outSaleRankingList.percent |",
  117. ],
  118. "使用示例": [
  119. "2024年业务员销售排名",
  120. "帮我看看2024年业务员谁卖得最好",
  121. "需要2024年全年的销售数据,按业务员排名",
  122. "统计2024年业务员销售业绩",
  123. ],
  124. }
  125. }
  126. tool_description_get_saler_ranking = get_tool_prompt(
  127. "get_saler_ranking", get_saler_ranking_config()
  128. )
  129. def get_saler_ranking_func(
  130. backend_url: str,
  131. token: str,
  132. beginmonth: int,
  133. endmonth: int,
  134. ) -> str:
  135. """实际的函数实现"""
  136. print(f"正在获取业务员{beginmonth}至{endmonth}的销售排行")
  137. return call_csharp_api(
  138. backend_url,
  139. token,
  140. "AiSaleToolHelper",
  141. "GetSaleRankingData",
  142. {"beginmonth": beginmonth, "endmonth": endmonth, "rankType": 1},
  143. )
  144. get_saler_ranking_func.__doc__ = tool_description_get_saler_ranking
  145. get_saler_ranking = tool(get_saler_ranking_func)
  146. # 客户销售排名统计表
  147. def get_cust_ranking_config():
  148. """get_cust_ranking 工具的默认配置"""
  149. return {
  150. "get_cust_ranking": {
  151. "基础描述": "客户销售排名统计表",
  152. "入参说明": {
  153. "backend_url": "后端API地址",
  154. "token": "认证令牌",
  155. "beginmonth": "开始月份,格式YYYYMM",
  156. "endmonth": "结束月份,格式YYYYMM",
  157. },
  158. "返回值说明": {"格式": "一个包含客户销售额排名的字符串"},
  159. "输出格式要求": [
  160. "# 客户销售排名统计表",
  161. "##国内",
  162. "(输出国内客户销售额echarts饼图,如果图表功能可用)",
  163. "| 客户 | 销售额 | 占比 |",
  164. "| :--- | :--- | :--- |",
  165. "| inSaleRankingList.cusname | inSaleRankingList.saleamt | inSaleRankingList.percent |",
  166. "##国外",
  167. "(输出国外客户销售额echarts饼图,如果图表功能可用)",
  168. "| 客户 | 销售额 | 占比 |",
  169. "| :--- | :--- | :--- |",
  170. "| outSaleRankingList.cusname | outSaleRankingList.saleamt | outSaleRankingList.percent |",
  171. ],
  172. "使用示例": [
  173. "2024年我们的主要客户是哪些?",
  174. "帮我查一下2024年哪些客户买得最多",
  175. "2024客户销售业绩排名",
  176. "需要2024年全年的客户销售数据",
  177. ],
  178. }
  179. }
  180. tool_description_get_cust_ranking = get_tool_prompt(
  181. "get_cust_ranking", get_cust_ranking_config()
  182. )
  183. def get_cust_ranking_func(
  184. backend_url: str,
  185. token: str,
  186. beginmonth: int,
  187. endmonth: int,
  188. ) -> str:
  189. """实际的函数实现"""
  190. print(f"正在获取客户{beginmonth}至{endmonth}的销售排行")
  191. return call_csharp_api(
  192. backend_url,
  193. token,
  194. "AiSaleToolHelper",
  195. "GetSaleRankingData",
  196. {"beginmonth": beginmonth, "endmonth": endmonth, "rankType": 2},
  197. )
  198. get_cust_ranking_func.__doc__ = tool_description_get_cust_ranking
  199. get_cust_ranking = tool(get_cust_ranking_func)
  200. # 产品型号销售统计表
  201. def get_mtrl_ranking_config():
  202. """get_mtrl_ranking 工具的默认配置"""
  203. return {
  204. "get_mtrl_ranking": {
  205. "基础描述": "产品型号销售统计表",
  206. "入参说明": {
  207. "backend_url": "后端API地址",
  208. "token": "认证令牌",
  209. "beginmonth": "开始月份,格式YYYYMM",
  210. "endmonth": "结束月份,格式YYYYMM",
  211. },
  212. "返回值说明": {"格式": "一个包含产品型号销售额排名的字符串"},
  213. "输出格式要求": [
  214. "# 产品型号销售排名统计表",
  215. "##国内",
  216. "(输出国内产品型号销售额echarts饼图,如果图表功能可用)",
  217. "| 产品型号 | 销量 | 销售额 | 金额占比 |",
  218. "| :--- | :--- | :--- |",
  219. "| inSaleRankingList.model | inSaleRankingList.saleqty | inSaleRankingList.saleamt | inSaleRankingList.percent |",
  220. "##国外",
  221. "(输出国外产品型号销售额echarts饼图,如果图表功能可用)",
  222. "| 产品型号 | 销量 | 销售额 | 金额占比 |",
  223. "| :--- | :--- | :--- |",
  224. "| outSaleRankingList.model | outSaleRankingList.saleqty | outSaleRankingList.saleamt | outSaleRankingList.percent |",
  225. ],
  226. "使用示例": [
  227. "查2024年产品型号销售排名",
  228. "2024年第一季度哪些产品型号卖得最好?",
  229. "2024年销售旺季(7-9月)产品型号排名",
  230. "2024年前十大畅销产品型号排名",
  231. "今年哪些产品卖得好?国内外市场分开看",
  232. ],
  233. }
  234. }
  235. tool_description_get_mtrl_ranking = get_tool_prompt(
  236. "get_mtrl_ranking", get_mtrl_ranking_config()
  237. )
  238. def get_mtrl_ranking_func(
  239. backend_url: str,
  240. token: str,
  241. beginmonth: int,
  242. endmonth: int,
  243. ) -> str:
  244. """实际的函数实现"""
  245. print(f"正在获取产品型号{beginmonth}至{endmonth}的销售排行")
  246. return call_csharp_api(
  247. backend_url,
  248. token,
  249. "AiSaleToolHelper",
  250. "GetSaleRankingData",
  251. {"beginmonth": beginmonth, "endmonth": endmonth, "rankType": 4},
  252. )
  253. get_mtrl_ranking_func.__doc__ = tool_description_get_mtrl_ranking
  254. get_mtrl_ranking = tool(get_mtrl_ranking_func)