export_pending_outbound_orders.py 4.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. class ExportPendingOutboundOrdersTool:
  2. name = 'export_pending_outbound_orders'
  3. route_path = '/mcp/tools/exportPendingOutboundOrders'
  4. FILTER_FIELDS = (
  5. 'number', 'product_type_id', 'product_id', 'order_warehouse_id',
  6. 'receiver_country', 'is_remove', 'address', 'inbound_date', 'status',
  7. 'is_battery', 'is_magnetic', 'is_wood', 'is_other', 'is_fda', 'is_toy',
  8. 'is_ultra_limit', 'is_sensitive', 'is_food', 'no_property',
  9. 'merge_declare_number', 'importer_id', 'packing_type',
  10. )
  11. def __init__(self, api_client=None):
  12. self.api_client = api_client
  13. def metadata(self):
  14. properties = {
  15. 'number': {
  16. 'type': 'string',
  17. 'description': '单号:订单号、参考号;多个值用空格、英文逗号或回车分隔。',
  18. },
  19. 'product_type_id': {'type': 'integer', 'description': '产品分类 ID。'},
  20. 'product_id': {
  21. 'type': 'array',
  22. 'items': {'type': 'integer'},
  23. 'description': '物流产品 ID 数组。先从筛选项工具获取授权值。',
  24. },
  25. 'order_warehouse_id': {'type': 'integer', 'description': '集货仓库 ID。'},
  26. 'receiver_country': {'type': 'string', 'description': '目的国国家代码。'},
  27. 'is_remove': {
  28. 'type': 'integer',
  29. 'enum': [0, 1],
  30. 'description': '是否装柜剔除:1 是,0 否。',
  31. },
  32. 'address': {'type': 'string', 'description': '派送地址模糊筛选。'},
  33. 'inbound_date': {
  34. 'type': 'string',
  35. 'description': '入库时间范围,格式 YYYY-MM-DD - YYYY-MM-DD。',
  36. },
  37. 'status': {
  38. 'type': 'array',
  39. 'items': {'type': 'integer'},
  40. 'description': '订单状态整数数组。',
  41. },
  42. 'merge_declare_number': {'type': 'string', 'description': '合并报关单号。'},
  43. 'importer_id': {'type': 'integer', 'description': '进口商 ID。'},
  44. 'packing_type': {
  45. 'type': 'string',
  46. 'description': '货物类型,多选值用英文逗号拼接。',
  47. },
  48. }
  49. for field, label in (
  50. ('is_battery', '带电'), ('is_magnetic', '带磁'), ('is_wood', '带木'),
  51. ('is_other', '其它'), ('is_fda', 'FDA产品'), ('is_toy', '玩具'),
  52. ('is_ultra_limit', '单箱尺寸超长超重'), ('is_sensitive', '敏感货'),
  53. ('is_food', '食品'), ('no_property', '无属性'),
  54. ):
  55. properties[field] = {
  56. 'type': 'string',
  57. 'enum': ['Y'],
  58. 'description': '商品属性:{0},选中时传 Y。'.format(label),
  59. }
  60. return {
  61. 'name': self.name,
  62. 'description': (
  63. '本工具只提交异步导出任务,不会在本次调用中等待文件生成。'
  64. '成功后返回任务引用(task_ref)和'
  65. '建议等待时间(retry_after_seconds)。稍后使用 query_export_task 单独查询'
  66. '任务状态或下载链接。'
  67. '使用场景:只有用户明确要求导出未排舱订单并需要下载文件时,才按'
  68. 'outbound/add.html的筛选条件调用。筛选名称必须先通过'
  69. 'list_pending_outbound_export_filter_options 获取当前员工有权限的 value。'
  70. '禁止使用:用户只是查看或查询订单、排舱列表或排舱详情时不得调用;'
  71. '本工具不导出已排舱列表,也不导出省外进港资料。用户只说”单号”时必须'
  72. '先确认是订单号还是客户参考号;不得用导出结果试探号码类型。'
  73. '参数名仅用于工具调用;向用户回答时只能使用中文业务名称,不得展示内部参数名。'
  74. ),
  75. 'input_schema': {'type': 'object', 'properties': properties},
  76. }
  77. def call(self, request_id='rq_export_pending_outbound_orders', **kwargs):
  78. if self.api_client is None:
  79. raise RuntimeError('api client is required for export_pending_outbound_orders')
  80. payload = {}
  81. for field in self.FILTER_FIELDS:
  82. if field in kwargs and kwargs[field] is not None:
  83. payload[field] = kwargs[field]
  84. return self.api_client.call_tool(self.name, self.route_path, payload, request_id)