提交 322c45ab authored 作者: 贺阳's avatar 贺阳

1、在清关节点设置上新增字段:前序节点间隔时间【默认为20】

2、如果有需要修改的节点时,检查前面所有的节点有没有同步过,没有同步的需要同步,前置的时间根据节点的前置节点间隔时间计算,后续的增加系统参数
上级 d2c0172c
......@@ -21,5 +21,11 @@
<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
......@@ -1080,59 +1080,6 @@ class CcBL(models.Model):
logging.warning(f"Attempt {i + 1}/{max_retries} failed. Retrying...")
return False
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:
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=20 * index)) if tally_time else fields.Datetime.now() + timedelta(
minutes=20 * 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
})
if self.state == 'draft' and self.ship_package_ids.filtered(
lambda line: line.state.tk_code == 'cb_imcustoms_start'):
self.ccing_func()
# 同步状态
# 尝试调用 callback_track
self.try_callback_track(max_retries=2, ship_package_ids=ship_package_ids)
except Exception as err:
logging.error('fetch_mail_dlv--error:%s' % str(err))
# 增加一个清关进度的业务对象,继承自models.Model, 用于管理业务数据.业务数据包括提单号、清关节点(业务对象)、进度日期、进度描述、更新人
class CcProgress(models.Model):
......
......@@ -242,6 +242,7 @@ class OrderController(http.Controller):
email_language=lang)
ship_wizard_obj.confirm() # 发送邮件
res['state'] = 200
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()
......
......@@ -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 ""
......@@ -7,6 +7,7 @@ import logging
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
......@@ -384,6 +385,87 @@ class CcBl(models.Model):
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):
# 模型名称
......
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
......@@ -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>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论