From 89cef5ad251faffd566cc6ca6e70e16aba0edf03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Fri, 29 May 2026 15:38:04 +0800 Subject: [PATCH] =?UTF-8?q?ai=E5=8A=A8=E6=80=81=E6=8A=A5=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yuthon_base/models/ir_ui_menu.py | 33 ++++++++++---------------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/yuthon_base/models/ir_ui_menu.py b/yuthon_base/models/ir_ui_menu.py index a7fafea95..3ced75f0f 100644 --- a/yuthon_base/models/ir_ui_menu.py +++ b/yuthon_base/models/ir_ui_menu.py @@ -8,33 +8,13 @@ class IrUiMenu(models.Model): _inherit = 'ir.ui.menu' def _get_menu_pinyin(self, name): - """计算菜单名的全拼+首字母,不存库""" + """计算菜单名的全拼+首字母""" if not name: return '' full_pinyin = ''.join(pypinyin.lazy_pinyin(name)).lower() first_letters = ''.join([p[0] for p in pypinyin.pinyin(name)]).lower() return f"{full_pinyin} {first_letters}" - def _name_has_pinyin(self, name, search_term): - """检查菜单名(含拼音后缀)是否匹配搜索词""" - if not name or not search_term: - return False - name_str = f"{name} [{self._get_menu_pinyin(name)}]".lower() - return search_term in name_str - - def load_menus(self, debug): - """重写 load_menus,把拼音拼到菜单名后面,让 Ctrl+K 能搜到""" - menus = super().load_menus(debug) - for menu_id, menu_data in menus.items(): - if not isinstance(menu_data, dict) or not menu_data.get('name'): - continue - name = menu_data['name'] - pinyin = self._get_menu_pinyin(name) - if pinyin: - # 格式: "通知公告 [tongzhigonggao tzgg]" - menu_data['name'] = f"{name} [{pinyin}]" - return menus - def name_search(self, name='', args=None, operator='ilike', limit=100): """支持全拼/首字母搜索菜单""" if args is None: @@ -46,6 +26,10 @@ class IrUiMenu(models.Model): if not search_term: return super().name_search(name=name, args=args, operator=operator, limit=limit) + # 生成搜索词的拼音和首字母 + search_pinyin = ''.join(pypinyin.lazy_pinyin(search_term)).lower() + search_first = ''.join([p[0] for p in pypinyin.pinyin(search_term)]).lower() + # 原名搜索 name_domain = expression.AND([args, [('name', operator, name)]]) name_ids = self.search(name_domain, limit=limit).ids @@ -55,8 +39,11 @@ class IrUiMenu(models.Model): pinyin_ids = [] for menu in all_menus: if menu.id in name_ids: - continue # 已经原名匹配了 - if self._name_has_pinyin(menu.name, search_term): + continue + if not menu.name: + continue + pinyin = self._get_menu_pinyin(menu.name) + if search_term in pinyin or search_pinyin in pinyin or search_first in pinyin: pinyin_ids.append(menu.id) all_ids = list(dict.fromkeys(name_ids + pinyin_ids))[:limit]