提交 47c73879 authored 作者: 贺阳's avatar 贺阳

优化小包状态回写提单状态

上级 f19ed46d
......@@ -603,7 +603,7 @@ class CcBL(models.Model):
raise ValidationError(_('The customs clearance status of the selected bill of loading must be the same.'))
# 最近操作时间取最晚的一条提单状态操作时间。
last_process_time = \
self.filtered(lambda x: x.customs_clearance_status.id).mapped('process_time').sorted(reverse=True)[0]
sorted(self.filtered(lambda x: x.customs_clearance_status.id).mapped('process_time'), reverse=True)[0]
return {
'name': _('Update the status of the bill of loading'),
'type': 'ir.actions.act_window',
......
# 导入odoo
import base64
# 导入日志
import logging
import xlrd
from odoo import models, fields, api, _
from odoo.exceptions import UserError
from odoo import models, fields
# 获取日志
_logger = logging.getLogger(__name__)
......@@ -50,6 +48,12 @@ class CcNode(models.Model):
], default='', string='Corresponding to the status of the big package', index=True) # 对应大包状态 未理货/已理货/尾程交接
# 新增字段:对应小包状态。只有类型为提单上才可填写。可选已配置节点类型为小包的节点。单选;
package_state = fields.Many2one('cc.node', string='Corresponding to the status of the package',domain="[('node_type','=','package')]", index=True) # 对应小包状态
package_state = fields.Many2one('cc.node', string='Corresponding to the status of the package',
domain="[('node_type','=','package')]", index=True) # 对应小包状态
def node_is_sync(self):
# 如果更新节点是 默认节点 同步的标志变为True
is_sync = False
if self.is_default:
is_sync = True
return is_sync
......@@ -13,7 +13,7 @@
<field optional="show" name="desc" string="Node Description"/>
<field optional="show" name="next_code_ids" widget="many2many_tags" options="{'no_create':True}"/>
<field optional="show" name="tally_state"/>
<field optional="show" name="package_state"/>
<field optional="show" name="package_state" attrs="{'invisible': [('node_type', '=', 'package')]}" />
<field optional="show" name="is_must" string="Is Must Node"/>
<field optional="show" name="is_done" string="Is Done Node"/>
<field optional="show" name="is_default" string="Is Current Node"/>
......
......@@ -102,9 +102,7 @@ class BatchInputShipPackageStatusWizard(models.TransientModel):
if reason_obj and not self.node_exception_reason_id:
raise ValidationError(_('Please select the reason for the exception!')) # 请选择异常原因
# 如果更新节点是 默认节点 同步的标志变为True
is_sync = False
if self.update_status.is_default:
is_sync = True
is_sync = self.update_status.node_is_sync()
# 更新状态
parcels.write(
{'state': self.update_status.id, 'node_exception_reason_id': self.node_exception_reason_id.id,
......
# -*- coding: utf-8 -*-
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import models, api, fields
from odoo import models, fields
from odoo.exceptions import ValidationError
......@@ -29,6 +29,8 @@ class UpdateBlStatusWizard(models.TransientModel):
bl_count = fields.Integer('Bill Of Loading Count', default=get_bl_count)
current_status = fields.Many2one('cc.node', 'Current Status')
next_code_ids = fields.Many2many('cc.node', 'bl_node_next_node_wizard_rel', 'node_id', 'next_node_id', 'Next Node',
related='current_status.next_code_ids')
update_status = fields.Many2one('cc.node', 'Update Node')
is_ok = fields.Boolean('Confirm Date is ok.', default=False)
process_time = fields.Datetime('Process Time')
......@@ -39,7 +41,7 @@ class UpdateBlStatusWizard(models.TransientModel):
# 批量更新小包状态
def submit(self):
bl_obj=self.get_order()
bl_obj = self.get_order()
# 确认数据
if not self.is_ok:
raise ValidationError('Please confirm that the above data is correct.') # 请确认以上数据正确
......@@ -50,10 +52,9 @@ class UpdateBlStatusWizard(models.TransientModel):
# 3.若选择的“更新节点”为“选择节点”的前序节点(根据节点设置排序),则查找“选择节点”是否已有同步日志,若有,则操作时间不允许早于前序节点同步日志里的操作时间,且不能大于当前时间。若有多条,以同步时间最晚的一条为准。
# 4.若选择的“更新节点”和“选择节点”一致时,需检查该节点的前序节点是否有同步日志,若有,则操作时间不允许早于前序节点同步日志里的操作时间,且不能大于当前时间。同一节点若有多条同步日志,以同步时间最晚的一条为准。
# 如果更新节点是 默认节点 同步的标志变为True
is_sync = False
if self.update_status.is_default:
is_sync = True
is_sync = self.update_status.node_is_sync()
# 更新状态
bl_obj.write(
{'customs_clearance_status': self.update_status.id, 'process_time': self.process_time, 'state_explain': self.state_explain,
{'customs_clearance_status': self.update_status.id, 'process_time': self.process_time,
'state_explain': self.state_explain,
'is_bl_sync': is_sync})
......@@ -16,10 +16,12 @@
<field name="bl_id" invisible="1"/>
<field name="current_status" readonly="1"/>
<field name="last_process_time"/>
<field name="update_status" required="1" domain="[('node_type','=','bl')]"/>
<field name="update_status" required="1"
domain="[('id','in',next_code_ids)]"/>
<field name="process_time" required="1" string="Customs Clearance Status Process Time"/>
<field name="state_explain" invisible="1"/>
<field name="is_batch" invisible="1"/>
<field name="next_code_ids" invisible="1" widget="many2many_tags"/>
</group>
<group>
<field name="is_ok"/>
......
......@@ -282,12 +282,12 @@ class CcBl(models.Model):
state_obj = self.env['cc.node'].search([('package_state', '=', package_state_obj.id)], limit=1)
for bl in self:
# 判断当前提单的关务提单状态是需要更新的前序节点,则进行修改和生成同步日志
if self.customs_clearance_status.is_before_node(state_obj):
if bl.customs_clearance_status.is_before_node(state_obj):
# 判断提单下所有小包的同步日志是否都有已提货的同步日志
is_all = self.check_multiple_bl_pickup_status_best(package_state_obj)
is_all = bl.check_multiple_bl_pickup_status_best(package_state_obj)
if is_all:
# 操作时间取小包对应操作时间最晚的一条
operate_time = sorted(self.ship_package_ids.mapped('process_time'), reverse=True)[0]
operate_time = sorted(bl.ship_package_ids.mapped('process_time'), reverse=True)[0]
# 检查该状态之前的所有节点是否都有同步日志,如果没有,则生成同步日志
before_node_obj = state_obj.get_before_node(node_type='bl')
is_ok = True
......@@ -299,6 +299,8 @@ class CcBl(models.Model):
before_minutes = before_node.calculate_total_interval(state_obj)
bl.process_time = datetime.strptime(str(operate_time), '%Y-%m-%d %H:%M:%S') - timedelta(
minutes=before_minutes)
bl.is_bl_sync = before_node.node_is_sync()
self._cr.commit()
# 调用同步关务提单状态
is_ok = bl.callback_track_bl()
if not is_ok:
......@@ -306,8 +308,12 @@ class CcBl(models.Model):
if is_ok:
bl.customs_clearance_status = state_obj.id
bl.process_time = operate_time
bl.is_bl_sync = state_obj.node_is_sync()
self._cr.commit()
# 调用同步提单状态
bl.callback_track_bl()
# 如果提单有小包变成了清关开始,提单状态变为清关中;如果提单所有小包的清关节点变成"是完成节点",则该提单状态变成已完成
bl.change_state_by_ship_package()
def check_multiple_bl_pickup_status_best(self, package_state_obj):
"""
......@@ -431,8 +437,11 @@ class CcBl(models.Model):
ship_packages = self.env['cc.ship.package'].search([('bl_id', '=', item.id), ('is_sync', '=', False)])
is_ok = item.package_callback_func(ship_packages.ids)
# 根据小包状态更新提单关务状态
if is_ok and self.ship_package_ids:
self.change_customs_state_by_ship_package(self.ship_package_ids[0].state)
try:
if is_ok and item.ship_package_ids:
item.change_customs_state_by_ship_package(item.ship_package_ids[0].state)
except Exception as e:
logging.info('change_customs_state_by_ship_package error:%s' % e)
return is_ok
def package_callback_func(self, ship_package_ids):
......@@ -495,7 +504,7 @@ class CcBl(models.Model):
# self.batch_create_package_sync_logs_by_sql(log_values)
# 如果提单有小包变成了清关开始,提单状态变为清关中;如果提单所有小包的清关节点变成"是完成节点",则该提单状态变成已完成
self.change_state_by_ship_package()
# self.change_state_by_ship_package()
return is_ok
def batch_create_package_sync_logs_by_sql(self, log_values):
......
......@@ -162,6 +162,6 @@ class BatchInputShipPackageStatusWizard(models.TransientModel):
self.current_status.tk_code or '', self.current_status.name or '', self.update_status.tk_code or '',
self.update_status.name or ''))
# 如果提单有小包变成了清关开始,提单状态变为清关中;如果提单所有小包的清关节点变成“是完成节点”,则该提单状态变成已完成
bl_obj.change_state_by_ship_package()
bl_obj.change_customs_state_by_ship_package(self.update_status)#根据小包状态更新提单关务状态
# bl_obj.change_state_by_ship_package()
return obj
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论