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

pda扫码记录

上级 71f8dcbf
...@@ -5,6 +5,7 @@ import logging ...@@ -5,6 +5,7 @@ import logging
from odoo import http, exceptions from odoo import http, exceptions
# from odoo.addons.queue_job import job # from odoo.addons.queue_job import job
from odoo.http import request from odoo.http import request
from odoo import fields
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
...@@ -136,7 +137,7 @@ class OrderController(http.Controller): ...@@ -136,7 +137,7 @@ class OrderController(http.Controller):
@http.route('/api/update/big/package/tally/detail', type='json', auth='public', methods=['GET', 'POST'], csrf=False) @http.route('/api/update/big/package/tally/detail', type='json', auth='public', methods=['GET', 'POST'], csrf=False)
def update_big_package_tally_detail(self): def update_big_package_tally_detail(self):
""" """
修改理货信息 按提单修改理货信息
:return: :return:
""" """
kwargs = json.loads(request.httprequest.data) kwargs = json.loads(request.httprequest.data)
...@@ -154,6 +155,17 @@ class OrderController(http.Controller): ...@@ -154,6 +155,17 @@ class OrderController(http.Controller):
bl_obj = request.env['cc.bl'].sudo().deal_bl_no_and_transfer_bl_no( bl_obj = request.env['cc.bl'].sudo().deal_bl_no_and_transfer_bl_no(
bl_no) # 提单号去掉杠和空格,并转换为小写,优先匹配提单号,匹配不到则匹配转单号 bl_no) # 提单号去掉杠和空格,并转换为小写,优先匹配提单号,匹配不到则匹配转单号
if bl_obj and bl_obj.state in state_arr: if bl_obj and bl_obj.state in state_arr:
# 1.按提单交货时,创建批次,填写的提单号传给后台查找对应的提单号,在匹配查找前,先查找是否pda扫码记录,若有类型该提单,类型为理货的,且操作时间-当前时间小于等于配置的参数(交货操作晚于提货操作X分钟),则提示:该提单未到交货时间,有风险产生倒叙,请间隔规定时间后再扫码;
if action_type == 'handover':
# 检查是否存在时间倒序风险
time_check_result = self._check_delivery_time_risk(bl_obj, pda_lang)
if time_check_result['has_risk']:
res['state'] = 400
res['message'] = time_check_result['message']
return res
# 继续原有的处理逻辑...
ship_packages = [] ship_packages = []
big_package_exception_arr = {} big_package_exception_arr = {}
ship_package_exception_arr = {} ship_package_exception_arr = {}
...@@ -278,7 +290,8 @@ class OrderController(http.Controller): ...@@ -278,7 +290,8 @@ class OrderController(http.Controller):
record_type=action_type, record_type=action_type,
bill_number=bl_obj.bl_no, bill_number=bl_obj.bl_no,
transfer_number=bl_obj.transfer_bl_no, transfer_number=bl_obj.transfer_bl_no,
state='success') state='success',
bl_id=bl_obj.id)
logging.info( logging.info(
'update_big_package_tally_detail ship_packages:%s' % len(ship_packages)) 'update_big_package_tally_detail ship_packages:%s' % len(ship_packages))
# 有小包 就更新小包状态和同步 # 有小包 就更新小包状态和同步
...@@ -313,7 +326,8 @@ class OrderController(http.Controller): ...@@ -313,7 +326,8 @@ class OrderController(http.Controller):
record_type=action_type, record_type=action_type,
bill_number=bl_obj.bl_no, bill_number=bl_obj.bl_no,
transfer_number=bl_obj.transfer_bl_no, transfer_number=bl_obj.transfer_bl_no,
state='failed') state='failed',
bl_id=bl_obj.id)
else: else:
request.env['pda.scan.record'].sudo().create_scan_record(operation, action_type, '', '', 'failed') request.env['pda.scan.record'].sudo().create_scan_record(operation, action_type, '', '', 'failed')
logging.info('res:%s' % res) logging.info('res:%s' % res)
...@@ -394,6 +408,20 @@ class OrderController(http.Controller): ...@@ -394,6 +408,20 @@ class OrderController(http.Controller):
error_no_set.add(package_no) error_no_set.add(package_no)
return error_no_set return error_no_set
# 按尾程交货时,检查时间风险
if action_type == 'handover' and ship_packages:
# 获取所有相关的提单对象
bl_ids = list(set([ship_package.get('bl_id') for ship_package in ship_packages]))
bl_objs = request.env['cc.bl'].sudo().search([('id', 'in', bl_ids)])
# 对每个提单进行时间风险检查
for bl_obj in bl_objs:
time_check_result = self._check_delivery_time_risk(bl_obj, pda_lang)
if time_check_result['has_risk']:
res['state'] = 400
res['message'] = time_check_result['message']
return res
# 处理小包、大包 # 处理小包、大包
if kwargs.get('ship_package_arr'): if kwargs.get('ship_package_arr'):
error_no_arr = process_packages( error_no_arr = process_packages(
...@@ -451,7 +479,8 @@ class OrderController(http.Controller): ...@@ -451,7 +479,8 @@ class OrderController(http.Controller):
record_type=action_type, record_type=action_type,
bill_number=bl.bl_no, bill_number=bl.bl_no,
transfer_number=bl.transfer_bl_no, transfer_number=bl.transfer_bl_no,
state='success') state='success',
bl_id=bl.id)
redis_conn = request.env['common.common'].sudo().get_redis() redis_conn = request.env['common.common'].sudo().get_redis()
if redis_conn and redis_conn != 'no': if redis_conn and redis_conn != 'no':
# redis_conn.lpush('push_ship_package_state', json.dumps( # redis_conn.lpush('push_ship_package_state', json.dumps(
...@@ -486,7 +515,8 @@ class OrderController(http.Controller): ...@@ -486,7 +515,8 @@ class OrderController(http.Controller):
record_type=action_type, record_type=action_type,
bill_number=bl.bl_no, bill_number=bl.bl_no,
transfer_number=bl.transfer_bl_no, transfer_number=bl.transfer_bl_no,
state='failed') state='failed',
bl_id=bl.id)
else: else:
request.env['pda.scan.record'].sudo().create_scan_record(operation, action_type, '', '', 'failed') request.env['pda.scan.record'].sudo().create_scan_record(operation, action_type, '', '', 'failed')
...@@ -598,3 +628,59 @@ class OrderController(http.Controller): ...@@ -598,3 +628,59 @@ class OrderController(http.Controller):
# 按服务商名称升序排序 # 按服务商名称升序排序
provider_info_arr.sort(key=lambda x: x.get('name', '')) provider_info_arr.sort(key=lambda x: x.get('name', ''))
return {'provider_info_arr': provider_info_arr, 'state': 200} return {'provider_info_arr': provider_info_arr, 'state': 200}
def _check_delivery_time_risk(self, bl_obj, pda_lang='zh'):
"""
检查提单交货时间倒序风险
:param bl_obj: 提单对象
:param pda_lang: 语言设置
:return: 检查结果字典
"""
try:
# 获取配置的交货操作晚于提货操作的时间参数(分钟)
config_param = request.env['ir.config_parameter'].sudo().get_param(
'delivery_time', '80' # 使用现有的delivery_time参数,默认80分钟
)
allowed_minutes = int(config_param)
# 查找该提单的PDA扫码记录,类型为理货的
pda_records = request.env['pda.scan.record'].sudo().search([
('bl_id', '=', bl_obj.id),
('operation', '=', 'bill_tally'), # 理货类型
('state', '=', 'success') # 成功状态
], order='create_date desc', limit=1)
if pda_records:
latest_tally_record = pda_records[0]
current_time = fields.Datetime.now()
time_diff = (current_time - latest_tally_record.create_date).total_seconds() / 60
# 如果时间差小于等于配置的参数,则存在风险
if time_diff <= allowed_minutes:
if pda_lang == 'en':
message = f"The bill of lading has not reached the delivery time, and there is a risk of flashback. Please scan the code after {allowed_minutes} minutes."
else:
message = f"该提单未到交货时间,有风险产生倒叙,请间隔{allowed_minutes}分钟后再扫码;"
return {
'has_risk': True,
'message': message,
'time_diff': time_diff,
'allowed_minutes': allowed_minutes
}
return {
'has_risk': False,
'message': '',
'time_diff': 0,
'allowed_minutes': allowed_minutes
}
except Exception as e:
logging.error(f"检查交货时间风险时出错: {str(e)}")
return {
'has_risk': False,
'message': '',
'time_diff': 0,
'allowed_minutes': 0
}
...@@ -32,6 +32,8 @@ class PDAScanRecord(models.Model): ...@@ -32,6 +32,8 @@ class PDAScanRecord(models.Model):
], string=_('Type'), required=True) # 类型 ], string=_('Type'), required=True) # 类型
bill_number = fields.Char(string=_('Bill Number')) # 提单号 bill_number = fields.Char(string=_('Bill Number')) # 提单号
transfer_number = fields.Char(string=_('Transfer Number')) # 转运单号 transfer_number = fields.Char(string=_('Transfer Number')) # 转运单号
# 增加提单关联字段
bl_id = fields.Many2one('cc.bl', string=_('Bill of Lading'), ondelete='cascade') # 提单对象
#增加状态 成功 失败 #增加状态 成功 失败
state = fields.Selection([ state = fields.Selection([
('success', _('Success')), ('success', _('Success')),
...@@ -39,7 +41,7 @@ class PDAScanRecord(models.Model): ...@@ -39,7 +41,7 @@ class PDAScanRecord(models.Model):
], string=_('State'), required=True) ], string=_('State'), required=True)
@api.model @api.model
def create_scan_record(self, operation, record_type, bill_number, transfer_number,state,operator_id=False): def create_scan_record(self, operation, record_type, bill_number, transfer_number, state, operator_id=False, bl_id=False):
""" """
创建扫码记录的方法,供接口调用 创建扫码记录的方法,供接口调用
Create scan record method for API calls Create scan record method for API calls
...@@ -47,12 +49,20 @@ class PDAScanRecord(models.Model): ...@@ -47,12 +49,20 @@ class PDAScanRecord(models.Model):
try: try:
if not operator_id: if not operator_id:
operator_id = self.env['res.users'].search([('login', '=', 'pda')], limit=1).id operator_id = self.env['res.users'].search([('login', '=', 'pda')], limit=1).id
# 如果没有传入bl_id,根据bill_number查找提单对象
if not bl_id and bill_number:
bl_obj = self.env['cc.bl'].sudo().deal_bl_no_and_transfer_bl_no(bill_number)
if bl_obj:
bl_id = bl_obj.id
record = self.create({ record = self.create({
'operator_id': operator_id, 'operator_id': operator_id,
'operation': operation, 'operation': operation,
'record_type': record_type, 'record_type': record_type,
'bill_number': bill_number, 'bill_number': bill_number,
'transfer_number': transfer_number, 'transfer_number': transfer_number,
'bl_id': bl_id,
'state': state 'state': state
}) })
return { return {
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
<field name="record_type"/> <field name="record_type"/>
<field name="bill_number"/> <field name="bill_number"/>
<field name="transfer_number"/> <field name="transfer_number"/>
<field name="bl_id" invisible="1"/>
<field name="state"/> <field name="state"/>
</tree> </tree>
</field> </field>
...@@ -39,6 +40,7 @@ ...@@ -39,6 +40,7 @@
</group> </group>
<group> <group>
<field name="record_type"/> <field name="record_type"/>
<field name="bl_id" invisible="1"/>
<field name="bill_number"/> <field name="bill_number"/>
<field name="transfer_number"/> <field name="transfer_number"/>
</group> </group>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论