提交 91994fc7 authored 作者: 贺阳's avatar 贺阳

5.自动改变关务提单状态,并生成同步日志,推送TK

检查逻辑: 提单节点上设置了对应小包状态,当提单所有的小包的同步日志都有该节点的同步日志时,则该提单自动改变状态;操作时间取小包对应操作时间最晚的一条; 如:节点上设置的提单节点为提单已提货,对应的小包状态为已提货;当提单a下所有小包,都有已提货的同步日志时,自动改变提单的关务提单状态,为已提货。操作时间取小包已提货同步日志最晚的一条;(实时) 并要求: 1.若提单节点的前序节点未产生同步日志,则需为其前序节点产生同步日志,操作时间根据设置的前序节点间距时间取值; 2.若小包变化需产生的关务提单节点为当前提单节点的前序节点,则不再产生同步日志,也不推送,且不改变提单节点状态; 3.之前检查提单完成的修改为 也要检查关务提单状态
上级 a742ea14
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
<field optional="show" name="desc" string="Node Description"/> <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="next_code_ids" widget="many2many_tags" options="{'no_create':True}"/>
<field optional="show" name="tally_state"/> <field optional="show" name="tally_state"/>
<field optional="show" name="package_state"/>
<field optional="show" name="is_must" string="Is Must Node"/> <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_done" string="Is Done Node"/>
<field optional="show" name="is_default" string="Is Current Node"/> <field optional="show" name="is_default" string="Is Current Node"/>
......
...@@ -287,7 +287,7 @@ class CcBl(models.Model): ...@@ -287,7 +287,7 @@ class CcBl(models.Model):
responses = asyncio.run(perform_requests()) responses = asyncio.run(perform_requests())
for response_item in responses: for response_item in responses:
response_data = response_item[0] response_data = response_item[0]
logging.info('response_data response:%s' % response_data) logging.info('response_data:%s' % response_data)
data = response_item[1] data = response_item[1]
package_id = response_item[2] package_id = response_item[2]
package_order = self.env['cc.ship.package'].sudo().browse(package_id) package_order = self.env['cc.ship.package'].sudo().browse(package_id)
......
...@@ -287,7 +287,7 @@ class CcBl(models.Model): ...@@ -287,7 +287,7 @@ class CcBl(models.Model):
responses = asyncio.run(perform_requests()) responses = asyncio.run(perform_requests())
for response_item in responses: for response_item in responses:
response_data = response_item[0] response_data = response_item[0]
logging.info('response_data response:%s' % response_data) logging.info('response_data:%s' % response_data)
data = response_item[1] data = response_item[1]
package_id = response_item[2] package_id = response_item[2]
package_order = self.env['cc.ship.package'].sudo().browse(package_id) package_order = self.env['cc.ship.package'].sudo().browse(package_id)
......
...@@ -12,6 +12,49 @@ class CCNode(models.Model): ...@@ -12,6 +12,49 @@ class CCNode(models.Model):
interval_minutes = fields.Integer('Predecessor Node Interval (Minutes)', default=20, interval_minutes = fields.Integer('Predecessor Node Interval (Minutes)', default=20,
help='Default interval time between predecessor nodes in minutes.') # 前序节点间隔时间,默认20分钟 help='Default interval time between predecessor nodes in minutes.') # 前序节点间隔时间,默认20分钟
def get_before_node(self, node_type='package'):
"""
获取当前状态的前序节点
"""
# 前序节点 该节点之前没有生成的节点
before_node_obj = self.env['cc.node'].sudo().search([
('node_type', '=', node_type), ('is_must', '=', True), ('seq', '<', self.seq)],
order='seq asc')
return before_node_obj
def is_before_node(self, target_state):
"""
判断当前状态是否在目标状态之前
Args:
target_state: 目标状态代码
Returns:
bool: 如果当前状态在目标状态之前返回True,否则返回False
"""
if not target_state:
return False
# 获取所有状态的顺序映射
states_seq = dict(
self.search([]).sorted('seq').mapped(lambda r: (r.tk_code, r.seq))
)
# 获取当前状态的序号
current_code = self.tk_code
current_seq = states_seq.get(current_code)
# 获取目标状态的序号
target_code = target_state.tk_code if isinstance(target_state, models.Model) else target_state
target_seq = states_seq.get(target_code)
# 如果任一状态不存在,返回False
if current_seq is None or target_seq is None:
return False
# 比较序号判断先后顺序
return current_seq < target_seq
def is_next_code(self, current_state_obj, next_state_id): def is_next_code(self, current_state_obj, next_state_id):
""" """
判断更新的节点是否是 小包状态的下级节点 判断更新的节点是否是 小包状态的下级节点
......
...@@ -51,7 +51,7 @@ class TT(models.Model): ...@@ -51,7 +51,7 @@ class TT(models.Model):
timestamp = int(time.time()) timestamp = int(time.time())
sign = self.generate_sign(timestamp, push_data) sign = self.generate_sign(timestamp, push_data)
response = self.get_response(url, sign, timestamp, push_data) response = self.get_response(url, sign, timestamp, push_data)
logging.info('callback_track response:%s' % response) # logging.info('callback_track response:%s' % response)
return response return response
def package_invoice_query(self, push_data): def package_invoice_query(self, push_data):
...@@ -126,7 +126,7 @@ class TT(models.Model): ...@@ -126,7 +126,7 @@ class TT(models.Model):
'app_key': app_key 'app_key': app_key
} }
request_url = tt_url + url request_url = tt_url + url
logging.info('request_url: %s' % request_url) # logging.info('request_url: %s' % request_url)
# logging.info('request_data: %s' % parameter) # logging.info('request_data: %s' % parameter)
for i in range(3): # 尝试最多3次 for i in range(3): # 尝试最多3次
try: try:
...@@ -150,7 +150,7 @@ class TT(models.Model): ...@@ -150,7 +150,7 @@ class TT(models.Model):
timestamp = int(time.time()) timestamp = int(time.time())
sign = self.generate_sign(timestamp, push_data) sign = self.generate_sign(timestamp, push_data)
response = await self.async_get_response(session, url, sign, timestamp, push_data) response = await self.async_get_response(session, url, sign, timestamp, push_data)
logging.info('callback_track response:%s' % response) # logging.info('callback_track response:%s' % response)
return response, push_data, package_id return response, push_data, package_id
async def async_callback_track(self, session, data, package_id): async def async_callback_track(self, session, data, package_id):
...@@ -164,7 +164,7 @@ class TT(models.Model): ...@@ -164,7 +164,7 @@ class TT(models.Model):
timestamp = int(time.time()) timestamp = int(time.time())
sign = self.generate_sign(timestamp, push_data) sign = self.generate_sign(timestamp, push_data)
response = await self.async_get_response(session, url, sign, timestamp, push_data) response = await self.async_get_response(session, url, sign, timestamp, push_data)
logging.info('bl_callback_track response:%s' % response) # logging.info('bl_callback_track response:%s' % response)
return response, push_data, package_id return response, push_data, package_id
async def async_bl_callback_track(self, session, data, bl_id): async def async_bl_callback_track(self, session, data, bl_id):
......
...@@ -24,14 +24,16 @@ ...@@ -24,14 +24,16 @@
<field name="model">cc.bl</field> <field name="model">cc.bl</field>
<field name="inherit_id" ref="ccs_base.form_cc_bl_view"/> <field name="inherit_id" ref="ccs_base.form_cc_bl_view"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<!-- # header之间增加一个按钮,调用自定义的方法--> <button name="%(ccs_base.action_batch_input_ship_package_wizard)d" position="after">
<header position="inside">
<button name="callback_track" string="Sync Package Status" type="object"/> <button name="callback_track" string="Sync Package Status" type="object"/>
</button>
<button name="%(ccs_base.action_batch_input_bl_status_wizard)d" position="before">
<button name="batch_action_sync" string="Sync CC Attachment" type="object"/> <button name="batch_action_sync" string="Sync CC Attachment" type="object"/>
</button>
<button name="%(ccs_base.action_batch_input_bl_status_wizard)d" position="after">
<!--增加同步提单状态的按钮--> <!--增加同步提单状态的按钮-->
<button name="callback_track_bl" string="Sync Bill Of Loading Status" type="object"/> <button name="callback_track_bl" string="Sync Bill Of Loading Status" type="object"/>
</header> </button>
<button name="action_show_ship_package" position="replace"> <button name="action_show_ship_package" position="replace">
<button name="action_show_ship_package" type="object" <button name="action_show_ship_package" type="object"
......
...@@ -163,4 +163,5 @@ class BatchInputShipPackageStatusWizard(models.TransientModel): ...@@ -163,4 +163,5 @@ class BatchInputShipPackageStatusWizard(models.TransientModel):
self.update_status.name or '')) self.update_status.name or ''))
# 如果提单有小包变成了清关开始,提单状态变为清关中;如果提单所有小包的清关节点变成“是完成节点”,则该提单状态变成已完成 # 如果提单有小包变成了清关开始,提单状态变为清关中;如果提单所有小包的清关节点变成“是完成节点”,则该提单状态变成已完成
bl_obj.change_state_by_ship_package() bl_obj.change_state_by_ship_package()
bl_obj.change_customs_state_by_ship_package(self.update_status)#根据小包状态更新提单关务状态
return obj return obj
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论