From 038162b5d99ca991ed49723a3fb899555c34b67e Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Tue, 23 Jun 2026 15:38:35 +0800 Subject: [PATCH] refactor: dispatch resource_ref_id to resource module interfaces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- models/product.json | 6 +++++ product_management/core.py | 46 +++++++++++++++++++++++++++++++------- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/models/product.json b/models/product.json index 5314e7a..fb8fafd 100644 --- a/models/product.json +++ b/models/product.json @@ -45,6 +45,12 @@ "length": 64, "nullable": "no" }, + { + "name": "resource_ref_id", + "title": "资源模块内部ID", + "type": "str", + "length": 64 + }, { "name": "brief_intro", "title": "产品简介", diff --git a/product_management/core.py b/product_management/core.py index d4ce5d0..fdf36c4 100644 --- a/product_management/core.py +++ b/product_management/core.py @@ -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)