Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
H
hh_ccs
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
贺阳
hh_ccs
Commits
647974dd
提交
647974dd
authored
8月 26, 2025
作者:
贺阳
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
倒序和漏推优化
上级
2c0fb2dc
显示空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
82 行增加
和
101 行删除
+82
-101
bl_patrol.py
ccs_connect_tiktok/models/bl_patrol.py
+82
-101
没有找到文件。
ccs_connect_tiktok/models/bl_patrol.py
浏览文件 @
647974dd
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
import
logging
import
logging
import
re
import
re
from
datetime
import
datetime
,
timedelta
from
datetime
import
timedelta
from
odoo
import
models
,
fields
,
api
,
_
from
odoo
import
models
,
fields
,
api
from
odoo.exceptions
import
UserError
from
odoo.exceptions
import
UserError
_logger
=
logging
.
getLogger
(
__name__
)
_logger
=
logging
.
getLogger
(
__name__
)
...
@@ -65,13 +66,6 @@ class BlPatrol(models.Model):
...
@@ -65,13 +66,6 @@ class BlPatrol(models.Model):
except
Exception
as
e
:
except
Exception
as
e
:
_logger
.
error
(
f
"提单巡查失败: {str(e)}"
)
_logger
.
error
(
f
"提单巡查失败: {str(e)}"
)
# 如果有巡查记录,更新状态为失败
if
'patrol'
in
locals
():
patrol
.
write
({
'state'
:
'failed'
,
'package_issues'
:
f
"巡查执行失败: {str(e)}"
,
'bl_issues'
:
f
"巡查执行失败: {str(e)}"
})
raise
UserError
(
f
"巡查失败: {str(e)}"
)
raise
UserError
(
f
"巡查失败: {str(e)}"
)
def
_execute_patrol
(
self
):
def
_execute_patrol
(
self
):
...
@@ -85,59 +79,59 @@ class BlPatrol(models.Model):
...
@@ -85,59 +79,59 @@ class BlPatrol(models.Model):
"""
"""
# 获取配置
# 获取配置
config
=
self
.
env
[
'ir.config_parameter'
]
.
sudo
()
config
=
self
.
env
[
'ir.config_parameter'
]
.
sudo
()
check_days
=
int
(
config
.
get_param
(
'patrol_check_days'
,
default
=
5
))
#
巡查天数
check_days
=
int
(
config
.
get_param
(
'patrol_check_days'
,
default
=
5
))
#
巡查天数
# 计算检查日期范围
# 计算检查日期范围
end_date
=
fields
.
Date
.
today
()
end_date
=
fields
.
Date
.
today
()
start_date
=
end_date
-
timedelta
(
days
=
check_days
)
start_date
=
end_date
-
timedelta
(
days
=
check_days
)
# 查找符合条件的提单 提单日期为近x天(默认5天),清关中和完成的提单。
# 查找符合条件的提单 提单日期为近x天(默认5天),清关中和完成的提单。
bls
=
self
.
env
[
'cc.bl'
]
.
sudo
()
.
search
([(
'bl_date'
,
'>='
,
start_date
),(
'bl_date'
,
'<='
,
end_date
),(
'state'
,
'in'
,
[
'ccing'
,
'done'
])])
bls
=
self
.
env
[
'cc.bl'
]
.
sudo
()
.
search
(
[(
'bl_date'
,
'>='
,
start_date
),
(
'bl_date'
,
'<='
,
end_date
),
(
'state'
,
'in'
,
[
'ccing'
,
'done'
])])
_logger
.
info
(
f
"开始巡查提单,检查范围: {start_date} 到 {end_date}, 提单数量: {len(bls)}"
)
_logger
.
info
(
f
"开始巡查提单,检查范围: {start_date} 到 {end_date}, 提单数量: {len(bls)}"
)
package_issues
=
[]
error_
package_issues
=
[]
bl_issues
=
[]
error_
bl_issues
=
[]
global_issue_counter
=
1
package_issue_counter
=
1
# 小包问题独立编号
bl_issue_counter
=
1
# 提单问题独立编号
for
bl
in
bls
:
for
bl
in
bls
:
# 检查小包轨迹问题
# 检查小包轨迹问题
bl_package_issues
=
self
.
_check_package_tracking_issues
(
bl
)
bl_package_issues
=
self
.
_check_package_tracking_issues
(
bl
)
if
bl_package_issues
:
if
bl_package_issues
:
# 为小包问题添加
全局
编号
# 为小包问题添加
独立
编号
for
i
,
issue
in
enumerate
(
bl_package_issues
):
for
i
,
issue
in
enumerate
(
bl_package_issues
):
# 使用正则表达式匹配任何数字+顿号的格式
# 使用正则表达式匹配任何数字+顿号的格式
if
re
.
match
(
r'^\d+、'
,
issue
):
if
re
.
match
(
r'^\d+、'
,
issue
):
# 替换开头的编号
# 替换开头的编号
bl_package_issues
[
i
]
=
re
.
sub
(
r'^\d+、'
,
f
"{
global
_issue_counter}、"
,
issue
,
1
)
bl_package_issues
[
i
]
=
re
.
sub
(
r'^\d+、'
,
f
"{
package
_issue_counter}、"
,
issue
,
1
)
else
:
else
:
# 如果没有编号,添加编号
# 如果没有编号,添加编号
bl_package_issues
[
i
]
=
f
"{
global
_issue_counter}、{issue}"
bl_package_issues
[
i
]
=
f
"{
package
_issue_counter}、{issue}"
global
_issue_counter
+=
1
package
_issue_counter
+=
1
package_issues
.
extend
(
bl_package_issues
)
error_
package_issues
.
extend
(
bl_package_issues
)
# 检查提单关务节点问题
# 检查提单关务节点问题
bl_node_issues
=
self
.
_check_bl_node_issues
(
bl
)
bl_node_issues
=
self
.
_check_bl_node_issues
(
bl
)
if
bl_node_issues
:
if
bl_node_issues
:
# 为提单问题添加
全局
编号
# 为提单问题添加
独立
编号
for
i
,
issue
in
enumerate
(
bl_node_issues
):
for
i
,
bl
issue
in
enumerate
(
bl_node_issues
):
# 使用正则表达式匹配任何数字+顿号的格式
# 使用正则表达式匹配任何数字+顿号的格式
if
re
.
match
(
r'^\d+、'
,
issue
):
if
re
.
match
(
r'^\d+、'
,
bl
issue
):
# 替换开头的编号
# 替换开头的编号
bl_node_issues
[
i
]
=
re
.
sub
(
r'^\d+、'
,
f
"{
global_issue_counter}、"
,
issue
,
1
)
bl_node_issues
[
i
]
=
re
.
sub
(
r'^\d+、'
,
f
"{
bl_issue_counter}、"
,
bl
issue
,
1
)
else
:
else
:
# 如果没有编号,添加编号
# 如果没有编号,添加编号
bl_node_issues
[
i
]
=
f
"{global_issue_counter}、{issue}"
bl_node_issues
[
i
]
=
f
"{bl_issue_counter}、{blissue}"
global_issue_counter
+=
1
bl_issue_counter
+=
1
bl_issues
.
extend
(
bl_node_issues
)
error_bl_issues
.
extend
(
bl_node_issues
)
return
{
return
{
'success'
:
True
,
'success'
:
True
,
'bl_count'
:
len
(
bls
),
'bl_count'
:
len
(
bls
),
'issue_count'
:
len
(
package_issues
)
+
len
(
bl_issues
),
'issue_count'
:
len
(
error_package_issues
)
+
len
(
error_
bl_issues
),
'package_issues'
:
'
\n
'
.
join
(
package_issues
)
if
package_issues
else
''
,
'package_issues'
:
'
\n
'
.
join
(
error_package_issues
)
if
error_
package_issues
else
''
,
'bl_issues'
:
'
\n
'
.
join
(
bl_issues
)
if
bl_issues
else
''
'bl_issues'
:
'
\n
'
.
join
(
error_bl_issues
)
if
error_
bl_issues
else
''
}
}
def
_check_package_tracking_issues
(
self
,
bl
):
def
_check_package_tracking_issues
(
self
,
bl
):
"""
"""
检查小包轨迹问题
检查小包轨迹问题
- 只检查真正的小包节点,不检查关务节点
"""
"""
issues
=
[]
issues
=
[]
# 按问题类型分组统计
# 按问题类型分组统计
...
@@ -146,29 +140,32 @@ class BlPatrol(models.Model):
...
@@ -146,29 +140,32 @@ class BlPatrol(models.Model):
# 获取该提单下所有小包的同步日志
# 获取该提单下所有小包的同步日志
ship_packages
=
bl
.
ship_package_ids
ship_packages
=
bl
.
ship_package_ids
for
package
in
ship_packages
:
for
package
in
ship_packages
:
sync_logs
=
package
.
sync_log_ids
.
sorted
(
'operate_time'
)
sync_logs
=
package
.
sync_log_ids
# 小包日志
if
len
(
sync_logs
)
<
2
:
# 检查多条日志的倒叙问题 - 只检查小包节点,不检查关务节点
continue
if
len
(
sync_logs
)
>=
2
:
# 检查倒叙问题
for
i
in
range
(
1
,
len
(
sync_logs
)):
for
i
in
range
(
1
,
len
(
sync_logs
)):
current_log
=
sync_logs
[
i
]
current_log
=
sync_logs
[
i
]
# 当前日志
previous_log
=
sync_logs
[
i
-
1
]
previous_log
=
sync_logs
[
i
-
1
]
# 前一个日志
if
current_log
.
operate_time
<
previous_log
.
operate_time
:
current_time
=
current_log
.
operate_time
# 当前日志时间
previous_time
=
previous_log
.
operate_time
# 前一个日志时间
if
current_time
and
previous_time
and
current_time
<
previous_time
:
try
:
try
:
progress_name
=
current_log
.
progress_name
or
"空"
# 检查节点类型,只处理小包节点
process_code
=
current_log
.
process_code
or
"空"
node
=
self
.
env
[
'cc.node'
]
.
sudo
()
.
search
(
[(
'node_type'
,
'='
,
'package'
),
(
'tk_code'
,
'='
,
current_log
.
process_code
)])
if
node
:
# 只处理小包节点
progress_name
=
node
.
name
or
"空"
process_code
=
node
.
tk_code
or
"空"
issue_key
=
f
"{progress_name}({process_code})倒叙"
issue_key
=
f
"{progress_name}({process_code})倒叙"
if
issue_key
not
in
reverse_issues
:
if
issue_key
not
in
reverse_issues
:
reverse_issues
[
issue_key
]
=
[]
reverse_issues
[
issue_key
]
=
[]
reverse_issues
[
issue_key
]
.
append
(
package
.
logistic_order_no
)
reverse_issues
[
issue_key
]
.
append
(
package
.
logistic_order_no
)
except
Exception
as
e
:
except
Exception
as
e
:
_logger
.
warning
(
f
"构建小包倒叙问题描述失败: {str(e)}"
)
_logger
.
warning
(
f
"构建小包倒叙问题描述失败: {str(e)}"
)
issue_key
=
"节点倒叙"
# 如果无法确定节点类型,跳过
if
issue_key
not
in
reverse_issues
:
continue
reverse_issues
[
issue_key
]
=
[]
reverse_issues
[
issue_key
]
.
append
(
package
.
logistic_order_no
)
# 检查漏推问题 - 只检查小包节点
break
# 检查漏推问题 - 根据节点配置检查
package_issues
=
self
.
_check_package_missing_nodes
(
package
,
sync_logs
)
package_issues
=
self
.
_check_package_missing_nodes
(
package
,
sync_logs
)
for
issue
in
package_issues
:
for
issue
in
package_issues
:
# 提取问题类型
# 提取问题类型
...
@@ -196,13 +193,15 @@ class BlPatrol(models.Model):
...
@@ -196,13 +193,15 @@ class BlPatrol(models.Model):
issue_counter
=
1
issue_counter
=
1
for
issue_type
,
packages
in
reverse_issues
.
items
():
for
issue_type
,
packages
in
reverse_issues
.
items
():
package_list
=
self
.
_format_package_list
(
packages
)
package_list
=
self
.
_format_package_list
(
packages
)
issues
.
append
(
f
"{issue_counter}、{bl.bl_no},出现{issue_type},涉及小包{len(packages)},小包追踪号包括{package_list}"
)
issues
.
append
(
f
"{issue_counter}、{bl.bl_no},出现{issue_type},涉及小包{len(packages)},小包追踪号包括{package_list}"
)
issue_counter
+=
1
issue_counter
+=
1
# 格式化漏推问题
# 格式化漏推问题
for
issue_type
,
packages
in
missing_issues
.
items
():
for
issue_type
,
packages
in
missing_issues
.
items
():
package_list
=
self
.
_format_package_list
(
packages
)
package_list
=
self
.
_format_package_list
(
packages
)
issues
.
append
(
f
"{issue_counter}、{bl.bl_no},出现{issue_type},涉及小包{len(packages)},小包追踪号包括{package_list}"
)
issues
.
append
(
f
"{issue_counter}、{bl.bl_no},出现{issue_type},涉及小包{len(packages)},小包追踪号包括{package_list}"
)
issue_counter
+=
1
issue_counter
+=
1
return
issues
return
issues
...
@@ -214,10 +213,8 @@ class BlPatrol(models.Model):
...
@@ -214,10 +213,8 @@ class BlPatrol(models.Model):
try
:
try
:
# 过滤掉None和空字符串
# 过滤掉None和空字符串
valid_packages
=
[
pkg
for
pkg
in
packages
if
pkg
and
str
(
pkg
)
.
strip
()]
valid_packages
=
[
pkg
for
pkg
in
packages
if
pkg
and
str
(
pkg
)
.
strip
()]
if
not
valid_packages
:
if
not
valid_packages
:
return
"无有效追踪号"
return
"无有效追踪号"
if
len
(
valid_packages
)
<=
10
:
if
len
(
valid_packages
)
<=
10
:
return
"/"
.
join
(
valid_packages
)
return
"/"
.
join
(
valid_packages
)
else
:
else
:
...
@@ -231,33 +228,24 @@ class BlPatrol(models.Model):
...
@@ -231,33 +228,24 @@ class BlPatrol(models.Model):
检查小包漏推节点
检查小包漏推节点
"""
"""
issues
=
[]
issues
=
[]
# 获取所有小包节点,按顺序排序
# 获取所有小包节点,按顺序排序
package_nodes
=
self
.
env
[
'cc.node'
]
.
sudo
()
.
search
([
package_nodes
=
self
.
env
[
'cc.node'
]
.
sudo
()
.
search
([(
'node_type'
,
'='
,
'package'
)],
order
=
'seq'
)
(
'node_type'
,
'='
,
'package'
)
],
order
=
'seq'
)
if
not
package_nodes
:
if
not
package_nodes
:
return
issues
return
issues
# 检查每个节点是否有对应的同步日志
# 检查每个节点是否有对应的同步日志
for
node
in
package_nodes
:
for
node
in
package_nodes
:
# 跳过当前节点(最后一个节点)
# 跳过当前节点(最后一个节点)
if
node
==
package_nodes
[
-
1
]:
if
node
==
package_nodes
[
-
1
]:
continue
continue
# 跳过初始节点(is_default=True)
# 跳过初始节点(is_default=True)
if
getattr
(
node
,
'is_default'
,
False
):
if
getattr
(
node
,
'is_default'
,
False
):
continue
continue
# 检查是否有该节点的同步日志
# 检查是否有该节点的同步日志
has_node_log
=
any
(
log
.
process_code
==
node
.
tk_code
for
log
in
sync_logs
)
has_node_log
=
any
(
log
.
process_code
==
node
.
tk_code
for
log
in
sync_logs
)
# 检查后续节点是否有日志
# 检查后续节点是否有日志
next_nodes
=
package_nodes
.
filtered
(
lambda
n
:
n
.
seq
>
node
.
seq
)
next_nodes
=
package_nodes
.
filtered
(
lambda
n
:
n
.
seq
>
node
.
seq
)
for
next_node
in
next_nodes
:
for
next_node
in
next_nodes
:
has_next_log
=
any
(
log
.
process_code
==
next_node
.
tk_code
for
log
in
sync_logs
)
has_next_log
=
any
(
log
.
process_code
==
next_node
.
tk_code
for
log
in
sync_logs
)
# 如果后续节点有日志但当前节点没有,说明漏推
# 如果后续节点有日志但当前节点没有,说明漏推
if
has_next_log
and
not
has_node_log
:
if
has_next_log
and
not
has_node_log
:
try
:
try
:
...
@@ -278,41 +266,45 @@ class BlPatrol(models.Model):
...
@@ -278,41 +266,45 @@ class BlPatrol(models.Model):
检查提单关务节点问题
检查提单关务节点问题
"""
"""
issues
=
[]
issues
=
[]
sync_logs
=
bl
.
bl_sync_log_ids
# 提单日志
# 获取提单同步日志
sync_logs
=
bl
.
bl_sync_log_ids
.
sorted
(
'operate_time'
)
if
len
(
sync_logs
)
<
2
:
return
issues
# 检查倒叙问题
# 检查倒叙问题
issue_counter
=
1
if
len
(
sync_logs
)
>=
2
:
for
i
in
range
(
1
,
len
(
sync_logs
)):
_logger
.
info
(
f
"=== 提单 {bl.bl_no} 倒序检查调试 ==="
)
current_log
=
sync_logs
[
i
]
# 获取所有提单节点,按业务顺序排序
previous_log
=
sync_logs
[
i
-
1
]
bl_nodes
=
self
.
env
[
'cc.node'
]
.
sudo
()
.
search
([(
'node_type'
,
'='
,
'bl'
)],
order
=
'seq'
)
if
bl_nodes
:
if
current_log
.
operate_time
<
previous_log
.
operate_time
:
# 收集所有有日志的节点及其时间
node_logs
=
{}
# {node_index: (node, log, time)}
for
i
,
node
in
enumerate
(
bl_nodes
):
for
log
in
sync_logs
:
if
log
.
process_code
==
node
.
tk_code
:
node_logs
[
i
]
=
(
node
,
log
,
log
.
operate_time
)
break
# 遍历每个有日志的节点,与前面所有有日志的节点比较
for
current_idx
in
sorted
(
node_logs
.
keys
()):
current_node
,
current_log
,
current_time
=
node_logs
[
current_idx
]
# 与前面所有有日志的节点比较
for
prev_idx
in
sorted
(
node_logs
.
keys
()):
if
prev_idx
>=
current_idx
:
# 跳过自己和自己后面的节点
continue
prev_node
,
prev_log
,
prev_time
=
node_logs
[
prev_idx
]
# 检查时间顺序
if
current_time
and
prev_time
:
if
current_time
<
prev_time
:
try
:
try
:
progress_name
=
current_log
.
progress_name
or
"空"
progress_name
=
current_log
.
progress_name
or
"空"
process_code
=
current_log
.
process_code
or
"空"
process_code
=
current_log
.
process_code
or
"空"
issues
.
append
(
issues
.
append
(
f
"{issue_counter}、
{bl.bl_no},出现{progress_name}({process_code})倒叙"
f
"
{bl.bl_no},出现{progress_name}({process_code})倒叙"
)
)
except
Exception
as
e
:
except
Exception
as
e
:
_logger
.
warning
(
f
"构建倒叙问题描述失败: {str(e)}"
)
_logger
.
warning
(
f
"构建倒序问题描述失败: {str(e)}"
)
issues
.
append
(
f
"{issue_counter}、{bl.bl_no},出现节点倒叙"
)
issues
.
append
(
f
"{bl.bl_no},出现节点倒叙"
)
break
# 检查漏推问题
# 检查漏推问题
bl_issues
=
self
.
_check_bl_missing_nodes
(
bl
,
sync_logs
)
missing_issues
=
self
.
_check_bl_missing_nodes
(
bl
,
sync_logs
)
if
bl_issues
:
if
missing_issues
:
# 为漏推问题添加编号
issues
.
extend
(
missing_issues
)
for
i
,
issue
in
enumerate
(
bl_issues
,
start
=
len
(
issues
)
+
1
):
if
issue
.
startswith
(
"1."
):
# 替换开头的编号
bl_issues
[
i
-
1
]
=
issue
.
replace
(
"1."
,
f
"{i}、"
,
1
)
issues
.
extend
(
bl_issues
)
return
issues
return
issues
def
_check_bl_missing_nodes
(
self
,
bl
,
sync_logs
):
def
_check_bl_missing_nodes
(
self
,
bl
,
sync_logs
):
...
@@ -320,46 +312,36 @@ class BlPatrol(models.Model):
...
@@ -320,46 +312,36 @@ class BlPatrol(models.Model):
检查提单漏推节点
检查提单漏推节点
"""
"""
issues
=
[]
issues
=
[]
# 获取所有提单节点,按顺序排序
# 获取所有提单节点,按顺序排序
bl_nodes
=
self
.
env
[
'cc.node'
]
.
sudo
()
.
search
([
bl_nodes
=
self
.
env
[
'cc.node'
]
.
sudo
()
.
search
([(
'node_type'
,
'='
,
'bl'
)],
order
=
'seq'
)
(
'node_type'
,
'='
,
'bl'
)
],
order
=
'seq'
)
if
not
bl_nodes
:
if
not
bl_nodes
:
return
issues
return
issues
# 检查每个节点是否有对应的同步日志
# 检查每个节点是否有对应的同步日志
for
node
in
bl_nodes
:
for
node
in
bl_nodes
:
# 跳过当前节点(最后一个节点)
# 跳过当前节点(最后一个节点)
if
node
==
bl_nodes
[
-
1
]:
if
node
==
bl_nodes
[
-
1
]:
continue
continue
# 跳过初始节点(is_default=True)
# 跳过初始节点(is_default=True)
if
getattr
(
node
,
'is_default'
,
False
):
if
getattr
(
node
,
'is_default'
,
False
):
continue
continue
# 检查是否有该节点的同步日志
# 检查是否有该节点的同步日志
has_node_log
=
any
(
log
.
process_code
==
node
.
tk_code
for
log
in
sync_logs
)
has_node_log
=
any
(
log
.
process_code
==
node
.
tk_code
for
log
in
sync_logs
)
# 检查后续节点是否有日志
# 检查后续节点是否有日志
next_nodes
=
bl_nodes
.
filtered
(
lambda
n
:
n
.
seq
>
node
.
seq
)
next_nodes
=
bl_nodes
.
filtered
(
lambda
n
:
n
.
seq
>
node
.
seq
)
for
next_node
in
next_nodes
:
for
next_node
in
next_nodes
:
has_next_log
=
any
(
log
.
process_code
==
next_node
.
tk_code
for
log
in
sync_logs
)
has_next_log
=
any
(
log
.
process_code
==
next_node
.
tk_code
for
log
in
sync_logs
)
# 如果后续节点有日志但当前节点没有,说明漏推
# 如果后续节点有日志但当前节点没有,说明漏推
if
has_next_log
and
not
has_node_log
:
if
has_next_log
and
not
has_node_log
:
try
:
try
:
node_name
=
node
.
name
or
"空"
node_name
=
node
.
name
or
"空"
tk_code
=
node
.
tk_code
or
"空"
tk_code
=
node
.
tk_code
or
"空"
issues
.
append
(
issues
.
append
(
f
"
1.
{bl.bl_no},出现{node_name}({tk_code})轨迹漏推"
f
"{bl.bl_no},出现{node_name}({tk_code})轨迹漏推"
)
)
except
Exception
as
e
:
except
Exception
as
e
:
_logger
.
warning
(
f
"构建提单漏推问题描述失败: {str(e)}"
)
_logger
.
warning
(
f
"构建提单漏推问题描述失败: {str(e)}"
)
issues
.
append
(
f
"
1.
{bl.bl_no},出现节点轨迹漏推"
)
issues
.
append
(
f
"{bl.bl_no},出现节点轨迹漏推"
)
break
break
return
issues
return
issues
def
_send_patrol_email
(
self
,
result
):
def
_send_patrol_email
(
self
,
result
):
...
@@ -371,7 +353,6 @@ class BlPatrol(models.Model):
...
@@ -371,7 +353,6 @@ class BlPatrol(models.Model):
config
=
self
.
env
[
'ir.config_parameter'
]
.
sudo
()
config
=
self
.
env
[
'ir.config_parameter'
]
.
sudo
()
receiver_emails
=
config
.
get_param
(
'patrol_receiver_emails'
,
default
=
''
)
receiver_emails
=
config
.
get_param
(
'patrol_receiver_emails'
,
default
=
''
)
sender_email
=
config
.
get_param
(
'patrol_sender_email'
,
default
=
''
)
sender_email
=
config
.
get_param
(
'patrol_sender_email'
,
default
=
''
)
if
not
receiver_emails
or
not
sender_email
:
if
not
receiver_emails
or
not
sender_email
:
_logger
.
warning
(
"邮件配置不完整,跳过邮件发送"
)
_logger
.
warning
(
"邮件配置不完整,跳过邮件发送"
)
return
return
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论