提交 5e22b7c3 authored 作者: 贺阳's avatar 贺阳

1.提单上新增字段:转单号

转单号判重规则与提单号判重规则一致,且不与提单号重复; 转单号可编辑,权限:清关员 提示: a.转单号已重复 b.转单号与提单号重复; 2.批量关联转单号; 在提单列表新增按钮“关联转单号”,点击,弹出向导,上传表格(模版可供下载),点击确定,将对应的提单回写转单号。遵循第1点规则,若有错误,则返回表格提示;一个不成功,所有表格里的不成功; 若提单已有转单号,则按最新覆盖; 3.PDA在按提单理货或交货时,创建提单理货或交货批次时,优先匹配提单号,匹配不到则匹配转单号,匹配规则与提单号匹配规则一致。匹配到也表示该提单已找到。 4.导出报关数据修改: 向导上新增字段:文件命名。导出的表格命名,可勾选。默认为提单号命名(现在就是按提单号命名),若勾选了转单号,则按转单号命名 是否分打包导出,默认给指,否
上级 b18925ed
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
'wizard/batch_input_ship_package_statu_wizard.xml', 'wizard/batch_input_ship_package_statu_wizard.xml',
'wizard/update_bl_status_wizard.xml', 'wizard/update_bl_status_wizard.xml',
'wizard/export_bl_big_package_xlsx_wizard.xml', 'wizard/export_bl_big_package_xlsx_wizard.xml',
'wizard/batch_update_transfer_bl_no_wizard_view.xml',
'wizard/associate_pallet_wizard_views.xml', 'wizard/associate_pallet_wizard_views.xml',
'wizard/add_exception_info_wizard_views.xml', 'wizard/add_exception_info_wizard_views.xml',
'wizard/email_template.xml', 'wizard/email_template.xml',
...@@ -57,9 +58,11 @@ ...@@ -57,9 +58,11 @@
'ccs_base/static/css/base.scss', 'ccs_base/static/css/base.scss',
], ],
'web.assets_backend': [ 'web.assets_backend': [
'ccs_base/static/src/mixins/*.js', 'ccs_base/static/src/mixins/link_pallet.js',
'ccs_base/static/src/views/*.js', 'ccs_base/static/src/mixins/link_transfer_bl_no.js',
'ccs_base/static/src/views/*.xml', 'ccs_base/static/src/views/big_package_list_controller.js',
'ccs_base/static/src/views/bl_list_controller.js',
'ccs_base/static/src/views/list.xml',
], ],
}, },
'license': 'AGPL-3', 'license': 'AGPL-3',
......
...@@ -133,8 +133,8 @@ class ExportBlAndPackageXlsx(http.Controller): ...@@ -133,8 +133,8 @@ class ExportBlAndPackageXlsx(http.Controller):
return sheet1 return sheet1
# 运单导出包裹清关数据 每个运单导出一个文件 生成压缩包 # 运单导出包裹清关数据 每个运单导出一个文件 生成压缩包
@http.route(['/export/bl/package/xls/<string:arr>/<string:select_type>'], type='http', auth="public") @http.route(['/export/bl/package/xls/<string:arr>/<string:select_type>/<string:file_name_type>'], type='http', auth="public")
def export_bl_package_xls(self, arr, select_type): def export_bl_package_xls(self, arr, select_type, file_name_type):
""" """
是否分大包,如果不分,就是提单一个文件,命名 提单号;如果分,一个提单一个大包一个文件,命名 提单号➕大包号 是否分大包,如果不分,就是提单一个文件,命名 提单号;如果分,一个提单一个大包一个文件,命名 提单号➕大包号
""" """
...@@ -144,6 +144,7 @@ class ExportBlAndPackageXlsx(http.Controller): ...@@ -144,6 +144,7 @@ class ExportBlAndPackageXlsx(http.Controller):
with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_DEFLATED) as zip_file: with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_DEFLATED) as zip_file:
if select_type == 'yes': if select_type == 'yes':
for bl_item in bl_obj: for bl_item in bl_obj:
order_no = bl_item.bl_no if file_name_type == 'bl_no' else bl_item.transfer_bl_no
for bag_item in bl_item.big_package_ids.filtered(lambda pack: not pack.is_cancel): for bag_item in bl_item.big_package_ids.filtered(lambda pack: not pack.is_cancel):
if len(bag_item.mapped('ship_package_ids').mapped('good_ids').filtered( if len(bag_item.mapped('ship_package_ids').mapped('good_ids').filtered(
lambda good: not good.is_cancel)) > 0: lambda good: not good.is_cancel)) > 0:
...@@ -152,9 +153,10 @@ class ExportBlAndPackageXlsx(http.Controller): ...@@ -152,9 +153,10 @@ class ExportBlAndPackageXlsx(http.Controller):
excel_file = io.BytesIO() excel_file = io.BytesIO()
worksheet.save(excel_file) worksheet.save(excel_file)
excel_file.seek(0) excel_file.seek(0)
zip_file.writestr(f"{bl_item.bl_no}-{bag_item.big_package_no}.xls", excel_file.read()) # 压缩 zip_file.writestr(f"{order_no}-{bag_item.big_package_no}.xls", excel_file.read()) # 压缩
else: else:
for bl_item in bl_obj: for bl_item in bl_obj:
order_no = bl_item.bl_no if file_name_type == 'bl_no' else bl_item.transfer_bl_no
big_bag_obj = bl_item.big_package_ids.filtered(lambda pack: not pack.is_cancel) big_bag_obj = bl_item.big_package_ids.filtered(lambda pack: not pack.is_cancel)
if len(big_bag_obj.mapped('ship_package_ids').mapped('good_ids').filtered( if len(big_bag_obj.mapped('ship_package_ids').mapped('good_ids').filtered(
lambda good: not good.is_cancel)) > 0: lambda good: not good.is_cancel)) > 0:
...@@ -163,7 +165,7 @@ class ExportBlAndPackageXlsx(http.Controller): ...@@ -163,7 +165,7 @@ class ExportBlAndPackageXlsx(http.Controller):
excel_file = io.BytesIO() excel_file = io.BytesIO()
worksheet.save(excel_file) worksheet.save(excel_file)
excel_file.seek(0) excel_file.seek(0)
zip_file.writestr(f"{bl_item.bl_no}.xls", excel_file.read()) # 压缩 zip_file.writestr(f"{order_no}.xls", excel_file.read()) # 压缩
zip_buffer.seek(0) zip_buffer.seek(0)
headers = [ headers = [
('Content-Type', 'application/x-zip-compressed'), ('Content-Type', 'application/x-zip-compressed'),
...@@ -172,19 +174,20 @@ class ExportBlAndPackageXlsx(http.Controller): ...@@ -172,19 +174,20 @@ class ExportBlAndPackageXlsx(http.Controller):
response = http.request.make_response(zip_buffer.getvalue(), headers=headers) response = http.request.make_response(zip_buffer.getvalue(), headers=headers)
return response return response
@http.route(['/export/flight_png/xls/<string:arr>'], type='http', auth="public") @http.route(['/export/flight_png/xls/<string:arr>/<string:file_name_type>'], type='http', auth="public")
def export_flight_png_xls(self, arr): def export_flight_png_xls(self, arr, file_name_type):
arr = json.loads(arr) arr = json.loads(arr)
flight_objs = http.request.env['cc.bl'].sudo().search([('id', 'in', arr)], order='id') flight_objs = http.request.env['cc.bl'].sudo().search([('id', 'in', arr)], order='id')
zip_buffer = io.BytesIO() zip_buffer = io.BytesIO()
with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_DEFLATED) as zip_file: with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_DEFLATED) as zip_file:
for flight in flight_objs: for flight in flight_objs:
order_no = flight.bl_no if file_name_type == 'bl_no' else flight.transfer_bl_no
bl_attachment_objs = flight.bl_attachment_ids bl_attachment_objs = flight.bl_attachment_ids
for bl_attachment_obj in bl_attachment_objs: for bl_attachment_obj in bl_attachment_objs:
# 获取图片数据 # 获取图片数据
image_data = base64.b64decode(bl_attachment_obj.datas) image_data = base64.b64decode(bl_attachment_obj.datas)
# 创建文件名,前缀为单据号 # 创建文件名,前缀为单据号
file_name = f"{flight.bl_no}.png" file_name = f"{order_no}.png"
# 将图片添加到 ZIP 文件 # 将图片添加到 ZIP 文件
zip_file.writestr(file_name, image_data) zip_file.writestr(file_name, image_data)
zip_buffer.seek(0) zip_buffer.seek(0)
......
...@@ -6,8 +6,8 @@ msgid "" ...@@ -6,8 +6,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Odoo Server 16.0\n" "Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-09 07:48+0000\n" "POT-Creation-Date: 2025-07-14 08:39+0000\n"
"PO-Revision-Date: 2025-06-09 15:53+0800\n" "PO-Revision-Date: 2025-07-14 16:41+0800\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
"Language: zh_CN\n" "Language: zh_CN\n"
...@@ -143,6 +143,19 @@ msgid "" ...@@ -143,6 +143,19 @@ msgid ""
" " " "
msgstr "" msgstr ""
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.view_batch_update_transfer_bl_no_wizard
msgid ""
"<span class=\"label label-warning\">\n"
" If there is abnormal data, please download "
"the error file, fix the data as prompted, and re-import!\n"
" </span>"
msgstr ""
"<span class=\"label label-warning\">\n"
" 如果数据异常,请下载错误文件,按提示修正数"
"据,然后重新导入!\n"
" </span>"
#. module: ccs_base #. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_bl_view #: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_bl_view
msgid "<span class=\"o_stat_text\">Big Packages</span>" msgid "<span class=\"o_stat_text\">Big Packages</span>"
...@@ -172,6 +185,18 @@ msgstr "<span class=\"o_stat_text\">小包</span>" ...@@ -172,6 +185,18 @@ msgstr "<span class=\"o_stat_text\">小包</span>"
msgid "<span class=\"o_stat_text\">Tally Big Packages</span>" msgid "<span class=\"o_stat_text\">Tally Big Packages</span>"
msgstr "<span class=\"o_stat_text\">已理货大包</span>" msgstr "<span class=\"o_stat_text\">已理货大包</span>"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.view_batch_update_transfer_bl_no_wizard
msgid ""
"<span style=\"color:red;font-size:15px;\">Tip: Please fill in the "
"information strictly according to the template, otherwise the system will "
"not recognize it.\n"
" </span>"
msgstr ""
"<span style=\"color:red;font-size:15px;\">提示:请务必按照模板填写信息,否则"
"系统无法识别。\n"
" </span>"
#. module: ccs_base #. module: ccs_base
#: model:ir.model.fields,help:ccs_base.field_batch_input_ship_package_status_wizard__exclude_tracking_no #: model:ir.model.fields,help:ccs_base.field_batch_input_ship_package_status_wizard__exclude_tracking_no
#: model:ir.model.fields,help:ccs_base.field_batch_input_ship_package_status_wizard__select_tracking_no #: model:ir.model.fields,help:ccs_base.field_batch_input_ship_package_status_wizard__select_tracking_no
...@@ -215,6 +240,7 @@ msgstr "" ...@@ -215,6 +240,7 @@ msgstr ""
#. module: ccs_base #. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard__action_type #: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard__action_type
#: model:ir.model.fields,field_description:ccs_base.field_export_bl_big_package_xlsx_wizard__action_type
msgid "Action Type" msgid "Action Type"
msgstr "动作类型" msgstr "动作类型"
...@@ -456,10 +482,33 @@ msgid "B/L File" ...@@ -456,10 +482,33 @@ msgid "B/L File"
msgstr "提货单文件" msgstr "提货单文件"
#. module: ccs_base #. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_batch_update_transfer_bl_no_wizard__report_file_ids
msgid "B/L List"
msgstr "提单列表"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/batch_update_transfer_bl_no_wizard.py:0
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__bl_no #: model:ir.model.fields,field_description:ccs_base.field_cc_bl__bl_no
#: model:ir.model.fields.selection,name:ccs_base.selection__export_bl_big_package_xlsx_wizard__file_name_type__bl_no
#, python-format
msgid "B/L No" msgid "B/L No"
msgstr "提单号" msgstr "提单号"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/batch_update_transfer_bl_no_wizard.py:0
#, python-format
msgid "B/L No and Transfer B/L No are duplicated"
msgstr "提单号和转单号重复"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/batch_update_transfer_bl_no_wizard.py:0
#, python-format
msgid "B/L No is required"
msgstr "提单号必填"
#. module: ccs_base #. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__bl_attachment_ids #: model:ir.model.fields,field_description:ccs_base.field_cc_bl__bl_attachment_ids
msgid "B\\L Attachments" msgid "B\\L Attachments"
...@@ -482,6 +531,16 @@ msgstr "批量" ...@@ -482,6 +531,16 @@ msgstr "批量"
msgid "Batch Add Package Exception Information" msgid "Batch Add Package Exception Information"
msgstr "批量添加异常信息" msgstr "批量添加异常信息"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.view_batch_update_transfer_bl_no_wizard
msgid "Batch Link Transfer B/L No"
msgstr "批量关联转单号"
#. module: ccs_base
#: model:ir.model,name:ccs_base.model_batch_update_transfer_bl_no_wizard
msgid "Batch Update Transfer B/L No Wizard"
msgstr "批量关联转单号向导"
#. module: ccs_base #. module: ccs_base
#: model:ir.model,name:ccs_base.model_batch_input_ship_package_status_wizard #: model:ir.model,name:ccs_base.model_batch_input_ship_package_status_wizard
msgid "Batch Update the status of the small package" msgid "Batch Update the status of the small package"
...@@ -877,6 +936,7 @@ msgstr "清关文件" ...@@ -877,6 +936,7 @@ msgstr "清关文件"
#: model_terms:ir.ui.view,arch_db:ccs_base.view_add_exception_info_wizard #: model_terms:ir.ui.view,arch_db:ccs_base.view_add_exception_info_wizard
#: model_terms:ir.ui.view,arch_db:ccs_base.view_associate_pallet_wizard #: model_terms:ir.ui.view,arch_db:ccs_base.view_associate_pallet_wizard
#: model_terms:ir.ui.view,arch_db:ccs_base.view_batch_input_ship_package_wizard #: model_terms:ir.ui.view,arch_db:ccs_base.view_batch_input_ship_package_wizard
#: model_terms:ir.ui.view,arch_db:ccs_base.view_batch_update_transfer_bl_no_wizard
#: model_terms:ir.ui.view,arch_db:ccs_base.view_export_bl_big_package_xlsx_wizard #: model_terms:ir.ui.view,arch_db:ccs_base.view_export_bl_big_package_xlsx_wizard
#: model_terms:ir.ui.view,arch_db:ccs_base.view_update_bl_status_wizard #: model_terms:ir.ui.view,arch_db:ccs_base.view_update_bl_status_wizard
msgid "Close" msgid "Close"
...@@ -954,6 +1014,7 @@ msgstr "快递名称" ...@@ -954,6 +1014,7 @@ msgstr "快递名称"
#: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard__create_uid #: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard__create_uid
#: model:ir.model.fields,field_description:ccs_base.field_associate_pallet_wizard__create_uid #: model:ir.model.fields,field_description:ccs_base.field_associate_pallet_wizard__create_uid
#: model:ir.model.fields,field_description:ccs_base.field_batch_input_ship_package_status_wizard__create_uid #: model:ir.model.fields,field_description:ccs_base.field_batch_input_ship_package_status_wizard__create_uid
#: model:ir.model.fields,field_description:ccs_base.field_batch_update_transfer_bl_no_wizard__create_uid
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__create_uid #: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__create_uid
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__create_uid #: model:ir.model.fields,field_description:ccs_base.field_cc_bl__create_uid
#: model:ir.model.fields,field_description:ccs_base.field_cc_clearance_file__create_uid #: model:ir.model.fields,field_description:ccs_base.field_cc_clearance_file__create_uid
...@@ -982,6 +1043,7 @@ msgstr "创建人" ...@@ -982,6 +1043,7 @@ msgstr "创建人"
#: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard__create_date #: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard__create_date
#: model:ir.model.fields,field_description:ccs_base.field_associate_pallet_wizard__create_date #: model:ir.model.fields,field_description:ccs_base.field_associate_pallet_wizard__create_date
#: model:ir.model.fields,field_description:ccs_base.field_batch_input_ship_package_status_wizard__create_date #: model:ir.model.fields,field_description:ccs_base.field_batch_input_ship_package_status_wizard__create_date
#: model:ir.model.fields,field_description:ccs_base.field_batch_update_transfer_bl_no_wizard__create_date
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__create_date #: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__create_date
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__create_date #: model:ir.model.fields,field_description:ccs_base.field_cc_bl__create_date
#: model:ir.model.fields,field_description:ccs_base.field_cc_clearance_file__create_date #: model:ir.model.fields,field_description:ccs_base.field_cc_clearance_file__create_date
...@@ -1170,6 +1232,7 @@ msgstr "消费者地址" ...@@ -1170,6 +1232,7 @@ msgstr "消费者地址"
#: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard__display_name #: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard__display_name
#: model:ir.model.fields,field_description:ccs_base.field_associate_pallet_wizard__display_name #: model:ir.model.fields,field_description:ccs_base.field_associate_pallet_wizard__display_name
#: model:ir.model.fields,field_description:ccs_base.field_batch_input_ship_package_status_wizard__display_name #: model:ir.model.fields,field_description:ccs_base.field_batch_input_ship_package_status_wizard__display_name
#: model:ir.model.fields,field_description:ccs_base.field_batch_update_transfer_bl_no_wizard__display_name
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__display_name #: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__display_name
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__display_name #: model:ir.model.fields,field_description:ccs_base.field_cc_bl__display_name
#: model:ir.model.fields,field_description:ccs_base.field_cc_clearance_file__display_name #: model:ir.model.fields,field_description:ccs_base.field_cc_clearance_file__display_name
...@@ -1200,6 +1263,11 @@ msgstr "显示名称" ...@@ -1200,6 +1263,11 @@ msgstr "显示名称"
msgid "Done" msgid "Done"
msgstr "完成" msgstr "完成"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.view_batch_update_transfer_bl_no_wizard
msgid "Download Template"
msgstr "下载模版"
#. module: ccs_base #. module: ccs_base
#: model:ir.model.fields.selection,name:ccs_base.selection__cc_bl__state__draft #: model:ir.model.fields.selection,name:ccs_base.selection__cc_bl__state__draft
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_bl_view #: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_bl_view
...@@ -1265,6 +1333,21 @@ msgstr "目的地港口代码" ...@@ -1265,6 +1333,21 @@ msgstr "目的地港口代码"
msgid "English" msgid "English"
msgstr "英文" msgstr "英文"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/batch_update_transfer_bl_no_wizard.py:0
#: model:ir.model.fields,field_description:ccs_base.field_batch_update_transfer_bl_no_wizard__error_file_ids
#, python-format
msgid "Error Data"
msgstr "异常数据"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/batch_update_transfer_bl_no_wizard.py:0
#, python-format
msgid "Error Reason"
msgstr ""
#. module: ccs_base #. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_exception_info__exception_code #: model:ir.model.fields,field_description:ccs_base.field_cc_exception_info__exception_code
msgid "Exception Code" msgid "Exception Code"
...@@ -1312,6 +1395,13 @@ msgstr "异常类型" ...@@ -1312,6 +1395,13 @@ msgstr "异常类型"
msgid "Exclude TrackingNo" msgid "Exclude TrackingNo"
msgstr "排除的追踪号" msgstr "排除的追踪号"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/models/cc_bill_loading.py:0
#, python-format
msgid "Export Customs Clearance Bill of Lading"
msgstr "导出清关清单文件"
#. module: ccs_base #. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_history_package_good__export_hs_code #: model:ir.model.fields,field_description:ccs_base.field_cc_history_package_good__export_hs_code
#: model:ir.model.fields,field_description:ccs_base.field_cc_package_good__export_hs_code #: model:ir.model.fields,field_description:ccs_base.field_cc_package_good__export_hs_code
...@@ -1346,6 +1436,7 @@ msgid "File" ...@@ -1346,6 +1436,7 @@ msgid "File"
msgstr "文件" msgstr "文件"
#. module: ccs_base #. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_batch_update_transfer_bl_no_wizard__file_name
#: model:ir.model.fields,field_description:ccs_base.field_cc_clearance_file__attachment_name #: model:ir.model.fields,field_description:ccs_base.field_cc_clearance_file__attachment_name
#: model:ir.model.fields,field_description:ccs_base.field_cc_clearance_file__file_name #: model:ir.model.fields,field_description:ccs_base.field_cc_clearance_file__file_name
#: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_clearance_file_view #: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_clearance_file_view
...@@ -1354,6 +1445,18 @@ msgstr "文件" ...@@ -1354,6 +1445,18 @@ msgstr "文件"
msgid "File Name" msgid "File Name"
msgstr "文件名" msgstr "文件名"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_export_bl_big_package_xlsx_wizard__file_name_type
msgid "File Name Type"
msgstr "文件名称"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/batch_update_transfer_bl_no_wizard.py:0
#, python-format
msgid "File error, the content order should be: %s"
msgstr "文件错误,内容顺序为:%s"
#. module: ccs_base #. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__message_follower_ids #: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__message_follower_ids
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__message_follower_ids #: model:ir.model.fields,field_description:ccs_base.field_cc_bl__message_follower_ids
...@@ -1537,6 +1640,7 @@ msgstr "历史小包" ...@@ -1537,6 +1640,7 @@ msgstr "历史小包"
#: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard__id #: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard__id
#: model:ir.model.fields,field_description:ccs_base.field_associate_pallet_wizard__id #: model:ir.model.fields,field_description:ccs_base.field_associate_pallet_wizard__id
#: model:ir.model.fields,field_description:ccs_base.field_batch_input_ship_package_status_wizard__id #: model:ir.model.fields,field_description:ccs_base.field_batch_input_ship_package_status_wizard__id
#: model:ir.model.fields,field_description:ccs_base.field_batch_update_transfer_bl_no_wizard__id
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__id #: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__id
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__id #: model:ir.model.fields,field_description:ccs_base.field_cc_bl__id
#: model:ir.model.fields,field_description:ccs_base.field_cc_clearance_file__id #: model:ir.model.fields,field_description:ccs_base.field_cc_clearance_file__id
...@@ -1614,6 +1718,11 @@ msgstr "" ...@@ -1614,6 +1718,11 @@ msgstr ""
msgid "If checked, some messages have a delivery error." msgid "If checked, some messages have a delivery error."
msgstr "" msgstr ""
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.view_batch_update_transfer_bl_no_wizard
msgid "Import"
msgstr "导入"
#. module: ccs_base #. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_history_package_good__import_hs_code #: model:ir.model.fields,field_description:ccs_base.field_cc_history_package_good__import_hs_code
#: model:ir.model.fields,field_description:ccs_base.field_cc_package_good__import_hs_code #: model:ir.model.fields,field_description:ccs_base.field_cc_package_good__import_hs_code
...@@ -1850,6 +1959,7 @@ msgstr "尾程服务商" ...@@ -1850,6 +1959,7 @@ msgstr "尾程服务商"
#: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard____last_update #: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard____last_update
#: model:ir.model.fields,field_description:ccs_base.field_associate_pallet_wizard____last_update #: model:ir.model.fields,field_description:ccs_base.field_associate_pallet_wizard____last_update
#: model:ir.model.fields,field_description:ccs_base.field_batch_input_ship_package_status_wizard____last_update #: model:ir.model.fields,field_description:ccs_base.field_batch_input_ship_package_status_wizard____last_update
#: model:ir.model.fields,field_description:ccs_base.field_batch_update_transfer_bl_no_wizard____last_update
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package____last_update #: model:ir.model.fields,field_description:ccs_base.field_cc_big_package____last_update
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl____last_update #: model:ir.model.fields,field_description:ccs_base.field_cc_bl____last_update
#: model:ir.model.fields,field_description:ccs_base.field_cc_clearance_file____last_update #: model:ir.model.fields,field_description:ccs_base.field_cc_clearance_file____last_update
...@@ -1884,6 +1994,7 @@ msgstr "最近操作时间" ...@@ -1884,6 +1994,7 @@ msgstr "最近操作时间"
#: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard__write_uid #: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard__write_uid
#: model:ir.model.fields,field_description:ccs_base.field_associate_pallet_wizard__write_uid #: model:ir.model.fields,field_description:ccs_base.field_associate_pallet_wizard__write_uid
#: model:ir.model.fields,field_description:ccs_base.field_batch_input_ship_package_status_wizard__write_uid #: model:ir.model.fields,field_description:ccs_base.field_batch_input_ship_package_status_wizard__write_uid
#: model:ir.model.fields,field_description:ccs_base.field_batch_update_transfer_bl_no_wizard__write_uid
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__write_uid #: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__write_uid
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__write_uid #: model:ir.model.fields,field_description:ccs_base.field_cc_bl__write_uid
#: model:ir.model.fields,field_description:ccs_base.field_cc_clearance_file__write_uid #: model:ir.model.fields,field_description:ccs_base.field_cc_clearance_file__write_uid
...@@ -1912,6 +2023,7 @@ msgstr "最后更新人" ...@@ -1912,6 +2023,7 @@ msgstr "最后更新人"
#: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard__write_date #: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard__write_date
#: model:ir.model.fields,field_description:ccs_base.field_associate_pallet_wizard__write_date #: model:ir.model.fields,field_description:ccs_base.field_associate_pallet_wizard__write_date
#: model:ir.model.fields,field_description:ccs_base.field_batch_input_ship_package_status_wizard__write_date #: model:ir.model.fields,field_description:ccs_base.field_batch_input_ship_package_status_wizard__write_date
#: model:ir.model.fields,field_description:ccs_base.field_batch_update_transfer_bl_no_wizard__write_date
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__write_date #: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__write_date
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__write_date #: model:ir.model.fields,field_description:ccs_base.field_cc_bl__write_date
#: model:ir.model.fields,field_description:ccs_base.field_cc_clearance_file__write_date #: model:ir.model.fields,field_description:ccs_base.field_cc_clearance_file__write_date
...@@ -1971,6 +2083,15 @@ msgstr "链接" ...@@ -1971,6 +2083,15 @@ msgstr "链接"
msgid "Link Pallet" msgid "Link Pallet"
msgstr "关联托盘" msgstr "关联托盘"
#. module: ccs_base
#. odoo-javascript
#. odoo-python
#: code:addons/ccs_base/models/cc_bill_loading.py:0
#: code:addons/ccs_base/static/src/views/list.xml:0
#, python-format
msgid "Link Transfer B/L No"
msgstr "关联转单号"
#. module: ccs_base #. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_progress__loading_type #: model:ir.model.fields,field_description:ccs_base.field_cc_progress__loading_type
msgid "Loading Type" msgid "Loading Type"
...@@ -2264,6 +2385,13 @@ msgstr "" ...@@ -2264,6 +2385,13 @@ msgstr ""
msgid "ONLINE SELLING PLACE" msgid "ONLINE SELLING PLACE"
msgstr "网上销售网站" msgstr "网上销售网站"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/batch_update_transfer_bl_no_wizard.py:0
#, python-format
msgid "Only excel files can be uploaded!"
msgstr "只能上传excel文件!"
#. module: ccs_base #. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_history_package_sync_log__operate_remark #: model:ir.model.fields,field_description:ccs_base.field_cc_history_package_sync_log__operate_remark
#: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_history_package_sync_log_view #: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_history_package_sync_log_view
...@@ -2411,10 +2539,18 @@ msgstr "摆放区域" ...@@ -2411,10 +2539,18 @@ msgstr "摆放区域"
#. odoo-python #. odoo-python
#: code:addons/ccs_base/models/cc_last_mile_provider.py:0 #: code:addons/ccs_base/models/cc_last_mile_provider.py:0
#, python-format #, python-format
msgid "" msgid "Placement Area must be unique !"
"Placement Area must be unique !"
msgstr "摆放区域必须唯一!" msgstr "摆放区域必须唯一!"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/batch_update_transfer_bl_no_wizard.py:0
#, python-format
msgid ""
"Please check if the import file and content are correct, and import "
"according to the template file!"
msgstr "请检查导入文件和内容是否正确,请根据模板文件导入!"
#. module: ccs_base #. module: ccs_base
#. odoo-python #. odoo-python
#: code:addons/ccs_base/models/cc_bill_loading.py:0 #: code:addons/ccs_base/models/cc_bill_loading.py:0
...@@ -2431,6 +2567,13 @@ msgstr "请先配置默认的提单节点类型的清关节点" ...@@ -2431,6 +2567,13 @@ msgstr "请先配置默认的提单节点类型的清关节点"
msgid "Please select the reason for the exception!" msgid "Please select the reason for the exception!"
msgstr "请选择异常原因!" msgstr "请选择异常原因!"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/batch_update_transfer_bl_no_wizard.py:0
#, python-format
msgid "Please upload the B/L data file to be imported first!"
msgstr "请先上传需要更新的提单数据文件!"
#. module: ccs_base #. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_batch_input_ship_package_status_wizard__process_time #: model:ir.model.fields,field_description:ccs_base.field_batch_input_ship_package_status_wizard__process_time
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__process_time #: model:ir.model.fields,field_description:ccs_base.field_cc_bl__process_time
...@@ -3053,7 +3196,7 @@ msgstr "同步日志" ...@@ -3053,7 +3196,7 @@ msgstr "同步日志"
#. module: ccs_base #. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_history_ship_package__sync_log_ids #: model:ir.model.fields,field_description:ccs_base.field_cc_history_ship_package__sync_log_ids
msgid "Sync Logs" msgid "Sync Logs"
msgstr "" msgstr "同步日志"
#. module: ccs_base #. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_clearance_file__upload_time #: model:ir.model.fields,field_description:ccs_base.field_cc_clearance_file__upload_time
...@@ -3184,6 +3327,18 @@ msgstr "商品号必须唯一。" ...@@ -3184,6 +3327,18 @@ msgstr "商品号必须唯一。"
msgid "The Logistic Order No must be unique." msgid "The Logistic Order No must be unique."
msgstr "物流订单号必须唯一。" msgstr "物流订单号必须唯一。"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/models/cc_bill_loading.py:0
#, python-format
msgid "The Transfer B/L No. cannot be the same as the B/L No."
msgstr "转单号不能与本单提单号重复"
#. module: ccs_base
#: model:ir.model.constraint,message:ccs_base.constraint_cc_bl_transfer_bl_no_uniq
msgid "The Transfer B/L No. must be unique."
msgstr "转单号必填"
#. module: ccs_base #. module: ccs_base
#. odoo-python #. odoo-python
#: code:addons/ccs_base/models/cc_bill_loading.py:0 #: code:addons/ccs_base/models/cc_bill_loading.py:0
...@@ -3235,6 +3390,20 @@ msgstr "托盘号只能输入数字!" ...@@ -3235,6 +3390,20 @@ msgstr "托盘号只能输入数字!"
msgid "The usage date cannot be later than the current date!" msgid "The usage date cannot be later than the current date!"
msgstr "使用日期不能大于当前日期!" msgstr "使用日期不能大于当前日期!"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/batch_update_transfer_bl_no_wizard.py:0
#, python-format
msgid "This B/L No does not exist in the system"
msgstr "提单号在系统不存在"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/batch_update_transfer_bl_no_wizard.py:0
#, python-format
msgid "This Transfer B/L No already exists"
msgstr "转单号已存在"
#. module: ccs_base #. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_big_package_view #: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_big_package_view
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_history_big_package_view #: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_history_big_package_view
...@@ -3337,6 +3506,27 @@ msgstr "交易单号" ...@@ -3337,6 +3506,27 @@ msgstr "交易单号"
msgid "Trade Type" msgid "Trade Type"
msgstr "交易类型" msgstr "交易类型"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/batch_update_transfer_bl_no_wizard.py:0
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__transfer_bl_no
#: model:ir.model.fields.selection,name:ccs_base.selection__export_bl_big_package_xlsx_wizard__file_name_type__transfer_bl_no
#, python-format
msgid "Transfer B/L No"
msgstr "转单号"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/batch_update_transfer_bl_no_wizard.py:0
#, python-format
msgid "Transfer B/L No is required"
msgstr "转单号必填"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.tree_cc_bl_view
msgid "Transfer Bill of Loading No."
msgstr "转单号"
#. module: ccs_base #. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__transport_tool_code #: model:ir.model.fields,field_description:ccs_base.field_cc_bl__transport_tool_code
#: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_bl_view #: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_bl_view
...@@ -3536,13 +3726,6 @@ msgstr "昨日提单" ...@@ -3536,13 +3726,6 @@ msgstr "昨日提单"
msgid "Yesterday's ship package" msgid "Yesterday's ship package"
msgstr "昨日小包" msgstr "昨日小包"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/models/cc_bill_loading.py:0
#, python-format
msgid "You have no expense to report"
msgstr ""
#. module: ccs_base #. module: ccs_base
#: model_terms:ir.actions.act_window,help:ccs_base.action_cc_big_package #: model_terms:ir.actions.act_window,help:ccs_base.action_cc_big_package
msgid "" msgid ""
......
# 导入odoo # 导入odoo
# 导入日志 # 导入日志
import logging
from datetime import timedelta, datetime
import json import json
import logging
from datetime import timedelta
import pytz import pytz
from odoo import models, fields, api, _ from odoo import models, fields, api, _
from odoo.exceptions import UserError, ValidationError from odoo.exceptions import UserError, ValidationError
...@@ -118,14 +119,6 @@ class CcBigPackage(models.Model): ...@@ -118,14 +119,6 @@ class CcBigPackage(models.Model):
'target': 'new', 'target': 'new',
'context': {}, 'context': {},
} }
# if there ere no records selected, then select all draft expenses for the user
expenses = self.env['hr.expense'].search(
[('state', '=', 'draft'), ('sheet_id', '=', False), ('employee_id', '=', self.env.user.employee_id.id)])
if not expenses:
raise UserError(_('You have no expense to report'))
else:
return expenses.action_submit_expenses()
def action_cc_big_package(self): def action_cc_big_package(self):
""" """
...@@ -344,8 +337,8 @@ class CcShipPackage(models.Model): ...@@ -344,8 +337,8 @@ class CcShipPackage(models.Model):
receiver_email = fields.Char(string='Receiver EMAIL', index=True) receiver_email = fields.Char(string='Receiver EMAIL', index=True)
# 电话号码 # 电话号码
receiver_phone = fields.Char(string='Receiver PHONE', index=True) receiver_phone = fields.Char(string='Receiver PHONE', index=True)
#消费者地址 # 消费者地址
receiver_detailed_address = fields.Char(string='Detailed Address',index=True) receiver_detailed_address = fields.Char(string='Detailed Address', index=True)
# 毛重 # 毛重
gross_weight = fields.Float(string='GROSS WEIGHT') gross_weight = fields.Float(string='GROSS WEIGHT')
# 重量单位 # 重量单位
...@@ -569,16 +562,48 @@ class CcBL(models.Model): ...@@ -569,16 +562,48 @@ class CcBL(models.Model):
# 定义模型字段 # 定义模型字段
# 限制提单号唯一 # 限制提单号唯一
_sql_constraints = [ _sql_constraints = [
('bl_no_uniq', 'unique(bl_no)', 'The Bill of Loading No. must be unique.') ('bl_no_uniq', 'unique(bl_no)', 'The Bill of Loading No. must be unique.'),
('transfer_bl_no_uniq', 'unique(transfer_bl_no)', 'The Transfer B/L No. must be unique.')
] ]
@api.constrains('transfer_bl_no', 'bl_no')
def _check_transfer_bl_no_not_same_as_bl_no(self):
"""Check that Transfer B/L No. is not the same as B/L No, and not the same as any other B/L No in the system."""
for record in self:
if record.transfer_bl_no:
# 1. 不能与本单提单号重复
if record.bl_no and record.transfer_bl_no == record.bl_no:
raise ValidationError(_('The Transfer B/L No. cannot be the same as the B/L No.'))
# 2. 不能与其他单据的提单号重复
other = self.env['cc.bl'].search([
('bl_no', '=', record.transfer_bl_no),
('id', '!=', record.id)
], limit=1)
if other:
raise ValidationError(_('The Transfer B/L No. cannot be the same as the B/L No.'))
def action_batch_export_package(self):
"""
导出报关文件
"""
return {
'name': _('Export customs declaration documents'), # 导出报关文件
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'export.bl.big.package.xlsx.wizard',
'target': 'new',
'context': {'active_id': self.ids, 'default_action_type': '报关文件'},
}
# 导出清关提单文件 # 导出清关提单文件
def export_bl_attachment_png(self): def action_export_bl_attachment_png(self):
arr = [item.id for item in self]
return { return {
'type': 'ir.actions.act_url', 'name': _('Export Customs Clearance Bill of Lading'), # 导出清关提单文件
'url': '/export/flight_png/xls/%s' % arr, 'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'export.bl.big.package.xlsx.wizard',
'target': 'new', 'target': 'new',
'context': {'active_id': self.ids, 'default_action_type': '清关提单文件'},
} }
def batch_input_ship_package_status_wizard(self): def batch_input_ship_package_status_wizard(self):
...@@ -605,7 +630,7 @@ class CcBL(models.Model): ...@@ -605,7 +630,7 @@ class CcBL(models.Model):
raise ValidationError(_('The customs clearance status of the selected bill of loading must be the same.')) raise ValidationError(_('The customs clearance status of the selected bill of loading must be the same.'))
# 最近操作时间取最晚的一条提单状态操作时间。 # 最近操作时间取最晚的一条提单状态操作时间。
last_process_time = \ last_process_time = \
sorted(self.filtered(lambda x: x.customs_clearance_status.id).mapped('process_time'), reverse=True)[0] sorted(self.filtered(lambda x: x.customs_clearance_status.id).mapped('process_time'), reverse=True)[0]
return { return {
'name': _('Update the status of the bill of loading'), 'name': _('Update the status of the bill of loading'),
'type': 'ir.actions.act_window', 'type': 'ir.actions.act_window',
...@@ -653,6 +678,8 @@ class CcBL(models.Model): ...@@ -653,6 +678,8 @@ class CcBL(models.Model):
is_history = fields.Boolean('历史单据', default=False) is_history = fields.Boolean('历史单据', default=False)
# 提单号 # 提单号
bl_no = fields.Char(string='B/L No', index=True) bl_no = fields.Char(string='B/L No', index=True)
# 转单号
transfer_bl_no = fields.Char(string='Transfer B/L No', index=True)
# 关务提单号 # 关务提单号
customs_bl_no = fields.Char(string='Customs B/L No') customs_bl_no = fields.Char(string='Customs B/L No')
# 贸易方式 # 贸易方式
...@@ -750,29 +777,17 @@ class CcBL(models.Model): ...@@ -750,29 +777,17 @@ class CcBL(models.Model):
else: else:
raise UserError(reason) raise UserError(reason)
def action_batch_export_package(self): def action_link_transfer_bl_no(self):
""" """
导出报关文件 批量关联转单号
""" """
# error_order = []
# for item in order_obj:
# # item.ship_package_ids
# parcel_ids = item.big_package_ids.mapped('ship_package_ids')
# if not parcel_ids:
# error_order.append(item.bl_no)
# continue
# good_parcels = parcel_ids.mapped('good_ids')
# if len(good_parcels) == 0:
# error_order.append(item.bl_no)
# if error_order:
# raise ValidationError(f"{','.join(error_order)},没有任何商品信息可导出报关数据")
return { return {
'name': _('Export customs declaration documents'), # 导出报关文件 'name': _('Link Transfer B/L No'),
'type': 'ir.actions.act_window', 'type': 'ir.actions.act_window',
'view_mode': 'form', 'views': [[False, "form"]],
'res_model': 'export.bl.big.package.xlsx.wizard', 'res_model': 'batch.update.transfer.bl.no.wizard',
'target': 'new', 'target': 'new',
'context': {'active_id': self.ids, }, 'context': {}
} }
# 添加计算方法,根据bl_line_ids计算bl_total_line,bl_total_qty,bl_total_amount # 添加计算方法,根据bl_line_ids计算bl_total_line,bl_total_qty,bl_total_amount
......
...@@ -16,6 +16,32 @@ class CommonCommon(models.Model): ...@@ -16,6 +16,32 @@ class CommonCommon(models.Model):
_name = 'common.common' _name = 'common.common'
_description = u'公用基础类' _description = u'公用基础类'
def process_num(self, input_str):
"""
处理导入
:param input_str:
:return:
"""
if input_str:
return str(input_str).replace('\\', '-').replace('、、', '').replace('&',
' ').replace(
'>',
'').replace('<',
'').replace(
'?', '').replace('!', '')
return input_str
def process_str(self, input_str):
"""
处理导入的字符串
:param input_str:
:return:
"""
if input_str:
return self.process_num(str(input_str)).replace('.0', '').strip()
return input_str
# 去杠去空格转大写 # 去杠去空格转大写
def process_match_str(self, input_str): def process_match_str(self, input_str):
......
...@@ -4,6 +4,7 @@ export_bl_big_package_xlsx_wizard_group_user,export_bl_big_package_xlsx_wizard_g ...@@ -4,6 +4,7 @@ export_bl_big_package_xlsx_wizard_group_user,export_bl_big_package_xlsx_wizard_g
associate_pallet_wizard_group_user,associate_pallet_wizard_group_user,ccs_base.model_associate_pallet_wizard,base.group_user,1,1,1,1 associate_pallet_wizard_group_user,associate_pallet_wizard_group_user,ccs_base.model_associate_pallet_wizard,base.group_user,1,1,1,1
add_exception_info_wizard_group_user,add_exception_info_wizard_group_user,ccs_base.model_add_exception_info_wizard,base.group_user,1,1,1,1 add_exception_info_wizard_group_user,add_exception_info_wizard_group_user,ccs_base.model_add_exception_info_wizard,base.group_user,1,1,1,1
update_bl_status_wizard_group_user,update_bl_status_wizard_group_user,ccs_base.model_update_bl_status_wizard,base.group_user,1,1,1,1 update_bl_status_wizard_group_user,update_bl_status_wizard_group_user,ccs_base.model_update_bl_status_wizard,base.group_user,1,1,1,1
batch_update_transfer_bl_no_wizard_group_user,batch_update_transfer_bl_no_wizard_group_user,ccs_base.model_batch_update_transfer_bl_no_wizard,base.group_user,1,1,1,1
access_group_user_common_common,access_group_user_common_common,model_common_common,base.group_user,1,1,1,1 access_group_user_common_common,access_group_user_common_common,model_common_common,base.group_user,1,1,1,1
......
...@@ -13,18 +13,8 @@ export const BigPackageLinkPallet = { ...@@ -13,18 +13,8 @@ export const BigPackageLinkPallet = {
this.http = useService('http'); this.http = useService('http');
this.fileInput = useRef('fileInput'); this.fileInput = useRef('fileInput');
this.root = useRef("root"); this.root = useRef("root");
// this.isBigPackage = this.model.rootParams.resModel === "cc.big.package";
// this.is_link = this.user.hasGroup("ccs_base.group_clearance_of_customs_manager");
// console.log('ccs isBigPackage:' + this.isBigPackage)
// console.log('ccs is_link:' + this.is_link)
}, },
// displayLink() {
// console.log('ccs flag:' + this.isBigPackage && this.is_link)
// // 是大包的对象以及有清关清理的权限才显示按钮
// return this.isBigPackage && this.is_link;
// },
async onLinkPalletClick() { async onLinkPalletClick() {
// 点击按钮弹出关联托盘的向导 // 点击按钮弹出关联托盘的向导
const records = this.model.root.selection; const records = this.model.root.selection;
......
/** @odoo-module */
import {useService} from '@web/core/utils/hooks';
const {useRef, useEffect, useState} = owl;
export const LinkTransferBlNo = {
setup() {
this._super();
this.actionService = useService('action');
this.notification = useService('notification');
this.orm = useService('orm');
this.http = useService('http');
this.fileInput = useRef('fileInput');
this.root = useRef("root");
},
async onTransferBlNoClick() {
// 点击按钮弹出批量关联转单号的向导
const records = this.model.root.selection;
const recordIds = records.map((a) => a.resId);
const action = await this.orm.call('cc.bl', 'action_link_transfer_bl_no', [recordIds]);
this.actionService.doAction(action);
},
};
/** @odoo-module */
import {BigPackageLinkPallet} from '../mixins/link_pallet';
import {registry} from '@web/core/registry';
import {patch} from '@web/core/utils/patch';
import {useService} from '@web/core/utils/hooks';
import {listView} from "@web/views/list/list_view";
import {ListController} from "@web/views/list/list_controller";
const {onWillStart} = owl;
export class BigPackageListController extends ListController {
setup() {
super.setup();
console.log('----------引用成功')
this.orm = useService('orm');
this.actionService = useService('action');
this.rpc = useService("rpc");
this.user = useService("user");
this.isBigPackage = this.model.rootParams.resModel === "cc.big.package";
console.log('ccs isBigPackage:' + this.isBigPackage)
onWillStart(async () => {
this.is_link = await this.user.hasGroup("ccs_base.group_clearance_of_customs_manager");
console.log('ccs is_link:' + this.is_link)
});
}
displayLink() {
console.log('ccs flag:' + this.isBigPackage && this.is_link)
// 是大包的对象以及有清关清理的权限才显示按钮
return this.isBigPackage && this.is_link;
}
displayTransferBlNo() {
// 大包页面永远不显示“关联转单号”按钮
return false;
}
}
patch(BigPackageListController.prototype, 'big_package_list_controller_link_pallet', BigPackageLinkPallet);
registry.category('views').add('cc_big_package_tree', {
...listView,
buttonTemplate: 'ccs_base.ListButtons',
Controller: BigPackageListController
});
\ No newline at end of file
/** @odoo-module */
import {LinkTransferBlNo} from '../mixins/link_transfer_bl_no';
import {registry} from '@web/core/registry';
import {patch} from '@web/core/utils/patch';
import {useService} from '@web/core/utils/hooks';
import {listView} from "@web/views/list/list_view";
import {ListController} from "@web/views/list/list_controller";
const {onWillStart} = owl;
export class BlListController extends ListController {
setup() {
super.setup();
console.log('----------引用成功')
this.orm = useService('orm');
this.actionService = useService('action');
this.rpc = useService("rpc");
this.user = useService("user");
this.isBl = this.model.rootParams.resModel === "cc.bl";
console.log('ccs isBl:' + this.isBl)
onWillStart(async () => {
this.can_link_transfer_bl_no = await this.user.hasGroup("ccs_base.group_clearance_of_customs_user");
console.log('ccs can_link_transfer_bl_no:' + this.can_link_transfer_bl_no)
});
}
displayLink() {
// 提单页面永远不显示“关联托盘”按钮
return false;
}
displayTransferBlNo() {
console.log('ccs flag:' + this.isBl && this.can_link_transfer_bl_no)
// 是提单的对象以及有清关用户的权限才显示按钮
return this.isBl && this.can_link_transfer_bl_no;
}
}
patch(BlListController.prototype, 'link_transfer_bl_no', LinkTransferBlNo);
registry.category('views').add('cc_bl_tree', {
...listView,
buttonTemplate: 'ccs_base.ListButtons',
Controller: BlListController
});
\ No newline at end of file
/** @odoo-module */ /** @odoo-module */
import {LinkTransferBlNo} from '../mixins/link_transfer_bl_no';
import {BigPackageLinkPallet} from '../mixins/link_pallet'; import {BigPackageLinkPallet} from '../mixins/link_pallet';
import {registry} from '@web/core/registry'; import {registry} from '@web/core/registry';
...@@ -10,7 +11,7 @@ import {ListController} from "@web/views/list/list_controller"; ...@@ -10,7 +11,7 @@ import {ListController} from "@web/views/list/list_controller";
const {onWillStart} = owl; const {onWillStart} = owl;
export class BigPackageListController extends ListController { export class BlListController extends ListController {
setup() { setup() {
super.setup(); super.setup();
console.log('----------引用成功') console.log('----------引用成功')
...@@ -18,14 +19,24 @@ export class BigPackageListController extends ListController { ...@@ -18,14 +19,24 @@ export class BigPackageListController extends ListController {
this.actionService = useService('action'); this.actionService = useService('action');
this.rpc = useService("rpc"); this.rpc = useService("rpc");
this.user = useService("user"); this.user = useService("user");
this.isBl = this.model.rootParams.resModel === "cc.bl";
this.isBigPackage = this.model.rootParams.resModel === "cc.big.package"; this.isBigPackage = this.model.rootParams.resModel === "cc.big.package";
console.log('ccs isBigPackage:' + this.isBigPackage) console.log('ccs isBl:' + this.isBl)
onWillStart(async () => { onWillStart(async () => {
this.can_link_transfer_bl_no = await this.user.hasGroup("ccs_base.group_clearance_of_customs_user");
this.is_link = await this.user.hasGroup("ccs_base.group_clearance_of_customs_manager"); this.is_link = await this.user.hasGroup("ccs_base.group_clearance_of_customs_manager");
console.log('ccs can_link_transfer_bl_no:' + this.can_link_transfer_bl_no)
console.log('ccs is_link:' + this.is_link) console.log('ccs is_link:' + this.is_link)
}); });
} }
displayTransferBlNo() {
console.log('ccs flag:' + this.isBl && this.can_link_transfer_bl_no)
// 是提单的对象以及有清关用户的权限才显示按钮
return this.isBl && this.can_link_transfer_bl_no;
}
displayLink() { displayLink() {
console.log('ccs flag:' + this.isBigPackage && this.is_link) console.log('ccs flag:' + this.isBigPackage && this.is_link)
// 是大包的对象以及有清关清理的权限才显示按钮 // 是大包的对象以及有清关清理的权限才显示按钮
...@@ -34,11 +45,19 @@ export class BigPackageListController extends ListController { ...@@ -34,11 +45,19 @@ export class BigPackageListController extends ListController {
} }
patch(BlListController.prototype, 'link_transfer_bl_no', LinkTransferBlNo);
registry.category('views').add('cc_bl_tree', {
...listView,
buttonTemplate: 'ccs_base.ListButtons',
Controller: BlListController
});
patch(BigPackageListController.prototype, 'big_package_list_controller_link_pallet', BigPackageLinkPallet); patch(BigPackageListController.prototype, 'big_package_list_controller_link_pallet', BigPackageLinkPallet);
registry.category('views').add('cc_big_package_tree', { registry.category('views').add('cc_big_package_tree', {
...listView, ...listView,
buttonTemplate: 'ccs_base.ListButtons', buttonTemplate: 'ccs_base.ListButtons',
Controller: BigPackageListController Controller: BigPackageListController
}); });
\ No newline at end of file
...@@ -7,5 +7,10 @@ ...@@ -7,5 +7,10 @@
Link Pallet Link Pallet
</button> </button>
</xpath> </xpath>
<xpath expr="//button[hasclass('o_list_button_add')]" position="after">
<button t-if="displayTransferBlNo()" type="button" class="d-none d-md-inline o_button_transfer_bl_no btn btn-primary mx-1" t-on-click.prevent="onTransferBlNoClick">
Link Transfer B/L No
</button>
</xpath>
</t> </t>
</templates> </templates>
...@@ -7,12 +7,13 @@ ...@@ -7,12 +7,13 @@
<field name="name">tree.cc.bl</field> <field name="name">tree.cc.bl</field>
<field name="model">cc.bl</field> <field name="model">cc.bl</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree string="Bill of Loading" decoration-warning="is_cancel==True"> <tree string="Bill of Loading" decoration-warning="is_cancel==True" js_class="cc_bl_tree">
<field optional="show" name="state" string="Status" widget="badge" decoration-info="state=='draft'" <field optional="show" name="state" string="Status" widget="badge" decoration-info="state=='draft'"
decoration-primary="state=='ccing'" decoration-success="state=='done'"/> decoration-primary="state=='ccing'" decoration-success="state=='done'"/>
<field optional="show" name="customs_clearance_status" string="Customs Clearance Status"/> <field optional="show" name="customs_clearance_status" string="Customs Clearance Status"/>
<field optional="show" name="bl_no" string="Bill of Loading No."/> <field optional="show" name="bl_no" string="Bill of Loading No."/>
<field optional="show" name="bl_date" string="B/L Date"/> <field optional="show" name="bl_date" string="B/L Date"/>
<field optional="hide" name="transfer_bl_no" string="Transfer Bill of Loading No."/>
<field optional="show" name="customer_id" string="Customer"/> <field optional="show" name="customer_id" string="Customer"/>
<field optional="show" name="customs_bl_no" string="Customs Bill of Loading No."/> <field optional="show" name="customs_bl_no" string="Customs Bill of Loading No."/>
<field optional="hide" name="big_package_sell_country" string="Sell Country"/> <field optional="hide" name="big_package_sell_country" string="Sell Country"/>
...@@ -120,6 +121,7 @@ ...@@ -120,6 +121,7 @@
<group> <group>
<group> <group>
<field name="bl_date" string="B/L Date"/> <field name="bl_date" string="B/L Date"/>
<field name="transfer_bl_no" readonly="True"/>
<field name="customer_id" string="Customer"/> <field name="customer_id" string="Customer"/>
<field name="customs_bl_no" string="Customs Bill of Loading No."/> <field name="customs_bl_no" string="Customs Bill of Loading No."/>
<field name="big_package_sell_country" string="Sell Country"/> <field name="big_package_sell_country" string="Sell Country"/>
...@@ -405,7 +407,7 @@ ...@@ -405,7 +407,7 @@
<field name="state">code</field> <field name="state">code</field>
<field name="code"> <field name="code">
if records: if records:
action = records.export_bl_attachment_png() action = records.action_export_bl_attachment_png()
</field> </field>
</record> </record>
......
...@@ -5,4 +5,5 @@ from . import export_bl_big_package_xlsx_wizard ...@@ -5,4 +5,5 @@ from . import export_bl_big_package_xlsx_wizard
from . import associate_pallet_wizard from . import associate_pallet_wizard
from . import add_exception_info_wizard from . import add_exception_info_wizard
from . import update_bl_status_wizard from . import update_bl_status_wizard
from . import batch_update_transfer_bl_no_wizard
import base64
import io
import logging
from odoo import models, fields, _
from odoo.exceptions import ValidationError
try:
import xlrd
import xlwt
except ImportError:
xlrd = None
xlwt = None
class BatchUpdateTransferBlNoWizard(models.TransientModel):
_name = 'batch.update.transfer.bl.no.wizard'
_description = 'Batch Update Transfer B/L No Wizard'
report_file_ids = fields.Many2many('ir.attachment', 'batch_update_transfer_bl_no_attachment_rel',
string='B/L List') # 提单清单
error_file_ids = fields.Many2many('ir.attachment', 'batch_update_transfer_bl_no_error_attachment_rel', 'wizard_id',
'error_file_id',
string='Error Data') # 异常数据
file_name = fields.Char('File Name') # 文件名称
def get_file_path(self, report_file_ids):
"""
Get the content of the excel file
:return:
"""
if report_file_ids.name[-3:] == 'xls' or report_file_ids.name[-4:] == 'xlsx':
data = False
report_path = report_file_ids._full_path(report_file_ids.store_fname)
if report_file_ids.name[-3:] == 'xls':
data = xlrd.open_workbook(report_path, formatting_info=True)
elif report_file_ids.name[-4:] == 'xlsx':
data = xlrd.open_workbook(report_path)
return data
else:
raise ValidationError(_('Only excel files can be uploaded!')) # 只能上传excel文件!
def check_import_template(self, report_file_ids):
"""
Check if the template header is correct
:return:
"""
if self.report_file_ids:
try:
data = self.get_file_path(report_file_ids[0])
first_table = data.sheets()[0]
excel_header = first_table.row_values(0)
except Exception as e:
raise ValidationError(
_('Please check if the import file and content are correct, and import according to the template file!')) # 请检查导入文件和内容是否正确,请根据模板文件导入!
header = [_('B/L No'), _('Transfer B/L No')]
str_header = ','.join(header)
if not excel_header == header:
raise ValidationError(_('File error, the content order should be: %s') % str_header) # 文件错误,内容顺序为:%s
def init_importfile(self):
"""
Initialize the imported file and convert it into a unified array format
:return:
"""
common_obj = self.env['common.common'].sudo()
data = self.get_file_path(self.report_file_ids[0])
order_list = []
first_table = data.sheets()[0]
for i in range(1, first_table.nrows):
line = first_table.row_values(i)
bl_no = common_obj.process_str(line[0]) # 提单号
transfer_bl_no = common_obj.process_str(line[1]) # 转单号
order_list.append({
'bl_no': bl_no, # 提单号
'bl_id': False, # 提单对象
'transfer_bl_no': transfer_bl_no, # 转单号
'error_remark': '' # 错误信息
})
return order_list
def check_list_import(self, order_list):
"""
Check normal and abnormal data
:param order_list:
:return:
"""
error_list = [] # 异常数据
pass_list = [] # 正常数据
# Collect all B/L No and Transfer B/L No
all_bl_no = set(item['bl_no'] for item in order_list if item.get('bl_no'))
all_transfer_bl_no = set(item['transfer_bl_no'] for item in order_list if item.get('transfer_bl_no'))
is_error = False
for order_item in order_list:
cause_arr = []
bl_no = order_item.get('bl_no')
transfer_bl_no = order_item.get('transfer_bl_no')
if not bl_no:
cause_arr.append(_('B/L No is required')) # 提单号必填
else:
bl_obj = self.env['cc.bl'].sudo().deal_bl_no(bl_no)
if bl_obj:
order_item['bl_id'] = bl_obj.id
else:
cause_arr.append(_('This B/L No does not exist in the system')) # 该提单号在系统不存在
if not transfer_bl_no:
cause_arr.append(_('Transfer B/L No is required')) # 转单号必填
else:
# Check if Transfer B/L No already exists in the system
bl_obj = self.env['cc.bl'].sudo().deal_bl_no_and_transfer_bl_no(transfer_bl_no)
if bl_obj and bl_obj.bl_no != bl_no:
cause_arr.append(_('This Transfer B/L No already exists')) # 该转单号已存在
# Check if any B/L No equals any Transfer B/L No, or vice versa
if (bl_no and bl_no in all_transfer_bl_no) or (transfer_bl_no and transfer_bl_no in all_bl_no):
cause_arr.append(_('B/L No and Transfer B/L No are duplicated')) # 提单号和转单号有重复
logging.info('cause_arr:%s' % cause_arr)
if len(cause_arr) > 0:
is_error = True
order_item['error_remark'] = ','.join(cause_arr)
error_list.append(order_item)
else:
pass_list.append(order_item)
error_list.append(order_item)
return pass_list, error_list, is_error
def error_export(self, error_msg):
"""
Export error records
:return:
"""
# Generate excel file for error data
wb = xlwt.Workbook(encoding='utf-8')
# Initialize style
style = xlwt.XFStyle()
style.num_format_str = 'yyyy/mm/dd'
# Create font for style
font = xlwt.Font()
font.name = 'Times New Roman'
font.bold = True
style.font = font
ws = wb.add_sheet('sheet1', cell_overwrite_ok=True)
header = [_('B/L No'), _('Transfer B/L No'), _('Error Reason')] # ['提单号', '转单号', '异常原因']
col_index = 0
for title in header:
ws.write(0, col_index, title, style)
ws.col(len(header) - col_index - 1).width = 256 * 20 # around 256 pixels
col_index += 1
index = 0
logging.info('error_msg:%s' % error_msg)
for item in error_msg:
ws.write(1 + index, 0, item['bl_no'])
ws.write(1 + index, 1, item['transfer_bl_no'])
ws.write(1 + index, 2, item['error_remark'])
index += 1
buf = io.BytesIO()
wb.save(buf)
buf.seek(0)
data = base64.encodebytes(buf.read())
buf.close()
self.file_name = '%s.%s' % (_('Error Data'), "xls")
# 将base64编码的字符串保存到Odoo的binary字段
attachment = self.env['ir.attachment'].sudo().create({
'datas': data,
'type': 'binary',
'name': self.file_name,
'store_fname': self.file_name,
'res_model': self._name, # 用 wizard 的模型名
'res_id': self.id, # 关联到当前 wizard 记录
})
self.error_file_ids = [(6, 0, attachment.ids)]
return {
'type': 'ir.actions.act_window',
'name': _('Error Data'),
'res_model': self._name,
'view_mode': 'form',
'res_id': self.id,
'context': {'default_error_file_ids': [(6, 0, attachment.ids)],
'default_report_file_ids': [(6, 0, self.report_file_ids.ids)]},
'target': 'new',
}
def submit(self):
report_file_ids = self.report_file_ids
if report_file_ids and len(report_file_ids) > 0:
if len(report_file_ids) > 1:
raise ValidationError(u'Only one template file can be uploaded at a time!') # 一次只能上传一个模板文件!
self.check_import_template(report_file_ids) # Check template header
# Convert to array
order_list = self.init_importfile()
# Check normal and error data
pass_list, error_list, is_error = self.check_list_import(order_list)
# Export error data
if len(error_list) > 0 and is_error:
return self.error_export(error_list)
if len(pass_list) > 0 and not is_error:
for item in pass_list:
item.pop('error_remark') if item.get('error_remark') or item.get(
'error_remark') == '' else False
if item.get('bl_id'):
self.env['cc.bl'].sudo().browse(item['bl_id']).write({'transfer_bl_no': item['transfer_bl_no']})
else:
raise ValidationError(
_('Please upload the B/L data file to be imported first!')) # 请先上传需要更新的提单数据文件!
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- Batch Link Transfer B/L No Wizard View -->
<record id="view_batch_update_transfer_bl_no_wizard" model="ir.ui.view">
<field name="name">batch.update.transfer.bl.no.wizard.form</field>
<field name="model">batch.update.transfer.bl.no.wizard</field>
<field name="arch" type="xml">
<form string="Batch Link Transfer B/L No"> <!-- 批量关联转单号 -->
<group>
<field name="report_file_ids" widget="many2many_binary"/>
<label for="error_file_ids" attrs="{'invisible': [('error_file_ids', '=', [])]}"/>
<div attrs="{'invisible': [('error_file_ids', '=', [])]}">
<field name="error_file_ids" widget="many2many_binary" readonly="1"
attrs="{'invisible': [('error_file_ids', '=', [])]}"/>
<br/>
<!-- 有异常数据时,请下载异常数据文件,根据提示处理好数据,再导入! -->
<span class="label label-warning">
If there is abnormal data, please download the error file, fix the data as prompted, and re-import!
</span>
</div>
</group>
<group>
<!-- 模板下载 -->
<a href="/ccs_base/static/template/transfer_bl_no_template.xlsx?v=20250715001">
Download Template
</a>
<!-- 提示:请务必按照模板填写信息,否则系统无法识别。 -->
<span style="color:red;font-size:15px;">Tip: Please fill in the information strictly according to the template, otherwise the system will not recognize it.
</span>
</group>
<footer>
<button name="submit" type="object"
string="Import" class="oe_highlight"/> <!-- 导入 -->
<button special="cancel" string="Close"/> <!-- 关闭 -->
</footer>
</form>
</field>
</record>
</data>
</odoo>
\ No newline at end of file
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import models, api, fields from odoo import models, fields
from odoo.exceptions import Warning, ValidationError
class ExportBlBigPackageXlsxWizard(models.TransientModel): class ExportBlBigPackageXlsxWizard(models.TransientModel):
...@@ -20,7 +19,12 @@ class ExportBlBigPackageXlsxWizard(models.TransientModel): ...@@ -20,7 +19,12 @@ class ExportBlBigPackageXlsxWizard(models.TransientModel):
return self.env['cc.bl'].sudo().browse(order_id) return self.env['cc.bl'].sudo().browse(order_id)
# 增加选择类型字段, 是否分大包导出 # 增加选择类型字段, 是否分大包导出
select_type = fields.Selection([('yes', 'YES'), ('no', 'NO')], string='Whether to export in Big packages') select_type = fields.Selection([('yes', 'YES'), ('no', 'NO')], string='Whether to export in Big packages',
default='no')
# 增加文件命名类型字段。导出的表格命名,可勾选。默认为提单号命名(现在就是按提单号命名),若勾选了转单号,则按转单号命名
file_name_type = fields.Selection([('bl_no', 'B/L No'), ('transfer_bl_no', 'Transfer B/L No')],
string='File Name Type', default='bl_no')
action_type = fields.Char(string='Action Type', default='报关文件')
def submit(self): def submit(self):
""" """
...@@ -28,8 +32,15 @@ class ExportBlBigPackageXlsxWizard(models.TransientModel): ...@@ -28,8 +32,15 @@ class ExportBlBigPackageXlsxWizard(models.TransientModel):
""" """
order_obj = self.get_order() order_obj = self.get_order()
arr = [item.id for item in order_obj] arr = [item.id for item in order_obj]
return { if self.action_type == '报关文件':
'type': 'ir.actions.act_url', return {
'url': '/export/bl/package/xls/%s/%s' % (arr, self.select_type), 'type': 'ir.actions.act_url',
'target': 'new', 'url': '/export/bl/package/xls/%s/%s/%s' % (arr, self.select_type, self.file_name_type),
} 'target': 'new',
}
else:
return {
'type': 'ir.actions.act_url',
'url': '/export/flight_png/xls/%s/%s' % (arr, self.file_name_type),
'target': 'new',
}
...@@ -12,8 +12,10 @@ ...@@ -12,8 +12,10 @@
<form string="导出报关文件"> <form string="导出报关文件">
<sheet> <sheet>
<group> <group>
<field name="select_type" required="1"/> <field name="select_type"
attrs="{'invisible': [('action_type', '!=', '报关文件')], 'required': [('action_type', '=', '报关文件')]}"/>
<field name="file_name_type" required="1"/>
<field name="action_type" invisible="1"/>
</group> </group>
<footer> <footer>
<button name="submit" type="object" string="Submit" class="oe_highlight"/> <button name="submit" type="object" string="Submit" class="oe_highlight"/>
......
...@@ -102,8 +102,8 @@ class OrderController(http.Controller): ...@@ -102,8 +102,8 @@ class OrderController(http.Controller):
bl_no = kwargs['bl_no'] bl_no = kwargs['bl_no']
# bl_obj = request.env['cc.bl'].sudo().search([('bl_no', '=', bl_no)]) # 提单 # bl_obj = request.env['cc.bl'].sudo().search([('bl_no', '=', bl_no)]) # 提单
state_arr = ['draft', 'ccing'] state_arr = ['draft', 'ccing']
bl_obj = request.env['cc.bl'].sudo().deal_bl_no( bl_obj = request.env['cc.bl'].sudo().deal_bl_no_and_transfer_bl_no(
bl_no) # 提单号去掉杠和空格,并转换为小写 bl_no) # 提单号去掉杠和空格,并转换为小写,优先匹配提单号,匹配不到则匹配转单号
if bl_obj: if bl_obj:
if bl_obj.state in state_arr: if bl_obj.state in state_arr:
res['bl_info'] = bl_obj.search_bl_info( res['bl_info'] = bl_obj.search_bl_info(
...@@ -149,8 +149,8 @@ class OrderController(http.Controller): ...@@ -149,8 +149,8 @@ class OrderController(http.Controller):
kwargs.get('big_package_arr') or kwargs.get('ship_package_arr') or kwargs.get('pallet_arr')): kwargs.get('big_package_arr') or kwargs.get('ship_package_arr') or kwargs.get('pallet_arr')):
bl_no = kwargs['bl_no'] bl_no = kwargs['bl_no']
state_arr = ['draft', 'ccing'] state_arr = ['draft', 'ccing']
bl_obj = request.env['cc.bl'].sudo().deal_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:
ship_packages = [] ship_packages = []
big_package_exception_arr = {} big_package_exception_arr = {}
......
...@@ -813,6 +813,31 @@ class CcBl(models.Model): ...@@ -813,6 +813,31 @@ class CcBl(models.Model):
lambda r: r.bl_no.replace('-', '').replace(' ', '').lower() == processed_bl_no) # 提单 lambda r: r.bl_no.replace('-', '').replace(' ', '').lower() == processed_bl_no) # 提单
return bl_obj return bl_obj
def deal_bl_no_and_transfer_bl_no(self, bl_no, state_arr=[]):
"""
优先匹配提单号,匹配不到则匹配转单号
匹配规则与提单号匹配规则一致:去掉杠和空格,转换为小写
:param bl_no:
:param state_arr:
:return:
"""
processed_bl_no = bl_no.replace('-', '').replace(' ', '').lower()
# 查询所有提单并处理它们的 bl_no
domain = [('state', 'in', state_arr)] if state_arr else []
all_bl_obj = self.env['cc.bl'].sudo().search(domain)
# 优先匹配提单号
bl_obj = all_bl_obj.filtered(
lambda r: r.bl_no and r.bl_no.replace('-', '').replace(' ', '').lower() == processed_bl_no)
# 如果提单号匹配不到,则匹配转单号
if not bl_obj:
bl_obj = all_bl_obj.filtered(
lambda r: r.transfer_bl_no and r.transfer_bl_no.replace('-', '').replace(' ', '').lower() == processed_bl_no)
return bl_obj
def try_callback_track(self, max_retries=3, ship_package_ids=[], user_obj=False): def try_callback_track(self, max_retries=3, ship_package_ids=[], user_obj=False):
""" 封装的重试逻辑 """ """ 封装的重试逻辑 """
for i in range(max_retries): for i in range(max_retries):
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论