提交 f16fec9f authored 作者: 贺阳's avatar 贺阳

1、大包上新增字段:提货时间,提货人【放在理货时间,理货人上方】;

2、大包理货状态新增:已提货(放在未理货后面); 3、提单详情右上角新增已提货大包的按钮,显示数量,跳转显示有提货时间,提货人的大包信息; 4、PDA扫码记录,类型新增:提货; 5、PDA交货时,提示:该提单未到交货时间,有风险产生倒叙,请间隔规定时间后再扫码;此处判断需加上查找提货记录;
上级 78ac9772
......@@ -900,6 +900,35 @@ msgstr "清关重量"
msgid "Checked goods"
msgstr "已理货"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__pickup_user_id
#: model:ir.model.fields,field_description:ccs_base.field_cc_history_big_package__pickup_user_id
msgid "Pickup User"
msgstr "提货人"
#. module: ccs_base
#: model:ir.model.fields,field_description:ccs_base.field_cc_big_package__pickup_time
#: model:ir.model.fields,field_description:ccs_base.field_cc_history_big_package__pickup_time
msgid "Pickup Time"
msgstr "提货时间"
#. module: ccs_base
#: model:ir.model.fields.selection,name:ccs_base.selection__cc_big_package__tally_state__picked_up
#: model:ir.model.fields.selection,name:ccs_base.selection__cc_history_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
#: 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.actions.act_window,name:ccs_base.action_show_big_package_picked_up
msgid "Picked Up Big Package"
msgstr "已提货大包"
#. module: ccs_base
#. odoo-python
#: code:addons/ccs_base/wizard/add_exception_info_wizard.py:0
......
......@@ -55,11 +55,16 @@ class CcBigPackage(models.Model):
# 增加is_cancel字段, 用于标识大包是否取消, 来自提单的is_cancel字段
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([
('unprocessed_goods', 'Unprocessed goods'),
('picked_up', 'Picked Up'),
('checked_goods', 'Checked goods'),
('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_time = fields.Datetime('Tally Time') # 理货时间
delivery_user_id = fields.Many2one('res.users', string='Delivery User', index=True) # 尾程交货人
......@@ -583,6 +588,16 @@ class CcBL(models.Model):
raise ValidationError(
_('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')
def cal_tally_big_package_qty(self):
"""
......@@ -631,6 +646,9 @@ class CcBL(models.Model):
# 大包数量
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',
store=True)
......@@ -865,6 +883,16 @@ class CcBL(models.Model):
'domain': [('bl_id', '=', self.id), ('is_cancel', '=', False), ('tally_state', '=', 'checked_goods')],
}
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_delivered(self):
# 返回一个action,显示已交货的大包
return {
......
......@@ -15,6 +15,8 @@
<field name="next_provider_name"/>
<field name="pallet_number"/>
<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_user_id" optional="show"/>
<field name="tally_time" optional="show"/>
......@@ -70,6 +72,8 @@
<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="pickup_user_id" readonly="1" options="{'no_create':True}"/>
<field name="pickup_time" readonly="1"/>
<field name="tally_state" readonly="1"/>
<field name="tally_user_id" readonly="1" options="{'no_create':True}"/>
<field name="tally_time" readonly="1"/>
......@@ -136,6 +140,8 @@
<separator/>
<filter string="Unprocessed goods" name="filter_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"
domain="[('tally_state', '=', 'checked_goods')]"/>
<filter string="Handover Completed" name="filter_handover_completed"
......
......@@ -93,6 +93,13 @@
<span class="o_stat_text">Tally Big Packages</span>
</div>
</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"
class="oe_stat_button" icon="fa-cube">
<div class="o_stat_info">
......
......@@ -95,18 +95,19 @@ class OrderController(http.Controller):
"""
kwargs = json.loads(request.httprequest.data)
pda_lang = kwargs.get('pda_lang') or 'zh'
action_type = kwargs.get('action_type') or 'tally' # tally / handover
action_type = kwargs.get('action_type') or 'tally' # tally / handover/pickup
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)]) # 提单
state_arr = ['draft', 'ccing']
bl_obj = request.env['cc.bl'].sudo().deal_bl_no_and_transfer_bl_no(
bl_no) # 提单号去掉杠和空格,并转换为小写,优先匹配提单号,匹配不到则匹配转单号
if bl_obj:
# 1.按提单交货时,创建批次,填写的提单号传给后台查找对应的提单号,在匹配查找前,先查找是否pda扫码记录,若有类型该提单,类型为理货的,且操作时间-当前时间小于等于配置的参数(交货操作晚于提货操作X分钟),则提示:该提单未到交货时间,有风险产生倒叙,请间隔规定时间后再扫码;
# 1.按提单交货时,创建批次,填写的提单号传给后台查找对应的提单号,在匹配查找前,先查找是否pda扫码记录,
# 若有类型该提单,类型为理货的,且操作时间-当前时间小于等于配置的参数(交货操作晚于提货操作X分钟),则提示:该提单未到交货时间,有风险产生倒叙,请间隔规定时间后再扫码;
#2025-09-23 新增PDA交货时,提示:该提单未到交货时间,有风险产生倒叙,请间隔规定时间后再扫码;此处判断需加上查找提货记录;
if action_type == 'handover':
# 检查是否存在时间倒序风险
time_check_result = self._check_delivery_time_risk(bl_obj, pda_lang)
......@@ -709,7 +710,7 @@ class OrderController(http.Controller):
# 查找该提单的PDA扫码记录,类型为理货的
pda_records = request.env['pda.scan.record'].sudo().search([
('bl_id', '=', bl_obj.id),
('record_type', '=', 'tally'), # 理货类型
('record_type', 'in', ['tally', 'pickup']), # 理货类型/提货类型
('state', '=', 'success') # 成功状态
], order='operation_time desc', limit=1)
......
......@@ -1417,11 +1417,16 @@ class CcBigPackage(models.Model):
def search_big_package_info(self, pda_lang=False, type='tally'):
"""
查询大包信息
type 为 pickup 时,返回提货信息
"""
unprocessed_goods_msg_dic = {
'en': 'Unprocessed goods',
'zh': '未理货'
}
picked_up_msg_dic = {
'en': 'Picked Up',
'zh': '已提货'
}
checked_goods_msg_dic = {
'en': 'Checked goods',
'zh': '已理货'
......@@ -1431,21 +1436,21 @@ class CcBigPackage(models.Model):
'zh': '尾程交接'
}
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],
'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)
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) 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 '',
# 理货时间/交货时间
'tally_user_id': (self.tally_user_id.id or 0) if type == 'tally' else ((self.delivery_user_id.id or 0) if type == 'handover' else (self.pickup_user_id.id or 0)),
# 理货人id/交货人id/提货人id
'tally_user_name': (self.tally_user_id.name or '') if type == 'tally' else ((
self.delivery_user_id.name or '') if type == 'handover' else (self.pickup_user_id.name or '')),
# 理货人名称/交货人名称/提货人名称
'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 '', # 大包号
'next_service_provider_name': self.next_provider_name or '', # 下一个服务商名称
'next_service_provider_tape_color': (provider_obj.tape_color_value or '') if provider_obj else '',
......@@ -1457,7 +1462,7 @@ class CcBigPackage(models.Model):
def update_big_package_info(self, **kwargs):
"""
理货 tally/尾程交接 handover
理货 tally/尾程交接 handover/提货 pickup
"""
action_type = kwargs.get('action_type')
......@@ -1468,6 +1473,9 @@ class CcBigPackage(models.Model):
elif action_type == 'handover' and item.tally_state != 'handover_completed':
# 更新交接信息
self._update_info(item, kwargs, 'handover')
elif action_type == 'pickup' and item.tally_state == 'picked_up':
# 更新提货信息
self._update_info(item, kwargs, 'pickup')
def _update_info(self, item, kwargs, action_type):
"""
......@@ -1480,6 +1488,13 @@ class CcBigPackage(models.Model):
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 == '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':
if kwargs.get('tally_state'):
item.tally_state = kwargs['tally_state']
......
......@@ -16,6 +16,8 @@ class PDAScanRecord(models.Model):
if self.operation:
if 'tally' in self.operation:
self.record_type = 'tally'
elif 'pickup' in self.operation:
self.record_type = 'pickup'
elif 'handover' in self.operation:
self.record_type = 'handover'
......@@ -25,12 +27,16 @@ class PDAScanRecord(models.Model):
('bill_tally', _('Bill Tally')), # 按提单理货
('tail_tally', _('Tail Tally')), # 按尾程理货
('pallet_tally', _('Pallet Tally')), # 按托盘理货
('bill_pickup', _('Bill Pickup')), # 按提单提货
('tail_pickup', _('Tail Pickup')), # 按尾程提货
('pallet_pickup', _('Pallet Pickup')), # 按托盘提货
('bill_handover', _('Bill Handover')), # 按提单交货
('tail_handover', _('Tail Handover')), # 按尾程交货
('pallet_handover', _('Pallet Handover')) # 按托盘交货
], string=_('Operation'), required=True) # 操作
record_type = fields.Selection([
('tally', _('Tally')), # 理货
('pickup', _('Pickup')), # 提货
('handover', _('Handover')) # 交货
], string=_('Type'), required=True) # 类型
bill_number = fields.Char(string=_('Bill Number')) # 提单号
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论