Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
H
hh_ccs
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
贺阳
hh_ccs
Commits
322c45ab
提交
322c45ab
authored
2月 18, 2025
作者:
贺阳
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
1、在清关节点设置上新增字段:前序节点间隔时间【默认为20】
2、如果有需要修改的节点时,检查前面所有的节点有没有同步过,没有同步的需要同步,前置的时间根据节点的前置节点间隔时间计算,后续的增加系统参数
上级
d2c0172c
显示空白字符变更
内嵌
并排
正在显示
7 个修改的文件
包含
172 行增加
和
60 行删除
+172
-60
data.xml
ccs_base/data/data.xml
+7
-0
cc_bill_loading.py
ccs_base/models/cc_bill_loading.py
+0
-53
order_controller.py
ccs_connect_tiktok/controllers/order_controller.py
+1
-0
zh_CN.po
ccs_connect_tiktok/i18n/zh_CN.po
+61
-2
cc_bill_loading.py
ccs_connect_tiktok/models/cc_bill_loading.py
+82
-0
cc_node.py
ccs_connect_tiktok/models/cc_node.py
+16
-5
cc_node_view.xml
ccs_connect_tiktok/views/cc_node_view.xml
+5
-0
没有找到文件。
ccs_base/data/data.xml
浏览文件 @
322c45ab
...
...
@@ -21,5 +21,11 @@
<field
name=
"value"
>
847896395@qq.com
</field>
</record>
<record
id=
"next_minutes"
model=
"ir.config_parameter"
>
<field
name=
"key"
>
next_minutes
</field>
<field
name=
"value"
>
20
</field>
</record>
</data>
</odoo>
\ No newline at end of file
ccs_base/models/cc_bill_loading.py
浏览文件 @
322c45ab
...
...
@@ -1080,59 +1080,6 @@ class CcBL(models.Model):
logging
.
warning
(
f
"Attempt {i + 1}/{max_retries} failed. Retrying..."
)
return
False
def
mail_auto_push
(
self
,
mail_time
=
False
,
ship_packages
=
[],
action_type
=
'tally'
):
self
=
self
.
with_context
(
dict
(
self
.
_context
,
is_mail
=
True
))
for
item
in
self
:
try
:
if
mail_time
:
utc_time
=
datetime
.
strptime
(
mail_time
,
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
)
before_min
=
self
.
env
[
'ir.config_parameter'
]
.
sudo
()
.
get_param
(
'before_min'
)
or
10
before_utc_time
=
utc_time
-
timedelta
(
minutes
=
int
(
before_min
))
item
.
push_clear_customs_start
(
before_utc_time
)
# 尝试调用 callback_track
if
self
.
try_callback_track
():
item
.
push_clear_customs_end
(
utc_time
)
# 再次尝试调用 callback_track
if
not
self
.
try_callback_track
():
logging
.
error
(
f
"Failed to push item after {3} attempts."
)
else
:
logging
.
error
(
f
"Failed to start process for item after {3} attempts."
)
elif
ship_packages
:
ship_package_ids
=
[
ship_package_dict
[
'id'
]
for
ship_package_dict
in
ship_packages
if
ship_package_dict
[
'id'
]]
tally_state
=
'checked_goods'
if
action_type
==
'tally'
else
'handover_completed'
node_obj
=
self
.
env
[
'cc.node'
]
.
sudo
()
.
search
([
(
'node_type'
,
'='
,
'package'
),
(
'tally_state'
,
'='
,
tally_state
)
# Check for both states
],
order
=
'seq asc'
)
# Order by sequence and creation date ascending
if
node_obj
:
for
index
,
node
in
enumerate
(
node_obj
):
for
ship_package_dict
in
ship_packages
:
ship_package_id
=
ship_package_dict
[
'id'
]
ship_package
=
self
.
env
[
'cc.ship.package'
]
.
browse
(
ship_package_id
)
# 小包
tally_time
=
ship_package_dict
[
'tally_time'
]
operation_time
=
(
datetime
.
strptime
(
tally_time
,
'
%
Y-
%
m-
%
d
%
H:
%
M:
%
S'
)
+
timedelta
(
minutes
=
20
*
index
))
if
tally_time
else
fields
.
Datetime
.
now
()
+
timedelta
(
minutes
=
20
*
index
)
# Increment time by 20 minutes for each node
state_node_obj
=
self
.
env
[
'cc.node'
]
.
sudo
()
.
search
(
[(
'node_type'
,
'='
,
'package'
),
(
'name'
,
'='
,
ship_package
.
state
.
name
)],
limit
=
1
)
if
state_node_obj
.
seq
<
node
.
seq
:
# Ensure the current state is valid
ship_package
.
write
({
'state'
:
node
.
id
,
'process_time'
:
operation_time
,
'state_explain'
:
node
.
desc
,
'is_sync'
:
True
if
node
.
is_default
else
False
})
if
self
.
state
==
'draft'
and
self
.
ship_package_ids
.
filtered
(
lambda
line
:
line
.
state
.
tk_code
==
'cb_imcustoms_start'
):
self
.
ccing_func
()
# 同步状态
# 尝试调用 callback_track
self
.
try_callback_track
(
max_retries
=
2
,
ship_package_ids
=
ship_package_ids
)
except
Exception
as
err
:
logging
.
error
(
'fetch_mail_dlv--error:
%
s'
%
str
(
err
))
# 增加一个清关进度的业务对象,继承自models.Model, 用于管理业务数据.业务数据包括提单号、清关节点(业务对象)、进度日期、进度描述、更新人
class
CcProgress
(
models
.
Model
):
...
...
ccs_connect_tiktok/controllers/order_controller.py
浏览文件 @
322c45ab
...
...
@@ -242,6 +242,7 @@ class OrderController(http.Controller):
email_language
=
lang
)
ship_wizard_obj
.
confirm
()
# 发送邮件
res
[
'state'
]
=
200
logging
.
info
(
'update_big_package_tally_detail ship_packages:
%
s'
%
len
(
ship_packages
))
# 有小包 就更新小包状态和同步
if
ship_packages
:
redis_conn
=
request
.
env
[
'common.common'
]
.
sudo
()
.
get_redis
()
...
...
ccs_connect_tiktok/i18n/zh_CN.po
浏览文件 @
322c45ab
...
...
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 202
4-10-16 08:24
+0000\n"
"PO-Revision-Date: 202
4-10-16 16:25
+0800\n"
"POT-Creation-Date: 202
5-02-18 02:36
+0000\n"
"PO-Revision-Date: 202
5-02-18 10:37
+0800\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: zh\n"
...
...
@@ -112,6 +112,11 @@ msgstr ""
msgid "Created on"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model.fields,help:ccs_connect_tiktok.field_cc_node__interval_minutes
msgid "Default interval time between predecessor nodes in minutes."
msgstr "前置节点之间的默认间隔时间(分钟)。"
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api__display_name
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__display_name
...
...
@@ -196,6 +201,11 @@ msgstr "操作时间"
msgid "Operate User"
msgstr "操作人"
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_node__interval_minutes
msgid "Predecessor Node Interval (Minutes)"
msgstr "前置节点间隔(分钟)"
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.tree_cc_ship_package_view
msgid "Progress"
...
...
@@ -252,6 +262,7 @@ msgstr ""
#: model:ir.actions.act_window,name:ccs_connect_tiktok.action_ao_tt_api_log
#: model:ir.ui.menu,name:ccs_connect_tiktok.menu_ao_flight_tt_api_log
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.form_ao_tt_api_log_view
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.tree_ao_tt_api_log_view
msgid "TIKTOK推送日志"
msgstr ""
...
...
@@ -338,8 +349,14 @@ msgstr ""
msgid "tt推送日志"
msgstr ""
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "上周日志"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__big_bag_no
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "业务信息"
msgstr ""
...
...
@@ -348,11 +365,26 @@ msgstr ""
msgid "产生时间"
msgstr ""
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "今日日志"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__data_text
msgid "传输数据"
msgstr ""
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "分组"
msgstr ""
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "失败"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__error_msg
msgid "失败原因"
...
...
@@ -363,6 +395,11 @@ msgstr ""
msgid "客户"
msgstr ""
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "成功"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.actions.server,name:ccs_connect_tiktok.action_batch_update_package_status
msgid "批量手动处理小包异常数据"
...
...
@@ -388,13 +425,25 @@ msgstr ""
msgid "推出"
msgstr ""
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "昨日日志"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__success_bl
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "是否成功"
msgstr ""
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "本周日志"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__source
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "类型"
msgstr ""
...
...
@@ -402,3 +451,13 @@ msgstr ""
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__request_id
msgid "请求id"
msgstr ""
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "近30日日志"
msgstr ""
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "近7日日志"
msgstr ""
ccs_connect_tiktok/models/cc_bill_loading.py
浏览文件 @
322c45ab
...
...
@@ -7,6 +7,7 @@ import logging
import
pytz
import
ssl
from
datetime
import
datetime
from
datetime
import
timedelta
,
datetime
from
lxml
import
etree
from
odoo
import
models
,
fields
,
api
,
tools
,
_
from
odoo.exceptions
import
ValidationError
,
Warning
...
...
@@ -384,6 +385,87 @@ class CcBl(models.Model):
lambda
r
:
r
.
bl_no
.
replace
(
'-'
,
''
)
.
replace
(
' '
,
''
)
.
lower
()
==
processed_bl_no
)
# 提单
return
bl_obj
def
mail_auto_push
(
self
,
mail_time
=
False
,
ship_packages
=
[],
action_type
=
'tally'
):
self
=
self
.
with_context
(
dict
(
self
.
_context
,
is_mail
=
True
))
for
item
in
self
:
try
:
if
mail_time
:
utc_time
=
datetime
.
strptime
(
mail_time
,
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
)
before_min
=
self
.
env
[
'ir.config_parameter'
]
.
sudo
()
.
get_param
(
'before_min'
)
or
10
before_utc_time
=
utc_time
-
timedelta
(
minutes
=
int
(
before_min
))
item
.
push_clear_customs_start
(
before_utc_time
)
# 尝试调用 callback_track
if
self
.
try_callback_track
():
item
.
push_clear_customs_end
(
utc_time
)
# 再次尝试调用 callback_track
if
not
self
.
try_callback_track
():
logging
.
error
(
f
"Failed to push item after {3} attempts."
)
else
:
logging
.
error
(
f
"Failed to start process for item after {3} attempts."
)
elif
ship_packages
:
ship_package_ids
=
[
ship_package_dict
[
'id'
]
for
ship_package_dict
in
ship_packages
if
ship_package_dict
[
'id'
]]
tally_state
=
'checked_goods'
if
action_type
==
'tally'
else
'handover_completed'
# 后续节点
node_obj
=
self
.
env
[
'cc.node'
]
.
sudo
()
.
search
([
(
'node_type'
,
'='
,
'package'
),
(
'tally_state'
,
'='
,
tally_state
)
# Check for both states
],
order
=
'seq asc'
)
# Order by sequence and creation date ascending
if
node_obj
:
next_minutes
=
int
(
self
.
env
[
'ir.config_parameter'
]
.
sudo
()
.
get_param
(
'next_minutes'
,
default
=
20
))
# 前序节点 理货或尾程交接之前没有生成的节点
before_node_obj
=
self
.
env
[
'cc.node'
]
.
sudo
()
.
search
([
(
'node_type'
,
'='
,
'package'
),
(
'is_must'
,
'='
,
True
),
(
'seq'
,
'<'
,
node_obj
[
0
]
.
seq
)],
order
=
'seq asc'
)
# 理货或尾程交接之前没有生成的节点
for
beforeidx
,
before_node
in
enumerate
(
before_node_obj
):
for
ship_package_dict
in
ship_packages
:
ship_package_id
=
ship_package_dict
[
'id'
]
ship_package
=
self
.
env
[
'cc.ship.package'
]
.
browse
(
ship_package_id
)
# 小包
tally_time
=
ship_package_dict
[
'tally_time'
]
before_minutes
=
before_node
.
calculate_total_interval
(
node_obj
[
0
])
operation_time
=
(
datetime
.
strptime
(
tally_time
,
'
%
Y-
%
m-
%
d
%
H:
%
M:
%
S'
)
-
timedelta
(
minutes
=
before_minutes
))
if
tally_time
else
fields
.
Datetime
.
now
()
-
timedelta
(
minutes
=
before_minutes
)
# 检查有没有同步过,没有同步过需要调用同步
sync_log_obj
=
ship_package
.
sync_log_ids
.
filtered
(
lambda
line
:
line
.
process_code
==
before_node
.
tk_code
)
if
not
sync_log_obj
:
# Ensure the current state is valid
ship_package
.
write
({
'state'
:
before_node
.
id
,
'process_time'
:
operation_time
,
'state_explain'
:
before_node
.
desc
,
'is_sync'
:
True
if
before_node
.
is_default
else
False
})
self
.
try_callback_track
(
max_retries
=
2
,
ship_package_ids
=
ship_package_ids
)
# 理货或尾程交接的节点
for
index
,
node
in
enumerate
(
node_obj
):
for
ship_package_dict
in
ship_packages
:
ship_package_id
=
ship_package_dict
[
'id'
]
ship_package
=
self
.
env
[
'cc.ship.package'
]
.
browse
(
ship_package_id
)
# 小包
tally_time
=
ship_package_dict
[
'tally_time'
]
operation_time
=
(
datetime
.
strptime
(
tally_time
,
'
%
Y-
%
m-
%
d
%
H:
%
M:
%
S'
)
+
timedelta
(
minutes
=
next_minutes
*
index
))
if
tally_time
else
fields
.
Datetime
.
now
()
+
timedelta
(
minutes
=
next_minutes
*
index
)
# Increment time by 20 minutes for each node
state_node_obj
=
self
.
env
[
'cc.node'
]
.
sudo
()
.
search
(
[(
'node_type'
,
'='
,
'package'
),
(
'name'
,
'='
,
ship_package
.
state
.
name
)],
limit
=
1
)
if
state_node_obj
.
seq
<
node
.
seq
:
# Ensure the current state is valid
ship_package
.
write
({
'state'
:
node
.
id
,
'process_time'
:
operation_time
,
'state_explain'
:
node
.
desc
,
'is_sync'
:
True
if
node
.
is_default
else
False
})
self
.
try_callback_track
(
max_retries
=
2
,
ship_package_ids
=
ship_package_ids
)
if
self
.
state
==
'draft'
and
self
.
ship_package_ids
.
filtered
(
lambda
line
:
line
.
state
.
tk_code
==
'cb_imcustoms_start'
):
self
.
ccing_func
()
except
Exception
as
err
:
logging
.
error
(
'fetch_mail_dlv--error:
%
s'
%
str
(
err
))
class
CcBigPackage
(
models
.
Model
):
# 模型名称
...
...
ccs_connect_tiktok/models/cc_node.py
浏览文件 @
322c45ab
import
base64
import
json
import
logging
from
datetime
import
datetime
from
lxml
import
etree
import
pytz
from
odoo
import
models
,
fields
,
api
,
tools
from
odoo.exceptions
import
ValidationError
,
Warning
# 继承节点对象.增加TK编码
class
CCNode
(
models
.
Model
):
...
...
@@ -14,3 +10,18 @@ class CCNode(models.Model):
_inherit
=
'cc.node'
tk_code
=
fields
.
Char
(
'TK Code'
,
help
=
'TK Code'
)
interval_minutes
=
fields
.
Integer
(
'Predecessor Node Interval (Minutes)'
,
default
=
20
,
help
=
'Default interval time between predecessor nodes in minutes.'
)
# 前序节点间隔时间,默认20分钟
def
calculate_total_interval
(
self
,
next_node
):
"""
计算该节点到某个节点直接的间隔时间和
"""
total_interval
=
0
predecessor_nodes
=
self
.
env
[
'cc.node'
]
.
search
(
[(
'node_type'
,
'='
,
'package'
),
(
'is_must'
,
'='
,
True
),
(
'seq'
,
'<='
,
next_node
.
seq
),
(
'seq'
,
'>'
,
self
.
seq
)])
for
node
in
predecessor_nodes
:
total_interval
+=
node
.
interval_minutes
logging
.
info
(
'node:
%
s,last_node:
%
s,total_interval:
%
s'
%
(
self
.
desc
,
next_node
.
desc
,
total_interval
))
return
total_interval
ccs_connect_tiktok/views/cc_node_view.xml
浏览文件 @
322c45ab
...
...
@@ -11,6 +11,11 @@
<field
name=
"desc"
position=
"after"
>
<field
name=
"tk_code"
/>
</field>
<field
name=
"next_code_ids"
position=
"after"
>
<field
name=
"interval_minutes"
/>
</field>
</field>
</record>
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论