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

1、同步的时候如果某个小包同步失败了,这个小包就不能继续往下修改状态和同步了

2、提单自动提取关务节点时,若生成本节点时,对比前序节点的时间,若与前序节点倒挂,则不推送。若前序节点推送多条,则取操作时间最晚的那条
上级 59a7ac9c
...@@ -375,6 +375,7 @@ class CcBl(models.Model): ...@@ -375,6 +375,7 @@ class CcBl(models.Model):
:param user_obj: :param user_obj:
:return: :return:
""" """
logging.info(f"package_state_obj: {package_state_obj}")
# 根据小包的状态找到对应的提单关务状态 # 根据小包的状态找到对应的提单关务状态
state_obj = self.env['cc.node'].search([('package_state', '=', package_state_obj.id)], limit=1) state_obj = self.env['cc.node'].search([('package_state', '=', package_state_obj.id)], limit=1)
for bl in self: for bl in self:
...@@ -390,25 +391,109 @@ class CcBl(models.Model): ...@@ -390,25 +391,109 @@ class CcBl(models.Model):
is_ok = True is_ok = True
for before_node in before_node_obj: for before_node in before_node_obj:
if not bl.bl_sync_log_ids.filtered(lambda r: r.process_code == before_node.tk_code): if not bl.bl_sync_log_ids.filtered(lambda r: r.process_code == before_node.tk_code):
# 修改关务提单状态
bl.customs_clearance_status = before_node.id
# 操作时间根据设置的前序节点间距时间取值
before_minutes = before_node.calculate_total_interval(state_obj) before_minutes = before_node.calculate_total_interval(state_obj)
bl.process_time = datetime.strptime(str(operate_time), '%Y-%m-%d %H:%M:%S') - timedelta( candidate_time = datetime.strptime(str(operate_time),
'%Y-%m-%d %H:%M:%S') - timedelta(
minutes=before_minutes) minutes=before_minutes)
prev_nodes = before_node.get_before_node(node_type='bl')
if prev_nodes:
prev_codes = prev_nodes.mapped('tk_code')
prev_logs = bl.bl_sync_log_ids.filtered(
lambda r: r.process_code in prev_codes and r.operate_time)
if prev_logs:
latest_prev_time = max(prev_logs.mapped('operate_time'))
logging.info(f"latest_prev_time: {latest_prev_time}")
if candidate_time < latest_prev_time:
remark = (
f"自动补写提单前序关务节点被跳过,节点:{before_node.desc or before_node.name},"
f"候选时间:{candidate_time.strftime('%Y-%m-%d %H:%M:%S')},"
f"前序节点最新时间:{latest_prev_time.strftime('%Y-%m-%d %H:%M:%S')}。"
f"存在时间倒挂风险,请核查。"
)
bl.message_post(body=remark)
continue
next_nodes = self.env['cc.node'].sudo().search([
('node_type', '=', 'bl'),
('is_must', '=', True),
('seq', '>', before_node.seq),
])
if next_nodes:
next_codes = next_nodes.mapped('tk_code')
next_logs = bl.bl_sync_log_ids.filtered(
lambda r: r.process_code in next_codes and r.operate_time)
if next_logs:
earliest_next_time = min(next_logs.mapped('operate_time'))
logging.info(
f"earliest_next_time: {earliest_next_time}, candidate_time: {candidate_time}")
if candidate_time > earliest_next_time:
remark = (
f"自动补写提单前序关务节点被拦截,节点:{before_node.desc or before_node.name},"
f"候选时间:{candidate_time.strftime('%Y-%m-%d %H:%M:%S')},"
f"后续节点最早时间:{earliest_next_time.strftime('%Y-%m-%d %H:%M:%S')}。"
f"存在时间倒挂风险,请核查。"
)
bl.message_post(body=remark)
is_ok = False
break
if not is_ok:
break
bl.customs_clearance_status = before_node.id
bl.process_time = candidate_time
bl.is_bl_sync = before_node.node_is_sync() bl.is_bl_sync = before_node.node_is_sync()
self._cr.commit() self._cr.commit()
# 调用同步关务提单状态
is_ok = bl.callback_track_bl(user_obj) is_ok = bl.callback_track_bl(user_obj)
if not is_ok: if not is_ok:
break break
if is_ok: if is_ok:
bl.customs_clearance_status = state_obj.id candidate_time = operate_time
bl.process_time = operate_time prev_nodes = state_obj.get_before_node(node_type='bl')
bl.is_bl_sync = state_obj.node_is_sync() allow_push = True
self._cr.commit() block_reason = ""
# 调用同步提单状态 if prev_nodes:
bl.callback_track_bl(user_obj) prev_codes = prev_nodes.mapped('tk_code')
prev_logs = bl.bl_sync_log_ids.filtered(
lambda r: r.process_code in prev_codes and r.operate_time)
if prev_logs:
latest_prev_time = max(prev_logs.mapped('operate_time'))
if candidate_time < latest_prev_time:
allow_push = False
block_reason = (
f"候选时间早于前序节点最新时间(候选时间:"
f"{candidate_time.strftime('%Y-%m-%d %H:%M:%S')},前序最新时间:"
f"{latest_prev_time.strftime('%Y-%m-%d %H:%M:%S')})"
)
if allow_push:
next_nodes = self.env['cc.node'].sudo().search([
('node_type', '=', 'bl'),
('is_must', '=', True),
('seq', '>', state_obj.seq),
])
if next_nodes:
next_codes = next_nodes.mapped('tk_code')
next_logs = bl.bl_sync_log_ids.filtered(
lambda r: r.process_code in next_codes and r.operate_time)
if next_logs:
earliest_next_time = min(next_logs.mapped('operate_time'))
if candidate_time > earliest_next_time:
allow_push = False
block_reason = (
f"候选时间晚于后续节点最早时间(候选时间:"
f"{candidate_time.strftime('%Y-%m-%d %H:%M:%S')},后续最早时间:"
f"{earliest_next_time.strftime('%Y-%m-%d %H:%M:%S')})"
)
logging.info(f"allow_push: {allow_push}")
if allow_push:
bl.customs_clearance_status = state_obj.id
bl.process_time = candidate_time
bl.is_bl_sync = state_obj.node_is_sync()
self._cr.commit()
bl.callback_track_bl(user_obj)
elif block_reason:
remark = (
f"自动补写提单关务节点被拦截,节点:{state_obj.desc or state_obj.name},"
f"{block_reason}。存在时间倒挂风险,请核查。"
)
bl.message_post(body=remark)
# 如果提单有小包变成了清关开始,提单状态变为清关中;如果提单所有小包的清关节点变成"是完成节点",则该提单状态变成已完成 # 如果提单有小包变成了清关开始,提单状态变为清关中;如果提单所有小包的清关节点变成"是完成节点",则该提单状态变成已完成
bl.change_state_by_ship_package() bl.change_state_by_ship_package()
...@@ -1217,6 +1302,7 @@ class CcBl(models.Model): ...@@ -1217,6 +1302,7 @@ class CcBl(models.Model):
if self.ship_package_ids: if self.ship_package_ids:
# 检查所有小包状态是否一致 # 检查所有小包状态是否一致
states = set(self.ship_package_ids.mapped('state.id')) states = set(self.ship_package_ids.mapped('state.id'))
logging.info(f"states: {states}")
if len(states) == 1: if len(states) == 1:
self.change_customs_state_by_ship_package(self.ship_package_ids[0].state, user_obj=user_obj) self.change_customs_state_by_ship_package(self.ship_package_ids[0].state, user_obj=user_obj)
else: else:
...@@ -1292,12 +1378,15 @@ class CcBl(models.Model): ...@@ -1292,12 +1378,15 @@ class CcBl(models.Model):
# 合并前序节点和当前节点,去重 # 合并前序节点和当前节点,去重
before_node_obj = before_node_obj | node_obj[0] before_node_obj = before_node_obj | node_obj[0]
# 理货或尾程交接之前没有生成的节点 # 理货或尾程交接之前没有生成的节点
for before_node in before_node_obj: for idx, before_node in enumerate(before_node_obj):
before_minutes = before_node.calculate_total_interval(node_obj[0]) before_minutes = before_node.calculate_total_interval(node_obj[0])
# 准备批量更新数据 # 准备批量更新数据
update_data = [] update_data = []
for package in all_ship_package_obj: for package in all_ship_package_obj:
package_id = package.id package_id = package.id
# 后续节点只处理上一节点同步成功(is_sync=True)的小包
if idx > 0 and not package.is_sync:
continue
if package_id not in sync_log_dict or before_node.tk_code not in sync_log_dict.get( if package_id not in sync_log_dict or before_node.tk_code not in sync_log_dict.get(
package_id, set()): package_id, set()):
tally_time = ship_packages_dict.get(package_id) tally_time = ship_packages_dict.get(package_id)
...@@ -1348,6 +1437,9 @@ class CcBl(models.Model): ...@@ -1348,6 +1437,9 @@ class CcBl(models.Model):
for index, node in enumerate(node_obj): for index, node in enumerate(node_obj):
update_data = [] update_data = []
for package in all_ship_package_obj: for package in all_ship_package_obj:
# 只有上一节点同步成功的小包才生成后续节点
if not package.is_sync:
continue
if package.state.name in state_node_dict: if package.state.name in state_node_dict:
current_state_node = state_node_dict[package.state.name] current_state_node = state_node_dict[package.state.name]
if current_state_node.seq < node.seq: if current_state_node.seq < node.seq:
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论