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

Merge branch 'release/3.3.0'

...@@ -6,11 +6,11 @@ msgid "" ...@@ -6,11 +6,11 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Odoo Server 16.0\n" "Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-22 01:56+0000\n" "POT-Creation-Date: 2025-09-23 09:28+0000\n"
"PO-Revision-Date: 2025-09-22 09:57+0800\n" "PO-Revision-Date: 2025-09-23 17:30+0800\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
"Language: zh_CN\n" "Language: zh\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
...@@ -173,6 +173,11 @@ msgstr "<span class=\"o_stat_text\">已交货大包</span>" ...@@ -173,6 +173,11 @@ msgstr "<span class=\"o_stat_text\">已交货大包</span>"
msgid "<span class=\"o_stat_text\">Goods</span>" msgid "<span class=\"o_stat_text\">Goods</span>"
msgstr "<span class=\"o_stat_text\">货物</span>" msgstr "<span class=\"o_stat_text\">货物</span>"
#. module: ccs_base
#: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_bl_view
msgid "<span class=\"o_stat_text\">Picked Up Big Packages</span>"
msgstr "<span class=\"o_stat_text\">已提货大包</span>"
#. module: ccs_base #. 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_big_package_view
#: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_bl_view #: model_terms:ir.ui.view,arch_db:ccs_base.form_cc_bl_view
...@@ -2545,6 +2550,39 @@ msgstr "托盘号" ...@@ -2545,6 +2550,39 @@ msgstr "托盘号"
msgid "Pallet Usage Date" msgid "Pallet Usage Date"
msgstr "托盘使用日期" msgstr "托盘使用日期"
#. module: ccs_base
#: model:ir.model.fields.selection,name:ccs_base.selection__cc_big_package__tally_state__picked_up
#: model_terms:ir.ui.view,arch_db:ccs_base.search_cc_big_package_view
msgid "Picked Up"
msgstr "已提货"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/models/cc_bill_loading.py:0
#, python-format
msgid "Picked Up Big Package"
msgstr "已提货大包"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_bl__picked_up_big_package_qty
msgid "Picked Up Big Package Qty"
msgstr "已提货大包数量"
#. module: ccs_base
#: model:ir.model.fields.selection,name:ccs_base.selection__cc_node__tally_state__picked_up
msgid "Picked up"
msgstr "已提货"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__pickup_time
msgid "Pickup Time"
msgstr "提货时间"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__pickup_user_id
msgid "Pickup User"
msgstr "提货人"
#. module: ccs_base #. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_last_mile_provider__placement_area #: model:ir.model.fields,field_description:ccs_base.field_cc_last_mile_provider__placement_area
msgid "Placement Area" msgid "Placement Area"
......
...@@ -55,11 +55,16 @@ class CcBigPackage(models.Model): ...@@ -55,11 +55,16 @@ class CcBigPackage(models.Model):
# 增加is_cancel字段, 用于标识大包是否取消, 来自提单的is_cancel字段 # 增加is_cancel字段, 用于标识大包是否取消, 来自提单的is_cancel字段
is_cancel = fields.Boolean(string='Is Cancel', related='bl_id.is_cancel', store=True) is_cancel = fields.Boolean(string='Is Cancel', related='bl_id.is_cancel', store=True)
# 提货相关字段
pickup_user_id = fields.Many2one('res.users', 'Pickup User', index=True) # 提货人
pickup_time = fields.Datetime('Pickup Time') # 提货时间
tally_state = fields.Selection([ tally_state = fields.Selection([
('unprocessed_goods', 'Unprocessed goods'), ('unprocessed_goods', 'Unprocessed goods'),
('picked_up', 'Picked Up'),
('checked_goods', 'Checked goods'), ('checked_goods', 'Checked goods'),
('handover_completed', 'Handover Completed') ('handover_completed', 'Handover Completed')
], default='unprocessed_goods', string='Tally Status', index=True) # 理货状态 未理货/已理货/尾程交接 ], default='unprocessed_goods', string='Tally Status', index=True) # 理货状态 未理货/已提货/已理货/尾程交接
tally_user_id = fields.Many2one('res.users', 'Tally User', index=True) # 理货人 tally_user_id = fields.Many2one('res.users', 'Tally User', index=True) # 理货人
tally_time = fields.Datetime('Tally Time') # 理货时间 tally_time = fields.Datetime('Tally Time') # 理货时间
delivery_user_id = fields.Many2one('res.users', string='Delivery User', index=True) # 尾程交货人 delivery_user_id = fields.Many2one('res.users', string='Delivery User', index=True) # 尾程交货人
...@@ -583,6 +588,16 @@ class CcBL(models.Model): ...@@ -583,6 +588,16 @@ class CcBL(models.Model):
raise ValidationError( raise ValidationError(
_('Transfer B/L No. cannot be the same as B/L No. or Transfer B/L No.')) # 转单号不能与提单号或转单号重复 _('Transfer B/L No. cannot be the same as B/L No. or Transfer B/L No.')) # 转单号不能与提单号或转单号重复
@api.depends('big_package_ids', 'big_package_ids.tally_state', 'big_package_ids.is_cancel')
def cal_picked_up_big_package_qty(self):
"""
已提货的大包数量
"""
for item in self:
item.picked_up_big_package_qty = len(
item.big_package_ids.filtered(
lambda package: package.tally_state == 'picked_up' and not package.is_cancel))
@api.depends('big_package_ids', 'big_package_ids.tally_state', 'big_package_ids.is_cancel') @api.depends('big_package_ids', 'big_package_ids.tally_state', 'big_package_ids.is_cancel')
def cal_tally_big_package_qty(self): def cal_tally_big_package_qty(self):
""" """
...@@ -631,6 +646,9 @@ class CcBL(models.Model): ...@@ -631,6 +646,9 @@ class CcBL(models.Model):
# 大包数量 # 大包数量
big_package_qty = fields.Integer(string='Big Package Qty') big_package_qty = fields.Integer(string='Big Package Qty')
# 已提货大包数量
picked_up_big_package_qty = fields.Integer(string='Picked Up Big Package Qty', compute='cal_picked_up_big_package_qty',
store=True)
# 理货大包数量 # 理货大包数量
tally_big_package_qty = fields.Integer(string='Tally Big Package Qty', compute='cal_tally_big_package_qty', tally_big_package_qty = fields.Integer(string='Tally Big Package Qty', compute='cal_tally_big_package_qty',
store=True) store=True)
...@@ -855,6 +873,16 @@ class CcBL(models.Model): ...@@ -855,6 +873,16 @@ class CcBL(models.Model):
'domain': [('bl_id', '=', self.id), ('is_cancel', '=', False)], 'domain': [('bl_id', '=', self.id), ('is_cancel', '=', False)],
} }
def action_show_big_package_picked_up(self):
# 返回一个action,显示已提货的大包
return {
'name': _('Picked Up 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', '=', 'picked_up')],
}
def action_show_big_package_tally(self): def action_show_big_package_tally(self):
# 返回一个action,显示已理货的大包 # 返回一个action,显示已理货的大包
return { return {
......
...@@ -43,6 +43,7 @@ class CcNode(models.Model): ...@@ -43,6 +43,7 @@ class CcNode(models.Model):
tally_state = fields.Selection([ tally_state = fields.Selection([
('unprocessed_goods', 'Unprocessed goods'), ('unprocessed_goods', 'Unprocessed goods'),
('picked_up', 'Picked up'),
('checked_goods', 'Checked goods'), ('checked_goods', 'Checked goods'),
('handover_completed', 'Handover Completed') ('handover_completed', 'Handover Completed')
], default='', string='Corresponding to the status of the big package', index=True) # 对应大包状态 未理货/已理货/尾程交接 ], default='', string='Corresponding to the status of the big package', index=True) # 对应大包状态 未理货/已理货/尾程交接
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
<field name="next_provider_name"/> <field name="next_provider_name"/>
<field name="pallet_number"/> <field name="pallet_number"/>
<field name="pallet_usage_date"/> <field name="pallet_usage_date"/>
<field name="pickup_user_id" optional="show"/>
<field name="pickup_time" optional="show"/>
<field name="tally_state" optional="show"/> <field name="tally_state" optional="show"/>
<field name="tally_user_id" optional="show"/> <field name="tally_user_id" optional="show"/>
<field name="tally_time" optional="show"/> <field name="tally_time" optional="show"/>
...@@ -70,6 +72,8 @@ ...@@ -70,6 +72,8 @@
<field name="pallet_usage_date" readonly="1"/> <field name="pallet_usage_date" readonly="1"/>
<field name="exception_info_ids" readonly="1" widget="many2many_tags"/> <field name="exception_info_ids" readonly="1" widget="many2many_tags"/>
<field name="is_cancel" string="Cancelled"/> <field name="is_cancel" string="Cancelled"/>
<field name="pickup_user_id" readonly="1" options="{'no_create':True}"/>
<field name="pickup_time" readonly="1"/>
<field name="tally_state" readonly="1"/> <field name="tally_state" readonly="1"/>
<field name="tally_user_id" readonly="1" options="{'no_create':True}"/> <field name="tally_user_id" readonly="1" options="{'no_create':True}"/>
<field name="tally_time" readonly="1"/> <field name="tally_time" readonly="1"/>
...@@ -136,6 +140,8 @@ ...@@ -136,6 +140,8 @@
<separator/> <separator/>
<filter string="Unprocessed goods" name="filter_unprocessed_goods" <filter string="Unprocessed goods" name="filter_unprocessed_goods"
domain="[('tally_state', '=', 'unprocessed_goods')]"/> domain="[('tally_state', '=', 'unprocessed_goods')]"/>
<filter string="Picked Up" name="filter_picked_up"
domain="[('tally_state', '=', 'picked_up')]"/>
<filter string="Checked goods" name="filter_checked_goods" <filter string="Checked goods" name="filter_checked_goods"
domain="[('tally_state', '=', 'checked_goods')]"/> domain="[('tally_state', '=', 'checked_goods')]"/>
<filter string="Handover Completed" name="filter_handover_completed" <filter string="Handover Completed" name="filter_handover_completed"
......
...@@ -93,6 +93,13 @@ ...@@ -93,6 +93,13 @@
<span class="o_stat_text">Tally Big Packages</span> <span class="o_stat_text">Tally Big Packages</span>
</div> </div>
</button> </button>
<button name="action_show_big_package_picked_up" type="object"
class="oe_stat_button" icon="fa-cube">
<div class="o_stat_info">
<field name="picked_up_big_package_qty" class="o_stat_value"/>
<span class="o_stat_text">Picked Up Big Packages</span>
</div>
</button>
<button name="action_show_big_package_delivered" type="object" <button name="action_show_big_package_delivered" type="object"
class="oe_stat_button" icon="fa-cube"> class="oe_stat_button" icon="fa-cube">
<div class="o_stat_info"> <div class="o_stat_info">
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
<data> <data>
<!-- 隐藏讨论菜单--> <!-- 隐藏讨论菜单-->
<menuitem id="mail.menu_root_discuss" active="False"/> <menuitem id="mail.menu_root_discuss" active="False"/>
<!-- 应用的权限给系统管理员-->
<menuitem id="base.menu_management" groups="base.group_system"/>
<!-- # 增加名称为主数据的,排序99--> <!-- # 增加名称为主数据的,排序99-->
<record id="menu_ccs_base_main" model="ir.ui.menu"> <record id="menu_ccs_base_main" model="ir.ui.menu">
<field name="name">Master Data</field> <field name="name">Master Data</field>
......
...@@ -6,8 +6,8 @@ msgid "" ...@@ -6,8 +6,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Odoo Server 16.0\n" "Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-22 01:59+0000\n" "POT-Creation-Date: 2025-09-23 09:31+0000\n"
"PO-Revision-Date: 2025-09-22 10:00+0800\n" "PO-Revision-Date: 2025-09-23 17:35+0800\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
"Language: zh_CN\n" "Language: zh_CN\n"
...@@ -95,6 +95,14 @@ msgstr "提单号" ...@@ -95,6 +95,14 @@ msgstr "提单号"
msgid "Bill Of Loading Sync Logs" msgid "Bill Of Loading Sync Logs"
msgstr "关务提单状态同步日志" msgstr "关务提单状态同步日志"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields.selection,name:ccs_connect_tiktok.selection__pda_scan_record__operation__bill_pickup
#, python-format
msgid "Bill Pickup"
msgstr "按提单提货"
#. module: ccs_connect_tiktok #. module: ccs_connect_tiktok
#. odoo-python #. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0 #: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
...@@ -388,6 +396,14 @@ msgstr "托盘" ...@@ -388,6 +396,14 @@ msgstr "托盘"
msgid "Pallet Handover" msgid "Pallet Handover"
msgstr "托盘交货" msgstr "托盘交货"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields.selection,name:ccs_connect_tiktok.selection__pda_scan_record__operation__pallet_pickup
#, python-format
msgid "Pallet Pickup"
msgstr "托盘提货"
#. module: ccs_connect_tiktok #. module: ccs_connect_tiktok
#. odoo-python #. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0 #: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
...@@ -396,6 +412,14 @@ msgstr "托盘交货" ...@@ -396,6 +412,14 @@ msgstr "托盘交货"
msgid "Pallet Tally" msgid "Pallet Tally"
msgstr "托盘理货" msgstr "托盘理货"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields.selection,name:ccs_connect_tiktok.selection__pda_scan_record__record_type__pickup
#, python-format
msgid "Pickup"
msgstr "提货"
#. module: ccs_connect_tiktok #. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_node__interval_minutes #: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_node__interval_minutes
msgid "Predecessor Node Interval (Minutes)" msgid "Predecessor Node Interval (Minutes)"
...@@ -541,6 +565,14 @@ msgstr "进度编码" ...@@ -541,6 +565,14 @@ msgstr "进度编码"
msgid "Tail Handover" msgid "Tail Handover"
msgstr "按尾程交货" msgstr "按尾程交货"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields.selection,name:ccs_connect_tiktok.selection__pda_scan_record__operation__tail_pickup
#, python-format
msgid "Tail Pickup"
msgstr ""
#. module: ccs_connect_tiktok #. module: ccs_connect_tiktok
#. odoo-python #. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0 #: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
...@@ -685,7 +717,7 @@ msgstr "" ...@@ -685,7 +717,7 @@ msgstr ""
#. module: ccs_connect_tiktok #. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_res_config_settings__delivery_time #: model:ir.model.fields,field_description:ccs_connect_tiktok.field_res_config_settings__delivery_time
msgid "交货操作晚于提货操作X分钟" msgid "交货间隔时间"
msgstr "" msgstr ""
#. module: ccs_connect_tiktok #. module: ccs_connect_tiktok
...@@ -901,6 +933,11 @@ msgstr "" ...@@ -901,6 +933,11 @@ msgstr ""
msgid "状态" msgid "状态"
msgstr "" msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_res_config_settings__tally_interval_time
msgid "理货间隔时间"
msgstr ""
#. module: ccs_connect_tiktok #. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__source #: 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 #: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
......
...@@ -1169,22 +1169,28 @@ class CcBl(models.Model): ...@@ -1169,22 +1169,28 @@ class CcBl(models.Model):
'domain': [('bl_id', '=', self.id), ('is_sync', '=', False)], 'domain': [('bl_id', '=', self.id), ('is_sync', '=', False)],
} }
def search_bl_info(self, pda_lang=False, type='tally'): def search_bl_info(self, pda_lang=False, type='tally', is_all=True):
""" """
查询提单信息 查询提单信息
""" """
vals = { vals = {
'bl_id': self.id, # 提单id
'bl_no': self.bl_no or '', # 提单号 'bl_no': self.bl_no or '', # 提单号
'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, 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(), # 托盘信息
} }
if is_all:
vals.update({
'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, 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 return vals
def get_unique_pallet_info(self): def get_unique_pallet_info(self):
...@@ -1243,7 +1249,8 @@ class CcBl(models.Model): ...@@ -1243,7 +1249,8 @@ class CcBl(models.Model):
user_obj = self.env['res.users'].search([('login', '=', pda_db_user)], limit=1) user_obj = self.env['res.users'].search([('login', '=', pda_db_user)], limit=1)
ship_package_ids = [ship_package_dict for sublist in [d['id'] for d in ship_packages] for ship_package_ids = [ship_package_dict for sublist in [d['id'] for d in ship_packages] for
ship_package_dict in sublist] ship_package_dict in sublist]
tally_state = 'checked_goods' if action_type == 'tally' else 'handover_completed' tally_state = 'checked_goods' if action_type == 'tally' else (
'picked_up' if action_type == 'pickup' else 'handover_completed')
# 后续节点 # 后续节点
node_obj = self.env['cc.node'].sudo().search([ node_obj = self.env['cc.node'].sudo().search([
('node_type', '=', 'package'), ('node_type', '=', 'package'),
...@@ -1417,11 +1424,16 @@ class CcBigPackage(models.Model): ...@@ -1417,11 +1424,16 @@ class CcBigPackage(models.Model):
def search_big_package_info(self, pda_lang=False, type='tally'): def search_big_package_info(self, pda_lang=False, type='tally'):
""" """
查询大包信息 查询大包信息
type 为 pickup 时,返回提货信息
""" """
unprocessed_goods_msg_dic = { unprocessed_goods_msg_dic = {
'en': 'Unprocessed goods', 'en': 'Unprocessed goods',
'zh': '未理货' 'zh': '未理货'
} }
picked_up_msg_dic = {
'en': 'Picked Up',
'zh': '已提货'
}
checked_goods_msg_dic = { checked_goods_msg_dic = {
'en': 'Checked goods', 'en': 'Checked goods',
'zh': '已理货' 'zh': '已理货'
...@@ -1431,21 +1443,24 @@ class CcBigPackage(models.Model): ...@@ -1431,21 +1443,24 @@ class CcBigPackage(models.Model):
'zh': '尾程交接' 'zh': '尾程交接'
} }
state_arr = {'unprocessed_goods': unprocessed_goods_msg_dic[pda_lang], state_arr = {'unprocessed_goods': unprocessed_goods_msg_dic[pda_lang],
'picked_up': picked_up_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]} # 未理货/已理货/尾程交接 'handover_completed': handover_completed_msg_dic[pda_lang]} # 未理货/已提货/已理货/尾程交接
# 根据下一阶段服务商名称获取尾程服务商的记录 # 根据下一阶段服务商名称获取尾程服务商的记录
provider_obj = self.env['cc.last.mile.provider'].match_provider(self.next_provider_name) provider_obj = self.env['cc.last.mile.provider'].match_provider(self.next_provider_name)
vals = { vals = {
'tally_state_label': state_arr[self.tally_state] or '', # 理货状态显示名称 'tally_state_label': state_arr[self.tally_state] or '', # 理货状态显示名称
'tally_state': self.tally_state or '', # 理货状态系统KEY 'tally_state': self.tally_state or '', # 理货状态系统KEY
'tally_user_id': (self.tally_user_id.id or 0) if type == 'tally' else (self.delivery_user_id.id or 0), 'tally_user_id': (self.tally_user_id.id or 0) if type == 'tally' else (
# 理货人id/交货人id (self.delivery_user_id.id or 0) if type == 'handover' else (self.pickup_user_id.id or 0)),
'tally_user_name': (self.tally_user_id.name or '') if type == 'tally' else ( # 理货人id/交货人id/提货人id
self.delivery_user_id.name or ''), 'tally_user_name': (self.tally_user_id.name or '') if type == 'tally' else ((
# 理货人名称/交货人名称 self.delivery_user_id.name or '') if type == 'handover' else (
'tally_time': (self.tally_time or '') if type == 'tally' else (self.delivery_time or ''), self.pickup_user_id.name or '')),
# self.env['common.common'].sudo().get_format_time(str(self.tally_time)) if self.tally_time else '', # 理货人名称/交货人名称/提货人名称
# 理货时间/交货时间 'tally_time': (self.tally_time or '') if type == 'tally' else (
(self.delivery_time or '') if type == 'handover' else (self.pickup_time or '')),
# 理货时间/交货时间/提货时间
'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_name': self.next_provider_name or '', # 下一个服务商名称
'next_service_provider_tape_color': (provider_obj.tape_color_value or '') if provider_obj else '', 'next_service_provider_tape_color': (provider_obj.tape_color_value or '') if provider_obj else '',
...@@ -1457,17 +1472,20 @@ class CcBigPackage(models.Model): ...@@ -1457,17 +1472,20 @@ class CcBigPackage(models.Model):
def update_big_package_info(self, **kwargs): def update_big_package_info(self, **kwargs):
""" """
理货 tally/尾程交接 handover 理货 tally/尾程交接 handover/提货 pickup
""" """
action_type = kwargs.get('action_type') action_type = kwargs.get('action_type')
for item in self: for item in self:
if action_type == 'tally' and item.tally_state == 'unprocessed_goods': if action_type == 'tally' and item.tally_state in ('unprocessed_goods', 'picked_up'):
# 更新理货信息 # 更新理货信息
self._update_info(item, kwargs, 'tally') self._update_info(item, kwargs, 'tally')
elif action_type == 'handover' and item.tally_state != 'handover_completed': elif action_type == 'handover' and item.tally_state != 'handover_completed':
# 更新交接信息 # 更新交接信息
self._update_info(item, kwargs, 'handover') self._update_info(item, kwargs, 'handover')
elif action_type == 'pickup' and item.tally_state == 'unprocessed_goods':
# 更新提货信息
self._update_info(item, kwargs, 'pickup')
def _update_info(self, item, kwargs, action_type): def _update_info(self, item, kwargs, action_type):
""" """
...@@ -1480,6 +1498,13 @@ class CcBigPackage(models.Model): ...@@ -1480,6 +1498,13 @@ class CcBigPackage(models.Model):
item.tally_user_id = kwargs['tally_user_id'] item.tally_user_id = kwargs['tally_user_id']
if kwargs.get('tally_time'): if kwargs.get('tally_time'):
item.tally_time = datetime.strptime(kwargs['tally_time'], '%Y-%m-%d %H:%M:%S') item.tally_time = datetime.strptime(kwargs['tally_time'], '%Y-%m-%d %H:%M:%S')
elif action_type == 'pickup':
if kwargs.get('tally_state'):
item.tally_state = kwargs['tally_state']
if kwargs.get('tally_user_id'):
item.pickup_user_id = kwargs['tally_user_id']
if kwargs.get('tally_time'):
item.pickup_time = datetime.strptime(kwargs['tally_time'], '%Y-%m-%d %H:%M:%S')
elif action_type == 'handover': elif action_type == 'handover':
if kwargs.get('tally_state'): if kwargs.get('tally_state'):
item.tally_state = kwargs['tally_state'] item.tally_state = kwargs['tally_state']
......
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from odoo import models, fields, api, _ from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class PDAScanRecord(models.Model): class PDAScanRecord(models.Model):
...@@ -16,28 +15,32 @@ class PDAScanRecord(models.Model): ...@@ -16,28 +15,32 @@ class PDAScanRecord(models.Model):
if self.operation: if self.operation:
if 'tally' in self.operation: if 'tally' in self.operation:
self.record_type = 'tally' self.record_type = 'tally'
elif 'pickup' in self.operation:
self.record_type = 'pickup'
elif 'handover' in self.operation: elif 'handover' in self.operation:
self.record_type = 'handover' self.record_type = 'handover'
operator_id = fields.Many2one('res.users', string='操作人', required=True) operator_id = fields.Many2one('res.users', string='操作人', required=True)
operation_time = fields.Datetime(string='操作时间', required=True, default=fields.Datetime.now) operation_time = fields.Datetime(string='操作时间', required=True, default=fields.Datetime.now)
operation = fields.Selection([ operation = fields.Selection([
('bill_tally', _('Bill Tally')), # 按提单理货 ('bill_tally', _('Bill Tally')), # 按提单理货
('tail_tally', _('Tail Tally')), # 按尾程理货 ('tail_tally', _('Tail Tally')), # 按尾程理货
('pallet_tally', _('Pallet Tally')), # 按托盘理货 ('pallet_tally', _('Pallet Tally')), # 按托盘理货
('bill_handover', _('Bill Handover')), # 按提单交货 ('bill_pickup', _('Bill Pickup')), # 按提单提货
('tail_handover', _('Tail Handover')), # 按尾程交货 ('bill_handover', _('Bill Handover')), # 按提单交货
('tail_handover', _('Tail Handover')), # 按尾程交货
('pallet_handover', _('Pallet Handover')) # 按托盘交货 ('pallet_handover', _('Pallet Handover')) # 按托盘交货
], string=_('Operation'), required=True) # 操作 ], string=_('Operation'), required=True) # 操作
record_type = fields.Selection([ record_type = fields.Selection([
('tally', _('Tally')), # 理货 ('tally', _('Tally')), # 理货
('handover', _('Handover')) # 交货 ('pickup', _('Pickup')), # 提货
('handover', _('Handover')) # 交货
], string=_('Type'), required=True) # 类型 ], string=_('Type'), required=True) # 类型
bill_number = fields.Char(string=_('Bill Number')) # 提单号 bill_number = fields.Char(string=_('Bill Number')) # 提单号
transfer_number = fields.Char(string=_('Transfer Number')) # 转运单号 transfer_number = fields.Char(string=_('Transfer Number')) # 转运单号
# 增加提单关联字段 # 增加提单关联字段
bl_id = fields.Many2one('cc.bl', string=_('Bill of Lading'), ondelete='cascade') # 提单对象 bl_id = fields.Many2one('cc.bl', string=_('Bill of Lading'), ondelete='cascade') # 提单对象
#增加状态 成功 失败 # 增加状态 成功 失败
state = fields.Selection([ state = fields.Selection([
('success', _('Success')), ('success', _('Success')),
('failed', _('Failed')) ('failed', _('Failed'))
...@@ -45,7 +48,8 @@ class PDAScanRecord(models.Model): ...@@ -45,7 +48,8 @@ class PDAScanRecord(models.Model):
failure_reason = fields.Char(string=_('Failure Reason')) # 失败原因 failure_reason = fields.Char(string=_('Failure Reason')) # 失败原因
@api.model @api.model
def create_scan_record(self, operation, record_type, bill_number, transfer_number, state, operator_id=False, bl_id=False, failure_reason=False, operation_time=False): def create_scan_record(self, operation, record_type, bill_number, transfer_number, state, operator_id=False,
bl_id=False, failure_reason=False, operation_time=False):
""" """
创建扫码记录的方法,供接口调用 创建扫码记录的方法,供接口调用
Create scan record method for API calls Create scan record method for API calls
...@@ -53,13 +57,13 @@ class PDAScanRecord(models.Model): ...@@ -53,13 +57,13 @@ class PDAScanRecord(models.Model):
try: try:
if not operator_id: if not operator_id:
operator_id = self.env['res.users'].search([('login', '=', 'pda')], limit=1).id operator_id = self.env['res.users'].search([('login', '=', 'pda')], limit=1).id
# 如果没有传入bl_id,根据bill_number查找提单对象 # 如果没有传入bl_id,根据bill_number查找提单对象
if not bl_id and bill_number: if not bl_id and bill_number:
bl_obj = self.env['cc.bl'].sudo().deal_bl_no_and_transfer_bl_no(bill_number) bl_obj = self.env['cc.bl'].sudo().deal_bl_no_and_transfer_bl_no(bill_number)
if bl_obj: if bl_obj:
bl_id = bl_obj.id bl_id = bl_obj.id
# 准备创建记录的数据 # 准备创建记录的数据
record_data = { record_data = {
'operator_id': operator_id, 'operator_id': operator_id,
...@@ -71,11 +75,11 @@ class PDAScanRecord(models.Model): ...@@ -71,11 +75,11 @@ class PDAScanRecord(models.Model):
'state': state, 'state': state,
'failure_reason': failure_reason 'failure_reason': failure_reason
} }
# 如果传入了自定义操作时间,使用它 # 如果传入了自定义操作时间,使用它
if operation_time: if operation_time:
record_data['operation_time'] = operation_time record_data['operation_time'] = operation_time
record = self.create(record_data) record = self.create(record_data)
return { return {
'success': True, 'success': True,
...@@ -86,4 +90,4 @@ class PDAScanRecord(models.Model): ...@@ -86,4 +90,4 @@ class PDAScanRecord(models.Model):
return { return {
'success': False, 'success': False,
'message': _('Creation failed: %s') % str(e) # 创建失败 'message': _('Creation failed: %s') % str(e) # 创建失败
} }
\ No newline at end of file
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
# Part of SmartGo. See LICENSE file for full copyright and licensing details. # Part of SmartGo. See LICENSE file for full copyright and licensing details.
import logging import logging
from odoo import api, fields, models, _ from odoo import api, fields, models
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
...@@ -15,14 +15,19 @@ class ResConfigSettings(models.TransientModel): ...@@ -15,14 +15,19 @@ class ResConfigSettings(models.TransientModel):
tt_app_secret = fields.Char('AppSecret', default='') tt_app_secret = fields.Char('AppSecret', default='')
tt_version = fields.Char('接口版本', default='3.0') tt_version = fields.Char('接口版本', default='3.0')
tt_customer_id = fields.Many2one('res.partner', string='客户') tt_customer_id = fields.Many2one('res.partner', string='客户')
#交货操作晚于提货操作X分钟【默认80分钟】 # 交货操作晚于提货操作X分钟【默认80分钟】
delivery_time = fields.Integer('交货操作晚于提货操作X分钟', default=80,config_parameter='delivery_time') delivery_time = fields.Integer('交货间隔时间', default=80, config_parameter='delivery_time')
# 提货操作晚于理货操作X分钟【默认80分钟】
tally_interval_time = fields.Integer('理货间隔时间', default=80, config_parameter='tally_interval_time')
# 巡查配置 # 巡查配置
patrol_receiver_emails = fields.Char('接收邮件地址', help='多个邮箱地址,用逗号分隔', config_parameter='patrol_receiver_emails') patrol_receiver_emails = fields.Char('接收邮件地址', help='多个邮箱地址,用逗号分隔',
config_parameter='patrol_receiver_emails')
patrol_sender_email = fields.Char('发送邮箱地址', config_parameter='patrol_sender_email') patrol_sender_email = fields.Char('发送邮箱地址', config_parameter='patrol_sender_email')
patrol_check_days = fields.Integer('巡查天数', default=5, help='检查近几天的提单', config_parameter='patrol_check_days') patrol_check_days = fields.Integer('巡查天数', default=5, help='检查近几天的提单',
patrol_start_hour = fields.Integer('巡查开始时间(小时)', default=8, help='北京时间,24小时制', config_parameter='patrol_start_hour') config_parameter='patrol_check_days')
patrol_start_hour = fields.Integer('巡查开始时间(小时)', default=8, help='北京时间,24小时制',
config_parameter='patrol_start_hour')
@api.model @api.model
def get_values(self): def get_values(self):
...@@ -38,6 +43,7 @@ class ResConfigSettings(models.TransientModel): ...@@ -38,6 +43,7 @@ class ResConfigSettings(models.TransientModel):
tt_version = config.get_param('tt_version', default='') tt_version = config.get_param('tt_version', default='')
tt_customer_id = config.get_param('tt_customer_id', default=False) tt_customer_id = config.get_param('tt_customer_id', default=False)
delivery_time = config.get_param('delivery_time', default=80) delivery_time = config.get_param('delivery_time', default=80)
tally_interval_time = config.get_param('tally_interval_time', default=80)
patrol_receiver_emails = config.get_param('patrol_receiver_emails', default='') patrol_receiver_emails = config.get_param('patrol_receiver_emails', default='')
patrol_sender_email = config.get_param('patrol_sender_email', default='') patrol_sender_email = config.get_param('patrol_sender_email', default='')
patrol_check_days = config.get_param('patrol_check_days', default=5) patrol_check_days = config.get_param('patrol_check_days', default=5)
...@@ -50,6 +56,7 @@ class ResConfigSettings(models.TransientModel): ...@@ -50,6 +56,7 @@ class ResConfigSettings(models.TransientModel):
tt_version=tt_version, tt_version=tt_version,
tt_customer_id=customer, tt_customer_id=customer,
delivery_time=delivery_time, delivery_time=delivery_time,
tally_interval_time=tally_interval_time,
patrol_receiver_emails=patrol_receiver_emails, patrol_receiver_emails=patrol_receiver_emails,
patrol_sender_email=patrol_sender_email, patrol_sender_email=patrol_sender_email,
patrol_check_days=patrol_check_days, patrol_check_days=patrol_check_days,
...@@ -66,7 +73,8 @@ class ResConfigSettings(models.TransientModel): ...@@ -66,7 +73,8 @@ class ResConfigSettings(models.TransientModel):
ir_config.set_param("tt_version", self.tt_version or "") ir_config.set_param("tt_version", self.tt_version or "")
ir_config.set_param("tt_customer_id", self.tt_customer_id.id or False) ir_config.set_param("tt_customer_id", self.tt_customer_id.id or False)
ir_config.set_param("delivery_time", self.delivery_time or 80) ir_config.set_param("delivery_time", self.delivery_time or 80)
ir_config.set_param("tally_interval_time", self.tally_interval_time or 80)
ir_config.set_param("patrol_receiver_emails", self.patrol_receiver_emails or "") ir_config.set_param("patrol_receiver_emails", self.patrol_receiver_emails or "")
ir_config.set_param("patrol_sender_email", self.patrol_sender_email or "") ir_config.set_param("patrol_sender_email", self.patrol_sender_email or "")
ir_config.set_param("patrol_check_days", self.patrol_check_days or 5) ir_config.set_param("patrol_check_days", self.patrol_check_days or 5)
ir_config.set_param("patrol_start_hour", self.patrol_start_hour or 8) ir_config.set_param("patrol_start_hour", self.patrol_start_hour or 8)
\ No newline at end of file
...@@ -25,6 +25,10 @@ ...@@ -25,6 +25,10 @@
<label for="tt_customer_id"/> <label for="tt_customer_id"/>
<field name="tt_customer_id"/> <field name="tt_customer_id"/>
</div> </div>
<div class="text-muted">
<label for="tally_interval_time"/>
<field name="tally_interval_time"/>
</div>
<div class="text-muted"> <div class="text-muted">
<label for="delivery_time"/> <label for="delivery_time"/>
<field name="delivery_time"/> <field name="delivery_time"/>
......
List View Sticky Header V16
============================
This module will helps to stick the list view header.
Credits
=======
Cybrosys Techno Solutions
Author
------
* Cybrosys Techno Solutions <odoo@cybrosys.com>
Muhammad Shahil @ Cybro
V15: Midilaj V K @ Cybro
V16: Viswanth @ Cybro
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
{
'name': 'Sticky Header in List and Form view',
'version': '16.0.1.0.1',
'summary': 'Helps to Stick The Header of List View',
'description': 'Helps to Stick The Header of List View',
'category': 'Tools',
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'website': "https://www.cybrosys.com",
'license': 'LGPL-3',
'images': ['static/description/banner.png'],
'depends': ['base'],
'assets': {
'web.assets_backend': [
"list_view_sticky_header/static/src/scss/sticky_header.scss"
],
},
'installable': True,
'auto_install': False,
'application': False,
}
## Module <list_view_sticky_header>
#### 14.09.2022
#### Version 16.0.1.0.0
#### ADD Initial Commit for list_view_sticky_header
.o_list_view .o_list_table thead {
position: sticky;
top: 0;
z-index:999;
}
.o_account_reports_page .table-responsive{
overflow-x: auto;
overflow-y: visible;
}
.table-responsive{
overflow: visible;
}
.o_list_view .table-responsive .table thead{
z-index: 1;
}
element.style {
}
.o_list_renderer .o_list_table thead {
position: sticky;
top: 0;
z-index:999;
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论