query_customer_payment_followup.py 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. class QueryCustomerPaymentFollowupTool:
  2. name = 'query_customer_payment_followup'
  3. route_path = '/mcp/tools/queryCustomerPaymentFollowup'
  4. def __init__(self, api_client=None):
  5. self.api_client = api_client
  6. def metadata(self):
  7. positive_id = {'type': 'integer', 'minimum': 1}
  8. return {
  9. 'name': self.name,
  10. 'description': (
  11. '查询当前员工有权查看的客户回款跟进数据,包括已出账未核销、未出账、'
  12. '逾期、坏账、收款单未核销、余额、信用额度和按应收月份聚合的未回款汇总。客户、事业部、'
  13. '商务经理和客户经理ID必须先调用list_customer_filter_options取得。公司、员工、'
  14. '菜单权限和数据范围由当前设备会话确定,调用方不得覆盖。用户要求展开某客户时,'
  15. '使用同一客户ID调用query_customer_unverified_bill_details并跟随分页。最终回复必须逐条完整'
  16. '展示所有客户、全部字段和月份汇总,不得摘要、隐藏、重命名或省略。'
  17. ),
  18. 'input_schema': {
  19. 'type': 'object',
  20. 'properties': {
  21. 'customer_id': dict(positive_id),
  22. 'department_id': dict(positive_id),
  23. 'sales_id': dict(positive_id),
  24. 'merchandiser_id': dict(positive_id),
  25. 'has_unverified_receivable_only': {
  26. 'type': 'boolean',
  27. 'default': True,
  28. },
  29. 'page': {
  30. 'type': 'integer', 'minimum': 1, 'maximum': 100,
  31. 'default': 1,
  32. },
  33. 'limit': {
  34. 'type': 'integer', 'minimum': 1, 'maximum': 100,
  35. 'default': 20,
  36. },
  37. },
  38. 'required': [],
  39. 'additionalProperties': False,
  40. },
  41. }
  42. def call(
  43. self, customer_id=None, department_id=None, sales_id=None,
  44. merchandiser_id=None, has_unverified_receivable_only=True,
  45. page=1, limit=20, request_id='rq_query_customer_payment_followup',
  46. ):
  47. if self.api_client is None:
  48. raise RuntimeError(
  49. 'api client is required for query_customer_payment_followup'
  50. )
  51. payload = {
  52. 'page': self._bounded_integer(page, 'page'),
  53. 'limit': self._bounded_integer(limit, 'limit'),
  54. 'has_unverified_receivable_only': self._strict_boolean(
  55. has_unverified_receivable_only,
  56. 'has_unverified_receivable_only',
  57. ),
  58. }
  59. for field, value in (
  60. ('customer_id', customer_id),
  61. ('department_id', department_id),
  62. ('sales_id', sales_id),
  63. ('merchandiser_id', merchandiser_id),
  64. ):
  65. if value is not None:
  66. payload[field] = self._positive_integer(value, field)
  67. return self.api_client.call_tool(
  68. self.name, self.route_path, payload, request_id
  69. )
  70. @staticmethod
  71. def _positive_integer(value, field):
  72. if isinstance(value, bool) or not isinstance(value, int) or value < 1:
  73. raise ValueError('{0} is invalid'.format(field))
  74. return value
  75. @classmethod
  76. def _bounded_integer(cls, value, field):
  77. value = cls._positive_integer(value, field)
  78. if value > 100:
  79. raise ValueError('{0} is invalid'.format(field))
  80. return value
  81. @staticmethod
  82. def _strict_boolean(value, field):
  83. if not isinstance(value, bool):
  84. raise ValueError('{0} is invalid'.format(field))
  85. return value