refactor: dispatch resource_ref_id to resource module interfaces

- product.json: add resource_ref_id field
- core.py: _get_ref_id() helper extracts resource_ref_id from product
- All dispatch methods pass resource_ref_id instead of product_code
- Resource modules no longer need product_code→internal_id mapping
This commit is contained in:
Hermes Agent 2026-06-23 15:38:35 +08:00
parent 811de2a863
commit 038162b5d9
2 changed files with 44 additions and 8 deletions

View File

@ -45,6 +45,12 @@
"length": 64,
"nullable": "no"
},
{
"name": "resource_ref_id",
"title": "资源模块内部ID",
"type": "str",
"length": 64
},
{
"name": "brief_intro",
"title": "产品简介",

View File

@ -1187,6 +1187,13 @@ class ProductManager:
return None, product, f'资源模块 {resource_module} 未注册 product_interface'
def _get_ref_id(self, product):
"""Extract resource_ref_id from product record, with fallback error."""
ref_id = product.get('resource_ref_id')
if not ref_id:
return None, '产品未绑定资源模块内部ID(resource_ref_id为空)'
return ref_id, None
async def get_product_display_info(self, product_id=None, product_code=None):
"""获取产品定价展示信息(通过资源模块接口)。"""
iface, product, err = await self._get_product_interface(
@ -1198,7 +1205,10 @@ class ProductManager:
if not fn:
return {'success': False, 'message': '资源模块未实现 get_product_display'}
return await fn(product['product_code'])
ref_id, err = self._get_ref_id(product)
if err:
return {'success': False, 'message': err}
return await fn(ref_id)
async def check_product_availability(self, product_id=None, product_code=None,
user_org_id=None):
@ -1212,7 +1222,10 @@ class ProductManager:
if not fn:
return {'available': False, 'reason': '资源模块未实现 check_product_availability'}
return await fn(product['product_code'], user_org_id)
ref_id, err = self._get_ref_id(product)
if err:
return {'available': False, 'reason': err}
return await fn(ref_id, user_org_id)
async def check_product_consumable(self, product_id=None, product_code=None,
user_id=None, user_org_id=None):
@ -1228,13 +1241,18 @@ class ProductManager:
return {'consumable': False, 'reason': '资源模块未实现 check_product_consumable',
'min_balance': 0, 'pricing_available': False}
ref_id, err = self._get_ref_id(product)
if err:
return {'consumable': False, 'reason': err,
'min_balance': 0, 'pricing_available': False}
if not user_id:
env = ServerEnv()
user_id = await env.get_user()
if not user_org_id:
user_org_id = self._get_current_org_id()
return await fn(product['product_code'], user_id, user_org_id)
return await fn(ref_id, user_id, user_org_id)
async def execute_product(self, product_id=None, product_code=None,
request_data=None, user_id=None, user_org_id=None):
@ -1249,14 +1267,17 @@ class ProductManager:
return {'success': False, 'message': '资源模块未实现 execute_product_service',
'status': 'FAILED'}
ref_id, err = self._get_ref_id(product)
if err:
return {'success': False, 'message': err, 'status': 'FAILED'}
if not user_id:
env = ServerEnv()
user_id = await env.get_user()
if not user_org_id:
user_org_id = self._get_current_org_id()
return await fn(product['product_code'], user_id, user_org_id,
request_data or {})
return await fn(ref_id, user_id, user_org_id, request_data or {})
async def execute_product_stream(self, product_id=None, product_code=None,
request_data=None, user_id=None,
@ -1276,14 +1297,19 @@ class ProductManager:
'error': '资源模块未实现 execute_product_service_stream'}
return _noimpl_gen()
ref_id, err = self._get_ref_id(product)
if err:
async def _ref_err_gen():
yield {'chunk': None, 'usage_data': None, 'done': True, 'error': err}
return _ref_err_gen()
if not user_id:
env = ServerEnv()
user_id = await env.get_user()
if not user_org_id:
user_org_id = self._get_current_org_id()
return fn(product['product_code'], user_id, user_org_id,
request_data or {})
return fn(ref_id, user_id, user_org_id, request_data or {})
async def calculate_product_cost(self, product_id=None, product_code=None,
usage_data=None, user_org_id=None):
@ -1297,7 +1323,11 @@ class ProductManager:
if not fn:
return {'success': False, 'message': '资源模块未实现 calculate_product_cost'}
ref_id, err = self._get_ref_id(product)
if err:
return {'success': False, 'message': err}
if not user_org_id:
user_org_id = self._get_current_org_id()
return await fn(product['product_code'], usage_data or {}, user_org_id)
return await fn(ref_id, usage_data or {}, user_org_id)