提交 2d49a026 authored 作者: 伍姿英's avatar 伍姿英

Merge branch 'release/V2.5.0'

......@@ -19,10 +19,16 @@
'security/ir.model.access.csv',
'wizard/batch_input_ship_package_statu_wizard.xml',
'wizard/export_bl_big_package_xlsx_wizard.xml',
'wizard/associate_pallet_wizard_views.xml',
'wizard/add_exception_info_wizard_views.xml',
'wizard/email_template.xml',
'data/data.xml',
'data/sequence.xml',
'views/menu_view.xml',
'views/cc_clearance_file_view.xml',
'views/cc_node_view.xml',
'views/cc_last_mile_provider_views.xml',
'views/cc_exception_info_views.xml',
'views/cc_process_view.xml',
'views/cc_package_good_view.xml',
'views/cc_ship_package_view.xml',
......@@ -43,6 +49,11 @@
'web.assets_frontend': [
'ccs_base/static/css/base.scss',
],
'web.assets_backend': [
'ccs_base/static/src/mixins/*.js',
'ccs_base/static/src/views/*.js',
'ccs_base/static/src/views/*.xml',
],
},
'license': 'AGPL-3',
}
......@@ -31,41 +31,43 @@ class ExportBlAndPackageXlsx(http.Controller):
if good_ids:
for good_item in good_ids:
good_index += 1
sheet1.write(good_index, 0, package_item.logistic_order_no or '') # 物流订单号 TRACKING NO.
sheet1.write(good_index, 1, package_item.customer_ref or '') # CUSTOMER REF
sheet1.write(good_index, 2, package_item.internal_account_number or '') # Internal Account Number
sheet1.write(good_index, 3, package_item.sender_name or '') # SENDER NAME
sheet1.write(good_index, 4, package_item.sender_add_1 or '') # SHIPPER ADD 1
sheet1.write(good_index, 5, package_item.sender_add_2 or '') # SHIPPER ADD 2
sheet1.write(good_index, 6, package_item.sender_add_3 or '') # SHIPPER ADD 3
sheet1.write(good_index, 7, package_item.sender_city or '') # SENDER CITY
sheet1.write(good_index, 8, package_item.sender_state or '') # Ship State
sheet1.write(good_index, 9, package_item.sender_postcode or '') # SENDER POSTCODE
sheet1.write(good_index, 10, package_item.sender_country or '') # SENDER COUNTRY
sheet1.write(good_index, 11, package_item.receiver_name or '') # RECEIPIENT NAME
sheet1.write(good_index, 12, package_item.receiver_add_1 or '') # RECEIPIENT ADD 1
sheet1.write(good_index, 13, package_item.receiver_add_2 or '') # RECEIPIENT ADD 2
sheet1.write(good_index, 14, package_item.receiver_add_3 or '') # RECEIPIENT ADD 3
sheet1.write(good_index, 15, package_item.receiver_city or '') # RECEIPIENT CITY
sheet1.write(good_index, 16, package_item.receiver_county or '') # RECEIPIENT COUNTY
sheet1.write(good_index, 17, package_item.receiver_postcode or '') # RECEIPIENT POSTCODE
sheet1.write(good_index, 18, package_item.receiver_email or '') # RECEPIENT EMAIL
sheet1.write(good_index, 19, package_item.receiver_phone or '') # PHONE NUMBER
sheet1.write(good_index, 20, package_item.gross_weight or 0) # GROSS WEIGHT (KG)
sheet1.write(good_index, 21, package_item.weight_unit or 0) # NET WEIGHT (KG)
sheet1.write(good_index, 22, package_item.currency or '') # Currency
sheet1.write(good_index, 23, good_item.sku_id or '') # SKU NUMBER
sheet1.write(good_index, 24, good_item.item_name_en or '') # ITEM DESCRIPTION
sheet1.write(good_index, 25, good_item.export_hs_code or '') # ITEM HS CODE
sheet1.write(good_index, 26, good_item.quantity) # ITEM QUANTITY
sheet1.write(good_index, 27, good_item.quantity_unit or '') # UNIT VALUE
sheet1.write(good_index, 28, good_item.item_total_price) # TOTAL VALUE
sheet1.write(good_index, 29, good_item.item_vat or '') # VAT
sheet1.write(good_index, 30, '') # SKU NUMBER
sheet1.write(good_index, 31, good_item.item_link or '') # PRODUCT LINK
sheet1.write(good_index, 32, '') # LENGTH
sheet1.write(good_index, 33, '') # WIDTH
sheet1.write(good_index, 34, '') # HEIGHT
sheet1.write(good_index, 0, package_item.logistic_order_no or '') # 物流订单号 CUSTOMS PROVIDER ORDER ID
sheet1.write(good_index, 1, package_item.big_package_id.big_package_no or '') # 小包商品对应的大包号 BIG BAG NO
sheet1.write(good_index, 2, package_item.tracking_no or '') # 小包追踪号 TRACKING NO
sheet1.write(good_index, 3, package_item.customer_ref or '') # CUSTOMER REF
sheet1.write(good_index, 4, package_item.internal_account_number or '') # Internal Account Number
sheet1.write(good_index, 5, package_item.sender_name or '') # SENDER NAME
sheet1.write(good_index, 6, package_item.sender_add_1 or '') # SHIPPER ADD 1
sheet1.write(good_index, 7, package_item.sender_add_2 or '') # SHIPPER ADD 2
sheet1.write(good_index, 8, package_item.sender_add_3 or '') # SHIPPER ADD 3
sheet1.write(good_index, 9, package_item.sender_city or '') # SENDER CITY
sheet1.write(good_index, 10, package_item.sender_state or '') # Ship State
sheet1.write(good_index, 11, package_item.sender_postcode or '') # SENDER POSTCODE
sheet1.write(good_index, 12, package_item.sender_country or '') # SENDER COUNTRY
sheet1.write(good_index, 13, package_item.receiver_name or '') # RECEIPIENT NAME
sheet1.write(good_index, 14, package_item.receiver_add_1 or '') # RECEIPIENT ADD 1
sheet1.write(good_index, 15, package_item.receiver_add_2 or '') # RECEIPIENT ADD 2
sheet1.write(good_index, 16, package_item.receiver_add_3 or '') # RECEIPIENT ADD 3
sheet1.write(good_index, 17, package_item.receiver_city or '') # RECEIPIENT CITY
sheet1.write(good_index, 18, package_item.receiver_county or '') # RECEIPIENT COUNTY
sheet1.write(good_index, 19, package_item.receiver_postcode or '') # RECEIPIENT POSTCODE
sheet1.write(good_index, 20, package_item.receiver_email or '') # RECEPIENT EMAIL
sheet1.write(good_index, 21, package_item.receiver_phone or '') # PHONE NUMBER
sheet1.write(good_index, 22, package_item.gross_weight or 0) # GROSS WEIGHT (KG)
sheet1.write(good_index, 23, package_item.weight_unit or 0) # NET WEIGHT (KG)
sheet1.write(good_index, 24, package_item.currency or '') # Currency
sheet1.write(good_index, 25, good_item.sku_id or '') # SKU NUMBER
sheet1.write(good_index, 26, good_item.item_name_en or '') # ITEM DESCRIPTION
sheet1.write(good_index, 27, good_item.export_hs_code or '') # ITEM HS CODE
sheet1.write(good_index, 28, good_item.quantity) # ITEM QUANTITY
sheet1.write(good_index, 29, good_item.quantity_unit or '') # UNIT VALUE
sheet1.write(good_index, 30, good_item.item_total_price) # TOTAL VALUE
sheet1.write(good_index, 31, good_item.item_vat or '') # VAT
sheet1.write(good_index, 32, '') # SKU NUMBER
sheet1.write(good_index, 33, good_item.item_link or '') # PRODUCT LINK
sheet1.write(good_index, 34, '') # LENGTH
sheet1.write(good_index, 35, '') # WIDTH
sheet1.write(good_index, 36, '') # HEIGHT
if good_index == int(parcel_export_num):
num += 1
sheet1 = self.get_package_title(worksheet, font_style, num)
......@@ -78,44 +80,46 @@ class ExportBlAndPackageXlsx(http.Controller):
"""
sheet1 = worksheet.add_sheet('Sheet(%s)' % num, cell_overwrite_ok=True)
index = 0
for i in range(35):
for i in range(37):
sheet1.col(i).width = 500 * 11
sheet1.col(6).width = 600 * 11
sheet1.write(index, 0, u'TRACKING NO.', font_style)
sheet1.write(index, 1, u'CUSTOMER REF', font_style)
sheet1.write(index, 2, u'Internal Account Number', font_style)
sheet1.write(index, 3, u'SENDER NAME', font_style)
sheet1.write(index, 4, u'SHIPPER ADD 1', font_style)
sheet1.write(index, 5, u'SHIPPER ADD 2', font_style)
sheet1.write(index, 6, u'SHIPPER ADD 3', font_style)
sheet1.write(index, 7, u'SENDER CITY', font_style)
sheet1.write(index, 8, u'Ship State', font_style)
sheet1.write(index, 9, u'SENDER POSTCODE', font_style)
sheet1.write(index, 10, u'SENDER COUNTRY', font_style)
sheet1.write(index, 11, u'RECEIPIENT NAME', font_style)
sheet1.write(index, 12, u'RECEIPIENT ADD 1', font_style)
sheet1.write(index, 13, u'RECEIPIENT ADD 2', font_style)
sheet1.write(index, 14, u'RECEIPIENT ADD 3', font_style)
sheet1.write(index, 15, u'RECEIPIENT CITY', font_style)
sheet1.write(index, 16, u'RECEIPIENT COUNTY', font_style)
sheet1.write(index, 17, u'RECEIPIENT POSTCODE', font_style)
sheet1.write(index, 18, u'RECEPIENT EMAIL', font_style)
sheet1.write(index, 19, u'PHONE NUMBER', font_style)
sheet1.write(index, 20, u'GROSS WEIGHT (KG)', font_style)
sheet1.write(index, 21, u'NET WEIGHT (KG)', font_style)
sheet1.write(index, 22, u'Currency', font_style)
sheet1.write(index, 23, u'SKU NUMBER', font_style)
sheet1.write(index, 24, u'ITEM DESCRIPTION', font_style)
sheet1.write(index, 25, u'ITEM HS CODE', font_style)
sheet1.write(index, 26, u'ITEM QUANTITY', font_style)
sheet1.write(index, 27, u'UNIT VALUE', font_style)
sheet1.write(index, 28, u'TOTAL VALUE', font_style)
sheet1.write(index, 29, u'VAT', font_style)
sheet1.write(index, 30, u'ONLINE SELLING PLACE', font_style)
sheet1.write(index, 31, u'PRODUCT LINK', font_style)
sheet1.write(index, 32, u'LENGTH', font_style)
sheet1.write(index, 33, u'WIDTH', font_style)
sheet1.write(index, 34, u'HEIGHT', font_style)
sheet1.col(8).width = 600 * 11
sheet1.write(index, 0, u'CUSTOMS PROVIDER ORDER ID', font_style) # CUSTOMS PROVIDER ORDER ID
sheet1.write(index, 1, u'BIG BAG NO', font_style) # BIG BAG NO
sheet1.write(index, 2, u'TRACKING NO', font_style) # TRACKING NO
sheet1.write(index, 3, u'CUSTOMER REF', font_style) # CUSTOMER REF
sheet1.write(index, 4, u'Internal Account Number', font_style) # INTERNAL ACCOUNT NUMBER
sheet1.write(index, 5, u'SENDER NAME', font_style) # SENDER NAME
sheet1.write(index, 6, u'SHIPPER ADD 1', font_style) # SHIPPER ADD 1
sheet1.write(index, 7, u'SHIPPER ADD 2', font_style) # SHIPPER ADD 2
sheet1.write(index, 8, u'SHIPPER ADD 3', font_style) # SHIPPER ADD 3
sheet1.write(index, 9, u'SENDER CITY', font_style) # SENDER CITY
sheet1.write(index, 10, u'Ship State', font_style) # SHIP STATE
sheet1.write(index, 11, u'SENDER POSTCODE', font_style) # SENDER POSTCODE
sheet1.write(index, 12, u'SENDER COUNTRY', font_style) # SENDER COUNTRY
sheet1.write(index, 13, u'RECEIPIENT NAME', font_style) # RECEIPIENT NAME
sheet1.write(index, 14, u'RECEIPIENT ADD 1', font_style) # RECEIPIENT ADD 1
sheet1.write(index, 15, u'RECEIPIENT ADD 2', font_style) # RECEIPIENT ADD 2
sheet1.write(index, 16, u'RECEIPIENT ADD 3', font_style) # RECEIPIENT ADD 3
sheet1.write(index, 17, u'RECEIPIENT CITY', font_style) # RECEIPIENT CITY
sheet1.write(index, 18, u'RECEIPIENT COUNTY', font_style) # RECEIPIENT COUNTY
sheet1.write(index, 19, u'RECEIPIENT POSTCODE', font_style) # RECEIPIENT POSTCODE
sheet1.write(index, 20, u'RECEPIENT EMAIL', font_style) # RECEPIENT EMAIL
sheet1.write(index, 21, u'PHONE NUMBER', font_style) # PHONE NUMBER
sheet1.write(index, 22, u'GROSS WEIGHT (KG)', font_style) # GROSS WEIGHT (KG)
sheet1.write(index, 23, u'NET WEIGHT (KG)', font_style) # NET WEIGHT (KG)
sheet1.write(index, 24, u'Currency', font_style) # CURRENCY
sheet1.write(index, 25, u'SKU NUMBER', font_style) # SKU NUMBER
sheet1.write(index, 26, u'ITEM DESCRIPTION', font_style) # ITEM DESCRIPTION
sheet1.write(index, 27, u'ITEM HS CODE', font_style) # ITEM HS CODE
sheet1.write(index, 28, u'ITEM QUANTITY', font_style) # ITEM QUANTITY
sheet1.write(index, 29, u'UNIT VALUE', font_style) # UNIT VALUE
sheet1.write(index, 30, u'TOTAL VALUE', font_style) # TOTAL VALUE
sheet1.write(index, 31, u'VAT', font_style) # VAT
sheet1.write(index, 32, u'ONLINE SELLING PLACE', font_style) # ONLINE SELLING PLACE
sheet1.write(index, 33, u'PRODUCT LINK', font_style) # PRODUCT LINK
sheet1.write(index, 34, u'LENGTH', font_style) # LENGTH
sheet1.write(index, 35, u'WIDTH', font_style) # WIDTH
sheet1.write(index, 36, u'HEIGHT', font_style) # HEIGHT
return sheet1
# 运单导出包裹清关数据 每个运单导出一个文件 生成压缩包
......
......@@ -14,5 +14,18 @@
<field name="key">parcel_export_num</field>
<field name="value">50000</field>
</record>
<!-- 默认发件邮箱-->
<record id="default_email_from" model="ir.config_parameter">
<field name="key">default_email_from</field>
<field name="value">847896395@qq.com</field>
</record>
<record id="next_minutes" model="ir.config_parameter">
<field name="key">next_minutes</field>
<field name="value">20</field>
</record>
</data>
</odoo>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="sequence_cc_exception_info" model="ir.sequence">
<field name="name">异常信息编码规则</field>
<field name="code">cc.exception.info</field>
<field name="padding">2</field>
<field name="number_next_actual">10</field>
<field name="company_id" eval="False"/>
</record>
</data>
</odoo>
\ No newline at end of file
......@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-09-19 08:22+0000\n"
"PO-Revision-Date: 2024-09-19 16:30+0800\n"
"POT-Creation-Date: 2025-02-12 02:20+0000\n"
"PO-Revision-Date: 2025-02-12 10:26+0800\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: zh_CN\n"
......@@ -17,11 +17,142 @@ msgstr ""
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 3.5\n"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/associate_pallet_wizard.py:0
#, python-format
msgid "%s The package does not exist, please check the input information!"
msgstr "%s 不存在该大包,请检查输入信息!"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/associate_pallet_wizard.py:0
#, python-format
msgid "%s at %s associated tray %s, with a tray usage date of %s"
msgstr "%s %s关联了托盘%s,托盘使用日期为%s"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/associate_pallet_wizard.py:0
#, python-format
msgid ""
"%s at %s changed the pallet number from %s to %s, and the pallet usage date "
"from %s to %s"
msgstr "%s %s更改了托盘号,由%s变更为%s,托盘使用日期%s变更为%s"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/add_exception_info_wizard.py:0
#, python-format
msgid ""
"%s at %s manipulated abnormal information, the reason for the abnormality "
"is: %s, %s %s email"
msgstr "%s %s 操作了异常信息,异常原因:%s,%s%s邮件"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/add_exception_info_wizard.py:0
#, python-format
msgid ""
"%s at %s manipulated abnormal information, the reason for the abnormality "
"is: %s, not sent %s email"
msgstr "%s %s 操作了异常信息,异常原因:%s,未发送%s邮件"
#. module: ccs_base
#: model:mail.template,body_html:ccs_base.email_template_exception_notification_en
msgid ""
"<div style=\"margin: 0px; padding: 0px;\">\n"
" <p style=\"margin: 0px; padding: 0px;\">\n"
" Dear all\n"
" <br>\n"
" <!-- 检查 big_package_ids 是否有值 -->\n"
" <t t-if=\"object.big_package_ids\">\n"
" <t t-foreach=\"object.big_package_ids\" t-"
"as=\"big_package_id\">\n"
" <div>Package:\n"
" <t t-esc=\"big_package_id.big_package_no or "
"''\"></t>\n"
" </div>\n"
" </t>\n"
" </t>\n"
" <!-- 检查 ship_package_ids 是否有值 -->\n"
" <t t-if=\"object.ship_package_ids\">\n"
" <t t-foreach=\"object.ship_package_ids\" t-"
"as=\"ship_package_id\">\n"
" <div>Package:\n"
" <t t-esc=\"ship_package_id."
"logistic_order_no or ''\"></t>\n"
" </div>\n"
" </t>\n"
" </t>\n"
" <div>Please know that there is an exception and the "
"cause of the exception is\n"
" <t t-if=\"object.exception_ids\">\n"
" <t t-esc=\"'/'.join([ex.reason for ex in object."
"exception_ids])\"></t>\n"
" </t>\n"
" <t t-if=\"not object.exception_ids\">\n"
" No Exception\n"
" </t>\n"
" </div>\n"
" </p>\n"
" </div>\n"
"\n"
" "
msgstr ""
#. module: ccs_base
#: model:mail.template,body_html:ccs_base.email_template_exception_notification
msgid ""
"<div style=\"margin: 0px; padding: 0px;\">\n"
" <p style=\"margin: 0px; padding: 0px;\">\n"
" 您好\n"
" <br>\n"
" <!-- 检查 big_package_ids 是否有值 -->\n"
" <t t-if=\"object.big_package_ids\">\n"
" <t t-foreach=\"object.big_package_ids\" t-"
"as=\"big_package_id\">\n"
" <div>包裹:\n"
" <t t-esc=\"big_package_id.big_package_no or "
"''\"></t>\n"
" </div>\n"
" </t>\n"
" </t>\n"
" <!-- 检查 ship_package_ids 是否有值 -->\n"
" <t t-if=\"object.ship_package_ids\">\n"
" <t t-foreach=\"object.ship_package_ids\" t-"
"as=\"ship_package_id\">\n"
" <div>包裹:\n"
" <t t-esc=\"ship_package_id."
"logistic_order_no or ''\"></t>\n"
" </div>\n"
" </t>\n"
" </t>\n"
" <div>出现异常,异常原因:\n"
" <t t-if=\"object.exception_ids\">\n"
" <t t-esc=\"'/'.join([ex.reason for ex in object."
"exception_ids])\"></t>,请知晓。\n"
" </t>\n"
" <t t-if=\"not object.exception_ids\">\n"
" 无异常,请知晓。\n"
" </t>\n"
" </div>\n"
" </p>\n"
" </div>\n"
"\n"
" "
msgstr ""
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_bl_view
msgid "<span class=\"o_stat_text\">Big Packages</span>"
msgstr "<span class=\"o_stat_text\">大包</span>"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_bl_view
msgid "<span class=\"o_stat_text\">Delivered Big Packages</span>"
msgstr "<span class=\"o_stat_text\">已交货大包</span>"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_big_package_view
#: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_bl_view
......@@ -63,30 +194,51 @@ msgid "ADD 3"
msgstr "地址3"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_last_mile_provider__abbreviation
msgid "Abbreviation"
msgstr "简称"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__message_needaction
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__message_needaction
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__message_needaction
#: model:ir.model.fields,field_description:ccs_base.field_order_state_change_rule__message_needaction
msgid "Action Needed"
msgstr ""
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard__action_type
msgid "Action Type"
msgstr "动作类型"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_last_mile_provider__active
msgid "Active"
msgstr "有效性"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__activity_ids
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__activity_ids
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__activity_ids
msgid "Activities"
msgstr ""
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__activity_exception_decoration
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__activity_exception_decoration
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__activity_exception_decoration
msgid "Activity Exception Decoration"
msgstr ""
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__activity_state
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__activity_state
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__activity_state
msgid "Activity State"
msgstr ""
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__activity_type_icon
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__activity_type_icon
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__activity_type_icon
msgid "Activity Type Icon"
......@@ -188,8 +340,40 @@ msgid "Actual Weight"
msgstr "实际重量"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.view_add_exception_info_wizard
msgid "Add Exception Information"
msgstr "添加异常信息"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/models/cc_bill_loading.py:0
#: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_big_package_view
#: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_ship_package_view
#, python-format
msgid "Add Package Exception Information"
msgstr "添加包裹异常信息"
#. module: ccs_base
#: model:ir.model,name:ccs_base.model_add_exception_info_wizard
msgid "Add Package Exception Information Wizard"
msgstr "添加包裹异常信息向导"
#. module: ccs_base
#: model:ir.actions.act_window,name:ccs_base.action_associate_pallet
#: model_terms:ir.ui.view,arch_db:ccs_base.view_associate_pallet_wizard
msgid "Associate Pallet"
msgstr "关联托盘"
#. module: ccs_base
#: model:ir.model,name:ccs_base.model_associate_pallet_wizard
msgid "Associate Pallet Wizard"
msgstr "关联托盘向导"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__message_attachment_count
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__message_attachment_count
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__message_attachment_count
#: model:ir.model.fields,field_description:ccs_base.field_order_state_change_rule__message_attachment_count
msgid "Attachment Count"
msgstr "附件总数"
......@@ -233,6 +417,17 @@ msgstr "提货单附件"
msgid "Base Info"
msgstr "基本信息"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_batch_input_ship_package_status_wizard__is_batch
msgid "Batch"
msgstr "批量"
#. module: ccs_base
#: model:ir.actions.server,name:ccs_base.big_package_add_exception_info_server_action
#: model:ir.actions.server,name:ccs_base.ship_package_add_exception_info_server_action
msgid "Batch Add Package Exception Information"
msgstr "批量添加异常信息"
#. module: ccs_base
#: model:ir.model,name:ccs_base.model_batch_input_ship_package_status_wizard
msgid "Batch Update the status of the small package"
......@@ -265,6 +460,15 @@ msgstr "大包"
msgid "Big Package No"
msgstr "大包号"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/associate_pallet_wizard.py:0
#, python-format
msgid ""
"Big Package No :%s ,The same bill of lading, same pallet number, and usage "
"date must be consistent!"
msgstr "大包号:%s ,同一提单、同一托盘号的使用日期必须一致!"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__big_package_no
#: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_big_package_view
......@@ -273,6 +477,11 @@ msgstr "大包号"
msgid "Big Package No."
msgstr "大包号"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_associate_pallet_wizard__big_package_numbers
msgid "Big Package Numbers"
msgstr "大包号"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__big_package_qty
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__bl_total_big_qty
......@@ -282,6 +491,7 @@ msgid "Big Package Qty"
msgstr "大包数"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard__big_package_ids
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__big_package_ids
msgid "Big Packages"
msgstr "大包"
......@@ -332,6 +542,11 @@ msgstr "提单号"
msgid "Billing Weight"
msgstr "提单重量"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_batch_input_ship_package_status_wizard__bl_count
msgid "Bl count"
msgstr "已选提单"
#. module: ccs_base
#: model:ir.model.fields.selection,name:ccs_base.selection__cc_progress__handover_type__broker_delivery
msgid "Broker Delivery"
......@@ -352,11 +567,6 @@ msgstr "买方所在地区"
msgid "By Node"
msgstr "节点"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_batch_input_ship_package_status_wizard__bl_count
msgid "Bl count"
msgstr "已选提单"
#. module: ccs_base
#: model:ir.model.fields.selection,name:ccs_base.selection__batch_input_ship_package_status_wizard__select_type__tracking_no
msgid "By TrackingNo"
......@@ -447,6 +657,7 @@ msgstr "清关信息"
#. module: ccs_base
#: model:ir.model.fields.selection,name:ccs_base.selection__cc_bl__state__ccing
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_bl_view
msgid "CCing"
msgstr "清关中"
......@@ -506,10 +717,19 @@ msgstr "清关重量"
#. module: ccs_base
#: model:ir.model.fields.selection,name:ccs_base.selection__cc_big_package__tally_state__checked_goods
#: model:ir.model.fields.selection,name:ccs_base.selection__cc_node__tally_state__checked_goods
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_big_package_view
msgid "Checked goods"
msgstr "已理货"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/add_exception_info_wizard.py:0
#: model:ir.model.fields.selection,name:ccs_base.selection__add_exception_info_wizard__email_language__zh_cn
#, python-format
msgid "Chinese"
msgstr "中文"
#. module: ccs_base
#: model:ir.actions.act_window,name:ccs_base.action_cc_is_clearance_company
#: model:ir.ui.menu,name:ccs_base.menu_cc_clearance_company
......@@ -531,6 +751,8 @@ msgid "Clearance Files"
msgstr "清关文件"
#. module: ccs_base
#: 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_batch_input_ship_package_wizard
#: model_terms:ir.ui.view,arch_db:ccs_base.view_export_bl_big_package_xlsx_wizard
msgid "Close"
......@@ -549,6 +771,17 @@ msgstr "公司"
msgid "Company Code"
msgstr "公司编码"
#. module: ccs_base
#: model:ir.model,name:ccs_base.model_res_config_settings
msgid "Config Settings"
msgstr "配置设置"
#. module: ccs_base
#: 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
msgid "Confirm"
msgstr "确认"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_batch_input_ship_package_status_wizard__is_ok
msgid "Confirm Date is ok."
......@@ -568,12 +801,26 @@ msgid "Container No"
msgstr "集装箱编号"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_node__tally_state
msgid "Corresponding to the status of the big package"
msgstr "对应大包状态"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_last_mile_provider__name
msgid "Courier Name"
msgstr "快递名称"
#. module: ccs_base
#: 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_batch_input_ship_package_status_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_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_customers_declaration_order__create_uid
#: model:ir.model.fields,field_description:ccs_base.field_cc_customers_declaration_order_line__create_uid
#: model:ir.model.fields,field_description:ccs_base.field_cc_exception_info__create_uid
#: model:ir.model.fields,field_description:ccs_base.field_cc_last_mile_provider__create_uid
#: model:ir.model.fields,field_description:ccs_base.field_cc_node__create_uid
#: model:ir.model.fields,field_description:ccs_base.field_cc_node_exception_reason__create_uid
#: model:ir.model.fields,field_description:ccs_base.field_cc_package_good__create_uid
......@@ -581,16 +828,21 @@ msgstr "集装箱编号"
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__create_uid
#: model:ir.model.fields,field_description:ccs_base.field_common_common__create_uid
#: model:ir.model.fields,field_description:ccs_base.field_export_bl_big_package_xlsx_wizard__create_uid
#: model:ir.model.fields,field_description:ccs_base.field_order_state_change_rule__create_uid
msgid "Created by"
msgstr "创建人"
#. module: ccs_base
#: 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_batch_input_ship_package_status_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_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_customers_declaration_order__create_date
#: model:ir.model.fields,field_description:ccs_base.field_cc_customers_declaration_order_line__create_date
#: model:ir.model.fields,field_description:ccs_base.field_cc_exception_info__create_date
#: model:ir.model.fields,field_description:ccs_base.field_cc_last_mile_provider__create_date
#: model:ir.model.fields,field_description:ccs_base.field_cc_node__create_date
#: model:ir.model.fields,field_description:ccs_base.field_cc_node_exception_reason__create_date
#: model:ir.model.fields,field_description:ccs_base.field_cc_package_good__create_date
......@@ -598,6 +850,7 @@ msgstr "创建人"
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__create_date
#: model:ir.model.fields,field_description:ccs_base.field_common_common__create_date
#: model:ir.model.fields,field_description:ccs_base.field_export_bl_big_package_xlsx_wizard__create_date
#: model:ir.model.fields,field_description:ccs_base.field_order_state_change_rule__create_date
msgid "Created on"
msgstr "创建时间"
......@@ -697,6 +950,28 @@ msgstr "申报价格"
msgid "Declare Type"
msgstr "申报类型"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/models/cc_bill_loading.py:0
#, python-format
msgid "Delivered Big Package"
msgstr "已交货大包"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__delivered_big_package_qty
msgid "Delivered Big Package Qty"
msgstr "已交货大包数量"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__delivery_time
msgid "Delivery Time"
msgstr "尾程交货时间"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__delivery_user_id
msgid "Delivery User"
msgstr "尾程交货人"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_node__desc
#: model:ir.model.fields,field_description:ccs_base.field_cc_node_exception_reason__desc
......@@ -704,12 +979,16 @@ msgid "Description"
msgstr "节点描述"
#. module: ccs_base
#: 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_batch_input_ship_package_status_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_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_customers_declaration_order__display_name
#: model:ir.model.fields,field_description:ccs_base.field_cc_customers_declaration_order_line__display_name
#: model:ir.model.fields,field_description:ccs_base.field_cc_exception_info__display_name
#: model:ir.model.fields,field_description:ccs_base.field_cc_last_mile_provider__display_name
#: model:ir.model.fields,field_description:ccs_base.field_cc_node__display_name
#: model:ir.model.fields,field_description:ccs_base.field_cc_node_exception_reason__display_name
#: model:ir.model.fields,field_description:ccs_base.field_cc_package_good__display_name
......@@ -717,16 +996,19 @@ msgstr "节点描述"
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__display_name
#: model:ir.model.fields,field_description:ccs_base.field_common_common__display_name
#: model:ir.model.fields,field_description:ccs_base.field_export_bl_big_package_xlsx_wizard__display_name
#: model:ir.model.fields,field_description:ccs_base.field_order_state_change_rule__display_name
msgid "Display Name"
msgstr "显示名称"
#. module: ccs_base
#: model:ir.model.fields.selection,name:ccs_base.selection__cc_bl__state__done
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_bl_view
msgid "Done"
msgstr "完成"
#. module: ccs_base
#: 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
msgid "Draft"
msgstr "未开始"
......@@ -751,11 +1033,23 @@ msgstr "预计到达时间"
msgid "ETD"
msgstr "预计离开时间"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard__email_language
msgid "Email Language"
msgstr "邮件语言"
#. module: ccs_base
#: model:ir.model,name:ccs_base.model_mail_thread
msgid "Email Thread"
msgstr "邮件会话"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/add_exception_info_wizard.py:0
#, python-format
msgid "Email template not found."
msgstr "邮件模版没有找到。"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_bl_view
msgid "End Port"
......@@ -768,17 +1062,48 @@ msgstr "目的地港口"
msgid "End Port Code"
msgstr "目的地港口代码"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/add_exception_info_wizard.py:0
#: model:ir.model.fields.selection,name:ccs_base.selection__add_exception_info_wizard__email_language__en_us
#, python-format
msgid "English"
msgstr "英文"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_exception_info__exception_code
msgid "Exception Code"
msgstr "异常编码"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_progress__exception_desc
msgid "Exception Description"
msgstr "异常描述"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard__exception_ids
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__exception_info_ids
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__exception_info_ids
msgid "Exception Information"
msgstr "异常信息"
#. module: ccs_base
#: model:mail.template,name:ccs_base.email_template_exception_notification_en
msgid "Exception Notification"
msgstr "异常邮件通知"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_batch_input_ship_package_status_wizard__node_exception_reason_id
#: model:ir.model.fields,field_description:ccs_base.field_cc_exception_info__reason
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__node_exception_reason_id
msgid "Exception Reason"
msgstr "异常原因"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_exception_info__responsible_email
msgid "Exception Responsible Email"
msgstr "异常接收负责人邮箱"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_progress__exception_type
msgid "Exception Type"
......@@ -797,23 +1122,15 @@ msgstr "排除的追踪号"
msgid "Export HSCode"
msgstr "出口HSCode"
#. module: ccs_base
#: model:ir.actions.server,name:ccs_base.export_order_big_package_xls_server
msgid "Export customs declaration data"
msgstr "导出报关数据"
#. module: ccs_base
#: model:ir.actions.server,name:ccs_base.export_flight_png_server
msgid "Export customs clearance bill of lading file"
msgstr "导出清关提单文件"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/models/cc_bill_loading.py:0
#, python-format
#: model:ir.actions.server,name:ccs_base.batch_input_ship_package_status_server
msgid "Update the status of the small package"
msgstr "更新小包状态"
#: model:ir.actions.server,name:ccs_base.export_order_big_package_xls_server
msgid "Export customs declaration data"
msgstr "导出报关数据"
#. module: ccs_base
#. odoo-python
......@@ -830,6 +1147,7 @@ msgid "File"
msgstr "文件"
#. module: ccs_base
#: 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_terms:ir.ui.view,arch_db:ccs_base.form_cc_clearance_file_view
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_clearance_file_view
......@@ -838,18 +1156,23 @@ msgid "File Name"
msgstr "文件名"
#. 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_bl__message_follower_ids
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__message_follower_ids
#: model:ir.model.fields,field_description:ccs_base.field_order_state_change_rule__message_follower_ids
msgid "Followers"
msgstr ""
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__message_partner_ids
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__message_partner_ids
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__message_partner_ids
#: model:ir.model.fields,field_description:ccs_base.field_order_state_change_rule__message_partner_ids
msgid "Followers (Partners)"
msgstr ""
#. module: ccs_base
#: model:ir.model.fields,help:ccs_base.field_cc_big_package__activity_type_icon
#: model:ir.model.fields,help:ccs_base.field_cc_bl__activity_type_icon
#: model:ir.model.fields,help:ccs_base.field_cc_ship_package__activity_type_icon
msgid "Font awesome icon e.g. fa-tasks"
......@@ -936,24 +1259,37 @@ msgstr "分组方式"
msgid "HEIGHT"
msgstr "高度"
#. module: ccs_base
#: model:ir.model.fields.selection,name:ccs_base.selection__cc_big_package__tally_state__handover_completed
#: model:ir.model.fields.selection,name:ccs_base.selection__cc_node__tally_state__handover_completed
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_big_package_view
msgid "Handover Completed"
msgstr "尾程交接"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_progress__handover_type
msgid "Handover Type"
msgstr "交接类型"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__has_message
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__has_message
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__has_message
#: model:ir.model.fields,field_description:ccs_base.field_order_state_change_rule__has_message
msgid "Has Message"
msgstr ""
#. module: ccs_base
#: 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_batch_input_ship_package_status_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_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_customers_declaration_order__id
#: model:ir.model.fields,field_description:ccs_base.field_cc_customers_declaration_order_line__id
#: model:ir.model.fields,field_description:ccs_base.field_cc_exception_info__id
#: model:ir.model.fields,field_description:ccs_base.field_cc_last_mile_provider__id
#: model:ir.model.fields,field_description:ccs_base.field_cc_node__id
#: model:ir.model.fields,field_description:ccs_base.field_cc_node_exception_reason__id
#: model:ir.model.fields,field_description:ccs_base.field_cc_package_good__id
......@@ -961,6 +1297,7 @@ msgstr ""
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__id
#: model:ir.model.fields,field_description:ccs_base.field_common_common__id
#: model:ir.model.fields,field_description:ccs_base.field_export_bl_big_package_xlsx_wizard__id
#: model:ir.model.fields,field_description:ccs_base.field_order_state_change_rule__id
msgid "ID"
msgstr ""
......@@ -980,26 +1317,32 @@ msgid "ITEM QUANTITY"
msgstr "商品数量"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__activity_exception_icon
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__activity_exception_icon
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__activity_exception_icon
msgid "Icon"
msgstr ""
#. module: ccs_base
#: model:ir.model.fields,help:ccs_base.field_cc_big_package__activity_exception_icon
#: model:ir.model.fields,help:ccs_base.field_cc_bl__activity_exception_icon
#: model:ir.model.fields,help:ccs_base.field_cc_ship_package__activity_exception_icon
msgid "Icon to indicate an exception activity."
msgstr ""
#. module: ccs_base
#: model:ir.model.fields,help:ccs_base.field_cc_big_package__message_needaction
#: model:ir.model.fields,help:ccs_base.field_cc_bl__message_needaction
#: model:ir.model.fields,help:ccs_base.field_cc_ship_package__message_needaction
#: model:ir.model.fields,help:ccs_base.field_order_state_change_rule__message_needaction
msgid "If checked, new messages require your attention."
msgstr ""
#. module: ccs_base
#: model:ir.model.fields,help:ccs_base.field_cc_big_package__message_has_error
#: model:ir.model.fields,help:ccs_base.field_cc_bl__message_has_error
#: model:ir.model.fields,help:ccs_base.field_cc_ship_package__message_has_error
#: model:ir.model.fields,help:ccs_base.field_order_state_change_rule__message_has_error
msgid "If checked, some messages have a delivery error."
msgstr ""
......@@ -1011,6 +1354,11 @@ msgstr ""
msgid "Import HSCode"
msgstr "进口HSCode"
#. module: ccs_base
#: model:ir.model,name:ccs_base.model_fetchmail_server
msgid "Incoming Mail Server"
msgstr "收件服务器"
#. module: ccs_base
#: model:ir.model.fields.selection,name:ccs_base.selection__cc_ship_package__receiver_type__individual
msgid "Individual"
......@@ -1084,8 +1432,10 @@ msgid "Is Done Node"
msgstr "是完成节点"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__message_is_follower
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__message_is_follower
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__message_is_follower
#: model:ir.model.fields,field_description:ccs_base.field_order_state_change_rule__message_is_follower
msgid "Is Follower"
msgstr ""
......@@ -1135,18 +1485,76 @@ msgstr "长度"
msgid "LSPTaxed"
msgstr ""
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_big_package_view
msgid "Last 10 days big package"
msgstr "近10日大包"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_bl_view
msgid "Last 10 days bill of loading"
msgstr "近10日提单"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_ship_package_view
msgid "Last 30 days Ship Package"
msgstr "近30日小包"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_big_package_view
msgid "Last 30 days big Package"
msgstr "近30日大包"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_bl_view
msgid "Last 30 days bill of loading"
msgstr "近30日提单"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_big_package_view
msgid "Last 7 days big package"
msgstr "近7日大包"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_bl_view
msgid "Last 7 days bill of loading"
msgstr "近7日提单"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_ship_package_view
msgid "Last 7 days ship package"
msgstr "近7日小包"
#. module: ccs_base
#: model:ir.model.fields.selection,name:ccs_base.selection__cc_progress__handover_type__last_mile_pick_up
msgid "Last Mile PickUp"
msgstr ""
#. module: ccs_base
#: model:ir.model,name:ccs_base.model_cc_last_mile_provider
#: model_terms:ir.ui.view,arch_db:ccs_base.view_last_mile_provider_form
#: model_terms:ir.ui.view,arch_db:ccs_base.view_last_mile_provider_search
#: model_terms:ir.ui.view,arch_db:ccs_base.view_last_mile_provider_tree
msgid "Last Mile Provider"
msgstr "尾程服务商"
#. module: ccs_base
#: model:ir.actions.act_window,name:ccs_base.action_last_mile_provider
#: model:ir.ui.menu,name:ccs_base.menu_last_mile_provider
msgid "Last Mile Providers"
msgstr "尾程服务商"
#. module: ccs_base
#: 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_batch_input_ship_package_status_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_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_customers_declaration_order____last_update
#: model:ir.model.fields,field_description:ccs_base.field_cc_customers_declaration_order_line____last_update
#: model:ir.model.fields,field_description:ccs_base.field_cc_exception_info____last_update
#: model:ir.model.fields,field_description:ccs_base.field_cc_last_mile_provider____last_update
#: model:ir.model.fields,field_description:ccs_base.field_cc_node____last_update
#: model:ir.model.fields,field_description:ccs_base.field_cc_node_exception_reason____last_update
#: model:ir.model.fields,field_description:ccs_base.field_cc_package_good____last_update
......@@ -1154,6 +1562,7 @@ msgstr ""
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package____last_update
#: model:ir.model.fields,field_description:ccs_base.field_common_common____last_update
#: model:ir.model.fields,field_description:ccs_base.field_export_bl_big_package_xlsx_wizard____last_update
#: model:ir.model.fields,field_description:ccs_base.field_order_state_change_rule____last_update
msgid "Last Modified on"
msgstr "最后修改时间"
......@@ -1163,12 +1572,16 @@ msgid "Last Process Time"
msgstr "最近操作时间"
#. module: ccs_base
#: 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_batch_input_ship_package_status_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_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_customers_declaration_order__write_uid
#: model:ir.model.fields,field_description:ccs_base.field_cc_customers_declaration_order_line__write_uid
#: model:ir.model.fields,field_description:ccs_base.field_cc_exception_info__write_uid
#: model:ir.model.fields,field_description:ccs_base.field_cc_last_mile_provider__write_uid
#: model:ir.model.fields,field_description:ccs_base.field_cc_node__write_uid
#: model:ir.model.fields,field_description:ccs_base.field_cc_node_exception_reason__write_uid
#: model:ir.model.fields,field_description:ccs_base.field_cc_package_good__write_uid
......@@ -1176,16 +1589,21 @@ msgstr "最近操作时间"
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__write_uid
#: model:ir.model.fields,field_description:ccs_base.field_common_common__write_uid
#: model:ir.model.fields,field_description:ccs_base.field_export_bl_big_package_xlsx_wizard__write_uid
#: model:ir.model.fields,field_description:ccs_base.field_order_state_change_rule__write_uid
msgid "Last Updated by"
msgstr "最后更新人"
#. module: ccs_base
#: 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_batch_input_ship_package_status_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_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_customers_declaration_order__write_date
#: model:ir.model.fields,field_description:ccs_base.field_cc_customers_declaration_order_line__write_date
#: model:ir.model.fields,field_description:ccs_base.field_cc_exception_info__write_date
#: model:ir.model.fields,field_description:ccs_base.field_cc_last_mile_provider__write_date
#: model:ir.model.fields,field_description:ccs_base.field_cc_node__write_date
#: model:ir.model.fields,field_description:ccs_base.field_cc_node_exception_reason__write_date
#: model:ir.model.fields,field_description:ccs_base.field_cc_package_good__write_date
......@@ -1193,9 +1611,25 @@ msgstr "最后更新人"
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__write_date
#: model:ir.model.fields,field_description:ccs_base.field_common_common__write_date
#: model:ir.model.fields,field_description:ccs_base.field_export_bl_big_package_xlsx_wizard__write_date
#: model:ir.model.fields,field_description:ccs_base.field_order_state_change_rule__write_date
msgid "Last Updated on"
msgstr "最后更新时间"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_big_package_view
msgid "Last week big package"
msgstr "上周大包"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_bl_view
msgid "Last week bill of loading"
msgstr "上周提单"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_ship_package_view
msgid "Last week ship package"
msgstr "上周小包"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_package_good__item_link
#: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_package_good_view
......@@ -1204,6 +1638,15 @@ msgstr "最后更新时间"
msgid "Link"
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 Pallet"
msgstr "关联托盘"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_progress__loading_type
msgid "Loading Type"
......@@ -1223,8 +1666,10 @@ msgid "Loose"
msgstr "散货"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__message_main_attachment_id
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__message_main_attachment_id
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__message_main_attachment_id
#: model:ir.model.fields,field_description:ccs_base.field_order_state_change_rule__message_main_attachment_id
msgid "Main Attachment"
msgstr "主附件"
......@@ -1234,18 +1679,50 @@ msgid "Master Data"
msgstr "主数据"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_last_mile_provider__matching_value
msgid "Matching Value"
msgstr "尾程服务商匹配值"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/models/cc_last_mile_provider.py:0
#, python-format
msgid "Matching values must be unique!"
msgstr "尾程服务商匹配值必须是唯一的!"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__message_has_error
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__message_has_error
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__message_has_error
#: model:ir.model.fields,field_description:ccs_base.field_order_state_change_rule__message_has_error
msgid "Message Delivery error"
msgstr ""
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__message_ids
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__message_ids
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__message_ids
#: model:ir.model.fields,field_description:ccs_base.field_order_state_change_rule__message_ids
msgid "Messages"
msgstr ""
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.view_associate_pallet_wizard
msgid "Multiple can be entered, one large package number per line"
msgstr "可输入多个,每行输入一个大包号"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.view_exception_info_form
msgid "Multiple entries can be made, one email per line"
msgstr "可输入多个,每行输入一个邮箱"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.view_last_mile_provider_form
msgid "Multiple entries can be made, one matching value per line"
msgstr "可输入多个,每行输入一个匹配值"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__my_activity_date_deadline
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__my_activity_date_deadline
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__my_activity_date_deadline
msgid "My Activity Deadline"
......@@ -1289,18 +1766,21 @@ msgid "Name EN"
msgstr "英文名称"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__activity_date_deadline
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__activity_date_deadline
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__activity_date_deadline
msgid "Next Activity Deadline"
msgstr ""
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__activity_summary
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__activity_summary
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__activity_summary
msgid "Next Activity Summary"
msgstr ""
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__activity_type_id
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__activity_type_id
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__activity_type_id
msgid "Next Activity Type"
......@@ -1375,6 +1855,11 @@ msgstr "节点类型"
msgid "Normal"
msgstr "正常"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_bl_view
msgid "Not Finished Bill of Loading"
msgstr "未完成提单"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_bl_view
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_ship_package_view
......@@ -1382,26 +1867,34 @@ msgid "Not Show Cancelled"
msgstr "不显示已取消的"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__message_needaction_counter
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__message_needaction_counter
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__message_needaction_counter
#: model:ir.model.fields,field_description:ccs_base.field_order_state_change_rule__message_needaction_counter
msgid "Number of Actions"
msgstr ""
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__message_has_error_counter
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__message_has_error_counter
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__message_has_error_counter
#: model:ir.model.fields,field_description:ccs_base.field_order_state_change_rule__message_has_error_counter
msgid "Number of errors"
msgstr ""
#. module: ccs_base
#: model:ir.model.fields,help:ccs_base.field_cc_big_package__message_needaction_counter
#: model:ir.model.fields,help:ccs_base.field_cc_bl__message_needaction_counter
#: model:ir.model.fields,help:ccs_base.field_cc_ship_package__message_needaction_counter
msgid "Number of messages which requires an action"
#: model:ir.model.fields,help:ccs_base.field_order_state_change_rule__message_needaction_counter
msgid "Number of messages requiring action"
msgstr ""
#. module: ccs_base
#: model:ir.model.fields,help:ccs_base.field_cc_big_package__message_has_error_counter
#: model:ir.model.fields,help:ccs_base.field_cc_bl__message_has_error_counter
#: model:ir.model.fields,help:ccs_base.field_cc_ship_package__message_has_error_counter
#: model:ir.model.fields,help:ccs_base.field_order_state_change_rule__message_has_error_counter
msgid "Number of messages with delivery error"
msgstr ""
......@@ -1460,6 +1953,16 @@ msgstr "产品链接"
msgid "Package"
msgstr "小包"
#. module: ccs_base
#: model:ir.actions.act_window,name:ccs_base.action_exception_info
#: model:ir.model,name:ccs_base.model_cc_exception_info
#: model:ir.ui.menu,name:ccs_base.menu_exception_info
#: model_terms:ir.ui.view,arch_db:ccs_base.view_exception_info_form
#: model_terms:ir.ui.view,arch_db:ccs_base.view_exception_info_search
#: model_terms:ir.ui.view,arch_db:ccs_base.view_exception_info_tree
msgid "Package Exception Information"
msgstr "包裹异常信息"
#. module: ccs_base
#: model:ir.actions.act_window,name:ccs_base.action_cc_package_good
#: model:ir.model,name:ccs_base.model_cc_package_good
......@@ -1493,6 +1996,17 @@ msgstr "包裹销售国家代码"
msgid "Packages Qty"
msgstr "小包数"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_associate_pallet_wizard__pallet_number
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__pallet_number
msgid "Pallet Number"
msgstr "托盘号"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__pallet_usage_date
msgid "Pallet Usage Date"
msgstr "托盘使用日期"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/batch_input_ship_package_statu_wizard.py:0
......@@ -1505,7 +2019,7 @@ msgstr "请选择异常原因!"
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__process_time
#: model_terms:ir.ui.view,arch_db:ccs_base.view_batch_input_ship_package_wizard
msgid "Process Time"
msgstr "操作时间"
msgstr "推送时间"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.tree_cc_ship_package_view
......@@ -1724,6 +2238,7 @@ msgid "Receiver VAT"
msgstr "收件人税号"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__activity_user_id
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__activity_user_id
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__activity_user_id
msgid "Responsible User"
......@@ -1835,6 +2350,11 @@ msgstr "包裹销售国家代码"
msgid "SellerObligation"
msgstr ""
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard__send_email
msgid "Send Email Notification"
msgstr "发送邮件通知"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__sender_add_1
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_ship_package_view
......@@ -1910,6 +2430,20 @@ msgstr "发货人省份"
msgid "Sender VAT"
msgstr "发货人税号"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/add_exception_info_wizard.py:0
#, python-format
msgid "Sent"
msgstr "已发送"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/add_exception_info_wizard.py:0
#, python-format
msgid "Sent Fail"
msgstr "发送失败"
#. module: ccs_base
#: model:ir.model.fields.selection,name:ccs_base.selection__cc_package_good__item_tax_status__sentinel
#: model:ir.model.fields.selection,name:ccs_base.selection__cc_ship_package__tax_mark__sentinel
......@@ -1955,6 +2489,7 @@ msgid "Ship Package Qty"
msgstr "小包数"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_add_exception_info_wizard__ship_package_ids
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__ship_package_ids
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__ship_package_ids
msgid "Ship Packages"
......@@ -2003,6 +2538,7 @@ msgid "Status"
msgstr "状态"
#. module: ccs_base
#: model:ir.model.fields,help:ccs_base.field_cc_big_package__activity_state
#: model:ir.model.fields,help:ccs_base.field_cc_bl__activity_state
#: model:ir.model.fields,help:ccs_base.field_cc_ship_package__activity_state
msgid ""
......@@ -2075,6 +2611,11 @@ msgstr "理货时间"
msgid "Tally User"
msgstr "理货人"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_last_mile_provider__tape_color_value
msgid "Tape Color Value"
msgstr "胶带色值"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__tax_mark
msgid "Tax Mark"
......@@ -2093,6 +2634,11 @@ msgstr "商品交税情况"
msgid "The Bill of Loading No. must be unique."
msgstr "提单号必须唯一。"
#. module: ccs_base
#: model:ir.model.constraint,message:ccs_base.constraint_cc_exception_info_exception_code_uniq
msgid "The Exception Code must be unique."
msgstr "异常编码必须唯一。"
#. module: ccs_base
#: model:ir.model.constraint,message:ccs_base.constraint_cc_package_good_item_id_uniq
msgid "The Item ID must be unique."
......@@ -2133,18 +2679,53 @@ msgstr "节点 [%s] 序号小于现有节点序号。"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/batch_input_ship_package_statu_wizard.py:0
#: code:addons/ccs_base/wizard/associate_pallet_wizard.py:0
#, python-format
msgid ""
"The operation time cannot be greater than the current time and cannot be "
"less than the latest operation time!"
msgstr "操作时间不能大于当前时间,也不能小于最近的操作时间!"
msgid "The pallet number can only be entered as a number!"
msgstr "托盘号只能输入数字!"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/associate_pallet_wizard.py:0
#, python-format
msgid "The usage date cannot be later than the current date!"
msgstr "使用日期不能大于当前日期!"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_big_package_view
msgid "This week big package"
msgstr "本周大包"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_bl_view
msgid "This week bill of loading"
msgstr "本周提单"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_ship_package_view
msgid "This week ship package"
msgstr "本周小包"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_bl_view
msgid "Today Deadline"
msgstr "今天截止"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_big_package_view
msgid "Today's big package"
msgstr "今日大包"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_bl_view
msgid "Today's bill of loading"
msgstr "今日提单"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_ship_package_view
msgid "Today's ship package"
msgstr "今日小包"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__bl_total_amount
#: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_bl_view
......@@ -2231,6 +2812,7 @@ msgid "Truck Port"
msgstr "卡转目的口岸"
#. module: ccs_base
#: model:ir.model.fields,help:ccs_base.field_cc_big_package__activity_exception_decoration
#: model:ir.model.fields,help:ccs_base.field_cc_bl__activity_exception_decoration
#: model:ir.model.fields,help:ccs_base.field_cc_ship_package__activity_exception_decoration
msgid "Type of the exception activity on record."
......@@ -2243,6 +2825,7 @@ msgstr "单价"
#. module: ccs_base
#: model:ir.model.fields.selection,name:ccs_base.selection__cc_big_package__tally_state__unprocessed_goods
#: model:ir.model.fields.selection,name:ccs_base.selection__cc_node__tally_state__unprocessed_goods
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_big_package_view
msgid "Unprocessed goods"
msgstr "未理货"
......@@ -2280,11 +2863,18 @@ msgstr "更新包裹进度"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/models/cc_bill_loading.py:0
#: code:addons/ccs_base/wizard/batch_input_ship_package_statu_wizard.py:0
#: model:ir.actions.server,name:ccs_base.batch_input_ship_package_status_server
#, python-format
msgid "Update the status of the small package"
msgstr "更新小包状态"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_associate_pallet_wizard__usage_date
msgid "Usage Date"
msgstr "使用日期"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_ship_package__user_track_note
#: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_ship_package_view
......@@ -2343,6 +2933,28 @@ msgstr "是否分大包导出"
msgid "YES"
msgstr "是"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_big_package_view
msgid "Yesterday's big package"
msgstr "昨日大包"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_bl_view
msgid "Yesterday's bill of loading"
msgstr "昨日提单"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_ship_package_view
msgid "Yesterday's ship package"
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
#: model_terms:ir.actions.act_window,help:ccs_base.action_cc_big_package
msgid ""
......@@ -2355,14 +2967,14 @@ msgstr "【大包】 还没有!点击左上角的“创建”按钮,沙发
msgid ""
"[CC Node] Not yet! Click the Create button in the top left corner and the "
"sofa is yours!"
msgstr "[清关节点] 还没有!点击左上角的“创建”按钮,沙发就是你的了!"
msgstr "【清关节点】 还没有!点击左上角的“创建”按钮,沙发就是你的了!"
#. module: ccs_base
#: model_terms:ir.actions.act_window,help:ccs_base.action_cc_progress
msgid ""
"[CC Progress] Not yet! Click the Create button in the top left corner and "
"the sofa is yours!"
msgstr "[清关进度] 还没有!点击左上角的“创建”按钮,沙发就是你的了!"
msgstr "【清关进度】 还没有!点击左上角的“创建”按钮,沙发就是你的了!"
#. module: ccs_base
#: model_terms:ir.actions.act_window,help:ccs_base.action_cc_is_clearance_company
......@@ -2383,7 +2995,7 @@ msgstr "【清关文件】 还没有!点击左上角的“创建”按钮,
msgid ""
"[Customers] Not yet! Click the Create button in the top left corner and the "
"sofa is yours!"
msgstr "[客户] 还没有!点击左上角的“创建”按钮,沙发就是你的了!"
msgstr "【客户】 还没有!点击左上角的“创建”按钮,沙发就是你的了!"
#. module: ccs_base
#: model_terms:ir.actions.act_window,help:ccs_base.action_cc_package_good
......@@ -2404,6 +3016,24 @@ msgstr "【小包】 还没有!点击左上角的“创建”按钮,沙发
msgid "base_info"
msgstr "基本信息"
#. module: ccs_base
#: model:ir.model.fields,help:ccs_base.field_add_exception_info_wizard__action_type
msgid "ship package/big package"
msgstr ""
#. module: ccs_base
#: model:mail.template,subject:ccs_base.email_template_exception_notification_en
msgid ""
"{{ ('Big Package Exception' if object.action_type == 'big package' else "
"'Ship Package Exception') }}"
msgstr ""
#. module: ccs_base
#: model:mail.template,subject:ccs_base.email_template_exception_notification
msgid ""
"{{ ('大包异常' if object.action_type == 'big package' else '小包异常') }}"
msgstr ""
#. module: ccs_base
#: model:ir.model,name:ccs_base.model_common_common
msgid "公用基础类"
......@@ -2415,3 +3045,23 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:ccs_base.view_export_bl_big_package_xlsx_wizard
msgid "导出报关文件"
msgstr ""
#. module: ccs_base
#: model:mail.template,name:ccs_base.email_template_exception_notification
msgid "异常信息邮件"
msgstr ""
#. module: ccs_base
#: model:ir.model,name:ccs_base.model_order_state_change_rule
msgid "提单状态变更规则"
msgstr ""
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_res_config_settings__before_min
msgid "清关时间取值(早于清关结束)"
msgstr ""
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.res_config_settings_view_form_auto_push
msgid "自动推送配置"
msgstr ""
from . import res_partner
from . import cc_node
from . import cc_bill_loading
from . import cc_customs_declaration_order
from . import cc_exception_info
from . import cc_last_mile_provider
from . import cc_node
from . import cc_node_exception_reason
from . import mail_thread
from . import common_common
from . import fetch_mail
from . import mail_thread
from . import order_state_change_rule
from . import res_config_setting
# 导入odoo
import ast
import base64
# 导入日志
import logging
import pytz
import re
from datetime import timedelta, datetime
from pygtrans import Translate
import xlrd
import pytz
from datetime import timedelta, datetime
from odoo import models, fields, api, _
# 导入日志
import logging
from odoo.exceptions import UserError
from pygtrans import Translate
# 获取日志
_logger = logging.getLogger(__name__)
......@@ -21,6 +19,7 @@ _logger = logging.getLogger(__name__)
class CcBigPackage(models.Model):
# 模型名称
_name = 'cc.big.package'
_inherit = ['mail.thread', 'mail.activity.mixin']
# 模型描述
_description = 'Big Package'
_rec_name = 'big_package_no'
......@@ -43,6 +42,11 @@ class CcBigPackage(models.Model):
# 商品纪录数
goods_qty = fields.Integer(string='Package Qty', compute='_compute_big_package_qty', store=True)
# New fields: pallet_number (char type), pallet_usage_date
# 托盘号(char型),托盘使用日期
pallet_number = fields.Char(string='Pallet Number')
pallet_usage_date = fields.Date(string='Pallet Usage Date')
# 计算包裹数量
@api.depends('ship_package_ids', 'goods_ids', 'ship_package_ids.is_cancel', 'goods_ids.is_cancel')
def _compute_big_package_qty(self):
......@@ -54,10 +58,37 @@ class CcBigPackage(models.Model):
# 增加is_cancel字段, 用于标识大包是否取消, 来自提单的is_cancel字段
is_cancel = fields.Boolean(string='Is Cancel', related='bl_id.is_cancel', store=True)
tally_state = fields.Selection([('unprocessed_goods', 'Unprocessed goods'), ('checked_goods', 'Checked goods')],
default='unprocessed_goods', string='Tally Status', index=True) # 理货状态 未理货/已理货
tally_state = fields.Selection([
('unprocessed_goods', 'Unprocessed goods'),
('checked_goods', 'Checked goods'),
('handover_completed', 'Handover Completed')
], default='unprocessed_goods', string='Tally Status', index=True) # 理货状态 未理货/已理货/尾程交接
tally_user_id = fields.Many2one('res.users', 'Tally User', index=True) # 理货人
tally_time = fields.Datetime('Tally Time') # 理货时间
delivery_user_id = fields.Many2one('res.users', string='Delivery User', index=True) # 尾程交货人
delivery_time = fields.Datetime(string='Delivery Time') # 尾程交货时间
exception_info_ids = fields.Many2many('cc.exception.info', 'bigpackage_exception_info_rel',
string='Exception Information')
def update_pallet_info(self, pallet_number, pallet_usage_date):
"""
修改托盘信息
:param pallet_number:
:param pallet_usage_date:
:return:
"""
self.pallet_usage_date = pallet_usage_date
self.pallet_number = pallet_number
def update_exception_info(self, exception_info_ids, is_send=False, email_language='zh_CN'):
"""
大包回写异常原因,发送邮件
:param exception_info_ids:
:return:
"""
self.exception_info_ids = [(6, 0, exception_info_ids)]
if is_send:
pass
# 创建显示包裹的action
def action_show_ship_package(self):
......@@ -81,12 +112,58 @@ class CcBigPackage(models.Model):
'domain': [('big_package_id', '=', self.id), ('is_cancel', '=', False)],
}
def action_link_pallet(self):
return {
'name': _('Link Pallet'),
'type': 'ir.actions.act_window',
'views': [[False, "form"]],
'res_model': 'associate.pallet.wizard',
'target': 'new',
'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):
"""
菜单 大包
:return:
"""
return {
"name": self._description,
"type": "ir.actions.act_window",
"res_model": self._name,
'view_mode': 'tree,form,pivot,graph',
"context": {'is_show': self.env.user.has_group('ccs_base.group_clearance_of_customs_manager')}
}
def action_package_exception_info(self):
"""
点击添加异常原因,弹出向导
"""
return {
'name': _('Add Package Exception Information'),
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'add.exception.info.wizard',
'target': 'new',
'context': {'active_id': self.ids, 'active_name': self[0]._name, 'default_big_package_ids': self.ids,
'default_action_type': 'big package'}
}
# 创建一个商品的业务对象,用来管理包裹的商品信息.商品信息包括所属包裹、SKU标识ID、商品中文名称、商品英文名称、出口HSCode,进口HSCode,重量、数量,数量单位,申报单价,运费, COD金额, VAT税率, 商品VAT,原产国, 类型:赠品,商品总价,商品链接,商品交税情况(包含:TTSTaxed: 已税
# Sentinel: 未税
# LSPTaxed: 未税
# SellerObligatio
# n: 未税)
# 创建一个商品的业务对象,用来管理包裹的商品信息.商品信息包括所属包裹、SKU标识ID、商品中文名称、商品英文名称、出口HSCode,进口HSCode,重量、数量,数量单位,申报单价,运费, COD金额, VAT税率, 商品VAT,原产国, 类型:赠品,商品总价,商品链接,商品交税情况(包含:TTSTaxed: 已税
# Sentinel: 未税
# LSPTaxed: 未税
# SellerObligatio
# n: 未税)
class CcPackageGood(models.Model):
# 模型名称
_name = 'cc.package.good'
......@@ -327,7 +404,20 @@ class CcShipPackage(models.Model):
default=lambda self: self.env['cc.node'].search(
[('node_type', '=', 'package'), ('is_default', '=', True)], limit=1))
node_exception_reason_id = fields.Many2one('cc.node.exception.reason', 'Exception Reason')
process_time = fields.Datetime('Process Time')
process_time = fields.Datetime('Process Time', index=True)
exception_info_ids = fields.Many2many('cc.exception.info', 'shippackage_exception_info_rel',
string='Exception Information')
def update_exception_info(self, exception_info_ids, is_send=False, email_language='zh_CN'):
"""
小包回写异常原因,发送邮件
:param exception_info_ids:
:return:
"""
self.exception_info_ids = [(6, 0, exception_info_ids)]
if is_send:
pass
# 重载write方法,在进度状态变化时,将is_sync置为False, 同时检查is_sync为false时,不允许修改进度状态
def write(self, vals):
......@@ -385,6 +475,20 @@ class CcShipPackage(models.Model):
'domain': [('bl_line_id', '=', self.id), ('is_cancel', '=', False)],
}
def action_package_exception_info(self):
"""
点击添加异常原因,弹出向导
"""
return {
'name': _('Add Package Exception Information'),
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'add.exception.info.wizard',
'target': 'new',
'context': {'active_id': self.ids, 'active_name': self[0]._name, 'default_ship_package_ids': self.ids,
'default_action_type': 'ship package'}
}
# 翻译
# def action_bl_line_translate(self):
# # http代理:proxies={'http': 'http://localhost:10809', 'https': 'http://localhost:10809'}
......@@ -500,6 +604,16 @@ class CcBL(models.Model):
item.big_package_ids.filtered(
lambda package: package.tally_state == 'checked_goods' and not package.is_cancel))
@api.depends('big_package_ids', 'big_package_ids.tally_state', 'big_package_ids.is_cancel')
def cal_delivered_big_package_qty(self):
"""
已交货的大包数量
"""
for item in self:
item.delivered_big_package_qty = len(
item.big_package_ids.filtered(
lambda package: package.tally_state == 'handover_completed' and not package.is_cancel))
# 提单号
bl_no = fields.Char(string='B/L No', index=True)
# 关务提单号
......@@ -514,6 +628,11 @@ class CcBL(models.Model):
# 理货大包数量
tally_big_package_qty = fields.Integer(string='Tally Big Package Qty', compute='cal_tally_big_package_qty',
store=True)
# 已交货大包数量
delivered_big_package_qty = fields.Integer(string='Delivered Big Package Qty',
compute='cal_delivered_big_package_qty',
store=True)
# 大包售卖国家
big_package_sell_country = fields.Char(string='Sell Country')
......@@ -863,6 +982,16 @@ class CcBL(models.Model):
'domain': [('bl_id', '=', self.id), ('is_cancel', '=', False), ('tally_state', '=', 'checked_goods')],
}
def action_show_big_package_delivered(self):
# 返回一个action,显示已交货的大包
return {
'name': _('Delivered Big Package'),
'type': 'ir.actions.act_window',
'res_model': 'cc.big.package',
'view_mode': 'tree,form',
'domain': [('bl_id', '=', self.id), ('is_cancel', '=', False), ('tally_state', '=', 'handover_completed')],
}
# 创建显示包裹的action
def action_show_ship_package(self):
# 返回一个action,显示包裹
......@@ -900,8 +1029,10 @@ class CcBL(models.Model):
def push_clear_customs_start(self, utc_time):
# 创建向导
push_node_obj = self.env['cc.node'].sudo().search([('node_type', '=', 'package'), ('tk_code', '=', 'cb_imcustoms_start')], limit=1)
node_obj = self.env['cc.node'].sudo().search([('node_type', '=', 'package'), ('seq', '<', push_node_obj.seq)], order='seq desc',
push_node_obj = self.env['cc.node'].sudo().search(
[('node_type', '=', 'package'), ('tk_code', '=', 'cb_imcustoms_start')], limit=1)
node_obj = self.env['cc.node'].sudo().search([('node_type', '=', 'package'), ('seq', '<', push_node_obj.seq)],
order='seq desc',
limit=1)
vals = {
'bl_id': self.id,
......@@ -918,7 +1049,8 @@ class CcBL(models.Model):
def push_clear_customs_end(self, utc_time):
# 创建向导
push_node_obj = self.env['cc.node'].sudo().search([('node_type', '=', 'package'), ('tk_code', '=', 'cb_imcustoms_finished')], limit=1)
push_node_obj = self.env['cc.node'].sudo().search(
[('node_type', '=', 'package'), ('tk_code', '=', 'cb_imcustoms_finished')], limit=1)
node_obj = self.env['cc.node'].sudo().search([('node_type', '=', 'package'), ('seq', '<', push_node_obj.seq)],
order='seq desc',
limit=1)
......@@ -936,34 +1068,18 @@ class CcBL(models.Model):
# print(wizard_obj.get_order())
wizard_obj.submit()
def try_callback_track(self, max_retries=3):
def try_callback_track(self, max_retries=3, ship_package_ids=[]):
""" 封装的重试逻辑 """
for i in range(max_retries):
if not ship_package_ids:
is_ok = self.callback_track()
else:
is_ok = self.package_callback_func(ship_package_ids)
if is_ok:
return True
logging.warning(f"Attempt {i + 1}/{max_retries} failed. Retrying...")
return False
def mail_auto_push(self, mail_time):
self = self.with_context(dict(self._context, is_mail=True))
for item in self:
try:
utc_time = datetime.strptime(mail_time, "%Y-%m-%d %H:%M:%S")
before_min = self.env['ir.config_parameter'].sudo().get_param('before_min') or 10
before_utc_time = utc_time - timedelta(minutes=int(before_min))
item.push_clear_customs_start(before_utc_time)
# 尝试调用 callback_track
if self.try_callback_track():
item.push_clear_customs_end(utc_time)
# 再次尝试调用 callback_track
if not self.try_callback_track():
logging.error(f"Failed to push item after {3} attempts.")
else:
logging.error(f"Failed to start process for item after {3} attempts.")
except Exception as err:
logging.error('fetch_mail_dlv--error:%s' % str(err))
# 增加一个清关进度的业务对象,继承自models.Model, 用于管理业务数据.业务数据包括提单号、清关节点(业务对象)、进度日期、进度描述、更新人
class CcProgress(models.Model):
......
import random
from odoo import models, fields, api
class CCExceptionInfo(models.Model):
_name = 'cc.exception.info'
_description = 'Package Exception Information'
_rec_name = 'reason'
@api.model
def create(self, vals):
if 'exception_code' not in vals or vals['exception_code'] == '/':
vals['exception_code'] = self.env['ir.sequence'].next_by_code('cc.exception.info') or '/'
obj = super(CCExceptionInfo, self).create(vals)
return obj
exception_code = fields.Char(string='Exception Code', default='/', required=True) # 异常编码*
reason = fields.Text(string='Exception Reason', required=True, translate=True) # 异常原因
responsible_email = fields.Text(string='Exception Responsible Email') # 异常接收负责人邮箱(可输入多个)
# 异常编码增加唯一约束
_sql_constraints = [('exception_code_uniq', 'unique(exception_code)', 'The Exception Code must be unique.')]
def search_exception_info(self, pda_lang=False):
"""
查询包裹异常原因
:return:
"""
return {
'exception_code': self.exception_code or '',
'reason': self.reason or '',
'responsible_email': self.responsible_email or '',
'id': self.id
}
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class CCLastMileProvider(models.Model):
_name = 'cc.last.mile.provider'
_description = 'Last Mile Provider'
@api.constrains('matching_value')
def _check_matching_value(self):
for record in self:
if record.matching_value:
values = record.matching_value.split('\n')
existing_values = '\n'.join(self.search([('id', '!=', record.id)]).mapped('matching_value')).split('\n')
if len(values) != len(set(values)) or any(value in existing_values for value in values):
raise ValidationError(_("Matching values must be unique!"))
name = fields.Char(string='Courier Name', required=True) # 快递名称
abbreviation = fields.Char(string='Abbreviation', required=True) # 简称
tape_color_value = fields.Char(string='Tape Color Value') # 胶带色值
active = fields.Boolean('Active', default=True) # 有效☑️
matching_value = fields.Text(string='Matching Value') # 尾程服务商匹配值
def match_provider(self, provider_name):
"""Check if the provider name exists in matching values and return the record."""
# 查询所有匹配的记录
matching_records = self.search([])
# 检查是否有记录的 matching_value 包含 provider_name
for record in matching_records:
if provider_name in record.matching_value.split('\n'):
return record # 返回找到的记录
return False # 如果没有找到,返回 None
# 导入odoo
import base64
import xlrd
from odoo import models, fields, api, _
# 导入日志
import logging
import xlrd
from odoo import models, fields, api, _
from odoo.exceptions import UserError
# 获取日志
......@@ -45,3 +42,9 @@ class CcNode(models.Model):
], string='Node Type', default='bl')
next_code_ids = fields.Many2many('cc.node', 'node_next_node_rel', 'node_id', 'next_node_id', 'Next Node',
domain="[('node_type','=',node_type)]")
tally_state = fields.Selection([
('unprocessed_goods', 'Unprocessed goods'),
('checked_goods', 'Checked goods'),
('handover_completed', 'Handover Completed')
], default='', string='Corresponding to the status of the big package', index=True) # 对应大包状态 未理货/已理货/尾程交接
......@@ -9,7 +9,6 @@ import json
import xlrd
import base64
import pdfplumber
import demjson
from io import BytesIO
from datetime import datetime, timedelta
import re
......
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
batch_input_ship_package_status_wizard_group_user,batch_input_ship_package_status_wizard_group_user,ccs_base.model_batch_input_ship_package_status_wizard,base.group_user,1,1,1,1
export_bl_big_package_xlsx_wizard_group_user,export_bl_big_package_xlsx_wizard_group_user,ccs_base.model_export_bl_big_package_xlsx_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
access_group_user_common_common,access_group_user_common_common,model_common_common,base.group_user,1,1,1,1
......@@ -11,6 +16,12 @@ access_cc_node_exception_reason_base.group_user,cc_node_exception_reason base.gr
access_cc_node_exception_reason_base.group_erp_manager,cc_node_exception_reason base.group_erp_manager,ccs_base.model_cc_node_exception_reason,base.group_erp_manager,1,1,1,1
cc_exception_info_group_user,cc_exception_info_group_user,ccs_base.model_cc_exception_info,base.group_user,1,0,0,0
cc_exception_info_group_erp_manager,cc_exception_info_group_erp_manager,ccs_base.model_cc_exception_info,base.group_erp_manager,1,1,1,1
cc_last_mile_provider_group_user,cc_last_mile_provider_group_user,ccs_base.model_cc_last_mile_provider,base.group_user,1,0,0,0
cc_last_mile_provider_group_erp_manager,cc_last_mile_provider_group_erp_manager,ccs_base.model_cc_last_mile_provider,base.group_erp_manager,1,1,1,1
......
/** @odoo-module */
import {useService} from '@web/core/utils/hooks';
const {useRef, useEffect, useState} = owl;
export const BigPackageLinkPallet = {
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");
// 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() {
// 点击按钮弹出关联托盘的向导
const records = this.model.root.selection;
const recordIds = records.map((a) => a.resId);
const action = await this.orm.call('cc.big.package', 'action_link_pallet', [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;
}
}
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
});
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
<t t-name="ccs_base.ListButtons" t-inherit="web.ListView.Buttons" t-inherit-mode="primary" owl="1">
<xpath expr="//button[hasclass('o_list_button_add')]" position="after">
<button t-if="displayLink()" type="button" class="d-none d-md-inline o_button_link_pallet btn btn-primary mx-1" t-on-click.prevent="onLinkPalletClick">
Link Pallet
</button>
</xpath>
</t>
</templates>
......@@ -6,15 +6,20 @@
<field name="name">tree.cc.big.package</field>
<field name="model">cc.big.package</field>
<field name="arch" type="xml">
<tree string="Big Package" decoration-warning="is_cancel==True">
<tree string="Big Package" js_class="cc_big_package_tree" decoration-warning="is_cancel==True">
<field optional="show" name="big_package_no" string="Big Package No."/>
<field optional="show" name="bl_id" string="Bill of Loading"/>
<field name="ship_package_qty" string="Packages Qty"/>
<field name="goods_qty" string="Goods Qty"/>
<field name="is_cancel" string="Cancelled"/>
<field name="pallet_number"/>
<field name="pallet_usage_date"/>
<field name="tally_state" optional="show"/>
<field name="tally_user_id" optional="show"/>
<field name="tally_time" optional="show"/>
<field name="tally_state" optional="show"/>
<field name="delivery_user_id" optional="show"/>
<field name="delivery_time" optional="show"/>
<field optional="show" name="create_date"/>
</tree>
</field>
</record>
......@@ -25,7 +30,12 @@
<field name="arch" type="xml">
<form string="Big Package">
<header>
<!-- <button name="action_link_pallet" type="object"-->
<!-- string="Link Pallet"-->
<!-- groups="ccs_base.group_clearance_of_customs_manager"/>&lt;!&ndash; 关联托盘 &ndash;&gt;-->
<button name="action_package_exception_info" type="object"
string="Add Package Exception Information"
groups="ccs_base.group_clearance_of_customs_manager"/><!-- 添加包裹异常信息 -->
</header>
<sheet>
<div class="oe_button_box" name="button_box">
......@@ -55,10 +65,15 @@
<field name="big_package_no" string="Big Package No."/>
<field name="bl_id" string="Bill of Loading"/>
<field name="next_provider_name" string="Next Provider Name"/>
<field name="pallet_number" readonly="1"/>
<field name="pallet_usage_date" readonly="1"/>
<field name="exception_info_ids" readonly="1" widget="many2many_tags"/>
<field name="is_cancel" string="Cancelled"/>
<field name="tally_state" readonly="1"/>
<field name="tally_user_id" readonly="1" options="{'no_create':True}"/>
<field name="tally_time" readonly="1"/>
<field name="delivery_user_id" readonly="1" options="{'no_create':True}"/>
<field name="delivery_time" readonly="1"/>
</group>
<group>
<field name="ship_package_qty" string="Package Qty"/>
......@@ -66,6 +81,11 @@
</group>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids"/>
<field name="activity_ids"/>
<field name="message_ids" options="{'post_refresh': 'recipients'}"/>
</div>
</form>
</field>
</record>
......@@ -79,6 +99,36 @@
<field name="big_package_no" string="Search"
filter_domain="['|', ('big_package_no', 'ilike', self), ('bl_id', 'ilike', self)]"/>
<separator/>
<filter string="Today's big package"
domain="[('create_date', '&gt;=', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))
, ('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="today_ship"/>
<filter string="Yesterday's big package"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=1), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')), ('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"
name="yesterday_ship"/>
<filter string="Last 7 days big package"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=7), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="last_7d"/>
<filter string="Last 10 days big package"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=10), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="last_10d"/>
<filter string="This week big package" name="this_week_ship"
domain="[('create_date', '&gt;=', (datetime.datetime.combine(context_today() + relativedelta(weeks=-1,days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),
('create_date', '&lt;', (datetime.datetime.combine(context_today() + relativedelta(days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"/>
<filter string="Last week big package" name="last_week_ship"
domain="[('create_date', '&gt;=', (datetime.datetime.combine(context_today() + relativedelta(weeks=-2,days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),
('create_date', '&lt;', (datetime.datetime.combine(context_today() + relativedelta(weeks=-1,days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"/>
<!-- <filter string="This month ship package"-->
<!-- domain="[('create_date', '>=', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-01 00:00:00'))]"-->
<!-- name="this_month_ship"/>-->
<!-- <filter string=" Last month ship package"-->
<!-- domain="[('create_date','&lt;', (context_today().replace(day=1)).strftime('%Y-%m-%d 00:00:00')),('create_date','&gt;=',(context_today() -relativedelta(months=1)).replace(day=1).strftime('%Y-%m-%d 00:00:00'))]"-->
<!-- name="last_month_ship"/>-->
<filter string="Last 30 days big Package"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=30), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="last_30d"/>
<separator/>
<field name="big_package_no" string="Big Package No."/>
<field name="bl_id" string="Bill of Loading"/>
<field name="next_provider_name" string="Next Provider Name"/>
......@@ -87,6 +137,8 @@
domain="[('tally_state', '=', 'unprocessed_goods')]"/>
<filter string="Checked goods" name="filter_checked_goods"
domain="[('tally_state', '=', 'checked_goods')]"/>
<filter string="Handover Completed" name="filter_handover_completed"
domain="[('tally_state', '=', 'handover_completed')]"/>
<separator/>
<group expand="0" string="Group By">
<filter domain="[]" name="groupby_bl_id" string="Bill of Loading" context="{'group_by': 'bl_id'}"/>
......@@ -102,7 +154,7 @@
<field name="res_model">cc.big.package</field>
<field name="view_mode">tree,form,pivot,graph</field>
<field name="domain">[]</field>
<field name="context">{}</field>
<field name="context">{'search_default_last_30d':1}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
[Big Package] Not yet! Click the Create button in the top left corner and the sofa is yours!
......@@ -114,4 +166,29 @@
<menuitem parent="" sequence="13" name="Big Package" id="menu_cc_big_package" action="action_cc_big_package"/>
<record id="big_package_add_exception_info_server_action" model="ir.actions.server">
<field name="name">Batch Add Package Exception Information</field>
<field name="model_id" ref="model_cc_big_package"/>
<field name="binding_model_id" ref="model_cc_big_package"/>
<field name="state">code</field>
<field name="binding_view_types">list</field>
<field name="groups_id" eval="[(4, ref('ccs_base.group_clearance_of_customs_manager'))]"/>
<field name="code">
if records:
action = records.action_package_exception_info()
</field>
</record>
<!-- <record id="action_cc_big_package_server" model="ir.actions.server">-->
<!-- <field name="name">全部航班</field>-->
<!-- <field name="model_id" ref="model_cc_big_package"/>-->
<!-- <field name="state">code</field>-->
<!-- <field name="code">-->
<!-- action = model.action_cc_big_package()-->
<!-- </field>-->
<!-- </record>-->
<!-- <menuitem id="menu_cc_big_package" name="Big Package" action="action_cc_big_package_server" sequence="13"/>-->
</odoo>
\ No newline at end of file
......@@ -8,7 +8,8 @@
<field name="model">cc.bl</field>
<field name="arch" type="xml">
<tree string="Bill of Loading" decoration-warning="is_cancel==True">
<field optional="show" name="state" string="Status" widget="badge" decoration-info="state=='draft'" decoration-primary="state=='ccing'" decoration-success="state=='done'"/>
<field optional="show" name="state" string="Status" widget="badge" decoration-info="state=='draft'"
decoration-primary="state=='ccing'" decoration-success="state=='done'"/>
<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="customer_id" string="Customer"/>
......@@ -35,6 +36,7 @@
<field optional="show" name="etd" string="ETD"/>
<field optional="show" name="is_cancel" string="Is Cancel"/>
<field optional="hide" name="cancel_reason" string="Cancel Reason"/>
<field optional="show" name="create_date"/>
</tree>
</field>
</record>
......@@ -47,7 +49,8 @@
<header>
<!-- # 为action_batch_input_ship_package_wizard添加一个按钮, 上下文中添加bl_id-->
<button name="%(action_batch_input_ship_package_wizard)d" type="action" class="oe_highlight"
string="Update Ship Package Status" context="{'default_bl_id': active_id, 'active_id': id}"/>
string="Update Ship Package Status"
context="{'default_bl_id': active_id, 'active_id': id}"/>
<field name="state" widget="statusbar" options="{'clickable': '1'}"/>
</header>
......@@ -68,6 +71,15 @@
<span class="o_stat_text">Tally Big Packages</span>
</div>
</button>
<button name="action_show_big_package_delivered" type="object"
class="oe_stat_button" icon="fa-cube">
<div class="o_stat_info">
<field name="delivered_big_package_qty" class="o_stat_value"/>
<span class="o_stat_text">Delivered Big Packages</span>
</div>
</button>
<button name="action_show_ship_package" type="object"
class="oe_stat_button" icon="fa-cubes">
<div class="o_stat_info">
......@@ -183,7 +195,42 @@
<field name="bl_no" string="Search"
filter_domain="['|', ('bl_no', 'ilike', self), ('customs_bl_no', 'ilike', self)]"/>
<separator/>
<filter string="Draft" name="filter_state_draft" domain="[('state','=','draft')]"/>
<filter string="CCing" name="filter_state_ccing" domain="[('state','=','ccing')]"/>
<filter string="Done" name="filter_state_done" domain="[('state','=','done')]"/>
<filter string="Not Finished Bill of Loading" name="filter_state_not_finished"
domain="[('state','in',('ccing','draft'))]"/>
<separator/>
<filter string="Today's bill of loading"
domain="[('create_date', '&gt;=', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))
, ('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="today_ship"/>
<filter string="Yesterday's bill of loading"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=1), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')), ('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"
name="yesterday_ship"/>
<filter string="Last 7 days bill of loading"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=7), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="last_7d"/>
<filter string="Last 10 days bill of loading"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=10), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="last_10d"/>
<filter string="This week bill of loading" name="this_week_ship"
domain="[('create_date', '&gt;=', (datetime.datetime.combine(context_today() + relativedelta(weeks=-1,days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),
('create_date', '&lt;', (datetime.datetime.combine(context_today() + relativedelta(days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"/>
<filter string="Last week bill of loading" name="last_week_ship"
domain="[('create_date', '&gt;=', (datetime.datetime.combine(context_today() + relativedelta(weeks=-2,days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),
('create_date', '&lt;', (datetime.datetime.combine(context_today() + relativedelta(weeks=-1,days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"/>
<!-- <filter string="This month ship package"-->
<!-- domain="[('create_date', '>=', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-01 00:00:00'))]"-->
<!-- name="this_month_ship"/>-->
<!-- <filter string=" Last month ship package"-->
<!-- domain="[('create_date','&lt;', (context_today().replace(day=1)).strftime('%Y-%m-%d 00:00:00')),('create_date','&gt;=',(context_today() -relativedelta(months=1)).replace(day=1).strftime('%Y-%m-%d 00:00:00'))]"-->
<!-- name="last_month_ship"/>-->
<filter string="Last 30 days bill of loading"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=30), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="last_30d"/>
<separator/>
<field name="bl_no" string="Bill of Loading No."/>
<field name="bl_date" string="B/L Date"/>
<field name="customer_id" string="Customer"/>
......@@ -248,14 +295,14 @@
<field name="res_model">cc.bl</field>
<field name="view_mode">tree,form,pivot,graph,calendar</field>
<field name="domain">[]</field>
<field name="context">{}</field>
<field name="context">{'search_default_filter_state_not_finished':1}</field>
<field name="help" type="html">
<p>
</p>
</field>
</record>
<menuitem parent="" sequence="15" name="Bill of Loading" id="menu_cc_bl" action="action_cc_bl"/>
<menuitem parent="" sequence="10" name="Bill of Loading" id="menu_cc_bl" action="action_cc_bl"/>
<!--&lt;!&ndash; <record model="ir.ui.view" id="search_cc_bl_view">&ndash;&gt;-->
......
<odoo>
<record id="view_exception_info_form" model="ir.ui.view">
<field name="name">exception.info.form</field>
<field name="model">cc.exception.info</field>
<field name="arch" type="xml">
<form string="Package Exception Information">
<sheet>
<group>
<field name="exception_code" readonly="1"/> <!-- 异常编码 -->
<field name="reason"/> <!-- 异常原因 -->
<field name="responsible_email"
placeholder="Multiple entries can be made, one email per line"/>
<!-- 异常接收负责人邮箱 可输入多个,一行一个邮箱 -->
</group>
</sheet>
</form>
</field>
</record>
<record id="view_exception_info_tree" model="ir.ui.view">
<field name="name">exception.info.tree</field>
<field name="model">cc.exception.info</field>
<field name="arch" type="xml">
<tree string="Package Exception Information">
<field name="exception_code"/> <!-- 异常编码 -->
<field name="reason"/> <!-- 异常原因 -->
<field name="responsible_email"/> <!-- 异常接收负责人邮箱 -->
</tree>
</field>
</record>
<record model="ir.ui.view" id="view_exception_info_search">
<field name="name">exception.info.search</field>
<field name="model">cc.exception.info</field>
<field name="arch" type="xml">
<search string="Package Exception Information">
<field name="exception_code"/>
<field name="reason"/>
</search>
</field>
</record>
<record id="action_exception_info" model="ir.actions.act_window">
<field name="name">Package Exception Information</field>
<field name="res_model">cc.exception.info</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="menu_exception_info" name="Package Exception Information" parent="menu_ccs_base_main" sequence="98"
action="action_exception_info"/>
</odoo>
\ No newline at end of file
<odoo>
<record id="view_last_mile_provider_form" model="ir.ui.view">
<field name="name">last.mile.provider.form</field>
<field name="model">cc.last.mile.provider</field>
<field name="arch" type="xml">
<form string="Last Mile Provider">
<sheet>
<group>
<group>
<field name="name"/> <!-- 快递名称 -->
<field name="abbreviation"/> <!-- 简称 -->
<field name="tape_color_value" widget="color" required="1"/> <!-- 胶带色值 -->
<field name="matching_value"
placeholder="Multiple entries can be made, one matching value per line"/> <!-- 尾程服务商匹配值 -->
</group>
<group>
<field name="active"/> <!-- 有效☑️ -->
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_last_mile_provider_tree" model="ir.ui.view">
<field name="name">last.mile.provider.tree</field>
<field name="model">cc.last.mile.provider</field>
<field name="arch" type="xml">
<tree string="Last Mile Provider">
<field name="name"/> <!-- 快递名称 -->
<field name="abbreviation"/> <!-- 简称 -->
<field name="tape_color_value"/> <!-- 胶带色值 -->
<field name="matching_value"/> <!-- 尾程服务商匹配值 -->
<field name="active"/> <!-- 有效☑️ -->
</tree>
</field>
</record>
<record model="ir.ui.view" id="view_last_mile_provider_search">
<field name="name">last.mile.provider.search</field>
<field name="model">cc.last.mile.provider</field>
<field name="arch" type="xml">
<search string="Last Mile Provider">
<field name="name"/>
<field name="abbreviation"/>
</search>
</field>
</record>
<record id="action_last_mile_provider" model="ir.actions.act_window">
<field name="name">Last Mile Providers</field>
<field name="res_model">cc.last.mile.provider</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="menu_last_mile_provider" name="Last Mile Providers" parent="menu_ccs_base_main" sequence="95"
action="action_last_mile_provider"/>
</odoo>
\ No newline at end of file
......@@ -12,6 +12,7 @@
<field optional="show" name="name" string="Node Name"/>
<field optional="show" name="desc" string="Node Description"/>
<field optional="show" name="next_code_ids" widget="many2many_tags" options="{'no_create':True}"/>
<field optional="show" name="tally_state"/>
<field optional="show" name="is_must" string="Is Must Node"/>
<field optional="show" name="is_done" string="Is Done Node"/>
<field optional="show" name="is_default" string="Is Current Node"/>
......
......@@ -184,6 +184,6 @@
</field>
</record>
<menuitem parent="" sequence="12" name="Package Goods" id="menu_cc_package_good" action="action_cc_package_good"/>
<menuitem parent="" sequence="16" name="Package Goods" id="menu_cc_package_good" action="action_cc_package_good"/>
</odoo>
\ No newline at end of file
......@@ -16,6 +16,7 @@
<field optional="hide" name="customer_ref" string="Customer Ref"/>
<field optional="hide" name="company_code" string="Company Code"/>
<field optional="hide" name="internal_account_number" string="Internal Account Number"/>
<field optional="hide" name="create_date"/>
<field optional="show" name="logistic_order_no" string="Logistic Order No"/>
<field optional="hide" name="buyer_region" string="Package Sell Country Code"/>
<field optional="show" name="big_package_no" string="Big Package No"/>
......@@ -79,6 +80,10 @@
<field name="arch" type="xml">
<form string="Ship Package">
<header>
<button name="action_package_exception_info" type="object"
string="Add Package Exception Information"
groups="ccs_base.group_clearance_of_customs_manager"/><!-- 添加包裹异常信息 -->
<field name="state" string="Progress Status" widget="statusbar"/>
</header>
<sheet>
......@@ -94,6 +99,7 @@
<field name="big_package_id" string="Big Package"/>
<field name="bl_id" string="Bill of Loading"/>
<field name="next_provider_name" string="Next Provider Name"/>
<field name="exception_info_ids" readonly="1" widget="many2many_tags"/>
<field name="process_time" readonly="1"/>
</group>
......@@ -201,7 +207,33 @@
<field name="tracking_no" string="Search"
filter_domain="['|', ('tracking_no', 'ilike', self), ('trade_no', 'ilike', self)]"/>
<separator/>
<filter string="Today's ship package"
domain="[('create_date', '&gt;=', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))
, ('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="today_ship"/>
<filter string="Yesterday's ship package"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=1), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')), ('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"
name="yesterday_ship"/>
<filter string="Last 7 days ship package"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=7), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="last_7d"/>
<filter string="This week ship package" name="this_week_ship"
domain="[('create_date', '&gt;=', (datetime.datetime.combine(context_today() + relativedelta(weeks=-1,days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),
('create_date', '&lt;', (datetime.datetime.combine(context_today() + relativedelta(days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"/>
<filter string="Last week ship package" name="last_week_ship"
domain="[('create_date', '&gt;=', (datetime.datetime.combine(context_today() + relativedelta(weeks=-2,days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),
('create_date', '&lt;', (datetime.datetime.combine(context_today() + relativedelta(weeks=-1,days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"/>
<!-- <filter string="This month ship package"-->
<!-- domain="[('create_date', '>=', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-01 00:00:00'))]"-->
<!-- name="this_month_ship"/>-->
<!-- <filter string=" Last month ship package"-->
<!-- domain="[('create_date','&lt;', (context_today().replace(day=1)).strftime('%Y-%m-%d 00:00:00')),('create_date','&gt;=',(context_today() -relativedelta(months=1)).replace(day=1).strftime('%Y-%m-%d 00:00:00'))]"-->
<!-- name="last_month_ship"/>-->
<filter string="Last 30 days Ship Package"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=30), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="last_30d"/>
<separator/>
<field name="tracking_no" string="Tracking No."/>
<field name="trade_no" string="Trade No"/>
<field name="user_track_note" string="User Tracking Note"/>
......@@ -290,9 +322,9 @@
<record model="ir.actions.act_window" id="action_cc_ship_package">
<field name="name">Ship Package</field>
<field name="res_model">cc.ship.package</field>
<field name="view_mode">tree,form,pivot,graph</field>
<field name="view_mode">tree,form,search,pivot,graph</field>
<field name="domain">[]</field>
<field name="context">{}</field>
<field name="context">{'search_default_last_30d':1}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
[Ship Package] Not yet! Click the Create button in the top left corner and the sofa is yours!
......@@ -302,18 +334,20 @@
</field>
</record>
<menuitem parent="" sequence="10" name="Ship Package" id="menu_cc_ship_package" action="action_cc_ship_package"/>
<menuitem parent="" sequence="15" name="Ship Package" id="menu_cc_ship_package" action="action_cc_ship_package"/>
<!-- <record id="bl_line_translate_server_action" model="ir.actions.server">-->
<!-- <field name="name">Translate</field>-->
<!-- <field name="model_id" ref="model_cc.ship.package"/>-->
<!-- <field name="binding_model_id" ref="model_cc.ship.package"/>-->
<!-- <field name="state">code</field>-->
<!-- <field name="code">-->
<!-- if records:-->
<!-- action = records.action_bl_line_translate()-->
<!-- </field>-->
<!-- </record>-->
<record id="ship_package_add_exception_info_server_action" model="ir.actions.server">
<field name="name">Batch Add Package Exception Information</field>
<field name="model_id" ref="model_cc_ship_package"/>
<field name="binding_model_id" ref="model_cc_ship_package"/>
<field name="state">code</field>
<field name="binding_view_types">list</field>
<field name="groups_id" eval="[(4, ref('ccs_base.group_clearance_of_customs_manager'))]"/>
<field name="code">
if records:
action = records.action_package_exception_info()
</field>
</record>
</odoo>
\ No newline at end of file
......@@ -2,14 +2,16 @@
<odoo>
<data>
<!-- 隐藏讨论菜单-->
<menuitem id="mail.menu_root_discuss" active="False"/>
<!-- # 增加名称为主数据的,排序99-->
<record id="menu_ccs_base_main" model="ir.ui.menu">
<field name="name">Master Data</field>
<field name="sequence" eval="99"/>
<field name="sequence" eval="20"/>
<field name="web_icon">ccs_base,static/description/icon5.png</field>
</record>
<!-- # 增加一个"客户"action, 仅显示为客户的partner,显示模式为树,表单-->
<!-- # 增加一个"客户"action, 仅显示为客户的partner,显示模式为树,表单-->
<record model="ir.actions.act_window" id="action_cc_partner">
<field name="name">Customers</field>
<field name="res_model">res.partner</field>
......@@ -27,7 +29,7 @@
<!-- # 增加一个"客户"菜单, 与action_cc_partner关联-->
<menuitem sequence="10" name="Customers" id="menu_cc_partner" action="action_cc_partner"
parent="menu_ccs_base_main" />
parent="menu_ccs_base_main"/>
<!-- # 增加一个"供应商"action, 仅显示为供应商的partner,显示模式为树,表单-->
<record model="ir.actions.act_window" id="action_cc_is_clearance_company">
......@@ -46,7 +48,8 @@
</record>
<!-- # 增加一个"供应商"菜单, 与action_cc_supplier关联-->
<menuitem sequence="20" name="Clearance Company" id="menu_cc_clearance_company" action="action_cc_is_clearance_company"
<menuitem sequence="20" name="Clearance Company" id="menu_cc_clearance_company"
action="action_cc_is_clearance_company"
parent="menu_ccs_base_main"/>
</data>
</odoo>
\ No newline at end of file
......@@ -2,8 +2,6 @@
from . import batch_input_ship_package_statu_wizard
from . import export_bl_big_package_xlsx_wizard
# from . import again_push_wizard
# from . import parcel_exception_wizard
# from . import big_bag_pickup_wizard
# from . import batch_push_tiktok
# from . import big_bag_check_wizard
from . import associate_pallet_wizard
from . import add_exception_info_wizard
# -*- coding: utf-8 -*-
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import logging
from odoo import models, fields, api, _
from odoo.exceptions import UserError
class AddExceptionInfoWizard(models.TransientModel):
_name = 'add.exception.info.wizard'
_description = 'Add Package Exception Information Wizard'
def get_order(self):
order_id = self._context.get('active_id')
if type(order_id) != list:
order_id = [self._context.get('active_id')]
return self.env[self._context.get('active_name')].browse(order_id)
def get_language(self):
"""
当前用户语言进行默认
:return:
"""
lang = self.env.user.lang
logging.info('lang:%s' % lang)
return lang
action_type = fields.Char(string='Action Type', help='ship package/big package')
big_package_ids = fields.Many2many('cc.big.package', 'exception_wizard_big_package_rel', string='Big Packages')
ship_package_ids = fields.Many2many('cc.ship.package', 'exception_wizard_ship_package_rel', string='Ship Packages')
exception_ids = fields.Many2many('cc.exception.info', 'big_package_add_exception_info_rel',
string='Exception Information',
required=True) # 异常信息(多选)
send_email = fields.Boolean(string='Send Email Notification', default=False) # 发送邮件通知
email_language = fields.Selection([
('zh_CN', 'Chinese'),
('en_US', 'English')
], string='Email Language', default=get_language) # 邮件语言
def create_add_exception_wizard(self, action_type, exception_ids, big_package_ids=[], ship_package_ids=[],
send_email=False, email_language='zh_CN'):
vals = {
'action_type': action_type,
'big_package_ids': [(6, 0, big_package_ids)],
'ship_package_ids': [(6, 0, ship_package_ids)],
'exception_ids': [(6, 0, exception_ids)],
'send_email': send_email,
'email_language': email_language,
}
return self.create(vals)
def confirm(self):
for record in self:
# 更新小包的异常信息
exception_objs = record.exception_ids
package_objs = self.get_order()
if not self._context.get('not_update_ex'):
for package in package_objs:
package.update_exception_info(exception_objs.ids) # 回写小包的异常信息
# 发送邮件通知
if record.send_email:
self.send_email_notification(record, package_objs, exception_objs)
else:
body = _(
'%s at %s manipulated abnormal information, the reason for the abnormality is: %s, not sent %s email') % (
self.env.user.name, fields.Datetime.now(),
'/'.join([exception.reason for exception in exception_objs]),
_('Chinese') if record.email_language == 'zh_CN' else _('English'))
package.message_post(body=body)
def send_email_notification(self, wizard_obj, package_objs, exception_objs):
"""
发送对应语言的邮件
"""
if self.email_language == 'zh_CN':
template_id = self.env.ref('ccs_base.email_template_exception_notification')
else:
template_id = self.env.ref(
'ccs_base.email_template_exception_notification_en') # Assuming you have an English template
if template_id:
email_arr = []
for r in exception_objs:
if r.responsible_email:
email_arr += r.responsible_email.split('\n')
email_to = ','.join(set(email_arr)) # 取 异常信息里的邮箱
logging.info('email_to:%s' % email_to)
default_email_from = self.env["ir.config_parameter"].sudo().get_param("default_email_from")
local_context = {'lang': self.email_language}
mail_id = template_id.with_context(local_context).send_mail(wizard_obj.id, force_send=True,
email_values={
'email_from': default_email_from,
'email_to': email_to
})
mail = self.env['mail.mail'].sudo().browse(mail_id)
for package in package_objs:
# 回写sns %s %s 操作了异常信息,异常原因:%s,%s发送%s邮件
body = _(
'%s at %s manipulated abnormal information, the reason for the abnormality is: %s, %s %s email') % (
self.env.user.name, fields.Datetime.now(),
'/'.join([exception.reason for exception in exception_objs]),
_('Sent Fail') if mail.exists() and mail.state == 'exception' else _('Sent'),
(_('Chinese') if wizard_obj.email_language == 'zh_CN' else _(
'English')) if wizard_obj.send_email else '')
package.message_post(body=body)
else:
raise UserError(_("Email template not found."))
<odoo>
<record id="view_add_exception_info_wizard" model="ir.ui.view">
<field name="name">add.exception.info.wizard.form</field>
<field name="model">add.exception.info.wizard</field>
<field name="arch" type="xml">
<form string="Add Exception Information">
<sheet>
<group>
<field name="big_package_ids" widget="many2many_tags" readonly="1" invisible="1"/>
<field name="ship_package_ids" widget="many2many_tags" readonly="1" invisible="1"/>
<field name="exception_ids" widget="many2many_tags" required="1"/> <!-- 异常信息 -->
<field name="send_email"/> <!-- 发送邮件通知 -->
<field name="email_language"
attrs="{'required':[('send_email','=',True)]}"/> <!-- 邮件语言 -->
</group>
<footer>
<button string="Confirm" type="object" name="confirm" class="btn-primary"/>
<button string="Close" special="cancel"/>
</footer>
</sheet>
</form>
</field>
</record>
</odoo>
\ No newline at end of file
# -*- coding: utf-8 -*-
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from datetime import date
from odoo import models, fields, api, _
from odoo.exceptions import Warning, ValidationError
class AssociatePalletWizard(models.TransientModel):
_name = 'associate.pallet.wizard'
_description = 'Associate Pallet Wizard'
@api.onchange('usage_date')
def change_usage_date(self):
for item in self:
if item.usage_date:
item.pallet_number = item.get_pallet_number(item.usage_date)
def get_pallet_number(self, usage_date):
"""
生成托盘号 从001开始,如果
:return: 新的托盘号
"""
try:
# 查找大包中最新的托盘号
latest_pallet = self.env['cc.big.package'].search([('pallet_usage_date', '=', str(usage_date))],
order='pallet_number desc', limit=1)
# 生成新的托盘号
if latest_pallet:
new_pallet_number = int(latest_pallet.pallet_number) + 1
else:
new_pallet_number = 1 # 如果没有找到,默认从1开始
return str(new_pallet_number).zfill(3) # 返回格式化的托盘号
except Exception as e:
raise ValidationError(str(e))
usage_date = fields.Date(string='Usage Date', default=fields.Date.today) # 使用日期
pallet_number = fields.Char(string='Pallet Number', required=True) # 托盘号
big_package_numbers = fields.Text(string='Big Package Numbers') # 大包号(可输入多个)
def confirm(self):
for record in self:
if not record.pallet_number.isdigit():
raise ValidationError(_('The pallet number can only be entered as a number!')) # 托盘号只能输入数字!
if record.usage_date > fields.Date.today():
raise ValidationError(_('The usage date cannot be later than the current date!')) # 使用日期不能大于当前日期!
# 处理大包号
big_package_ids = record.big_package_numbers.splitlines()
success_package = []
fail_package = []
for package_number in big_package_ids:
package = self.env['cc.big.package'].search([('big_package_no', '=', package_number)], limit=1)
if package:
success_package.append(package)
else:
fail_package.append(package_number)
if fail_package:
raise ValidationError(_('%s The package does not exist, please check the input information!') % (
'\n'.join(fail_package))) # 不存在该大包,请检查输入信息
if success_package:
for package in success_package:
# 回写大包的托盘号和使用日期
old_pallet_number = package.pallet_number
new_pallet_number = record.pallet_number # 修改的托盘号
old_usage_date = package.pallet_usage_date
# 同一提单,同一托盘号,使用日期必须一致
related_packages = package.bl_id.big_package_ids.filtered(
lambda p: p.pallet_number == new_pallet_number) # 查找对应提单下相同托盘号的所有大包
warning_package_arr = [related_package.big_package_no for related_package in related_packages if
related_package.pallet_usage_date != record.usage_date]
if warning_package_arr:
raise ValidationError(
_('Big Package No :%s ,The same bill of lading, same pallet number, and usage date must be consistent!') % (
'\n'.join(warning_package_arr))) # 大包号关联的同一提单,同一托盘号,使用日期必须一致
package.update_pallet_info(new_pallet_number, record.usage_date)
if old_pallet_number:
# %s %s更改了托盘号,由%s变更为%s,托盘使用日期%s变更为%s
body = _(
'%s at %s changed the pallet number from %s to %s, and the pallet usage date from %s to %s') % (
self.env.user.name, fields.Datetime.now(), old_pallet_number, new_pallet_number,
old_usage_date,
record.usage_date)
else:
# 某人某时关联了托盘xxx,托盘使用日期xxxx
body = _('%s at %s associated tray %s, with a tray usage date of %s') % (
self.env.user.name, fields.Datetime.now(), new_pallet_number, record.usage_date)
package.message_post(body=body)
<odoo>
<record id="view_associate_pallet_wizard" model="ir.ui.view">
<field name="name">associate.pallet.wizard.form</field>
<field name="model">associate.pallet.wizard</field>
<field name="arch" type="xml">
<form string="Associate Pallet">
<sheet>
<group>
<field name="usage_date" required="1"/> <!-- 使用日期 -->
<field name="pallet_number" required="1"/> <!-- 托盘号 -->
<field name="big_package_numbers" required="1"
placeholder="Multiple can be entered, one large package number per line"/> <!-- 大包号 可输入多个,一行一个大包号 -->
</group>
<footer>
<button string="Confirm" type="object" name="confirm" class="btn-primary"/>
<button string="Close" special="cancel"/>
</footer>
</sheet>
</form>
</field>
</record>
<record id="action_associate_pallet" model="ir.actions.act_window">
<field name="name">Associate Pallet</field>
<field name="res_model">associate.pallet.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</odoo>
\ No newline at end of file
<odoo>
<record id="email_template_exception_notification" model="mail.template">
<field name="name">异常信息邮件</field>
<field name="model_id" ref="model_add_exception_info_wizard"/>
<field name="subject">{{ ('大包异常' if object.action_type == 'big package' else '小包异常') }}</field>
<field name="body_html" type="html">
<div style="margin: 0px; padding: 0px;">
<p style="margin: 0px; padding: 0px;">
您好
<br/>
<!-- 检查 big_package_ids 是否有值 -->
<t t-if="object.big_package_ids">
<t t-foreach="object.big_package_ids" t-as="big_package_id">
<div>包裹:
<t t-esc="big_package_id.big_package_no or ''"/>
</div>
</t>
</t>
<!-- 检查 ship_package_ids 是否有值 -->
<t t-if="object.ship_package_ids">
<t t-foreach="object.ship_package_ids" t-as="ship_package_id">
<div>包裹:
<t t-esc="ship_package_id.logistic_order_no or ''"/>
</div>
</t>
</t>
<div>出现异常,异常原因:
<t t-if="object.exception_ids">
<t t-esc="'/'.join([ex.reason for ex in object.exception_ids])"/>,请知晓。
</t>
<t t-if="not object.exception_ids">
无异常,请知晓。
</t>
</div>
</p>
</div>
</field>
</record>
<record id="email_template_exception_notification_en" model="mail.template">
<field name="name">Exception Notification</field>
<field name="model_id" ref="model_add_exception_info_wizard"/>
<field name="subject">{{ ('Big Package Exception' if object.action_type == 'big package' else 'Ship Package Exception') }}</field>
<field name="body_html" type="html">
<div style="margin: 0px; padding: 0px;">
<p style="margin: 0px; padding: 0px;">
Dear all
<br/>
<!-- 检查 big_package_ids 是否有值 -->
<t t-if="object.big_package_ids">
<t t-foreach="object.big_package_ids" t-as="big_package_id">
<div>Package:
<t t-esc="big_package_id.big_package_no or ''"/>
</div>
</t>
</t>
<!-- 检查 ship_package_ids 是否有值 -->
<t t-if="object.ship_package_ids">
<t t-foreach="object.ship_package_ids" t-as="ship_package_id">
<div>Package:
<t t-esc="ship_package_id.logistic_order_no or ''"/>
</div>
</t>
</t>
<div>Please know that there is an exception and the cause of the exception is
<t t-if="object.exception_ids">
<t t-esc="'/'.join([ex.reason for ex in object.exception_ids])"/>
</t>
<t t-if="not object.exception_ids">
No Exception
</t>
</div>
</p>
</div>
</field>
</record>
</odoo>
\ No newline at end of file
# -*- coding: utf-8 -*-
import aiohttp
import asyncio
import certifi
import json
import logging
import math
import random
import re
import ssl
import threading
from datetime import datetime, timedelta
from odoo import http, fields, exceptions, _
# from odoo.addons.queue_job import job
from odoo.http import request
import logging
import json
import random
_logger = logging.getLogger(__name__)
......@@ -18,6 +24,10 @@ bill_null_msg_dic = {
'en': 'The bill of lading number cannot be empty',
'zh': '提单号不能为空'
}
bill_state_msg_dic = {
'en': 'No information was found in the system regarding the bill of lading that has not completed customs clearance',
'zh': '没有在系统中找到未完成清关的该提单信息'
}
class OrderController(http.Controller):
......@@ -69,22 +79,27 @@ class OrderController(http.Controller):
@http.route('/api/bl/info', type='json', auth='public', methods=['GET', 'POST'], csrf=False)
def bl_info(self):
"""
查看提单以及大包信息
查看提单以及大包,小包和托盘信息
:param kwargs:
:return:
"""
kwargs = json.loads(request.httprequest.data)
pda_lang = kwargs.get('pda_lang') or 'zh'
action_type = kwargs.get('action_type') or 'tally' # tally / handover
res = {'state': 201, 'message': ''}
try:
logging.info('bl_info kwargs:%s' % kwargs)
if kwargs.get('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']
bl_obj = request.env['cc.bl'].sudo().deal_bl_no(bl_no) # 提单号去掉杠和空格,并转换为小写
if bl_obj:
res['bl_info'] = bl_obj.search_bl_info(pda_lang=pda_lang)
if bl_obj.state in state_arr:
res['bl_info'] = bl_obj.search_bl_info(pda_lang=pda_lang, type=action_type)
res['state'] = 200
else:
res['message'] = bill_state_msg_dic[pda_lang] # 没有在系统中找到未完成清关的该提单信息
else:
res['state'] = 404
res['message'] = bill_noexist_msg_dic[pda_lang] # _('Bill of lading does not exist') # 提单不存在
......@@ -113,64 +128,172 @@ class OrderController(http.Controller):
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
try:
logging.info('update_big_package_tally_detail kw:%s' % kwargs)
if kwargs.get('bl_no') and kwargs.get('big_package_arr'):
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')):
bl_no = kwargs['bl_no']
bl_obj = request.env['cc.bl'].sudo().search([('bl_no', '=', bl_no)]) # 提单
big_package_arr = kwargs['big_package_arr']
if bl_obj:
# 该箱号的大包存在, 且状态为已扫, 则提示已扫;
# 该箱号的大包不存在, 则提示该箱号在系统中不存在;
tally_no_arr = [] # 已理货大包号
error_no_arr = [] # 不存在大包号
for package_item in big_package_arr:
big_package_no = package_item.get('big_package_no') # 大包号
tally_state = package_item.get('tally_state') # 理货状态
tally_user_id = package_item.get('tally_user_id') # 理货人
tally_time = package_item.get('tally_time') # 理货时间
big_package_obj = request.env['cc.big.package'].sudo().search(
[('big_package_no', '=', big_package_no)]) # 大包号
if big_package_obj:
if big_package_obj.tally_state == 'unprocessed_goods':
big_package_obj.update_big_package_info(tally_state=tally_state,
tally_user_id=tally_user_id,
tally_time=tally_time) # 修改理货信息
# else:
# tally_no_arr.append(big_package_no)
state_arr = ['draft', 'ccing']
bl_obj = request.env['cc.bl'].sudo().deal_bl_no(bl_no) # 提单号去掉杠和空格,并转换为小写
if bl_obj and bl_obj.state in state_arr:
ship_packages = []
big_package_exception_arr = {}
ship_package_exception_arr = {}
# 处理包裹信息
def process_packages(package_arr, package_type, ship_packages):
error_no_set = set() # 使用集合来存储错误信息
for package_item in package_arr:
file_str = 'big_package_no' if package_type == 'big' else (
'logistic_order_no' if package_type == 'ship' else 'pallet_number') # 大包号/物流订单号
package_no = package_item.get(file_str) # 包裹号
exception_cause_ids = package_item.get('exception_cause_ids') # 异常原因id数组
if package_type == 'pallet':
package_obj = request.env['cc.big.package'].sudo().search(
[('pallet_number', '=', package_no), ('bl_id', '=', bl_obj.id)]) # 多个
else:
error_no_arr.append(big_package_no)
if len(error_no_arr) > 0:
error_no_str = ','.join(list(set(error_no_arr)))
noexist_msg_dic = {
'en': 'Big package number [%s] does not exist' % error_no_str,
'zh': '大包号[%s]不存在' % error_no_str
}
res['message'] = noexist_msg_dic[
pda_lang] # _('Big package number [%s] does not exist',','.join(list(set(error_no_arr)))) # 大包号[%s]不存在
package_obj = request.env[f'cc.{package_type}.package'].sudo().search(
[(file_str, '=', package_no)]) # 小包/大包 1个
if package_obj:
if exception_cause_ids:
for excep_item in exception_cause_ids:
if package_type == 'ship':
if excep_item not in ship_package_exception_arr:
ship_package_exception_arr[excep_item] = []
ship_package_exception_arr[excep_item] += package_obj.ids
else:
if excep_item not in big_package_exception_arr:
big_package_exception_arr[excep_item] = []
big_package_exception_arr[excep_item] += package_obj.ids
package_obj.update_exception_info(exception_cause_ids) # 修改异常信息
tally_time = package_item.get('tally_time')
if (action_type == 'tally' and package_item.get('tally_state') == 'checked_goods') or (
action_type == 'handover' and package_item.get(
'tally_state') == 'handover_completed'):
if package_type == 'ship':
ship_packages.append({
'id': package_obj.id,
'tally_time': tally_time})
else:
for package in package_obj:
ship_packages += [{
'id': ship_package.id,
'tally_time': tally_time} for ship_package in
package.ship_package_ids if
(
action_type == 'tally' and package.tally_state == 'unprocessed_goods') or (
action_type == 'handover' and package.tally_state in (
'unprocessed_goods', 'checked_goods'))] # 小包
package_obj.update_big_package_info(action_type=action_type,
tally_state=package_item.get('tally_state'),
tally_user_id=package_item.get(
'tally_user_id'),
tally_time=tally_time) # 修改理货信息
else:
error_no_set.add(package_no)
return error_no_set
# 处理小包、大包和托盘
if kwargs.get('ship_package_arr'):
error_no_arr = process_packages(kwargs['ship_package_arr'], 'ship', ship_packages)
if error_no_arr:
res['message'] = {
'en': 'Ship package number [%s] does not exist' % ','.join(error_no_arr),
'zh': '小包物流订单号[%s]不存在' % ','.join(error_no_arr)
}[pda_lang]
return res
if kwargs.get('big_package_arr'):
error_no_arr = process_packages(kwargs['big_package_arr'], 'big', ship_packages)
if error_no_arr:
res['message'] = {
'en': 'Big package number [%s] does not exist' % ','.join(error_no_arr),
'zh': '大包号[%s]不存在' % ','.join(error_no_arr)
}[pda_lang]
return res
if kwargs.get('pallet_arr'):
error_no_arr = process_packages(kwargs['pallet_arr'], 'pallet', ship_packages)
if error_no_arr:
res['message'] = {
'en': 'Tray number [%s] does not have a corresponding big package' % ','.join(
error_no_arr),
'zh': '托盘[%s]没有对应的大包' % ','.join(error_no_arr)
}[pda_lang]
return res
# 修改异常原因,发送异常邮件
lang = 'zh_CN' if pda_lang == 'zh' else 'en_US' # 语言
for exception_id, big_package in big_package_exception_arr.items():
if big_package:
big_wizard_obj = request.env[
'add.exception.info.wizard'].sudo().with_context({'active_id': big_package,
'active_name': 'cc.big.package',
'not_update_ex': True}).create_add_exception_wizard(
'big package', [exception_id], big_package_ids=big_package, send_email=True,
email_language=lang)
big_wizard_obj.confirm() # 发送邮件
for exception_id, ship_package in ship_package_exception_arr.items():
if ship_package:
ship_wizard_obj = request.env[
'add.exception.info.wizard'].sudo().with_context({'active_id': ship_package,
'active_name': 'cc.ship.package',
'not_update_ex': True}).create_add_exception_wizard(
'ship package', [exception_id], ship_package_ids=ship_package, send_email=True,
email_language=lang)
ship_wizard_obj.confirm() # 发送邮件
res['state'] = 200
# if len(tally_no_arr) > 0:
# res['message'] = '大包号[%s]已理货,无需重新理货!' % ','.join(list(set(tally_no_arr)))
logging.info('update_big_package_tally_detail ship_packages:%s' % len(ship_packages))
# 有小包 就更新小包状态和同步
if ship_packages:
redis_conn = request.env['common.common'].sudo().get_redis()
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}))
redis_conn.lpush('mail_push_package_list', json.dumps(
{'id': bl_obj.id, 'ship_packages': str(ship_packages), 'action_type': action_type}))
else:
res['message'] = bill_noexist_msg_dic[pda_lang] # 提单不存在
else:
null_msg_dic = {
'en': 'The bill of lading number and package data cannot be empty',
'zh': '提单号和大包数据不能为空'
'en': 'The bill of lading number and action type must be provided; at least one of the following is required: big package data, ship package data, or pallet data.',
'zh': '提单号和类型必须提供;以下三者中至少需要提供一个:大包数据、小包数据或托盘数据。'
}
res['message'] = null_msg_dic[
pda_lang] # _('The bill of lading number and package data cannot be empty') # 提单号和大包数据不能为空
res['message'] = null_msg_dic[pda_lang]
except Exception as e:
logging.info('update_big_package_tally_detail error:%s' % e)
exceptions_msg_dic = {
'en': 'System parsing error, the reason for the error is %s' % e,
'zh': '系统解析错误,错误原因是%s' % e
}
res['message'] = exceptions_msg_dic[pda_lang]
logging.info('res:%s' % res)
return res
@http.route('/api/exceptions/info', type='json', auth='public', methods=['GET', 'POST'], csrf=False)
def exceptions_info(self):
"""
返回所有的异常原因的信息
"""
kwargs = json.loads(request.httprequest.data)
pda_lang = kwargs.get('pda_lang') or 'zh'
res = {'state': 201, 'message': ''}
try:
logging.info('exceptions_info kwargs:%s' % kwargs)
lang = 'zh_CN' if pda_lang == 'zh' else 'en_US' # 语言
exception_obj = request.env['cc.exception.info'].sudo().with_context({'lang': lang}).search([]) # 包裹异常原因
res['exception_arr'] = [excep.search_exception_info(pda_lang=pda_lang) for excep in exception_obj]
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('exceptions_info error:%s' % e)
res['message'] = exceptions_msg_dic[
pda_lang] # _('System parsing error, the reason for the error is %s', e) # 系统解析错误,错误原因是
logging.info('res:%s' % res)
logging.info('exceptions_info res:%s' % res)
return res
......@@ -293,7 +293,6 @@ class TTApi(http.Controller):
kws.get('master_waybill_no'), kws.get('big_bag_quantity'))
request._cr.execute(select_bl_sql)
exit_bl_obj = request._cr.fetchall()
logging.info('select_bl_sql:%s,exit_bl_obj:%s' % (select_bl_sql, exit_bl_obj))
if not bl:
if declare_type == 'create':
bl = request.env['cc.bl'].sudo().create(bl_vals)
......@@ -307,7 +306,6 @@ class TTApi(http.Controller):
bl.write(bl_vals)
if bl and ((declare_type == 'create' and len(exit_bl_obj) <= 0) or (
declare_type == 'update' and bl.state == 'draft')):
logging.info('-----update big')
# 生成cc.big.package
big_bag_list = kws.get('big_bag_list')
if big_bag_list and len(big_bag_list) > 0:
......
......@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-10-16 08:24+0000\n"
"PO-Revision-Date: 2024-10-16 16:25+0800\n"
"POT-Creation-Date: 2025-02-18 02:36+0000\n"
"PO-Revision-Date: 2025-02-18 10:37+0800\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: zh\n"
......@@ -112,6 +112,11 @@ msgstr ""
msgid "Created on"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model.fields,help:ccs_connect_tiktok.field_cc_node__interval_minutes
msgid "Default interval time between predecessor nodes in minutes."
msgstr "前置节点之间的默认间隔时间(分钟)。"
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api__display_name
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__display_name
......@@ -196,6 +201,11 @@ msgstr "操作时间"
msgid "Operate User"
msgstr "操作人"
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_node__interval_minutes
msgid "Predecessor Node Interval (Minutes)"
msgstr "前置节点间隔(分钟)"
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.tree_cc_ship_package_view
msgid "Progress"
......@@ -252,6 +262,7 @@ msgstr ""
#: model:ir.actions.act_window,name:ccs_connect_tiktok.action_ao_tt_api_log
#: model:ir.ui.menu,name:ccs_connect_tiktok.menu_ao_flight_tt_api_log
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.form_ao_tt_api_log_view
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.tree_ao_tt_api_log_view
msgid "TIKTOK推送日志"
msgstr ""
......@@ -338,8 +349,14 @@ msgstr ""
msgid "tt推送日志"
msgstr ""
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "上周日志"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__big_bag_no
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "业务信息"
msgstr ""
......@@ -348,11 +365,26 @@ msgstr ""
msgid "产生时间"
msgstr ""
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "今日日志"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__data_text
msgid "传输数据"
msgstr ""
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "分组"
msgstr ""
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "失败"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__error_msg
msgid "失败原因"
......@@ -363,6 +395,11 @@ msgstr ""
msgid "客户"
msgstr ""
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "成功"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.actions.server,name:ccs_connect_tiktok.action_batch_update_package_status
msgid "批量手动处理小包异常数据"
......@@ -388,13 +425,25 @@ msgstr ""
msgid "推出"
msgstr ""
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "昨日日志"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__success_bl
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "是否成功"
msgstr ""
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "本周日志"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__source
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "类型"
msgstr ""
......@@ -402,3 +451,13 @@ msgstr ""
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__request_id
msgid "请求id"
msgstr ""
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "近30日日志"
msgstr ""
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "近7日日志"
msgstr ""
import aiohttp
import asyncio
import base64
import certifi
import json
import logging
import ssl
import aiohttp
import certifi
import pytz
import ssl
from datetime import datetime
from datetime import timedelta, datetime
from lxml import etree
from odoo import models, fields, api, tools, _
from odoo.exceptions import ValidationError, Warning
......@@ -132,7 +132,7 @@ class CcShipPackageSyncLog(models.Model):
class CcShipPackage(models.Model):
_inherit = "cc.ship.package"
is_sync = fields.Boolean('Is Sync', default=False)
is_sync = fields.Boolean('Is Sync', default=False, index=True)
tk_code = fields.Char(related='state.tk_code', store=True, string='TK Code', help='TK Code')
# 增加同步日志纪录字段
......@@ -231,16 +231,22 @@ class CcShipPackage(models.Model):
source='推出')
return ''
def search_ship_package_info(self, pda_lang=False):
"""
查询小包信息
:return:
"""
return {
'logistic_order_no': self.logistic_order_no, # 物流订单号
}
# 继承提单对象t
class CcBl(models.Model):
_inherit = 'cc.bl'
# 增加未同步小包数量字段
unsync_package_count = fields.Integer('Unsync Package Count', compute='_compute_unsync_package_count')
# 计算未同步小包数量
@api.depends('ship_package_ids')
@api.depends('ship_package_ids', 'ship_package_ids.is_sync')
def _compute_unsync_package_count(self):
for record in self:
record_counts = record.ship_package_ids.filtered(lambda r: not r.is_sync)
......@@ -249,18 +255,32 @@ class CcBl(models.Model):
else:
record.unsync_package_count = 0
# 增加未同步小包数量字段
unsync_package_count = fields.Integer('Unsync Package Count', compute='_compute_unsync_package_count', store=True)
# 定义一个方法, 获取提单下的所有未同步的小包,并回传小包状态
def callback_track(self):
is_ok = True
for item in self:
ship_packages = self.env['cc.ship.package'].search([('bl_id', '=', item.id), ('is_sync', '=', False)])
# for package in ship_packages:
# package.callback_track()
is_ok = item.package_callback_func(ship_packages.ids)
return is_ok
def package_callback_func(self, ship_package_ids):
"""
同步小包状态
"""
ship_packages = self.env['cc.ship.package'].search([('id', 'in', ship_package_ids), ('is_sync', '=', False)])
logging.info('package_callback_func ship_packages:%s' % len(ship_packages))
is_ok = True
tt_api_obj = self.env["ao.tt.api"].sudo()
async def perform_requests():
ssl_context = ssl.create_default_context(cafile=certifi.where())
async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=ssl_context), timeout=aiohttp.ClientTimeout(total=60)) as session:
async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=ssl_context),
timeout=aiohttp.ClientTimeout(total=60)) as session:
tasks = []
logging.info('------123')
for index, package in enumerate(ship_packages):
if not package.is_sync and package.state and package.state.tk_code:
data = package.get_callback_track_data()
......@@ -322,20 +342,130 @@ class CcBl(models.Model):
'domain': [('bl_id', '=', self.id), ('is_sync', '=', False)],
}
def search_bl_info(self, pda_lang=False):
def search_bl_info(self, pda_lang=False, type='tally'):
"""
查询提单信息
"""
vals = {
'bl_no': self.bl_no or '', # 提单号
'scan_big_package_qty': self.tally_big_package_qty,
'scan_big_package_qty': self.tally_big_package_qty + self.delivered_big_package_qty if type == 'tally' else self.delivered_big_package_qty,
# 已扫大包数量
'big_package_arr': [big_package_item.search_big_package_info(pda_lang=pda_lang) for big_package_item in
'big_package_arr': [big_package_item.search_big_package_info(pda_lang=pda_lang, type=type) for
big_package_item in
self.big_package_ids],
# 大包信息
'ship_package_arr': [ship_package_item.search_ship_package_info(pda_lang=pda_lang) for ship_package_item in
self.ship_package_ids], # 小包信息
'pallet_arr': self.get_unique_pallet_info(), # 托盘信息
}
return vals
def get_unique_pallet_info(self):
"""获取唯一托盘信息,返回托盘号和最早的使用时间"""
pallet_info = {}
for package in self.big_package_ids:
pallet_number = package.pallet_number
pallet_usage_time = package.pallet_usage_date
if pallet_number and (pallet_number not in pallet_info or pallet_info[pallet_number] > pallet_usage_time):
pallet_info[pallet_number] = pallet_usage_time
return [{'pallet_number': k, 'pallet_usage_time': v} for k, v in pallet_info.items()]
def deal_bl_no(self, bl_no, state_arr=[]):
"""
处理提单号:去掉杠和空格,并转换为小写
:param bl_no:
: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.replace('-', '').replace(' ', '').lower() == processed_bl_no) # 提单
return bl_obj
def mail_auto_push(self, mail_time=False, ship_packages=[], action_type='tally'):
self = self.with_context(dict(self._context, is_mail=True))
for item in self:
try:
if mail_time:
utc_time = datetime.strptime(mail_time, "%Y-%m-%d %H:%M:%S")
before_min = self.env['ir.config_parameter'].sudo().get_param('before_min') or 10
before_utc_time = utc_time - timedelta(minutes=int(before_min))
item.push_clear_customs_start(before_utc_time)
# 尝试调用 callback_track
if self.try_callback_track():
item.push_clear_customs_end(utc_time)
# 再次尝试调用 callback_track
if not self.try_callback_track():
logging.error(f"Failed to push item after {3} attempts.")
else:
logging.error(f"Failed to start process for item after {3} attempts.")
elif ship_packages:
ship_package_ids = [ship_package_dict['id'] for ship_package_dict in ship_packages if
ship_package_dict['id']]
tally_state = 'checked_goods' if action_type == 'tally' else 'handover_completed'
# 后续节点
node_obj = self.env['cc.node'].sudo().search([
('node_type', '=', 'package'),
('tally_state', '=', tally_state) # Check for both states
], order='seq asc') # Order by sequence and creation date ascending
if node_obj:
next_minutes = int(self.env['ir.config_parameter'].sudo().get_param('next_minutes', default=20))
# 前序节点 理货或尾程交接之前没有生成的节点
before_node_obj = self.env['cc.node'].sudo().search([
('node_type', '=', 'package'), ('is_must', '=', True), ('seq', '<', node_obj[0].seq)],
order='seq asc')
# 理货或尾程交接之前没有生成的节点
for beforeidx, before_node in enumerate(before_node_obj):
for ship_package_dict in ship_packages:
ship_package_id = ship_package_dict['id']
ship_package = self.env['cc.ship.package'].browse(ship_package_id) # 小包
tally_time = ship_package_dict['tally_time']
before_minutes = before_node.calculate_total_interval(node_obj[0])
operation_time = (datetime.strptime(tally_time, '%Y-%m-%d %H:%M:%S') - timedelta(
minutes=before_minutes)) if tally_time else fields.Datetime.now() - timedelta(
minutes=before_minutes)
# 检查有没有同步过,没有同步过需要调用同步
sync_log_obj = ship_package.sync_log_ids.filtered(
lambda line: line.process_code == before_node.tk_code)
if not sync_log_obj: # Ensure the current state is valid
ship_package.write({
'state': before_node.id,
'process_time': operation_time,
'state_explain': before_node.desc,
'is_sync': True if before_node.is_default else False
})
self.try_callback_track(max_retries=2, ship_package_ids=ship_package_ids)
# 理货或尾程交接的节点
for index, node in enumerate(node_obj):
for ship_package_dict in ship_packages:
ship_package_id = ship_package_dict['id']
ship_package = self.env['cc.ship.package'].browse(ship_package_id) # 小包
tally_time = ship_package_dict['tally_time']
operation_time = (datetime.strptime(tally_time, '%Y-%m-%d %H:%M:%S') + timedelta(
minutes=next_minutes * index)) if tally_time else fields.Datetime.now() + timedelta(
minutes=next_minutes * index) # Increment time by 20 minutes for each node
state_node_obj = self.env['cc.node'].sudo().search(
[('node_type', '=', 'package'), ('name', '=', ship_package.state.name)],
limit=1)
if state_node_obj.seq < node.seq: # Ensure the current state is valid
ship_package.write({
'state': node.id,
'process_time': operation_time,
'state_explain': node.desc,
'is_sync': True if node.is_default else False
})
self.try_callback_track(max_retries=2, ship_package_ids=ship_package_ids)
if self.state == 'draft' and self.ship_package_ids.filtered(
lambda line: line.state.tk_code == 'cb_imcustoms_start'):
self.ccing_func()
except Exception as err:
logging.error('fetch_mail_dlv--error:%s' % str(err))
class CcBigPackage(models.Model):
# 模型名称
......@@ -343,7 +473,7 @@ class CcBigPackage(models.Model):
# 模型描述
_description = 'Big Package'
def search_big_package_info(self, pda_lang=False):
def search_big_package_info(self, pda_lang=False, type='tally'):
"""
查询大包信息
"""
......@@ -355,28 +485,64 @@ class CcBigPackage(models.Model):
'en': 'Checked goods',
'zh': '已理货'
}
handover_completed_msg_dic = {
'en': 'Handover Completed',
'zh': '尾程交接'
}
state_arr = {'unprocessed_goods': unprocessed_goods_msg_dic[pda_lang],
'checked_goods': checked_goods_msg_dic[pda_lang]} # 未理货/已理货
'checked_goods': checked_goods_msg_dic[pda_lang],
'handover_completed': handover_completed_msg_dic[pda_lang]} # 未理货/已理货/尾程交接
# 根据下一阶段服务商名称获取尾程服务商的记录
provider_obj = self.env['cc.last.mile.provider'].match_provider(self.next_provider_name)
vals = {
'tally_state_label': state_arr[self.tally_state] or '', # 理货状态显示名称
'tally_state': self.tally_state or '', # 理货状态系统KEY
'tally_user_id': self.tally_user_id.id or 0, # 理货人id
'tally_user_name': self.tally_user_id.name or '', # 理货人名称
'tally_time': self.tally_time or '',
'tally_user_id': (self.tally_user_id.id or 0) if type == 'tally' else (self.delivery_user_id.id or 0),
# 理货人id/交货人id
'tally_user_name': (self.tally_user_id.name or '') if type == 'tally' else (
self.delivery_user_id.name or ''),
# 理货人名称/交货人名称
'tally_time': (self.tally_time or '') if type == 'tally' else (self.delivery_time or ''),
# self.env['common.common'].sudo().get_format_time(str(self.tally_time)) if self.tally_time else '',
# 理货时间
'big_package_no': self.big_package_no or '' # 大包号
# 理货时间/交货时间
'big_package_no': self.big_package_no or '', # 大包号
'next_service_provider_name': self.next_provider_name or '', # 下一个服务商名称
'next_service_provider_tape_color': (provider_obj.tape_color_value or '') if provider_obj else '',
# 下一个服务商胶带对应色值
'pallet_number': self.pallet_number or '', # 托盘号
'pallet_usage_time': self.pallet_usage_date or '' # 托盘使用时间
}
return vals
def update_big_package_info(self, **kwargs):
"""
理货
理货 tally/尾程交接 handover
"""
action_type = kwargs.get('action_type')
for item in self:
if action_type == 'tally' and item.tally_state == 'unprocessed_goods':
# 更新理货信息
self._update_info(item, kwargs, 'tally')
elif action_type == 'handover' and item.tally_state != 'handover_completed':
# 更新交接信息
self._update_info(item, kwargs, 'handover')
def _update_info(self, item, kwargs, action_type):
"""
if self.tally_state == 'unprocessed_goods':
更新信息的通用方法
"""
if action_type == 'tally':
if kwargs.get('tally_state'):
item.tally_state = kwargs['tally_state']
if kwargs.get('tally_user_id'):
item.tally_user_id = kwargs['tally_user_id']
if kwargs.get('tally_time'):
item.tally_time = datetime.strptime(kwargs['tally_time'], '%Y-%m-%d %H:%M:%S')
elif action_type == 'handover':
if kwargs.get('tally_state'):
self.tally_state = kwargs['tally_state']
item.tally_state = kwargs['tally_state']
if kwargs.get('tally_user_id'):
self.tally_user_id = kwargs['tally_user_id']
item.delivery_user_id = kwargs['tally_user_id']
if kwargs.get('tally_time'):
self.tally_time = kwargs['tally_time']
item.delivery_time = datetime.strptime(kwargs['tally_time'], '%Y-%m-%d %H:%M:%S')
import base64
import json
import logging
from datetime import datetime
from lxml import etree
import pytz
from odoo import models, fields, api, tools
from odoo.exceptions import ValidationError, Warning
# 继承节点对象.增加TK编码
class CCNode(models.Model):
......@@ -14,3 +10,18 @@ class CCNode(models.Model):
_inherit = 'cc.node'
tk_code = fields.Char('TK Code', help='TK Code')
interval_minutes = fields.Integer('Predecessor Node Interval (Minutes)', default=20,
help='Default interval time between predecessor nodes in minutes.') # 前序节点间隔时间,默认20分钟
def calculate_total_interval(self, next_node):
"""
计算该节点到某个节点直接的间隔时间和
"""
total_interval = 0
predecessor_nodes = self.env['cc.node'].search(
[('node_type', '=', 'package'), ('is_must', '=', True), ('seq', '<=', next_node.seq),
('seq', '>', self.seq)])
for node in predecessor_nodes:
total_interval += node.interval_minutes
logging.info('node:%s,last_node:%s,total_interval:%s' % (self.desc, next_node.desc, total_interval))
return total_interval
......@@ -16,6 +16,7 @@
<field name="error_msg"/>
<field name="success_bl"/>
<field name="request_id"/>
<field name="create_date" optional="hide"/>
</tree>
</field>
</record>
......@@ -41,19 +42,66 @@
</field>
</record>
<record model="ir.ui.view" id="search_ao_tt_api_log_view">
<field name="name">search.ao.tt.api.log</field>
<field name="model">ao.tt.api.log</field>
<field name="arch" type="xml">
<search string="TIKTOK推送日志">
<filter string="今日日志"
domain="[('create_date', '&gt;=', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')), ('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="create_date"/>
<filter string="昨日日志"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=1), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')), ('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"
name="last_24h"/>
<filter string="近7日日志"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=7), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"
name="last_7d"/>
<filter string="本周日志" name="this_week_log"
domain="[('create_date', '&gt;=', (datetime.datetime.combine(context_today() + relativedelta(weeks=-1,days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),
('create_date', '&lt;', (datetime.datetime.combine(context_today() + relativedelta(days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"/>
<filter string="上周日志" name="last_week_log"
domain="[('create_date', '&gt;=', (datetime.datetime.combine(context_today() + relativedelta(weeks=-2,days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')),
('create_date', '&lt;', (datetime.datetime.combine(context_today() + relativedelta(weeks=-1,days=1,weekday=0), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"/>
<!-- <filter string="本月日志" name="this_month_log"-->
<!-- domain="[('create_date','&gt;=', time.strftime('%Y-%m-1 00:00:00')),('create_date','&lt;',(context_today() + relativedelta(months=1)).strftime('%Y-%m-1 00:00:00'))]"/>-->
<!-- <filter string="上月日志" name="last_month_log"-->
<!-- domain="[('create_date','&lt;', time.strftime('%Y-%m-1 00:00:00')),('create_date','&gt;=',(context_today() - relativedelta(months=1)).strftime('%Y-%m-1 00:00:00'))]"/>-->
<filter string="近30日日志" name="last_30d"
domain="[('create_date', '>=', (datetime.datetime.combine(context_today() - datetime.timedelta(days=30), datetime.time(0, 0, 0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')), ('create_date', '&lt;', (datetime.datetime.combine(context_today(), datetime.time(0, 0, 0)).to_utc() + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'))]"/>
<separator/>
<field name="big_bag_no"/>
<field name="data_text"/>
<separator/>
<filter name="filter_success_bl" string="成功" domain="[('success_bl','=',True)]"/>
<filter name="filter_not_success_bl" string="失败" domain="[('success_bl','=',False)]"/>
<separator/>
<group expand="0" string="分组">
<filter domain="[]" name="groupby_success_bl" string="是否成功"
context="{'group_by': 'success_bl'}"/>
<filter domain="[]" name="groupby_big_bag_no" string="业务信息"
context="{'group_by': 'big_bag_no'}"/>
<filter domain="[]" name="groupby_source" string="类型"
context="{'group_by': 'source'}"/>
</group>
<searchpanel>
<field icon="fa-users" select="multi" name="source"/>
</searchpanel>
</search>
</field>
</record>
<record model="ir.actions.act_window" id="action_ao_tt_api_log">
<field name="name">TIKTOK推送日志</field>
<field name="res_model">ao.tt.api.log</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,search</field>
<field name="domain">[]</field>
<field name="context">{}</field>
<field name="context">{'search_default_last_30d':1}</field>
</record>
<menuitem
id="menu_ao_flight_tt_api_log"
name="TIKTOK推送日志"
sequence="9" action="action_ao_tt_api_log"/>
sequence="21" action="action_ao_tt_api_log"/>
</data>
</odoo>
\ No newline at end of file
......@@ -11,6 +11,11 @@
<field name="desc" position="after">
<field name="tk_code"/>
</field>
<field name="next_code_ids" position="after">
<field name="interval_minutes"/>
</field>
</field>
</record>
......
......@@ -2,30 +2,27 @@
# 本地
db_ip = "127.0.0.1"
db_port = "8888"
db_name = "hh_ccs_test"
db_port = "8069"
db_name = "hhccs_test"
db_user = "admin"
db_password = "admin"
redis_options = dict(
host='127.0.0.1',
port=6379,
# password='topodoo1314',
decode_responses=True,
db=0
)
# 测试
# db_ip = "121.199.167.133"
# db_port = "8369"
# db_name = "airorder0309"
# db_name = "hh_ccs"
# db_user = "admin"
# db_password = "123123"
# db_password = "admin"
#
# redis_options = dict(
# host='172.18.0.6',
# port=6379,
# # password='top123',
# decode_responses=True,
# db=3
# )
......@@ -44,5 +41,3 @@ redis_options = dict(
# decode_responses=True,
# db=3
# )
# coding=utf-8
import json
import logging
import odoorpc
import redis
import time
import requests
import odoorpc
from requests.adapters import HTTPAdapter
import time
from datetime import datetime
import config
from requests.adapters import HTTPAdapter
import config
# 默认字符gbk
# logging.basicConfig(filename='./push_data_logger.log', level=logging.INFO)
logging.basicConfig(filename='./push_data_logger.log', level=logging.INFO)
# 设置文件字符为utf-8
logging.basicConfig(handlers=[logging.FileHandler('logs/mail_push.log', 'a', 'utf-8')],
format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO)
# logging.basicConfig(handlers=[logging.FileHandler('logs/mail_push.log', 'a', 'utf-8')],
# format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO)
class Order_dispose(object):
......@@ -29,11 +31,13 @@ class Order_dispose(object):
try:
data = json.loads(data)
logging.info('mail_push_data: %s', data)
ship_packages = eval(data['ship_packages']) if data.get('ship_packages') else [] # 小包
action_type = data.get('action_type') # 类型
bl_obj = self.odoo_db.env['cc.bl']
bl_record = bl_obj.browse(data['id'])
# utc_time = datetime.strptime(data['utc_time'], "%Y-%m-%d %H:%M:%S")
utc_time = data['utc_time']
bl_record.mail_auto_push(utc_time)
utc_time = data.get('utc_time')
bl_record.mail_auto_push(utc_time, ship_packages, action_type)
except Exception as ex:
logging.error('mail_auto_push error:%s' % str(ex))
return res_data
......
# coding=utf-8
import json
import logging
import odoorpc
import redis
import requests
import time
from requests.adapters import HTTPAdapter
import config
# 本地
# 默认字符gbk
# logging.basicConfig(filename='./push_ship_package_state.log', level=logging.INFO)
# 环境?
# 设置文件字符为utf-8
logging.basicConfig(handlers=[logging.FileHandler('logs/push_ship_package_state.log', 'a', 'utf-8')],
format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO)
class Order_dispose(object):
def __init__(self):
# rpc连接
self.odoo_db = odoorpc.ODOO(config.db_ip, port=config.db_port)
self.odoo_db.login(config.db_name, config.db_user, config.db_password)
def order_data(self, record_ids):
res_data = []
try:
result = json.loads(record_ids)
ship_package_ids = result['ship_package_ids'] # 小包
bl_id = result['bl_id']
logging.info('push_ship_package_state kw: %s', result)
bl_obj = self.odoo_db.env['cc.bl'].browse(bl_id) # 提单
logging.info('bl_obj:%s' % bl_obj)
logging.info('ship_package_ids:%s' % len(ship_package_ids))
is_ok = bl_obj.package_callback_func(ship_package_ids) # 调用同步包裹状态
logging.info('is_ok:%s' % is_ok)
# 失败的重复推送 重复推2次
for i in range(2):
if not is_ok:
is_ok = bl_obj.package_callback_func(ship_package_ids)
logging.info('push_ship_package_state 重试推送: %d次' % (i + 1))
else:
break
except Exception as ex:
logging.error('push_ship_package_state error:%s' % str(ex))
return res_data
try:
pool = redis.ConnectionPool(**config.redis_options)
r = redis.Redis(connection_pool=pool)
logging.info(u'redis连接成功')
Order_dispose = Order_dispose()
while 1:
try:
result = r.brpop('push_ship_package_state', 0)
data1 = result[1]
response_data = Order_dispose.order_data(data1)
except Exception as e:
logging.error(e)
continue
except Exception as e:
logging.error("登录失败")
logging.error(e)
[program:push_ship_package_state_consumer_1]
process_name=%(program_name)s_%(process_num)02d ; 进程名称
directory = /mnt/extra-addons ; 程序的启动目录
command = /usr/bin/python3 /mnt/extra-addons/push_ship_package_state.py ; 启动命令
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 2 ; 启动失败自动重试次数,默认是 3
user = root ; 用哪个用户启动
numprocs=1 ; 进程数
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /var/log/supervisor/push_ship_package_state.log
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论