Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
H
hh_ccs
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
贺阳
hh_ccs
Commits
02028d58
提交
02028d58
authored
9月 10, 2025
作者:
贺阳
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
修改托盘理货
上级
2d04ffe8
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
221 行增加
和
68 行删除
+221
-68
order_controller.py
ccs_connect_tiktok/controllers/order_controller.py
+182
-26
cc_pallet.py
ccs_pallet/models/cc_pallet.py
+38
-3
associate_pallet_wizard.py
ccs_pallet/wizard/associate_pallet_wizard.py
+1
-39
没有找到文件。
ccs_connect_tiktok/controllers/order_controller.py
浏览文件 @
02028d58
...
...
@@ -815,42 +815,20 @@ class OrderController(http.Controller):
pallet_id
=
pallet_item
.
get
(
'pallet_id'
)
usage_time
=
pallet_item
.
get
(
'usage_time'
)
big_package_nos
=
pallet_item
.
get
(
'big_package_nos'
,
[])
if
not
pallet_id
or
not
usage_time
or
not
big_package_nos
:
continue
# 获取托盘对象
pallet
=
request
.
env
[
'cc.pallet'
]
.
sudo
()
.
browse
(
pallet_id
)
if
not
pallet
.
exists
():
continue
# 获取大包对象
big_packages
=
request
.
env
[
'cc.big.package'
]
.
sudo
()
.
search
([
(
'big_package_no'
,
'in'
,
big_package_nos
)
])
if
big_packages
:
# 更新托盘状态为已使用
pallet
.
usage_state
=
'used'
# 关联大包到托盘
pallet
.
package_ids
=
[(
4
,
pkg
.
id
)
for
pkg
in
big_packages
]
# 更新大包的托盘信息
for
pkg
in
big_packages
:
pkg
.
update_pallet_info
(
pallet_number
=
pallet
.
name
,
pallet_usage_date
=
usage_time
,
pallet_id
=
pallet
.
id
)
# 更新大包理货状态
pkg
.
update_big_package_info
(
action_type
=
'tally'
,
tally_state
=
'checked_goods'
,
tally_user_id
=
tally_user_id
,
tally_time
=
usage_time
)
pallet
.
update_usage_state
(
big_packages
,
usage_time
)
# 创建成功的PDA扫码记录
bl_obj
=
big_packages
[
0
]
.
bl_id
if
big_packages
else
None
if
bl_obj
:
...
...
@@ -991,4 +969,183 @@ class OrderController(http.Controller):
operator_id
=
tally_user_id
)
logging
.
info
(
'pallet_handover_complete res:
%
s'
%
res
)
return
res
\ No newline at end of file
return
res
@http.route
(
'/api/update/pallet/big/package/tally/detail'
,
type
=
'json'
,
auth
=
'public'
,
methods
=
[
'GET'
,
'POST'
],
csrf
=
False
)
def
update_pallet_big_package_tally_detail
(
self
):
"""
修改尾程快递按托盘号的理货/交货信息
:return:
"""
kwargs
=
json
.
loads
(
request
.
httprequest
.
data
)
pda_lang
=
kwargs
.
get
(
'pda_lang'
)
or
'zh'
res
=
{
'state'
:
201
,
'message'
:
''
}
action_type
=
kwargs
.
get
(
'action_type'
)
or
'tally'
# tally / handover
operation
=
'pallet_tally'
if
action_type
==
'tally'
else
'pallet_handover'
#按托盘理货/交货
tally_user_id
=
False
# 理货人ID
ship_packages
=
[]
try
:
logging
.
info
(
'update_pallet_big_package_tally_detail kw:
%
s'
%
kwargs
)
if
action_type
and
kwargs
.
get
(
'pallet_arr'
):
#判断托盘数组里面的托盘号在托盘表里面是否存在
pallet_nos
=
[
pallet_item
.
get
(
'pallet_no'
)
for
pallet_item
in
kwargs
.
get
(
'pallet_arr'
)]
pallet_obj
=
request
.
env
[
'cc.pallet'
]
.
sudo
()
.
search
([(
'name'
,
'in'
,
pallet_nos
)])
if
pallet_obj
:
res
[
'message'
]
=
{
'en'
:
'Pallet number [
%
s] does not exist'
%
','
.
join
(
pallet_nos
),
'zh'
:
'托盘号[
%
s]不存在'
%
','
.
join
(
pallet_nos
)
}[
pda_lang
]
return
res
big_package_arr
=
[]
error_no_arr
=
[]
for
pallet_item
in
kwargs
.
get
(
'pallet_arr'
):
#检查大包号是否存在
big_package_arr
.
extend
(
pallet_item
.
get
(
'big_package_arr'
))
if
big_package_arr
:
big_package_obj
=
request
.
env
[
'cc.big.package'
]
.
sudo
()
.
search
([(
'big_package_no'
,
'in'
,
big_package_arr
)])
if
not
big_package_obj
:
error_no_arr
.
extend
(
big_package_arr
)
if
error_no_arr
:
res
[
'message'
]
=
{
'en'
:
'Big package number [
%
s] does not exist'
%
','
.
join
(
error_no_arr
),
'zh'
:
'大包号[
%
s]不存在'
%
','
.
join
(
error_no_arr
)
}[
pda_lang
]
return
res
tally_user_id
=
kwargs
[
'big_package_arr'
][
0
]
.
get
(
'tally_user_id'
)
if
kwargs
.
get
(
'big_package_arr'
)
else
False
big_package_exception_arr
=
{}
# 处理包裹信息
def
process_packages
(
package_arr
,
package_type
,
ship_packages
):
error_no_set
=
set
()
# 使用集合来存储错误信息
for
package_item
in
package_arr
:
file_str
=
'big_package_no'
# 大包号
package_no
=
package_item
.
get
(
file_str
)
# 包裹号
exception_cause_ids
=
package_item
.
get
(
'exception_cause_ids'
)
# 异常原因id数组
package_obj
=
request
.
env
[
f
'cc.big.package'
]
.
sudo
()
.
search
(
[(
file_str
,
'='
,
package_no
)])
# 大包 1个
if
package_obj
:
if
exception_cause_ids
:
for
excep_item
in
exception_cause_ids
:
if
excep_item
not
in
big_package_exception_arr
:
big_package_exception_arr
[
excep_item
]
=
[
]
big_package_exception_arr
[
excep_item
]
+=
package_obj
.
ids
package_obj
.
update_exception_info
(
exception_cause_ids
)
# 修改异常信息
tally_time
=
package_item
.
get
(
'tally_time'
)
if
(
action_type
==
'tally'
and
package_item
.
get
(
'tally_state'
)
==
'checked_goods'
)
or
(
action_type
==
'handover'
and
package_item
.
get
(
'tally_state'
)
==
'handover_completed'
):
for
package
in
package_obj
:
if
(
action_type
==
'tally'
and
package
.
tally_state
==
'unprocessed_goods'
)
or
(
action_type
==
'handover'
and
package
.
tally_state
in
(
'unprocessed_goods'
,
'checked_goods'
)):
ship_packages
.
append
({
'id'
:
package
.
ship_package_ids
.
ids
,
'bl_id'
:
package
.
bl_id
.
id
,
'tally_time'
:
tally_time
})
# 小包
package_obj
.
update_big_package_info
(
action_type
=
action_type
,
tally_state
=
package_item
.
get
(
'tally_state'
),
tally_user_id
=
package_item
.
get
(
'tally_user_id'
),
tally_time
=
tally_time
)
# 修改理货信息
else
:
error_no_set
.
add
(
package_no
)
return
error_no_set
# 处理大包
if
kwargs
.
get
(
'big_package_arr'
):
error_no_arr
=
process_packages
(
kwargs
[
'big_package_arr'
],
'big'
,
ship_packages
)
if
error_no_arr
:
res
[
'message'
]
=
{
'en'
:
'Big package number [
%
s] does not exist'
%
','
.
join
(
error_no_arr
),
'zh'
:
'大包号[
%
s]不存在'
%
','
.
join
(
error_no_arr
)
}[
pda_lang
]
return
res
# 修改异常原因,发送异常邮件
lang
=
'zh_CN'
if
pda_lang
==
'zh'
else
'en_US'
# 语言
for
exception_id
,
big_package
in
big_package_exception_arr
.
items
():
if
big_package
:
big_wizard_obj
=
request
.
env
[
'add.exception.info.wizard'
]
.
sudo
()
.
with_context
({
'active_id'
:
big_package
,
'active_name'
:
'cc.big.package'
,
'not_update_ex'
:
True
})
.
create_add_exception_wizard
(
'big package'
,
[
exception_id
],
big_package_ids
=
big_package
,
send_email
=
True
,
email_language
=
lang
)
big_wizard_obj
.
confirm
()
# 发送邮件
res
[
'state'
]
=
200
logging
.
info
(
'update_pallet_big_package_tally_detail ship_packages:
%
s'
%
len
(
ship_packages
))
# 有小包 就更新小包状态和同步
if
ship_packages
:
# 获取最晚的操作时间
latest_operation_time
=
self
.
_get_latest_operation_time
(
ship_packages
)
# 在这里创建成功的pda扫码记录
bl_obj
=
request
.
env
[
'cc.bl'
]
.
sudo
()
.
search
(
[(
'id'
,
'in'
,
[
ship_package
.
get
(
'bl_id'
)
for
ship_package
in
ship_packages
])])
logging
.
info
(
f
"bl_obj: {bl_obj}"
)
for
bl
in
bl_obj
:
request
.
env
[
'pda.scan.record'
]
.
sudo
()
.
create_scan_record
(
operation
=
operation
,
record_type
=
action_type
,
bill_number
=
bl
.
bl_no
,
transfer_number
=
bl
.
transfer_bl_no
,
state
=
'success'
,
bl_id
=
bl
.
id
,
operation_time
=
latest_operation_time
,
operator_id
=
tally_user_id
)
redis_conn
=
request
.
env
[
'common.common'
]
.
sudo
()
.
get_redis
()
if
redis_conn
and
redis_conn
!=
'no'
:
bl_ids
=
[
ship_package
.
get
(
'bl_id'
)
for
ship_package
in
ship_packages
]
logging
.
info
(
'bl_ids:
%
s'
%
bl_ids
)
redis_conn
.
lpush
(
'mail_push_package_list'
,
json
.
dumps
(
{
'ids'
:
list
(
set
(
bl_ids
)),
'ship_packages'
:
str
(
ship_packages
),
'action_type'
:
action_type
}))
else
:
null_msg_dic
=
{
'en'
:
'The bill of lading number and action type must be provided; at least one of the following is required: big package data or pallet data.'
,
'zh'
:
'类型必须提供;大包数据或托盘数据至少需要提供一个。'
}
res
[
'message'
]
=
null_msg_dic
[
pda_lang
]
except
Exception
as
e
:
error
=
str
(
e
)
logging
.
info
(
'update_pro_big_package_tally_detail error:
%
s'
%
error
)
exceptions_msg_dic
=
{
'en'
:
'System parsing error, the reason for the error is
%
s'
%
error
,
'zh'
:
'系统解析错误,错误原因是
%
s'
%
error
}
res
[
'message'
]
=
exceptions_msg_dic
[
pda_lang
]
# 在这里创建失败的pda扫码记录
if
ship_packages
:
bl_obj
=
request
.
env
[
'cc.bl'
]
.
sudo
()
.
search
(
[(
'id'
,
'in'
,
[
ship_package
.
get
(
'bl_id'
)
for
ship_package
in
ship_packages
])],
limit
=
1
)
if
bl_obj
:
for
bl
in
bl_obj
:
request
.
env
[
'pda.scan.record'
]
.
sudo
()
.
create_scan_record
(
operation
=
operation
,
record_type
=
action_type
,
bill_number
=
bl
.
bl_no
,
transfer_number
=
bl
.
transfer_bl_no
,
state
=
'failed'
,
bl_id
=
bl
.
id
,
failure_reason
=
error
,
operator_id
=
tally_user_id
)
else
:
request
.
env
[
'pda.scan.record'
]
.
sudo
()
.
create_scan_record
(
operation
=
operation
,
record_type
=
action_type
,
bill_number
=
''
,
transfer_number
=
''
,
state
=
'failed'
,
failure_reason
=
error
,
operator_id
=
tally_user_id
)
logging
.
info
(
'update_pallet_big_package_tally_detail res:
%
s'
%
res
)
return
res
ccs_pallet/models/cc_pallet.py
浏览文件 @
02028d58
...
...
@@ -7,7 +7,7 @@ from odoo import models, fields, api, _
# 获取日志
_logger
=
logging
.
getLogger
(
__name__
)
from
odoo.exceptions
import
ValidationError
class
CcPallet
(
models
.
Model
):
# 模型名称
...
...
@@ -104,12 +104,47 @@ class CcPallet(models.Model):
delivery_plate_number
=
fields
.
Char
(
string
=
_
(
'Delivery Plate Number'
))
# 当大包关联到托盘时,自动更新使用状态
@api.model
def
update_usage_state
(
self
):
def
update_usage_state
(
self
,
success_package
,
usage_date
):
"""更新托盘使用状态"""
for
pallet
in
self
:
if
pallet
.
package_ids
:
pallet
.
usage_state
=
'used'
# 关联大包到托盘
pallet
.
package_ids
=
[(
4
,
package_id
.
id
,
0
)
for
package_id
in
success_package
]
# 更新大包的托盘信息
for
package
in
success_package
:
old_pallet_number
=
package
.
pallet_number
new_pallet_number
=
pallet
.
name
# 使用托盘的编号
old_usage_date
=
package
.
pallet_usage_date
# 同一提单,同一托盘号,使用日期必须一致
related_packages
=
package
.
bl_id
.
big_package_ids
.
filtered
(
lambda
p
:
p
.
pallet_number
==
new_pallet_number
)
# 查找对应提单下相同托盘号的所有大包
warning_package_arr
=
[
related_package
.
big_package_no
for
related_package
in
related_packages
if
related_package
.
pallet_usage_date
!=
usage_date
]
if
warning_package_arr
:
raise
ValidationError
(
_
(
'Big Package No :
%
s ,The same bill of lading, same pallet number, and usage date must be consistent!'
)
%
(
'
\n
'
.
join
(
warning_package_arr
)))
# 大包号关联的同一提单,同一托盘号,使用日期必须一致
# 更新大包的托盘信息
package
.
update_pallet_info
(
new_pallet_number
,
usage_date
,
pallet
.
id
)
if
old_pallet_number
:
# %s %s更改了托盘号,由%s变更为%s,托盘使用日期%s变更为%s
body
=
_
(
'
%
s at
%
s changed the pallet number from
%
s to
%
s, and the pallet usage date from
%
s to
%
s'
)
%
(
self
.
env
.
user
.
name
,
fields
.
Datetime
.
now
(),
old_pallet_number
,
new_pallet_number
,
old_usage_date
,
usage_date
)
else
:
# 某人某时关联了托盘xxx,托盘使用日期xxxx
body
=
_
(
'
%
s at
%
s associated tray
%
s, with a tray usage date of
%
s'
)
%
(
self
.
env
.
user
.
name
,
fields
.
Datetime
.
now
(),
new_pallet_number
,
usage_date
)
package
.
message_post
(
body
=
body
)
# 记录托盘关联日志
body
=
_
(
'
%
s at
%
s associated
%
d packages to pallet
%
s'
)
%
(
self
.
env
.
user
.
name
,
fields
.
Datetime
.
now
(),
len
(
success_package
),
pallet
.
name
)
pallet
.
message_post
(
body
=
body
)
else
:
pallet
.
usage_state
=
'unused'
...
...
ccs_pallet/wizard/associate_pallet_wizard.py
浏览文件 @
02028d58
...
...
@@ -36,44 +36,6 @@ class AssociatePalletWizard(models.TransientModel):
'
\n
'
.
join
(
fail_package
)))
# 不存在该大包,请检查输入信息
if
success_package
:
# 关联大包到托盘
record
.
pallet_id
.
package_ids
=
[(
4
,
package_id
.
id
,
0
)
for
package_id
in
success_package
]
# 更新大包的托盘信息
for
package
in
success_package
:
old_pallet_number
=
package
.
pallet_number
new_pallet_number
=
record
.
pallet_id
.
name
# 使用托盘的编号
old_usage_date
=
package
.
pallet_usage_date
# 同一提单,同一托盘号,使用日期必须一致
related_packages
=
package
.
bl_id
.
big_package_ids
.
filtered
(
lambda
p
:
p
.
pallet_number
==
new_pallet_number
)
# 查找对应提单下相同托盘号的所有大包
warning_package_arr
=
[
related_package
.
big_package_no
for
related_package
in
related_packages
if
related_package
.
pallet_usage_date
!=
record
.
usage_date
]
if
warning_package_arr
:
raise
ValidationError
(
_
(
'Big Package No :
%
s ,The same bill of lading, same pallet number, and usage date must be consistent!'
)
%
(
'
\n
'
.
join
(
warning_package_arr
)))
# 大包号关联的同一提单,同一托盘号,使用日期必须一致
package
.
update_pallet_info
(
new_pallet_number
,
record
.
usage_date
,
record
.
pallet_id
.
id
)
if
old_pallet_number
:
# %s %s更改了托盘号,由%s变更为%s,托盘使用日期%s变更为%s
body
=
_
(
'
%
s at
%
s changed the pallet number from
%
s to
%
s, and the pallet usage date from
%
s to
%
s'
)
%
(
self
.
env
.
user
.
name
,
fields
.
Datetime
.
now
(),
old_pallet_number
,
new_pallet_number
,
old_usage_date
,
record
.
usage_date
)
else
:
# 某人某时关联了托盘xxx,托盘使用日期xxxx
body
=
_
(
'
%
s at
%
s associated tray
%
s, with a tray usage date of
%
s'
)
%
(
self
.
env
.
user
.
name
,
fields
.
Datetime
.
now
(),
new_pallet_number
,
record
.
usage_date
)
package
.
message_post
(
body
=
body
)
# 更新托盘的使用状态(理货时间和交货时间会自动通过计算字段更新)
record
.
pallet_id
.
update_usage_state
()
record
.
pallet_id
.
update_usage_state
(
success_package
)
# 记录托盘关联日志
body
=
_
(
'
%
s at
%
s associated
%
d packages to pallet
%
s'
)
%
(
self
.
env
.
user
.
name
,
fields
.
Datetime
.
now
(),
len
(
success_package
),
record
.
pallet_id
.
name
)
record
.
pallet_id
.
message_post
(
body
=
body
)
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论