Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
H
hh_ccs
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
贺阳
hh_ccs
Commits
a05f8190
提交
a05f8190
authored
8月 07, 2025
作者:
伍姿英
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'release/3.0.0'
上级
b4e351d5
bef8276e
隐藏空白字符变更
内嵌
并排
正在显示
9 个修改的文件
包含
610 行增加
和
26 行删除
+610
-26
__manifest__.py
ccs_connect_tiktok/__manifest__.py
+1
-0
order_controller.py
ccs_connect_tiktok/controllers/order_controller.py
+223
-17
zh_CN.po
ccs_connect_tiktok/i18n/zh_CN.po
+193
-8
__init__.py
ccs_connect_tiktok/models/__init__.py
+1
-0
pda_scan_record.py
ccs_connect_tiktok/models/pda_scan_record.py
+88
-0
res_config_setting.py
ccs_connect_tiktok/models/res_config_setting.py
+7
-1
ir.model.access.csv
ccs_connect_tiktok/security/ir.model.access.csv
+3
-0
config_settings_views.xml
ccs_connect_tiktok/views/config_settings_views.xml
+4
-0
pda_scan_record_views.xml
ccs_connect_tiktok/views/pda_scan_record_views.xml
+90
-0
没有找到文件。
ccs_connect_tiktok/__manifest__.py
浏览文件 @
a05f8190
...
...
@@ -31,6 +31,7 @@
'views/cc_node_view.xml'
,
'views/cc_ship_package_view.xml'
,
'views/cc_bl_view.xml'
,
'views/pda_scan_record_views.xml'
,
],
'demo'
:
[
...
...
ccs_connect_tiktok/controllers/order_controller.py
浏览文件 @
a05f8190
# -*- coding: utf-8 -*-
import
json
import
logging
from
datetime
import
datetime
from
odoo
import
http
,
exceptions
# from odoo.addons.queue_job import job
...
...
@@ -105,6 +106,14 @@ class OrderController(http.Controller):
bl_obj
=
request
.
env
[
'cc.bl'
]
.
sudo
()
.
deal_bl_no_and_transfer_bl_no
(
bl_no
)
# 提单号去掉杠和空格,并转换为小写,优先匹配提单号,匹配不到则匹配转单号
if
bl_obj
:
# 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
if
bl_obj
.
state
in
state_arr
:
res
[
'bl_info'
]
=
bl_obj
.
search_bl_info
(
pda_lang
=
pda_lang
,
type
=
action_type
)
...
...
@@ -136,17 +145,24 @@ class OrderController(http.Controller):
@http.route
(
'/api/update/big/package/tally/detail'
,
type
=
'json'
,
auth
=
'public'
,
methods
=
[
'GET'
,
'POST'
],
csrf
=
False
)
def
update_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
=
'bill_tally'
if
action_type
==
'tally'
else
'bill_handover'
bl_obj
=
False
tally_user_id
=
False
# 理货人ID
try
:
logging
.
info
(
'update_big_package_tally_detail kw:
%
s'
%
kwargs
)
if
kwargs
.
get
(
'bl_no'
)
and
action_type
and
(
kwargs
.
get
(
'big_package_arr'
)
or
kwargs
.
get
(
'ship_package_arr'
)
or
kwargs
.
get
(
'pallet_arr'
)):
tally_user_id
=
kwargs
[
'big_package_arr'
][
0
]
.
get
(
'tally_user_id'
)
if
kwargs
.
get
(
'big_package_arr'
)
else
(
kwargs
[
'ship_package_arr'
][
0
]
.
get
(
'tally_user_id'
)
if
kwargs
.
get
(
'ship_package_arr'
)
else
(
kwargs
[
'pallet_arr'
][
0
]
.
get
(
'tally_user_id'
)
if
kwargs
.
get
(
'pallet_arr'
)
else
False
))
bl_no
=
kwargs
[
'bl_no'
]
state_arr
=
[
'draft'
,
'ccing'
]
bl_obj
=
request
.
env
[
'cc.bl'
]
.
sudo
()
.
deal_bl_no_and_transfer_bl_no
(
...
...
@@ -270,6 +286,18 @@ class OrderController(http.Controller):
email_language
=
lang
)
ship_wizard_obj
.
confirm
()
# 发送邮件
res
[
'state'
]
=
200
# 获取最晚的操作时间
latest_operation_time
=
self
.
_get_latest_operation_time
(
ship_packages
)
# 创建成功的pda扫码记录
request
.
env
[
'pda.scan.record'
]
.
sudo
()
.
create_scan_record
(
operation
=
operation
,
record_type
=
action_type
,
bill_number
=
bl_obj
.
bl_no
,
transfer_number
=
bl_obj
.
transfer_bl_no
,
state
=
'success'
,
bl_id
=
bl_obj
.
id
,
operation_time
=
latest_operation_time
,
operator_id
=
tally_user_id
)
logging
.
info
(
'update_big_package_tally_detail ship_packages:
%
s'
%
len
(
ship_packages
))
# 有小包 就更新小包状态和同步
...
...
@@ -291,12 +319,33 @@ class OrderController(http.Controller):
}
res
[
'message'
]
=
null_msg_dic
[
pda_lang
]
except
Exception
as
e
:
logging
.
info
(
'update_big_package_tally_detail error:
%
s'
%
e
)
error
=
str
(
e
)
logging
.
info
(
'update_big_package_tally_detail error:
%
s'
%
error
)
exceptions_msg_dic
=
{
'en'
:
'System parsing error, the reason for the error is
%
s'
%
e
,
'zh'
:
'系统解析错误,错误原因是
%
s'
%
e
'en'
:
'System parsing error, the reason for the error is
%
s'
%
e
rror
,
'zh'
:
'系统解析错误,错误原因是
%
s'
%
e
rror
}
res
[
'message'
]
=
exceptions_msg_dic
[
pda_lang
]
# 创建失败的pda扫码记录
if
bl_obj
:
request
.
env
[
'pda.scan.record'
]
.
sudo
()
.
create_scan_record
(
operation
=
operation
,
record_type
=
action_type
,
bill_number
=
bl_obj
.
bl_no
,
transfer_number
=
bl_obj
.
transfer_bl_no
,
state
=
'failed'
,
bl_id
=
bl_obj
.
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
(
'res:
%
s'
%
res
)
return
res
...
...
@@ -311,10 +360,14 @@ class OrderController(http.Controller):
pda_lang
=
kwargs
.
get
(
'pda_lang'
)
or
'zh'
res
=
{
'state'
:
201
,
'message'
:
''
}
action_type
=
kwargs
.
get
(
'action_type'
)
or
'tally'
# tally / handover
operation
=
'tail_tally'
if
action_type
==
'tally'
else
'tail_handover'
tally_user_id
=
False
# 理货人ID
ship_packages
=
[]
try
:
logging
.
info
(
'update_pro_big_package_tally_detail kw:
%
s'
%
kwargs
)
if
action_type
and
(
kwargs
.
get
(
'big_package_arr'
)
or
kwargs
.
get
(
'ship_package_arr'
)):
ship_packages
=
[]
tally_user_id
=
kwargs
[
'big_package_arr'
][
0
]
.
get
(
'tally_user_id'
)
if
kwargs
.
get
(
'big_package_arr'
)
else
(
kwargs
[
'ship_package_arr'
][
0
]
.
get
(
'tally_user_id'
)
if
kwargs
.
get
(
'ship_package_arr'
)
else
False
)
big_package_exception_arr
=
{}
ship_package_exception_arr
=
{}
...
...
@@ -417,14 +470,27 @@ 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
))
logging
.
info
(
'update_pro_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'
:
# redis_conn.lpush('push_ship_package_state', json.dumps(
# {'bl_id': bl_obj.id, 'ship_package_ids': ship_package_ids}))
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
(
...
...
@@ -438,12 +504,38 @@ class OrderController(http.Controller):
}
res
[
'message'
]
=
null_msg_dic
[
pda_lang
]
except
Exception
as
e
:
logging
.
info
(
'update_pro_big_package_tally_detail error:
%
s'
%
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'
%
e
,
'zh'
:
'系统解析错误,错误原因是
%
s'
%
e
'en'
:
'System parsing error, the reason for the error is
%
s'
%
e
rror
,
'zh'
:
'系统解析错误,错误原因是
%
s'
%
e
rror
}
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
(
'res:
%
s'
%
res
)
return
res
...
...
@@ -491,8 +583,7 @@ class OrderController(http.Controller):
'zh'
:
'系统解析错误,错误原因是
%
s'
%
e
}
logging
.
info
(
'last_mile_tally error:
%
s'
%
e
)
res
[
'message'
]
=
exceptions_msg_dic
[
pda_lang
]
# _('System parsing error, the reason for the error is %s', e) # 系统解析错误,错误原因是
res
[
'message'
]
=
exceptions_msg_dic
[
pda_lang
]
# _('System parsing error, the reason for the error is %s', e) # 系统解析错误,错误原因是
logging
.
info
(
'last_mile_tally res:
%
s'
%
res
)
return
res
...
...
@@ -506,8 +597,9 @@ class OrderController(http.Controller):
res
=
{
'state'
:
201
,
'message'
:
''
}
try
:
logging
.
info
(
'last_mile_delivery kwargs:
%
s'
%
kwargs
)
return
self
.
_get_last_mile_grouped
(
'checked_goods'
,
pda_lang
)
# 按尾程交货时,检查时间风险 大包或小包对应的提单是否已存在成功扫码记录
res
=
self
.
_get_last_mile_grouped
(
'checked_goods'
,
pda_lang
)
return
res
except
Exception
as
e
:
exceptions_msg_dic
=
{
'en'
:
'System parsing error, the reason for the error is
%
s'
%
e
,
...
...
@@ -519,6 +611,37 @@ class OrderController(http.Controller):
logging
.
info
(
'last_mile_delivery res:
%
s'
%
res
)
return
res
@http.route
(
'/api/last_mile/delivery/time_check'
,
type
=
'json'
,
auth
=
'public'
,
csrf
=
False
)
def
last_mile_delivery_time_check
(
self
):
"""
按尾程快递交货接口,查询系统所有清关中的提单,且大包状态为已理货的数量,按下一阶段服务商名称分组,下一个阶段服务商名称匹配尾程快递传给PDA。传输字段与理货的一致。
"""
kwargs
=
json
.
loads
(
request
.
httprequest
.
data
)
pda_lang
=
kwargs
.
get
(
'pda_lang'
)
or
'zh'
res
=
{
'state'
:
201
,
'message'
:
''
}
try
:
logging
.
info
(
'last_mile_delivery_time_check kwargs:
%
s'
%
kwargs
)
all_bl_ids_in_request
=
kwargs
[
'bl_ids'
]
logging
.
info
(
f
"all_bl_ids_in_request: {all_bl_ids_in_request}"
)
if
all_bl_ids_in_request
:
bl_objs
=
request
.
env
[
'cc.bl'
]
.
sudo
()
.
search
([(
'id'
,
'in'
,
all_bl_ids_in_request
)])
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
res
[
'state'
]
=
200
except
Exception
as
e
:
exceptions_msg_dic
=
{
'en'
:
'System parsing error, the reason for the error is
%
s'
%
e
,
'zh'
:
'系统解析错误,错误原因是
%
s'
%
e
}
logging
.
info
(
'last_mile_delivery_time_check error:
%
s'
%
e
)
res
[
'message'
]
=
exceptions_msg_dic
[
pda_lang
]
logging
.
info
(
'last_mile_delivery_time_check res:
%
s'
%
res
)
return
res
def
_get_last_mile_grouped
(
self
,
tally_state
,
pda_lang
):
lang
=
'zh_CN'
if
pda_lang
==
'zh'
else
'en_US'
# 语言
# 1. 查所有清关中提单
...
...
@@ -551,4 +674,87 @@ class OrderController(http.Controller):
provider_info_arr
=
list
(
group_dict
.
values
())
# 按服务商名称升序排序
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
,
'bl_ids'
:
list
(
set
(
list
(
map
(
lambda
x
:
x
.
bl_id
.
id
,
big_packages
))))}
def
_check_delivery_time_risk
(
self
,
bl_obj
,
pda_lang
=
'zh'
):
"""
检查提单交货时间倒序风险
:param bl_obj: 提单对象
:param pda_lang: 语言设置
:return: 检查结果字典
"""
# 获取配置的交货操作晚于提货操作的时间参数(分钟)
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
),
(
'record_type'
,
'='
,
'tally'
),
# 理货类型
(
'state'
,
'='
,
'success'
)
# 成功状态
],
order
=
'operation_time desc'
,
limit
=
1
)
if
pda_records
:
latest_tally_record
=
pda_records
[
0
]
current_time
=
request
.
env
[
'common.common'
]
.
sudo
()
.
get_utc_time
(
datetime
.
now
())
# Ensure operation_time is also timezone-aware (UTC)
operation_time
=
latest_tally_record
.
operation_time
time_diff
=
(
datetime
.
strptime
(
current_time
,
'
%
Y-
%
m-
%
d
%
H:
%
M:
%
S'
)
-
operation_time
)
.
total_seconds
()
/
60
logging
.
info
(
f
"current_time: {current_time}, operation_time: {operation_time},time_diff: {time_diff}"
)
# 如果时间差小于等于配置的参数,则存在风险
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
}
def
_get_latest_operation_time
(
self
,
ship_packages
):
"""
获取最晚的操作时间
:param ship_packages: 小包列表
:return: 最晚的操作时间字符串
"""
latest_time
=
None
for
ship_package
in
ship_packages
:
tally_time
=
ship_package
.
get
(
'tally_time'
)
if
tally_time
:
# 如果tally_time是字符串,转换为datetime对象进行比较
if
isinstance
(
tally_time
,
str
):
try
:
# 尝试解析时间字符串
from
datetime
import
datetime
parsed_time
=
datetime
.
strptime
(
tally_time
,
'
%
Y-
%
m-
%
d
%
H:
%
M:
%
S'
)
if
latest_time
is
None
or
parsed_time
>
latest_time
:
latest_time
=
parsed_time
except
ValueError
:
# 如果解析失败,记录日志但继续处理
logging
.
warning
(
f
"无法解析时间字符串: {tally_time}"
)
continue
elif
isinstance
(
tally_time
,
datetime
):
# 如果已经是datetime对象
if
latest_time
is
None
or
tally_time
>
latest_time
:
latest_time
=
tally_time
# 返回最晚时间的字符串格式
if
latest_time
:
return
latest_time
.
strftime
(
'
%
Y-
%
m-
%
d
%
H:
%
M:
%
S'
)
else
:
return
request
.
env
[
'common.common'
]
.
sudo
()
.
get_utc_time
(
datetime
.
now
())
ccs_connect_tiktok/i18n/zh_CN.po
浏览文件 @
a05f8190
...
...
@@ -6,11 +6,11 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-0
3-19 08:47
+0000\n"
"PO-Revision-Date: 2025-0
3-19 16:51
+0800\n"
"POT-Creation-Date: 2025-0
8-05 06:34
+0000\n"
"PO-Revision-Date: 2025-0
8-05 14:38
+0800\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: zh\n"
"Language: zh
_CN
\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
...
...
@@ -25,7 +25,7 @@ msgstr "<span class=\"o_stat_text\">小包</span>"
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.form_cc_bl_view_inherit
msgid "<span class=\"o_stat_text\">Ship Packages</span>"
msgstr "
<span class=\"o_stat_text\">小包</span>
"
msgstr "
Ship Package
"
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_bl_sync_log__api_customer
...
...
@@ -49,6 +49,11 @@ msgstr ""
msgid "AppSecret"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model,name:ccs_connect_tiktok.model_ir_attachment
msgid "Attachment"
msgstr "附件"
#. module: ccs_connect_tiktok
#: model:ir.actions.server,name:ccs_connect_tiktok.action_batch_sync_bl_status
msgid "Batch Sync Bill Of Loading Status"
...
...
@@ -69,11 +74,43 @@ msgstr "批量更新小包状态向导"
msgid "Big Package"
msgstr "大包"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields.selection,name:ccs_connect_tiktok.selection__pda_scan_record__operation__bill_handover
#, python-format
msgid "Bill Handover"
msgstr "按提单交货"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__bill_number
#, python-format
msgid "Bill Number"
msgstr "提单号"
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_bl__bl_sync_log_ids
msgid "Bill Of Loading Sync Logs"
msgstr "关务提单状态同步日志"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields.selection,name:ccs_connect_tiktok.selection__pda_scan_record__operation__bill_tally
#, python-format
msgid "Bill Tally"
msgstr "按提单理货"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__bl_id
#, python-format
msgid "Bill of Lading"
msgstr "提单"
#. module: ccs_connect_tiktok
#: model:ir.model,name:ccs_connect_tiktok.model_cc_bl
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_bl_sync_log__bl_id
...
...
@@ -134,21 +171,35 @@ msgstr "清关文件"
msgid "Config Settings"
msgstr "配置设置"
#. module: ccs_connect_tiktok
#: model_terms:ir.actions.act_window,help:ccs_connect_tiktok.action_pda_scan_record
msgid "Create your first PDA scan record"
msgstr "创建第一条PDA扫码记录"
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api__create_uid
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__create_uid
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_bl_sync_log__create_uid
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_ship_package_sync_log__create_uid
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__create_uid
msgid "Created by"
msgstr ""
msgstr "
创建人
"
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api__create_date
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__create_date
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_bl_sync_log__create_date
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_ship_package_sync_log__create_date
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__create_date
msgid "Created on"
msgstr ""
msgstr "创建时间"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#, python-format
msgid "Creation failed: %s"
msgstr "创建失败: %s"
#. module: ccs_connect_tiktok
#: model:ir.model.fields,help:ccs_connect_tiktok.field_cc_node__interval_minutes
...
...
@@ -160,15 +211,46 @@ msgstr "前置节点之间的默认间隔时间(分钟)。"
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__display_name
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_bl_sync_log__display_name
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_ship_package_sync_log__display_name
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__display_name
msgid "Display Name"
msgstr ""
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields.selection,name:ccs_connect_tiktok.selection__pda_scan_record__state__failed
#, python-format
msgid "Failed"
msgstr "失败"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__failure_reason
#, python-format
msgid "Failure Reason"
msgstr "失败原因"
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_cc_bl_sync_log_view
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_cc_ship_package_sync_log_view
msgid "Group By"
msgstr "分组"
#. module: ccs_connect_tiktok
#: model:ir.model,name:ccs_connect_tiktok.model_ir_http
msgid "HTTP Routing"
msgstr "HTTP 路由"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields.selection,name:ccs_connect_tiktok.selection__pda_scan_record__record_type__handover
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.view_pda_scan_record_search
#, python-format
msgid "Handover"
msgstr "交货"
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_batch_input_ship_package_status_wizard__ship_package_ids
msgid "Have Node Package"
...
...
@@ -179,6 +261,7 @@ msgstr "已更新节点"
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__id
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_bl_sync_log__id
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_ship_package_sync_log__id
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__id
msgid "ID"
msgstr ""
...
...
@@ -198,6 +281,7 @@ msgstr "是否同步"
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log____last_update
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_bl_sync_log____last_update
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_ship_package_sync_log____last_update
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record____last_update
msgid "Last Modified on"
msgstr ""
...
...
@@ -206,6 +290,7 @@ msgstr ""
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__write_uid
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_bl_sync_log__write_uid
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_ship_package_sync_log__write_uid
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__write_uid
msgid "Last Updated by"
msgstr ""
...
...
@@ -214,6 +299,7 @@ msgstr ""
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__write_date
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_bl_sync_log__write_date
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_ship_package_sync_log__write_date
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__write_date
msgid "Last Updated on"
msgstr ""
...
...
@@ -225,8 +311,6 @@ msgstr "未同步"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/cc_bill_loading.py:0
#: code:addons/ccs_connect_tiktok/models/cc_bill_loading_new.py:0
#: code:addons/ccs_connect_tiktok/models/cc_bill_loading_old.py:0
#, python-format
msgid "Not Sync Ship Packages"
msgstr "待同步小包"
...
...
@@ -263,6 +347,27 @@ msgstr "操作时间"
msgid "Operate User"
msgstr "操作人"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__operation
#, python-format
msgid "Operation"
msgstr "操作"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.actions.act_window,name:ccs_connect_tiktok.action_pda_scan_record
#: model:ir.model,name:ccs_connect_tiktok.model_pda_scan_record
#: model:ir.ui.menu,name:ccs_connect_tiktok.menu_pda_scan_record
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.view_pda_scan_record_form
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.view_pda_scan_record_search
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.view_pda_scan_record_tree
#, python-format
msgid "PDA Scan Record"
msgstr "PDA扫码记录"
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_node__interval_minutes
msgid "Predecessor Node Interval (Minutes)"
...
...
@@ -300,11 +405,34 @@ msgstr "小包"
msgid "Skip Check"
msgstr "跳过检查"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/ir_attachment.py:0
#, python-format
msgid "Sorry, you are not allowed to access this document."
msgstr ""
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__state
#, python-format
msgid "State"
msgstr "状态"
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.form_cc_bl_view_inherit
msgid "State Explain"
msgstr "状态说明"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields.selection,name:ccs_connect_tiktok.selection__pda_scan_record__state__success
#, python-format
msgid "Success"
msgstr "成功"
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.form_cc_bl_view_inherit
msgid "Sync Bill Of Loading Status"
...
...
@@ -377,6 +505,31 @@ msgstr "编码"
msgid "TK Process Code"
msgstr "进度编码"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields.selection,name:ccs_connect_tiktok.selection__pda_scan_record__operation__tail_handover
#, python-format
msgid "Tail Handover"
msgstr "按尾程交货"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields.selection,name:ccs_connect_tiktok.selection__pda_scan_record__operation__tail_tally
#, python-format
msgid "Tail Tally"
msgstr "按尾程理货"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields.selection,name:ccs_connect_tiktok.selection__pda_scan_record__record_type__tally
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.view_pda_scan_record_search
#, python-format
msgid "Tally"
msgstr "理货"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/wizard/batch_input_ship_package_statu_wizard.py:0
...
...
@@ -403,6 +556,22 @@ msgid ""
"number!"
msgstr "单号【%s】需填写在排除单号中!"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__transfer_number
#, python-format
msgid "Transfer Number"
msgstr "转运单号"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__record_type
#, python-format
msgid "Type"
msgstr "类型"
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.tree_cc_bl_view_inherit
msgid "UnSync Package Count"
...
...
@@ -477,6 +646,11 @@ msgstr ""
msgid "业务信息"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_res_config_settings__delivery_time
msgid "交货操作晚于提货操作X分钟"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__push_time
msgid "产生时间"
...
...
@@ -507,6 +681,12 @@ msgstr ""
msgid "失败原因"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.actions.server,name:ccs_connect_tiktok.cron_delete_log_ir_actions_server
#: model:ir.cron,cron_name:ccs_connect_tiktok.cron_delete_log
msgid "定时删除历史日志"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_res_config_settings__tt_customer_id
msgid "客户"
...
...
@@ -542,6 +722,11 @@ msgstr ""
msgid "推出"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__operator_id
msgid "操作人"
msgstr ""
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "昨日日志"
...
...
ccs_connect_tiktok/models/__init__.py
浏览文件 @
a05f8190
...
...
@@ -8,6 +8,7 @@ from . import cc_node
from
.
import
cc_bill_loading
from
.
import
ir_attachment
from
.
import
http
from
.
import
pda_scan_record
ccs_connect_tiktok/models/pda_scan_record.py
0 → 100644
浏览文件 @
a05f8190
# -*- coding: utf-8 -*-
from
odoo
import
models
,
fields
,
api
,
_
from
odoo.exceptions
import
ValidationError
class
PDAScanRecord
(
models
.
Model
):
_name
=
'pda.scan.record'
_description
=
_
(
'PDA Scan Record'
)
# PDA扫码记录
_order
=
'create_date desc'
_rec_name
=
'bill_number'
@api.onchange
(
'operation'
)
def
_onchange_operation
(
self
):
"""根据操作自动设置类型"""
if
self
.
operation
:
if
'tally'
in
self
.
operation
:
self
.
record_type
=
'tally'
elif
'handover'
in
self
.
operation
:
self
.
record_type
=
'handover'
operator_id
=
fields
.
Many2one
(
'res.users'
,
string
=
'操作人'
,
required
=
True
)
operation_time
=
fields
.
Datetime
(
string
=
'操作时间'
,
required
=
True
,
default
=
fields
.
Datetime
.
now
)
operation
=
fields
.
Selection
([
(
'bill_tally'
,
_
(
'Bill Tally'
)),
# 按提单理货
(
'tail_tally'
,
_
(
'Tail Tally'
)),
# 按尾程理货
(
'bill_handover'
,
_
(
'Bill Handover'
)),
# 按提单交货
(
'tail_handover'
,
_
(
'Tail Handover'
))
# 按尾程交货
],
string
=
_
(
'Operation'
),
required
=
True
)
# 操作
record_type
=
fields
.
Selection
([
(
'tally'
,
_
(
'Tally'
)),
# 理货
(
'handover'
,
_
(
'Handover'
))
# 交货
],
string
=
_
(
'Type'
),
required
=
True
)
# 类型
bill_number
=
fields
.
Char
(
string
=
_
(
'Bill Number'
))
# 提单号
transfer_number
=
fields
.
Char
(
string
=
_
(
'Transfer Number'
))
# 转运单号
# 增加提单关联字段
bl_id
=
fields
.
Many2one
(
'cc.bl'
,
string
=
_
(
'Bill of Lading'
),
ondelete
=
'cascade'
)
# 提单对象
#增加状态 成功 失败
state
=
fields
.
Selection
([
(
'success'
,
_
(
'Success'
)),
(
'failed'
,
_
(
'Failed'
))
],
string
=
_
(
'State'
),
required
=
True
)
failure_reason
=
fields
.
Char
(
string
=
_
(
'Failure Reason'
))
# 失败原因
@api.model
def
create_scan_record
(
self
,
operation
,
record_type
,
bill_number
,
transfer_number
,
state
,
operator_id
=
False
,
bl_id
=
False
,
failure_reason
=
False
,
operation_time
=
False
):
"""
创建扫码记录的方法,供接口调用
Create scan record method for API calls
"""
try
:
if
not
operator_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_data
=
{
'operator_id'
:
operator_id
,
'operation'
:
operation
,
'record_type'
:
record_type
,
'bill_number'
:
bill_number
,
'transfer_number'
:
transfer_number
,
'bl_id'
:
bl_id
,
'state'
:
state
,
'failure_reason'
:
failure_reason
}
# 如果传入了自定义操作时间,使用它
if
operation_time
:
record_data
[
'operation_time'
]
=
operation_time
record
=
self
.
create
(
record_data
)
return
{
'success'
:
True
,
'record_id'
:
record
.
id
,
'message'
:
''
}
except
Exception
as
e
:
return
{
'success'
:
False
,
'message'
:
_
(
'Creation failed:
%
s'
)
%
str
(
e
)
# 创建失败
}
\ No newline at end of file
ccs_connect_tiktok/models/res_config_setting.py
浏览文件 @
a05f8190
...
...
@@ -15,6 +15,8 @@ class ResConfigSettings(models.TransientModel):
tt_app_secret
=
fields
.
Char
(
'AppSecret'
,
default
=
''
)
tt_version
=
fields
.
Char
(
'接口版本'
,
default
=
'3.0'
)
tt_customer_id
=
fields
.
Many2one
(
'res.partner'
,
string
=
'客户'
)
#交货操作晚于提货操作X分钟【默认80分钟】
delivery_time
=
fields
.
Integer
(
'交货操作晚于提货操作X分钟'
,
default
=
80
,
config_parameter
=
'delivery_time'
)
@api.model
def
get_values
(
self
):
...
...
@@ -29,13 +31,15 @@ class ResConfigSettings(models.TransientModel):
tt_app_secret
=
config
.
get_param
(
'tt_app_secret'
,
default
=
''
)
tt_version
=
config
.
get_param
(
'tt_version'
,
default
=
''
)
tt_customer_id
=
config
.
get_param
(
'tt_customer_id'
,
default
=
False
)
delivery_time
=
config
.
get_param
(
'delivery_time'
,
default
=
80
)
customer
=
self
.
env
[
'res.partner'
]
.
sudo
()
.
search
([(
'id'
,
'='
,
tt_customer_id
)])
values
.
update
(
tt_url
=
tt_url
,
tt_app_key
=
tt_app_key
,
tt_app_secret
=
tt_app_secret
,
tt_version
=
tt_version
,
tt_customer_id
=
customer
tt_customer_id
=
customer
,
delivery_time
=
delivery_time
)
return
values
...
...
@@ -47,3 +51,4 @@ class ResConfigSettings(models.TransientModel):
ir_config
.
set_param
(
"tt_app_secret"
,
self
.
tt_app_secret
or
""
)
ir_config
.
set_param
(
"tt_version"
,
self
.
tt_version
or
""
)
ir_config
.
set_param
(
"tt_customer_id"
,
self
.
tt_customer_id
.
id
or
False
)
ir_config
.
set_param
(
"delivery_time"
,
self
.
delivery_time
or
80
)
\ No newline at end of file
ccs_connect_tiktok/security/ir.model.access.csv
浏览文件 @
a05f8190
...
...
@@ -12,3 +12,6 @@ access_cc_bl_sync_log_base.group_erp_manager,cc_bl_sync_log base.group_erp_manag
access_cc_bl_sync_log_ccs_base.group_clearance_of_customs_manager,cc_bl_sync_log ccs_base.group_clearance_of_customs_manager,ccs_connect_tiktok.model_cc_bl_sync_log,ccs_base.group_clearance_of_customs_manager,1,0,0,0
access_cc_bl_sync_log_ccs_base.group_clearance_of_customs_user,cc_bl_sync_log ccs_base.group_clearance_of_customs_user,ccs_connect_tiktok.model_cc_bl_sync_log,ccs_base.group_clearance_of_customs_user,1,0,0,0
access_pda_scan_record_user,pda.scan.record.user,model_pda_scan_record,base.group_user,1,1,1,0
access_pda_scan_record_manager,pda.scan.record.manager,model_pda_scan_record,base.group_system,1,1,1,1
ccs_connect_tiktok/views/config_settings_views.xml
浏览文件 @
a05f8190
...
...
@@ -25,6 +25,10 @@
<label
for=
"tt_customer_id"
/>
<field
name=
"tt_customer_id"
/>
</div>
<div
class=
"text-muted"
>
<label
for=
"delivery_time"
/>
<field
name=
"delivery_time"
/>
</div>
</div>
</div>
<div
class=
"col-12 col-lg-6 o_setting_box"
>
...
...
ccs_connect_tiktok/views/pda_scan_record_views.xml
0 → 100644
浏览文件 @
a05f8190
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- PDA扫码记录列表视图 -->
<record
id=
"view_pda_scan_record_tree"
model=
"ir.ui.view"
>
<field
name=
"name"
>
pda.scan.record.tree
</field>
<field
name=
"model"
>
pda.scan.record
</field>
<field
name=
"arch"
type=
"xml"
>
<tree
string=
"PDA Scan Record"
decoration-info=
"state == 'success'"
decoration-danger=
"state == 'failed'"
>
<field
name=
"operator_id"
/>
<field
name=
"operation_time"
/>
<field
name=
"operation"
/>
<field
name=
"record_type"
/>
<field
name=
"bill_number"
/>
<field
name=
"transfer_number"
/>
<field
name=
"bl_id"
invisible=
"1"
/>
<field
name=
"state"
/>
<field
name=
"failure_reason"
optional=
"hide"
/>
</tree>
</field>
</record>
<!-- PDA扫码记录表单视图 -->
<record
id=
"view_pda_scan_record_form"
model=
"ir.ui.view"
>
<field
name=
"name"
>
pda.scan.record.form
</field>
<field
name=
"model"
>
pda.scan.record
</field>
<field
name=
"arch"
type=
"xml"
>
<form
string=
"PDA Scan Record"
>
<header>
<field
name=
"state"
widget=
"statusbar"
/>
</header>
<sheet>
<group>
<group>
<field
name=
"operator_id"
/>
<field
name=
"operation_time"
/>
<field
name=
"operation"
/>
</group>
<group>
<field
name=
"record_type"
/>
<field
name=
"bl_id"
invisible=
"1"
/>
<field
name=
"bill_number"
/>
<field
name=
"transfer_number"
/>
</group>
</group>
<group>
<field
name=
"failure_reason"
attrs=
"{'invisible': [('state', '=', 'success')]}"
/>
</group>
</sheet>
</form>
</field>
</record>
<!-- PDA扫码记录搜索视图 -->
<record
id=
"view_pda_scan_record_search"
model=
"ir.ui.view"
>
<field
name=
"name"
>
pda.scan.record.search
</field>
<field
name=
"model"
>
pda.scan.record
</field>
<field
name=
"arch"
type=
"xml"
>
<search
string=
"PDA Scan Record"
>
<field
name=
"operator_id"
/>
<field
name=
"operation_time"
/>
<field
name=
"operation"
/>
<field
name=
"record_type"
/>
<field
name=
"bill_number"
/>
<field
name=
"transfer_number"
/>
<filter
string=
"Tally"
name=
"tally"
domain=
"[('record_type', '=', 'tally')]"
/>
<filter
string=
"Handover"
name=
"handover"
domain=
"[('record_type', '=', 'handover')]"
/>
</search>
</field>
</record>
<!-- PDA扫码记录动作 -->
<record
id=
"action_pda_scan_record"
model=
"ir.actions.act_window"
>
<field
name=
"name"
>
PDA Scan Record
</field>
<field
name=
"res_model"
>
pda.scan.record
</field>
<field
name=
"view_mode"
>
tree,form
</field>
<field
name=
"search_view_id"
ref=
"view_pda_scan_record_search"
/>
<field
name=
"help"
type=
"html"
>
<p
class=
"o_view_nocontent_smiling_face"
>
Create your first PDA scan record
</p>
</field>
</record>
<!-- 菜单项 -->
<menuitem
id=
"menu_pda_scan_record"
name=
"PDA Scan Record"
action=
"action_pda_scan_record"
sequence=
"21"
/>
</odoo>
\ No newline at end of file
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论