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

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

2、如果有需要修改的节点时,检查前面所有的节点有没有同步过,没有同步的需要同步,前置的时间根据节点的前置节点间隔时间计算,后续的增加系统参数
上级 d2c0172c
...@@ -21,5 +21,11 @@ ...@@ -21,5 +21,11 @@
<field name="value">847896395@qq.com</field> <field name="value">847896395@qq.com</field>
</record> </record>
<record id="next_minutes" model="ir.config_parameter">
<field name="key">next_minutes</field>
<field name="value">20</field>
</record>
</data> </data>
</odoo> </odoo>
\ No newline at end of file
...@@ -1080,59 +1080,6 @@ class CcBL(models.Model): ...@@ -1080,59 +1080,6 @@ class CcBL(models.Model):
logging.warning(f"Attempt {i + 1}/{max_retries} failed. Retrying...") logging.warning(f"Attempt {i + 1}/{max_retries} failed. Retrying...")
return False 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, 用于管理业务数据.业务数据包括提单号、清关节点(业务对象)、进度日期、进度描述、更新人 # 增加一个清关进度的业务对象,继承自models.Model, 用于管理业务数据.业务数据包括提单号、清关节点(业务对象)、进度日期、进度描述、更新人
class CcProgress(models.Model): class CcProgress(models.Model):
......
...@@ -242,6 +242,7 @@ class OrderController(http.Controller): ...@@ -242,6 +242,7 @@ class OrderController(http.Controller):
email_language=lang) email_language=lang)
ship_wizard_obj.confirm() # 发送邮件 ship_wizard_obj.confirm() # 发送邮件
res['state'] = 200 res['state'] = 200
logging.info('update_big_package_tally_detail ship_packages:%s' % len(ship_packages))
# 有小包 就更新小包状态和同步 # 有小包 就更新小包状态和同步
if ship_packages: if ship_packages:
redis_conn = request.env['common.common'].sudo().get_redis() redis_conn = request.env['common.common'].sudo().get_redis()
......
...@@ -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: 2024-10-16 08:24+0000\n" "POT-Creation-Date: 2025-02-18 02:36+0000\n"
"PO-Revision-Date: 2024-10-16 16:25+0800\n" "PO-Revision-Date: 2025-02-18 10:37+0800\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
"Language: zh\n" "Language: zh\n"
...@@ -112,6 +112,11 @@ msgstr "" ...@@ -112,6 +112,11 @@ msgstr ""
msgid "Created on" msgid "Created on"
msgstr "" 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 #. 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__display_name
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__display_name #: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__display_name
...@@ -196,6 +201,11 @@ msgstr "操作时间" ...@@ -196,6 +201,11 @@ msgstr "操作时间"
msgid "Operate User" msgid "Operate User"
msgstr "操作人" 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 #. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.tree_cc_ship_package_view #: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.tree_cc_ship_package_view
msgid "Progress" msgid "Progress"
...@@ -252,6 +262,7 @@ msgstr "" ...@@ -252,6 +262,7 @@ msgstr ""
#: model:ir.actions.act_window,name:ccs_connect_tiktok.action_ao_tt_api_log #: 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: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.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 #: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.tree_ao_tt_api_log_view
msgid "TIKTOK推送日志" msgid "TIKTOK推送日志"
msgstr "" msgstr ""
...@@ -338,8 +349,14 @@ msgstr "" ...@@ -338,8 +349,14 @@ msgstr ""
msgid "tt推送日志" msgid "tt推送日志"
msgstr "" 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 #. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__big_bag_no #: 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 "业务信息" msgid "业务信息"
msgstr "" msgstr ""
...@@ -348,11 +365,26 @@ msgstr "" ...@@ -348,11 +365,26 @@ msgstr ""
msgid "产生时间" msgid "产生时间"
msgstr "" 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 #. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__data_text #: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__data_text
msgid "传输数据" msgid "传输数据"
msgstr "" 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 #. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__error_msg #: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__error_msg
msgid "失败原因" msgid "失败原因"
...@@ -363,6 +395,11 @@ msgstr "" ...@@ -363,6 +395,11 @@ msgstr ""
msgid "客户" msgid "客户"
msgstr "" 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 #. module: ccs_connect_tiktok
#: model:ir.actions.server,name:ccs_connect_tiktok.action_batch_update_package_status #: model:ir.actions.server,name:ccs_connect_tiktok.action_batch_update_package_status
msgid "批量手动处理小包异常数据" msgid "批量手动处理小包异常数据"
...@@ -388,13 +425,25 @@ msgstr "" ...@@ -388,13 +425,25 @@ msgstr ""
msgid "推出" msgid "推出"
msgstr "" 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 #. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__success_bl #: 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 "是否成功" msgid "是否成功"
msgstr "" 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 #. 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
msgid "类型" msgid "类型"
msgstr "" msgstr ""
...@@ -402,3 +451,13 @@ msgstr "" ...@@ -402,3 +451,13 @@ msgstr ""
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__request_id #: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__request_id
msgid "请求id" msgid "请求id"
msgstr "" 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 ...@@ -7,6 +7,7 @@ import logging
import pytz import pytz
import ssl import ssl
from datetime import datetime from datetime import datetime
from datetime import timedelta, datetime
from lxml import etree from lxml import etree
from odoo import models, fields, api, tools, _ from odoo import models, fields, api, tools, _
from odoo.exceptions import ValidationError, Warning from odoo.exceptions import ValidationError, Warning
...@@ -384,6 +385,87 @@ class CcBl(models.Model): ...@@ -384,6 +385,87 @@ class CcBl(models.Model):
lambda r: r.bl_no.replace('-', '').replace(' ', '').lower() == processed_bl_no) # 提单 lambda r: r.bl_no.replace('-', '').replace(' ', '').lower() == processed_bl_no) # 提单
return bl_obj 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): class CcBigPackage(models.Model):
# 模型名称 # 模型名称
......
import base64
import json
import logging import logging
from datetime import datetime from datetime import datetime
from lxml import etree
import pytz
from odoo import models, fields, api, tools from odoo import models, fields, api, tools
from odoo.exceptions import ValidationError, Warning
# 继承节点对象.增加TK编码 # 继承节点对象.增加TK编码
class CCNode(models.Model): class CCNode(models.Model):
...@@ -14,3 +10,18 @@ class CCNode(models.Model): ...@@ -14,3 +10,18 @@ class CCNode(models.Model):
_inherit = 'cc.node' _inherit = 'cc.node'
tk_code = fields.Char('TK Code', help='TK Code') 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 @@ ...@@ -11,6 +11,11 @@
<field name="desc" position="after"> <field name="desc" position="after">
<field name="tk_code"/> <field name="tk_code"/>
</field> </field>
<field name="next_code_ids" position="after">
<field name="interval_minutes"/>
</field>
</field> </field>
</record> </record>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论