提交 fe4152be authored 作者: 刘擎阳's avatar 刘擎阳

1.新增ocr配置

上级 390b718b
......@@ -258,6 +258,34 @@ class OrderStateChangeRule(models.Model):
logging.info('邮件正文提取单号: %s' % text_arr)
attachment_arr = kwargs['attachment_arr']
attachment_tuple_arr = attachment_arr if attachment_arr else []
try:
from ..pdf_tools.baidu_ocr_config import get_baidu_ocr_config
from ..pdf_tools import awb_page_merger
ICP = self.env['ir.config_parameter'].sudo()
# 1. 组装 Odoo 系统参数
odoo_ocr_config = {
"baidu_ocr_app_id": ICP.get_param('ocr.baidu_app_id', ''),
"baidu_ocr_api_key": ICP.get_param('ocr.baidu_api_key', ''),
"baidu_ocr_secret_key": ICP.get_param('ocr.baidu_secret_key', ''),
# Odoo的系统参数存的都是字符串,所以需要做类型转换
"ocr_enabled": ICP.get_param('ocr.enabled') == 'True',
"ocr_timeout": int(ICP.get_param('ocr.timeout', 30)),
"max_retries": int(ICP.get_param('ocr.max_retries', 3)),
}
print(odoo_ocr_config)
# 2. 注入配置:传 save_to_file=False 保证只在当前运行内存生效,不修改底层 json
ocr_config_manager = get_baidu_ocr_config()
ocr_config_manager.update_config(odoo_ocr_config, save_to_file=False)
# 3. 核心!清理 awb_page_merger 中的全局懒加载缓存
# 因为 awb_page_merger 缓存了 _OCR_EXTRACTOR 实例
# 必须重置为 None,否则如果在 Odoo 界面修改了秘钥,系统还会继续使用旧秘钥
awb_page_merger._OCR_EXTRACTOR = None
logging.info("Odoo OCR 配置注入成功")
except ImportError as e:
logging.error(f"导入 OCR 模块失败,请检查路径: {e}")
except Exception as e:
logging.error(f"注入 OCR 配置时发生错误: {e}")
try:
# 清洗邮件正文提取的单号
text_arr = [i.replace('-', '').replace(' ', '').replace('\xa0', '') for i in text_arr]
......
......@@ -17,6 +17,15 @@ class ResConfigSettings(models.TransientModel):
is_package_scan = fields.Boolean(
'一键全扫开关', default=False, config_parameter='is_package_scan')
# OCR 相关配置
baidu_ocr_app_id = fields.Char(string="Baidu OCR App ID", config_parameter='ocr.baidu_app_id')
baidu_ocr_api_key = fields.Char(string="Baidu OCR API Key", config_parameter='ocr.baidu_api_key')
baidu_ocr_secret_key = fields.Char(string="Baidu OCR Secret Key", config_parameter='ocr.baidu_secret_key')
ocr_enabled = fields.Boolean(string="是否启用 OCR", config_parameter='ocr.enabled', default=True)
ocr_timeout = fields.Integer(string="OCR 超时时间(秒)", config_parameter='ocr.timeout', default=30)
ocr_max_retries = fields.Integer(string="最大重试次数", config_parameter='ocr.max_retries', default=3)
@api.model
def get_values(self):
"""
......
......@@ -140,15 +140,27 @@ class BaiduOCRConfig:
"""获取所有配置"""
return self._config.copy()
def update_config(self, config_dict: Dict) -> None:
# def update_config(self, config_dict: Dict) -> None:
# """
# 批量更新配置
#
# Args:
# config_dict: 配置字典
# """
# self._config.update(config_dict)
# self._save_config(self._config)
def update_config(self, config_dict: Dict, save_to_file: bool = True) -> None:
"""
批量更新配置
Args:
config_dict: 配置字典
save_to_file: 是否将配置持久化写入本地 JSON 文件
"""
self._config.update(config_dict)
self._save_config(self._config)
if save_to_file:
self._save_config(self._config)
# 全局配置实例
......
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="res_config_settings_view_form_ocr_inherit" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.ocr</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="base_setup.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('app_settings_block')]/div" position="before">
<!-- OCR 配置板块 -->
<div id="ocr_baidu_config">
<h2>百度 OCR 接口配置</h2>
<div class="row mt16 o_settings_container">
<!-- 开启/关闭开关 -->
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="ocr_enabled"/>
</div>
<div class="o_setting_right_pane">
<label for="ocr_enabled"/>
<div class="text-muted">
开启后,系统将自动识别附件 PDF 中的提单号
</div>
</div>
</div>
<!-- 百度参数设置 -->
<div class="col-12 col-lg-6 o_setting_box" attrs="{'invisible': [('ocr_enabled', '=', False)]}">
<div class="o_setting_right_pane">
<div class="content-group">
<div class="row mt16">
<label for="baidu_ocr_app_id" string="App ID" class="col-lg-3 o_light_label"/>
<field name="baidu_ocr_app_id"/>
</div>
<div class="row">
<label for="baidu_ocr_api_key" string="API Key" class="col-lg-3 o_light_label"/>
<field name="baidu_ocr_api_key"/>
</div>
<div class="row">
<label for="baidu_ocr_secret_key" string="Secret Key" class="col-lg-3 o_light_label"/>
<field name="baidu_ocr_secret_key" password="True"/>
</div>
</div>
</div>
</div>
<!-- 超时与重试设置 -->
<div class="col-12 col-lg-6 o_setting_box" attrs="{'invisible': [('ocr_enabled', '=', False)]}">
<div class="o_setting_right_pane">
<div class="text-muted">
<label for="ocr_timeout" string="超时时间(秒)"/>
<field name="ocr_timeout" style="width: 50px;"/>
</div>
<div class="text-muted">
<label for="ocr_max_retries" string="最大重试次数"/>
<field name="ocr_max_retries" style="width: 50px;"/>
</div>
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
</data>
</odoo>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论