Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
H
hh_ccs
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
贺阳
hh_ccs
Commits
ef681cb0
提交
ef681cb0
authored
8月 04, 2025
作者:
贺阳
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
pda扫码记录
上级
71f8dcbf
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
105 行增加
和
7 行删除
+105
-7
order_controller.py
ccs_connect_tiktok/controllers/order_controller.py
+91
-5
pda_scan_record.py
ccs_connect_tiktok/models/pda_scan_record.py
+11
-1
pda_scan_record_views.xml
ccs_connect_tiktok/views/pda_scan_record_views.xml
+3
-1
没有找到文件。
ccs_connect_tiktok/controllers/order_controller.py
浏览文件 @
ef681cb0
...
@@ -5,6 +5,7 @@ import logging
...
@@ -5,6 +5,7 @@ import logging
from
odoo
import
http
,
exceptions
from
odoo
import
http
,
exceptions
# from odoo.addons.queue_job import job
# from odoo.addons.queue_job import job
from
odoo.http
import
request
from
odoo.http
import
request
from
odoo
import
fields
_logger
=
logging
.
getLogger
(
__name__
)
_logger
=
logging
.
getLogger
(
__name__
)
...
@@ -136,7 +137,7 @@ class OrderController(http.Controller):
...
@@ -136,7 +137,7 @@ class OrderController(http.Controller):
@http.route
(
'/api/update/big/package/tally/detail'
,
type
=
'json'
,
auth
=
'public'
,
methods
=
[
'GET'
,
'POST'
],
csrf
=
False
)
@http.route
(
'/api/update/big/package/tally/detail'
,
type
=
'json'
,
auth
=
'public'
,
methods
=
[
'GET'
,
'POST'
],
csrf
=
False
)
def
update_big_package_tally_detail
(
self
):
def
update_big_package_tally_detail
(
self
):
"""
"""
修改理货信息
按提单
修改理货信息
:return:
:return:
"""
"""
kwargs
=
json
.
loads
(
request
.
httprequest
.
data
)
kwargs
=
json
.
loads
(
request
.
httprequest
.
data
)
...
@@ -154,6 +155,17 @@ class OrderController(http.Controller):
...
@@ -154,6 +155,17 @@ class OrderController(http.Controller):
bl_obj
=
request
.
env
[
'cc.bl'
]
.
sudo
()
.
deal_bl_no_and_transfer_bl_no
(
bl_obj
=
request
.
env
[
'cc.bl'
]
.
sudo
()
.
deal_bl_no_and_transfer_bl_no
(
bl_no
)
# 提单号去掉杠和空格,并转换为小写,优先匹配提单号,匹配不到则匹配转单号
bl_no
)
# 提单号去掉杠和空格,并转换为小写,优先匹配提单号,匹配不到则匹配转单号
if
bl_obj
and
bl_obj
.
state
in
state_arr
:
if
bl_obj
and
bl_obj
.
state
in
state_arr
:
# 1.按提单交货时,创建批次,填写的提单号传给后台查找对应的提单号,在匹配查找前,先查找是否pda扫码记录,若有类型该提单,类型为理货的,且操作时间-当前时间小于等于配置的参数(交货操作晚于提货操作X分钟),则提示:该提单未到交货时间,有风险产生倒叙,请间隔规定时间后再扫码;
if
action_type
==
'handover'
:
# 检查是否存在时间倒序风险
time_check_result
=
self
.
_check_delivery_time_risk
(
bl_obj
,
pda_lang
)
if
time_check_result
[
'has_risk'
]:
res
[
'state'
]
=
400
res
[
'message'
]
=
time_check_result
[
'message'
]
return
res
# 继续原有的处理逻辑...
ship_packages
=
[]
ship_packages
=
[]
big_package_exception_arr
=
{}
big_package_exception_arr
=
{}
ship_package_exception_arr
=
{}
ship_package_exception_arr
=
{}
...
@@ -278,7 +290,8 @@ class OrderController(http.Controller):
...
@@ -278,7 +290,8 @@ class OrderController(http.Controller):
record_type
=
action_type
,
record_type
=
action_type
,
bill_number
=
bl_obj
.
bl_no
,
bill_number
=
bl_obj
.
bl_no
,
transfer_number
=
bl_obj
.
transfer_bl_no
,
transfer_number
=
bl_obj
.
transfer_bl_no
,
state
=
'success'
)
state
=
'success'
,
bl_id
=
bl_obj
.
id
)
logging
.
info
(
logging
.
info
(
'update_big_package_tally_detail ship_packages:
%
s'
%
len
(
ship_packages
))
'update_big_package_tally_detail ship_packages:
%
s'
%
len
(
ship_packages
))
# 有小包 就更新小包状态和同步
# 有小包 就更新小包状态和同步
...
@@ -313,7 +326,8 @@ class OrderController(http.Controller):
...
@@ -313,7 +326,8 @@ class OrderController(http.Controller):
record_type
=
action_type
,
record_type
=
action_type
,
bill_number
=
bl_obj
.
bl_no
,
bill_number
=
bl_obj
.
bl_no
,
transfer_number
=
bl_obj
.
transfer_bl_no
,
transfer_number
=
bl_obj
.
transfer_bl_no
,
state
=
'failed'
)
state
=
'failed'
,
bl_id
=
bl_obj
.
id
)
else
:
else
:
request
.
env
[
'pda.scan.record'
]
.
sudo
()
.
create_scan_record
(
operation
,
action_type
,
''
,
''
,
'failed'
)
request
.
env
[
'pda.scan.record'
]
.
sudo
()
.
create_scan_record
(
operation
,
action_type
,
''
,
''
,
'failed'
)
logging
.
info
(
'res:
%
s'
%
res
)
logging
.
info
(
'res:
%
s'
%
res
)
...
@@ -394,6 +408,20 @@ class OrderController(http.Controller):
...
@@ -394,6 +408,20 @@ class OrderController(http.Controller):
error_no_set
.
add
(
package_no
)
error_no_set
.
add
(
package_no
)
return
error_no_set
return
error_no_set
# 按尾程交货时,检查时间风险
if
action_type
==
'handover'
and
ship_packages
:
# 获取所有相关的提单对象
bl_ids
=
list
(
set
([
ship_package
.
get
(
'bl_id'
)
for
ship_package
in
ship_packages
]))
bl_objs
=
request
.
env
[
'cc.bl'
]
.
sudo
()
.
search
([(
'id'
,
'in'
,
bl_ids
)])
# 对每个提单进行时间风险检查
for
bl_obj
in
bl_objs
:
time_check_result
=
self
.
_check_delivery_time_risk
(
bl_obj
,
pda_lang
)
if
time_check_result
[
'has_risk'
]:
res
[
'state'
]
=
400
res
[
'message'
]
=
time_check_result
[
'message'
]
return
res
# 处理小包、大包
# 处理小包、大包
if
kwargs
.
get
(
'ship_package_arr'
):
if
kwargs
.
get
(
'ship_package_arr'
):
error_no_arr
=
process_packages
(
error_no_arr
=
process_packages
(
...
@@ -451,7 +479,8 @@ class OrderController(http.Controller):
...
@@ -451,7 +479,8 @@ class OrderController(http.Controller):
record_type
=
action_type
,
record_type
=
action_type
,
bill_number
=
bl
.
bl_no
,
bill_number
=
bl
.
bl_no
,
transfer_number
=
bl
.
transfer_bl_no
,
transfer_number
=
bl
.
transfer_bl_no
,
state
=
'success'
)
state
=
'success'
,
bl_id
=
bl
.
id
)
redis_conn
=
request
.
env
[
'common.common'
]
.
sudo
()
.
get_redis
()
redis_conn
=
request
.
env
[
'common.common'
]
.
sudo
()
.
get_redis
()
if
redis_conn
and
redis_conn
!=
'no'
:
if
redis_conn
and
redis_conn
!=
'no'
:
# redis_conn.lpush('push_ship_package_state', json.dumps(
# redis_conn.lpush('push_ship_package_state', json.dumps(
...
@@ -486,7 +515,8 @@ class OrderController(http.Controller):
...
@@ -486,7 +515,8 @@ class OrderController(http.Controller):
record_type
=
action_type
,
record_type
=
action_type
,
bill_number
=
bl
.
bl_no
,
bill_number
=
bl
.
bl_no
,
transfer_number
=
bl
.
transfer_bl_no
,
transfer_number
=
bl
.
transfer_bl_no
,
state
=
'failed'
)
state
=
'failed'
,
bl_id
=
bl
.
id
)
else
:
else
:
request
.
env
[
'pda.scan.record'
]
.
sudo
()
.
create_scan_record
(
operation
,
action_type
,
''
,
''
,
'failed'
)
request
.
env
[
'pda.scan.record'
]
.
sudo
()
.
create_scan_record
(
operation
,
action_type
,
''
,
''
,
'failed'
)
...
@@ -598,3 +628,59 @@ class OrderController(http.Controller):
...
@@ -598,3 +628,59 @@ class OrderController(http.Controller):
# 按服务商名称升序排序
# 按服务商名称升序排序
provider_info_arr
.
sort
(
key
=
lambda
x
:
x
.
get
(
'name'
,
''
))
provider_info_arr
.
sort
(
key
=
lambda
x
:
x
.
get
(
'name'
,
''
))
return
{
'provider_info_arr'
:
provider_info_arr
,
'state'
:
200
}
return
{
'provider_info_arr'
:
provider_info_arr
,
'state'
:
200
}
def
_check_delivery_time_risk
(
self
,
bl_obj
,
pda_lang
=
'zh'
):
"""
检查提单交货时间倒序风险
:param bl_obj: 提单对象
:param pda_lang: 语言设置
:return: 检查结果字典
"""
try
:
# 获取配置的交货操作晚于提货操作的时间参数(分钟)
config_param
=
request
.
env
[
'ir.config_parameter'
]
.
sudo
()
.
get_param
(
'delivery_time'
,
'80'
# 使用现有的delivery_time参数,默认80分钟
)
allowed_minutes
=
int
(
config_param
)
# 查找该提单的PDA扫码记录,类型为理货的
pda_records
=
request
.
env
[
'pda.scan.record'
]
.
sudo
()
.
search
([
(
'bl_id'
,
'='
,
bl_obj
.
id
),
(
'operation'
,
'='
,
'bill_tally'
),
# 理货类型
(
'state'
,
'='
,
'success'
)
# 成功状态
],
order
=
'create_date desc'
,
limit
=
1
)
if
pda_records
:
latest_tally_record
=
pda_records
[
0
]
current_time
=
fields
.
Datetime
.
now
()
time_diff
=
(
current_time
-
latest_tally_record
.
create_date
)
.
total_seconds
()
/
60
# 如果时间差小于等于配置的参数,则存在风险
if
time_diff
<=
allowed_minutes
:
if
pda_lang
==
'en'
:
message
=
f
"The bill of lading has not reached the delivery time, and there is a risk of flashback. Please scan the code after {allowed_minutes} minutes."
else
:
message
=
f
"该提单未到交货时间,有风险产生倒叙,请间隔{allowed_minutes}分钟后再扫码;"
return
{
'has_risk'
:
True
,
'message'
:
message
,
'time_diff'
:
time_diff
,
'allowed_minutes'
:
allowed_minutes
}
return
{
'has_risk'
:
False
,
'message'
:
''
,
'time_diff'
:
0
,
'allowed_minutes'
:
allowed_minutes
}
except
Exception
as
e
:
logging
.
error
(
f
"检查交货时间风险时出错: {str(e)}"
)
return
{
'has_risk'
:
False
,
'message'
:
''
,
'time_diff'
:
0
,
'allowed_minutes'
:
0
}
ccs_connect_tiktok/models/pda_scan_record.py
浏览文件 @
ef681cb0
...
@@ -32,6 +32,8 @@ class PDAScanRecord(models.Model):
...
@@ -32,6 +32,8 @@ class PDAScanRecord(models.Model):
],
string
=
_
(
'Type'
),
required
=
True
)
# 类型
],
string
=
_
(
'Type'
),
required
=
True
)
# 类型
bill_number
=
fields
.
Char
(
string
=
_
(
'Bill Number'
))
# 提单号
bill_number
=
fields
.
Char
(
string
=
_
(
'Bill Number'
))
# 提单号
transfer_number
=
fields
.
Char
(
string
=
_
(
'Transfer Number'
))
# 转运单号
transfer_number
=
fields
.
Char
(
string
=
_
(
'Transfer Number'
))
# 转运单号
# 增加提单关联字段
bl_id
=
fields
.
Many2one
(
'cc.bl'
,
string
=
_
(
'Bill of Lading'
),
ondelete
=
'cascade'
)
# 提单对象
#增加状态 成功 失败
#增加状态 成功 失败
state
=
fields
.
Selection
([
state
=
fields
.
Selection
([
(
'success'
,
_
(
'Success'
)),
(
'success'
,
_
(
'Success'
)),
...
@@ -39,7 +41,7 @@ class PDAScanRecord(models.Model):
...
@@ -39,7 +41,7 @@ class PDAScanRecord(models.Model):
],
string
=
_
(
'State'
),
required
=
True
)
],
string
=
_
(
'State'
),
required
=
True
)
@api.model
@api.model
def
create_scan_record
(
self
,
operation
,
record_type
,
bill_number
,
transfer_number
,
state
,
operator
_id
=
False
):
def
create_scan_record
(
self
,
operation
,
record_type
,
bill_number
,
transfer_number
,
state
,
operator_id
=
False
,
bl
_id
=
False
):
"""
"""
创建扫码记录的方法,供接口调用
创建扫码记录的方法,供接口调用
Create scan record method for API calls
Create scan record method for API calls
...
@@ -47,12 +49,20 @@ class PDAScanRecord(models.Model):
...
@@ -47,12 +49,20 @@ class PDAScanRecord(models.Model):
try
:
try
:
if
not
operator_id
:
if
not
operator_id
:
operator_id
=
self
.
env
[
'res.users'
]
.
search
([(
'login'
,
'='
,
'pda'
)],
limit
=
1
)
.
id
operator_id
=
self
.
env
[
'res.users'
]
.
search
([(
'login'
,
'='
,
'pda'
)],
limit
=
1
)
.
id
# 如果没有传入bl_id,根据bill_number查找提单对象
if
not
bl_id
and
bill_number
:
bl_obj
=
self
.
env
[
'cc.bl'
]
.
sudo
()
.
deal_bl_no_and_transfer_bl_no
(
bill_number
)
if
bl_obj
:
bl_id
=
bl_obj
.
id
record
=
self
.
create
({
record
=
self
.
create
({
'operator_id'
:
operator_id
,
'operator_id'
:
operator_id
,
'operation'
:
operation
,
'operation'
:
operation
,
'record_type'
:
record_type
,
'record_type'
:
record_type
,
'bill_number'
:
bill_number
,
'bill_number'
:
bill_number
,
'transfer_number'
:
transfer_number
,
'transfer_number'
:
transfer_number
,
'bl_id'
:
bl_id
,
'state'
:
state
'state'
:
state
})
})
return
{
return
{
...
...
ccs_connect_tiktok/views/pda_scan_record_views.xml
浏览文件 @
ef681cb0
...
@@ -14,6 +14,7 @@
...
@@ -14,6 +14,7 @@
<field
name=
"record_type"
/>
<field
name=
"record_type"
/>
<field
name=
"bill_number"
/>
<field
name=
"bill_number"
/>
<field
name=
"transfer_number"
/>
<field
name=
"transfer_number"
/>
<field
name=
"bl_id"
invisible=
"1"
/>
<field
name=
"state"
/>
<field
name=
"state"
/>
</tree>
</tree>
</field>
</field>
...
@@ -32,13 +33,14 @@
...
@@ -32,13 +33,14 @@
<group>
<group>
<group>
<group>
<field
name=
"create_uid"
/>
<field
name=
"create_uid"
/>
<field
name=
"create_date"
/>
<field
name=
"create_date"
/>
<!-- <field name="operator_id"/>
<!-- <field name="operator_id"/>
<field name="operation_time"/> -->
<field name="operation_time"/> -->
<field
name=
"operation"
/>
<field
name=
"operation"
/>
</group>
</group>
<group>
<group>
<field
name=
"record_type"
/>
<field
name=
"record_type"
/>
<field
name=
"bl_id"
invisible=
"1"
/>
<field
name=
"bill_number"
/>
<field
name=
"bill_number"
/>
<field
name=
"transfer_number"
/>
<field
name=
"transfer_number"
/>
</group>
</group>
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论