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

尾程匹配节点时间和前序节点推送的优化

上级 9441f0b7
...@@ -5,15 +5,15 @@ import base64 ...@@ -5,15 +5,15 @@ import base64
import json import json
import logging import logging
import re import re
import tempfile
from datetime import datetime, timedelta from datetime import datetime, timedelta
from io import BytesIO from io import BytesIO
import pdfplumber import pdfplumber
import xlrd import xlrd
from aip.ocr import AipOcr
from odoo import models from odoo import models
from odoo.exceptions import ValidationError from odoo.exceptions import ValidationError
import tempfile
from aip.ocr import AipOcr
from pdf2image import convert_from_path from pdf2image import convert_from_path
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
...@@ -265,7 +265,8 @@ class OrderStateChangeRule(models.Model): ...@@ -265,7 +265,8 @@ class OrderStateChangeRule(models.Model):
ids = [i[0] for i in result] ids = [i[0] for i in result]
bl_objs = self.env['cc.bl'].sudo().search([('id', 'in', ids)]) if result else False bl_objs = self.env['cc.bl'].sudo().search([('id', 'in', ids)]) if result else False
if bl_objs and attachment_tuple_arr: if bl_objs and attachment_tuple_arr:
file_objs = self.env['cc.clearance.file'].sudo().search([('file_name', '=', '尾程交接POD(待大包数量和箱号)'), file_objs = self.env['cc.clearance.file'].sudo().search(
[('file_name', '=', '尾程交接POD(待大包数量和箱号)'),
('bl_id', 'in', bl_objs.ids)]) ('bl_id', 'in', bl_objs.ids)])
file_objs.unlink() file_objs.unlink()
for attachment_tuple in attachment_tuple_arr: for attachment_tuple in attachment_tuple_arr:
...@@ -362,7 +363,7 @@ class OrderStateChangeRule(models.Model): ...@@ -362,7 +363,7 @@ class OrderStateChangeRule(models.Model):
# poppler_path = r"E:\poppler-23.08.0\Library\bin" # poppler_path = r"E:\poppler-23.08.0\Library\bin"
# images = convert_from_path(pdf_path, poppler_path=poppler_path) # images = convert_from_path(pdf_path, poppler_path=poppler_path)
# 非本地代码 # 非本地代码
images = convert_from_path(pdf_path)#如果文件损坏的会报错,需要处理 images = convert_from_path(pdf_path) # 如果文件损坏的会报错,需要处理
# 保存每一页为图片文件 # 保存每一页为图片文件
for i, image in enumerate(images): for i, image in enumerate(images):
if i == 0: if i == 0:
......
...@@ -883,6 +883,7 @@ class BatchGetPodInfoWizard(models.TransientModel): ...@@ -883,6 +883,7 @@ class BatchGetPodInfoWizard(models.TransientModel):
if redis_conn and redis_conn != 'no' and pod_node_id: if redis_conn and redis_conn != 'no' and pod_node_id:
redis_conn.lpush('mail_push_package_list', json.dumps( redis_conn.lpush('mail_push_package_list', json.dumps(
{'ids': bl_objs.ids, 'ship_packages': str(ship_packages), 'action_type': 'push_match_node', {'ids': bl_objs.ids, 'ship_packages': str(ship_packages), 'action_type': 'push_match_node',
'user_login': self.env.user.login,
'pod_node_id': pod_node_id})) 'pod_node_id': pod_node_id}))
def _extract_time_from_pdf(self, file_data, bl_no, ocr_texts=None): def _extract_time_from_pdf(self, file_data, bl_no, ocr_texts=None):
......
...@@ -1271,17 +1271,27 @@ class CcBl(models.Model): ...@@ -1271,17 +1271,27 @@ class CcBl(models.Model):
if package.get('tally_time'): if package.get('tally_time'):
for single_id in package['id']: for single_id in package['id']:
ship_packages_dict[single_id] = package['tally_time'] ship_packages_dict[single_id] = package['tally_time']
if action_type != 'push_match_node':
if action_type == 'push_match_node' and pod_node_id:
#尾程匹配的节点包括前序节点
node_obj = self.env['cc.node'].sudo().search([('id', '=', pod_node_id)])
else:
tally_state = 'checked_goods' if action_type == 'tally' else ( tally_state = 'checked_goods' if action_type == 'tally' else (
'picked_up' if action_type == 'pickup' else 'handover_completed') 'picked_up' if action_type == 'pickup' else 'handover_completed')
# 后续节点 # 检查理货或尾程交接的节点,根据排序进行升序
node_obj = self.env['cc.node'].sudo().search([ node_obj = self.env['cc.node'].sudo().search([
('node_type', '=', 'package'), ('node_type', '=', 'package'),
('tally_state', '=', tally_state) # 检查理货或尾程交接的节点,根据排序进行升序 ('tally_state', '=', tally_state)
], order='seq asc') ], order='seq asc')
if node_obj: if not node_obj:
return True
# 前序节点 理货或尾程交接之前没有生成的节点 # 前序节点 理货或尾程交接之前没有生成的节点
before_node_obj = node_obj[0].get_before_node() before_node_obj = node_obj[0].get_before_node()
if pod_node_id:
# 合并前序节点和当前节点,去重
before_node_obj = before_node_obj | node_obj[0]
logging.info('before_node_obj: %s', before_node_obj)
# 理货或尾程交接之前没有生成的节点 # 理货或尾程交接之前没有生成的节点
for before_node in before_node_obj: for before_node in before_node_obj:
before_minutes = before_node.calculate_total_interval(node_obj[0]) before_minutes = before_node.calculate_total_interval(node_obj[0])
...@@ -1293,10 +1303,9 @@ class CcBl(models.Model): ...@@ -1293,10 +1303,9 @@ class CcBl(models.Model):
package_id, set()): package_id, set()):
tally_time = ship_packages_dict.get(package_id) tally_time = ship_packages_dict.get(package_id)
if tally_time: if tally_time:
operation_time = ( tally_time=datetime.strptime(tally_time, '%Y-%m-%d %H:%M:%S')
datetime.strptime(tally_time, '%Y-%m-%d %H:%M:%S') - timedelta( operation_time =tally_time if pod_node_id and pod_node_id==before_node.id else ((
minutes=before_minutes)) if tally_time else fields.Datetime.now() - timedelta( tally_time - timedelta(minutes=before_minutes)) if tally_time else fields.Datetime.now() - timedelta(minutes=before_minutes))
minutes=before_minutes)
update_data.append(( update_data.append((
package_id, package_id,
before_node.id, before_node.id,
...@@ -1327,15 +1336,9 @@ class CcBl(models.Model): ...@@ -1327,15 +1336,9 @@ class CcBl(models.Model):
item.try_callback_track(max_retries=2, ship_package_ids=ship_package_ids, item.try_callback_track(max_retries=2, ship_package_ids=ship_package_ids,
user_obj=user_obj) user_obj=user_obj)
# 理货或尾程交接的节点 # 理货或尾程交接的节点
#pda需要生成后续节点
if action_type != 'push_match_node':
# 预先获取所有状态节点 # 预先获取所有状态节点
if action_type == 'push_match_node' and pod_node_id:
#尾程匹配的节点包括前序节点
match_node_obj = self.env['cc.node'].sudo().search([('id', '=', pod_node_id)])
if match_node_obj:
node_obj = self.env['cc.node'].sudo().search([('node_type', '=', 'package'),('seq', '<=', match_node_obj.seq),('is_must', '=', True)], order='seq asc')
logging.info('node_obj: %s', node_obj)
if not node_obj:
return False
all_state_nodes = self.env['cc.node'].sudo().search([ all_state_nodes = self.env['cc.node'].sudo().search([
('node_type', '=', 'package') ('node_type', '=', 'package')
]) ])
...@@ -1349,9 +1352,7 @@ class CcBl(models.Model): ...@@ -1349,9 +1352,7 @@ class CcBl(models.Model):
if current_state_node.seq < node.seq: if current_state_node.seq < node.seq:
tally_time = ship_packages_dict.get(package.id) tally_time = ship_packages_dict.get(package.id)
if tally_time: if tally_time:
operation_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(
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) minutes=next_minutes * index)
update_data.append(( update_data.append((
package.id, package.id,
......
...@@ -8,12 +8,12 @@ import redis ...@@ -8,12 +8,12 @@ import redis
import config import config
# 默认字符gbk # 默认字符gbk
# logging.basicConfig(filename='./push_data_logger.log', level=logging.INFO) logging.basicConfig(filename='./push_data_logger.log', level=logging.INFO)
# 设置文件字符为utf-8 # 设置文件字符为utf-8
logging.basicConfig(handlers=[logging.FileHandler('logs/mail_push.log', 'a', 'utf-8')], # logging.basicConfig(handlers=[logging.FileHandler('logs/mail_push.log', 'a', 'utf-8')],
format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) # format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO)
class Order_dispose(object): class Order_dispose(object):
...@@ -45,7 +45,7 @@ class Order_dispose(object): ...@@ -45,7 +45,7 @@ class Order_dispose(object):
utc_time = data.get('utc_time') utc_time = data.get('utc_time')
user_login = data.get('user_login') user_login = data.get('user_login')
pod_node_id = data.get('pod_node_id') pod_node_id = data.get('pod_node_id')
bl_record.mail_auto_push(utc_time, ship_packages, action_type, user_login, config.pda_db_user, bl_record.mail_auto_push(utc_time, ship_packages, action_type, user_login, user_login or config.pda_db_user,
pod_node_id=pod_node_id) pod_node_id=pod_node_id)
except Exception as ex: except Exception as ex:
logging.error('mail_auto_push error:%s' % str(ex)) logging.error('mail_auto_push error:%s' % str(ex))
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论