Merge pull request !11727 from 李鹏宇/dev
This commit is contained in:
李鹏宇
2026-05-28 03:12:09 +00:00
committed by Gitee
17 changed files with 58 additions and 60 deletions
+6 -6
View File
@@ -29,12 +29,12 @@
],
'assets': {
'web.assets_backend': [
'yuthon_ai_agent_17/static/src/js/ai_chat_action.js',
'yuthon_ai_agent_17/static/src/js/ai_floating.js',
'yuthon_ai_agent_17/static/src/xml/ai_chat_template.xml',
'yuthon_ai_agent_17/static/src/xml/ai_navbar_button.xml',
'yuthon_ai_agent_17/static/src/css/ai_chat.css',
'yuthon_ai_agent_17/static/src/css/ai_floating.css',
'yuthon_ai_agent/static/src/js/ai_chat_action.js',
'yuthon_ai_agent/static/src/js/ai_floating.js',
'yuthon_ai_agent/static/src/xml/ai_chat_template.xml',
'yuthon_ai_agent/static/src/xml/ai_navbar_button.xml',
'yuthon_ai_agent/static/src/css/ai_chat.css',
'yuthon_ai_agent/static/src/css/ai_floating.css',
],
},
'installable': True,
+1 -1
View File
@@ -11,7 +11,7 @@ class AiChatController(http.Controller):
def _check_ai_access(self):
"""检查用户是否有 AI Agent 使用权限"""
if not request.env.user.has_group('yuthon_ai_agent_17.group_ai_agent_user'):
if not request.env.user.has_group('yuthon_ai_agent.group_ai_agent_user'):
return {'error': '您没有使用 AI 助手的权限,请联系管理员开通。'}
return None
+2 -2
View File
@@ -157,7 +157,7 @@ class AiConversation(models.Model):
self.ensure_one()
return {
'type': 'ir.actions.client',
'tag': 'yuthon_ai_agent_17.chat',
'tag': 'yuthon_ai_agent.chat',
'name': self.name,
'params': {'res_id': self.id},
}
@@ -445,7 +445,7 @@ class AiConversation(models.Model):
"""发送用户消息并获取 AI 回复(支持工具调用)。"""
self.ensure_one()
# 权限校验:只有 AI Agent 用户组才能使用
if not self.env.user.has_group('yuthon_ai_agent_17.group_ai_agent_user'):
if not self.env.user.has_group('yuthon_ai_agent.group_ai_agent_user'):
return {'error': '您没有使用 AI 助手的权限,请联系管理员开通。'}
provider = self.provider_id
+5 -5
View File
@@ -13,7 +13,7 @@
<field name="name">AI Agent 管理员</field>
<field name="category_id" ref="base.module_category_hidden"/>
<field name="comment">管理 AI 服务商配置</field>
<field name="implied_ids" eval="[(4, ref('yuthon_ai_agent_17.group_ai_agent_user'))]"/>
<field name="implied_ids" eval="[(4, ref('yuthon_ai_agent.group_ai_agent_user'))]"/>
<field name="users" eval="[(4, ref('base.user_admin'))]"/>
</record>
@@ -22,7 +22,7 @@
<field name="name">AI 对话:仅本人</field>
<field name="model_id" ref="model_ai_conversation"/>
<field name="domain_force">[('create_uid','=',user.id)]</field>
<field name="groups" eval="[(4, ref('yuthon_ai_agent_17.group_ai_agent_user'))]"/>
<field name="groups" eval="[(4, ref('yuthon_ai_agent.group_ai_agent_user'))]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
@@ -34,7 +34,7 @@
<field name="name">AI 画像:仅本人</field>
<field name="model_id" ref="model_ai_user_profile"/>
<field name="domain_force">[('user_id','=',user.id)]</field>
<field name="groups" eval="[(4, ref('yuthon_ai_agent_17.group_ai_agent_user'))]"/>
<field name="groups" eval="[(4, ref('yuthon_ai_agent.group_ai_agent_user'))]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
@@ -46,7 +46,7 @@
<field name="name">AI 记忆:仅本人</field>
<field name="model_id" ref="model_ai_user_memory"/>
<field name="domain_force">[('profile_id.user_id','=',user.id)]</field>
<field name="groups" eval="[(4, ref('yuthon_ai_agent_17.group_ai_agent_user'))]"/>
<field name="groups" eval="[(4, ref('yuthon_ai_agent.group_ai_agent_user'))]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
@@ -58,7 +58,7 @@
<field name="name">Token 用量:仅本人</field>
<field name="model_id" ref="model_ai_token_usage"/>
<field name="domain_force">[('user_id','=',user.id)]</field>
<field name="groups" eval="[(4, ref('yuthon_ai_agent_17.group_ai_agent_user'))]"/>
<field name="groups" eval="[(4, ref('yuthon_ai_agent.group_ai_agent_user'))]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="True"/>
+16 -16
View File
@@ -1,17 +1,17 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_ai_provider_read,AI服务商-只读,model_ai_provider,yuthon_ai_agent_17.group_ai_agent_user,1,0,0,0
access_ai_provider_admin,AI服务商-管理员,model_ai_provider,yuthon_ai_agent_17.group_ai_agent_admin,1,1,1,1
access_ai_conversation_user,AI对话-用户,model_ai_conversation,yuthon_ai_agent_17.group_ai_agent_user,1,1,1,1
access_ai_message_user,AI消息-用户,model_ai_message,yuthon_ai_agent_17.group_ai_agent_user,1,1,1,1
access_ai_conversation_admin,AI对话-管理员,model_ai_conversation,yuthon_ai_agent_17.group_ai_agent_admin,1,1,1,1
access_ai_message_admin,AI消息-管理员,model_ai_message,yuthon_ai_agent_17.group_ai_agent_admin,1,1,1,1
access_ai_user_profile_user,AI画像-用户,model_ai_user_profile,yuthon_ai_agent_17.group_ai_agent_user,1,1,1,0
access_ai_user_profile_admin,AI画像-管理员,model_ai_user_profile,yuthon_ai_agent_17.group_ai_agent_admin,1,1,1,1
access_ai_user_memory_user,AI记忆-用户,model_ai_user_memory,yuthon_ai_agent_17.group_ai_agent_user,1,1,1,1
access_ai_user_memory_admin,AI记忆-管理员,model_ai_user_memory,yuthon_ai_agent_17.group_ai_agent_admin,1,1,1,1
access_ai_token_usage_user,Token用量-用户,model_ai_token_usage,yuthon_ai_agent_17.group_ai_agent_user,1,0,1,0
access_ai_token_usage_admin,Token用量-管理员,model_ai_token_usage,yuthon_ai_agent_17.group_ai_agent_admin,1,1,1,1
access_ai_token_usage_summary_user,Token汇总-用户,model_ai_token_usage_summary,yuthon_ai_agent_17.group_ai_agent_user,1,0,0,0
access_ai_token_usage_summary_admin,Token汇总-管理员,model_ai_token_usage_summary,yuthon_ai_agent_17.group_ai_agent_admin,1,0,0,0
access_ai_rule_user,AI规则-用户只读,model_ai_rule,yuthon_ai_agent_17.group_ai_agent_user,1,0,0,0
access_ai_rule_admin,AI规则-管理员,model_ai_rule,yuthon_ai_agent_17.group_ai_agent_admin,1,1,1,1
access_ai_provider_read,AI服务商-只读,model_ai_provider,yuthon_ai_agent.group_ai_agent_user,1,0,0,0
access_ai_provider_admin,AI服务商-管理员,model_ai_provider,yuthon_ai_agent.group_ai_agent_admin,1,1,1,1
access_ai_conversation_user,AI对话-用户,model_ai_conversation,yuthon_ai_agent.group_ai_agent_user,1,1,1,1
access_ai_message_user,AI消息-用户,model_ai_message,yuthon_ai_agent.group_ai_agent_user,1,1,1,1
access_ai_conversation_admin,AI对话-管理员,model_ai_conversation,yuthon_ai_agent.group_ai_agent_admin,1,1,1,1
access_ai_message_admin,AI消息-管理员,model_ai_message,yuthon_ai_agent.group_ai_agent_admin,1,1,1,1
access_ai_user_profile_user,AI画像-用户,model_ai_user_profile,yuthon_ai_agent.group_ai_agent_user,1,1,1,0
access_ai_user_profile_admin,AI画像-管理员,model_ai_user_profile,yuthon_ai_agent.group_ai_agent_admin,1,1,1,1
access_ai_user_memory_user,AI记忆-用户,model_ai_user_memory,yuthon_ai_agent.group_ai_agent_user,1,1,1,1
access_ai_user_memory_admin,AI记忆-管理员,model_ai_user_memory,yuthon_ai_agent.group_ai_agent_admin,1,1,1,1
access_ai_token_usage_user,Token用量-用户,model_ai_token_usage,yuthon_ai_agent.group_ai_agent_user,1,0,1,0
access_ai_token_usage_admin,Token用量-管理员,model_ai_token_usage,yuthon_ai_agent.group_ai_agent_admin,1,1,1,1
access_ai_token_usage_summary_user,Token汇总-用户,model_ai_token_usage_summary,yuthon_ai_agent.group_ai_agent_user,1,0,0,0
access_ai_token_usage_summary_admin,Token汇总-管理员,model_ai_token_usage_summary,yuthon_ai_agent.group_ai_agent_admin,1,0,0,0
access_ai_rule_user,AI规则-用户只读,model_ai_rule,yuthon_ai_agent.group_ai_agent_user,1,0,0,0
access_ai_rule_admin,AI规则-管理员,model_ai_rule,yuthon_ai_agent.group_ai_agent_admin,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_ai_provider_read AI服务商-只读 model_ai_provider yuthon_ai_agent_17.group_ai_agent_user yuthon_ai_agent.group_ai_agent_user 1 0 0 0
3 access_ai_provider_admin AI服务商-管理员 model_ai_provider yuthon_ai_agent_17.group_ai_agent_admin yuthon_ai_agent.group_ai_agent_admin 1 1 1 1
4 access_ai_conversation_user AI对话-用户 model_ai_conversation yuthon_ai_agent_17.group_ai_agent_user yuthon_ai_agent.group_ai_agent_user 1 1 1 1
5 access_ai_message_user AI消息-用户 model_ai_message yuthon_ai_agent_17.group_ai_agent_user yuthon_ai_agent.group_ai_agent_user 1 1 1 1
6 access_ai_conversation_admin AI对话-管理员 model_ai_conversation yuthon_ai_agent_17.group_ai_agent_admin yuthon_ai_agent.group_ai_agent_admin 1 1 1 1
7 access_ai_message_admin AI消息-管理员 model_ai_message yuthon_ai_agent_17.group_ai_agent_admin yuthon_ai_agent.group_ai_agent_admin 1 1 1 1
8 access_ai_user_profile_user AI画像-用户 model_ai_user_profile yuthon_ai_agent_17.group_ai_agent_user yuthon_ai_agent.group_ai_agent_user 1 1 1 0
9 access_ai_user_profile_admin AI画像-管理员 model_ai_user_profile yuthon_ai_agent_17.group_ai_agent_admin yuthon_ai_agent.group_ai_agent_admin 1 1 1 1
10 access_ai_user_memory_user AI记忆-用户 model_ai_user_memory yuthon_ai_agent_17.group_ai_agent_user yuthon_ai_agent.group_ai_agent_user 1 1 1 1
11 access_ai_user_memory_admin AI记忆-管理员 model_ai_user_memory yuthon_ai_agent_17.group_ai_agent_admin yuthon_ai_agent.group_ai_agent_admin 1 1 1 1
12 access_ai_token_usage_user Token用量-用户 model_ai_token_usage yuthon_ai_agent_17.group_ai_agent_user yuthon_ai_agent.group_ai_agent_user 1 0 1 0
13 access_ai_token_usage_admin Token用量-管理员 model_ai_token_usage yuthon_ai_agent_17.group_ai_agent_admin yuthon_ai_agent.group_ai_agent_admin 1 1 1 1
14 access_ai_token_usage_summary_user Token汇总-用户 model_ai_token_usage_summary yuthon_ai_agent_17.group_ai_agent_user yuthon_ai_agent.group_ai_agent_user 1 0 0 0
15 access_ai_token_usage_summary_admin Token汇总-管理员 model_ai_token_usage_summary yuthon_ai_agent_17.group_ai_agent_admin yuthon_ai_agent.group_ai_agent_admin 1 0 0 0
16 access_ai_rule_user AI规则-用户只读 model_ai_rule yuthon_ai_agent_17.group_ai_agent_user yuthon_ai_agent.group_ai_agent_user 1 0 0 0
17 access_ai_rule_admin AI规则-管理员 model_ai_rule yuthon_ai_agent_17.group_ai_agent_admin yuthon_ai_agent.group_ai_agent_admin 1 1 1 1
@@ -5,7 +5,7 @@ import { registry } from "@web/core/registry";
import { useService } from "@web/core/utils/hooks";
export class AiChatAction extends Component {
static template = "yuthon_ai_agent_17.AiChatTemplate";
static template = "yuthon_ai_agent.AiChatTemplate";
// Client Action 接收的 props
static props = ["*"];
@@ -86,4 +86,4 @@ export class AiChatAction extends Component {
}
}
registry.category("actions").add("yuthon_ai_agent_17.chat", AiChatAction);
registry.category("actions").add("yuthon_ai_agent.chat", AiChatAction);
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
<t t-name="yuthon_ai_agent_17.AiChatTemplate">
<t t-name="yuthon_ai_agent.AiChatTemplate">
<div class="o_ai_chat_action d-flex flex-column h-100">
<!-- 头部 -->
<div class="ai-chat-header p-2 border-bottom d-flex justify-content-between align-items-center">
@@ -2,7 +2,7 @@
<templates xml:space="preserve">
<!-- 右上角托盘按钮 -->
<t t-name="yuthon_ai_agent_17.AiSystray">
<t t-name="yuthon_ai_agent.AiSystray">
<div class="o_ai_systray">
<button class="o_ai_systray_btn" t-on-click="toggleChat"
title="AI 助手" aria-label="AI 助手">
@@ -77,7 +77,7 @@
<!-- Client Action: 聊天界面 -->
<record id="action_ai_chat_client" model="ir.actions.client">
<field name="name">AI Chat</field>
<field name="tag">yuthon_ai_agent_17.chat</field>
<field name="tag">yuthon_ai_agent.chat</field>
</record>
<!-- 标准 Window Action(list/form) -->
@@ -91,9 +91,9 @@
<!-- 旧菜单 xmlid 保留但隐藏(menu_ai_root 已在 ai_provider_views.xml 定义) -->
<menuitem id="menu_ai_chat" name="对话管理"
parent="menu_ai_root" action="action_ai_conversation" sequence="99"
groups="yuthon_ai_agent_17.group_ai_agent_admin" active="0"/>
groups="yuthon_ai_agent.group_ai_agent_admin" active="0"/>
<menuitem id="menu_ai_config" name="服务商配置"
parent="menu_ai_root" action="action_ai_provider" sequence="99"
groups="yuthon_ai_agent_17.group_ai_agent_admin" active="0"/>
groups="yuthon_ai_agent.group_ai_agent_admin" active="0"/>
</odoo>
+3 -3
View File
@@ -4,11 +4,11 @@
<!-- 根菜单 & 系统配置父菜单 -->
<!-- ============================================ -->
<menuitem id="menu_ai_root" name="AI 助手" sequence="70"
groups="yuthon_ai_agent_17.group_ai_agent_user,yuthon_ai_agent_17.group_ai_agent_admin"/>
groups="yuthon_ai_agent.group_ai_agent_user,yuthon_ai_agent.group_ai_agent_admin"/>
<menuitem id="menu_system_config" name="系统配置"
parent="menu_ai_root" sequence="50"
groups="yuthon_ai_agent_17.group_ai_agent_admin"/>
groups="yuthon_ai_agent.group_ai_agent_admin"/>
<!-- ============================================ -->
<!-- AI 服务商 - 列表视图 -->
@@ -132,6 +132,6 @@
<!-- 服务商配置菜单 → 归入系统配置 -->
<menuitem id="menu_ai_provider" name="服务商配置"
parent="menu_system_config" action="action_ai_provider" sequence="1"
groups="yuthon_ai_agent_17.group_ai_agent_admin"/>
groups="yuthon_ai_agent.group_ai_agent_admin"/>
</odoo>
+1 -1
View File
@@ -134,6 +134,6 @@
<!-- 菜单 → 系统配置 -->
<menuitem id="menu_ai_rule" name="规则配置"
parent="menu_system_config" action="action_ai_rule" sequence="2"
groups="yuthon_ai_agent_17.group_ai_agent_admin"/>
groups="yuthon_ai_agent.group_ai_agent_admin"/>
</odoo>
@@ -91,11 +91,11 @@
<!-- ============================================ -->
<menuitem id="menu_all_token_usage" name="Token 明细"
parent="menu_system_config" action="action_all_token_usage" sequence="10"
groups="yuthon_ai_agent_17.group_ai_agent_admin" active="0"/>
groups="yuthon_ai_agent.group_ai_agent_admin" active="0"/>
<menuitem id="menu_token_usage_summary" name="Token 汇总"
parent="menu_system_config" action="action_token_usage_summary" sequence="15"
groups="yuthon_ai_agent_17.group_ai_agent_admin" active="0"/>
groups="yuthon_ai_agent.group_ai_agent_admin" active="0"/>
<!-- 兼容旧 XML ID(升级时不残留) -->
<record id="action_my_token_usage" model="ir.actions.act_window">
@@ -106,9 +106,9 @@
</record>
<menuitem id="menu_my_token_usage" name="Token 明细"
parent="menu_ai_root" sequence="99"
groups="yuthon_ai_agent_17.group_ai_agent_admin" active="0"/>
groups="yuthon_ai_agent.group_ai_agent_admin" active="0"/>
<menuitem id="menu_token_management" name="Token 管理"
parent="menu_ai_root" sequence="99"
groups="yuthon_ai_agent_17.group_ai_agent_admin" active="0"/>
groups="yuthon_ai_agent.group_ai_agent_admin" active="0"/>
</odoo>
@@ -128,7 +128,7 @@ action = {
'res_model': 'ai.user.profile',
'res_id': profile.id,
'view_mode': 'form',
'views': [(env.ref('yuthon_ai_agent_17.view_ai_user_profile_form').id, 'form')],
'views': [(env.ref('yuthon_ai_agent.view_ai_user_profile_form').id, 'form')],
'target': 'current',
}
</field>
@@ -152,11 +152,11 @@ action = {
<!-- 管理员:用户列表 → 归入系统配置 -->
<menuitem id="menu_ai_profiles" name="用户列表"
parent="menu_system_config" action="action_all_ai_profiles" sequence="5"
groups="yuthon_ai_agent_17.group_ai_agent_admin"/>
groups="yuthon_ai_agent.group_ai_agent_admin"/>
<!-- 旧 xmlid 保留但隐藏(兼容升级) -->
<menuitem id="menu_user_management" name="用户管理"
parent="menu_ai_root" sequence="99"
groups="yuthon_ai_agent_17.group_ai_agent_admin" active="0"/>
groups="yuthon_ai_agent.group_ai_agent_admin" active="0"/>
</odoo>
+5 -12
View File
@@ -141,18 +141,11 @@ class IssueLibrary(models.Model):
records = self.env['issue.library'].browse(active_ids)
count = 0
for record in records:
if record.class_char:
# 先清理HTML标签
value = record.class_char
value = re.sub(r'<[^>]+>', '', value)
# 再补"次"字
if '班子会' in value and '第' in value:
pattern = r'(第\d+)(班子会)'
new_value = re.sub(pattern, r'\1次\2', value)
else:
new_value = value
if new_value != record.class_char:
record.class_char = new_value
# 只清理party_char的HTML标签
if record.party_char:
clean_value = re.sub(r'<[^>]+>', '', record.party_char)
if clean_value != record.party_char:
record.party_char = clean_value
count += 1
return {
'type': 'ir.actions.client',
@@ -57,6 +57,7 @@
decoration-muted="issue_state == 'cancel'">
<header>
<button name="all_meeting_issue" type="object" string="会议安排" class="oe_highlight" groups="yuthon_salary.group_lc_user"/>
<button name="batch_add_ci_char" type="object" string="批量补'次'字" class="oe_highlight"/>
</header>
<field name="code"/>
<field name="name" column_invisible="1"/>
@@ -21,6 +21,8 @@ class PropertyOpenRent(models.Model):
upset = fields.Float(string="底价")
document_ids = fields.Many2many('ir.attachment', string="附件")
handling_opinions = fields.Text(string="经办意见")
type_stamp_ids = fields.Many2many('seals.type.setting', string='用章类型')
is_chapter = fields.Selection([('yes', '是'), ('no', '否')], string='是否用章', default='no')
# 物业
property_name = fields.Char(string="物业信息")
@@ -41,6 +41,8 @@
<field name="upset" invisible="1"/>
<field name="property_name" readonly="1"/>
<field name="handling_opinions"/>
<field name="is_chapter" string="是否用章"/>
<field name="type_stamp_ids" widget="many2many_tags" string="用章类型" options="{'no_create': True, 'no_open': True}" required="is_chapter" invisible="is_chapter != 'yes'"/>
</group>
</group>
<group>