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

1、按托盘理货和交货的接口

上级 24b04c21
......@@ -3,7 +3,7 @@ import json
import logging
from datetime import datetime
from odoo import http, exceptions, _
from odoo import http, exceptions
# from odoo.addons.queue_job import job
from odoo.http import request
......@@ -366,7 +366,8 @@ class OrderController(http.Controller):
try:
logging.info('update_pro_big_package_tally_detail kw:%s' % kwargs)
if action_type and (kwargs.get('big_package_arr') or kwargs.get('ship_package_arr')):
tally_user_id=kwargs['big_package_arr'][0].get('tally_user_id') if kwargs.get('big_package_arr') else (
tally_user_id = kwargs['big_package_arr'][0].get('tally_user_id') if kwargs.get(
'big_package_arr') else (
kwargs['ship_package_arr'][0].get('tally_user_id') if kwargs.get('ship_package_arr') else False)
big_package_exception_arr = {}
ship_package_exception_arr = {}
......@@ -583,7 +584,8 @@ class OrderController(http.Controller):
'zh': '系统解析错误,错误原因是%s' % e
}
logging.info('last_mile_tally error:%s' % e)
res['message'] = exceptions_msg_dic[pda_lang] # _('System parsing error, the reason for the error is %s', e) # 系统解析错误,错误原因是
res['message'] = exceptions_msg_dic[
pda_lang] # _('System parsing error, the reason for the error is %s', e) # 系统解析错误,错误原因是
logging.info('last_mile_tally res:%s' % res)
return res
......@@ -647,11 +649,12 @@ class OrderController(http.Controller):
# if is_pallet:
# domain=[('state', '!=', 'done')]# 1. 按托盘理货时,查非已完成状态的提单
# else:
#先都查清关中的,如果以后要查非已完成状态的提单,再修改domain。而且查尾程快递和对应的大包或托盘信息得分两个接口
domain=[('state', '=', 'ccing')]# 1. 按尾程理货时,查所有清关中提单
# 先都查清关中的,如果以后要查非已完成状态的提单,再修改domain。而且查尾程快递和对应的大包或托盘信息得分两个接口
domain = [('state', '=', 'ccing')] # 1. 按尾程理货时,查所有清关中提单
bls = request.env['cc.bl'].sudo().search(domain)
# 2. 查所有大包
big_packages = request.env['cc.big.package'].sudo().search([('bl_id', 'in', bls.ids),('tally_state', '=', tally_state)])
big_packages = request.env['cc.big.package'].sudo().search(
[('bl_id', 'in', bls.ids), ('tally_state', '=', tally_state)])
# 3. 按"下一阶段服务商名称"分组
group_dict = {}
for pkg in big_packages:
......@@ -663,17 +666,24 @@ class OrderController(http.Controller):
if key not in group_dict:
group_dict[key] = provider.search_pro_info() # 查询快递信息
group_dict[key]['count'] = 0
group_dict[key]['big_package_arr'] = []#大包信息
group_dict[key]['ship_package_arr'] = []#小包信息
group_dict[key]['pallet_info_arr'] = []#托盘信息
group_dict[key]['big_package_arr'] = [] # 大包信息
group_dict[key]['ship_package_arr'] = [] # 小包信息
group_dict[key]['pallet_info_arr'] = [] # 托盘信息
group_dict[key]['count'] += 1
group_dict[key]['big_package_arr'].append(pkg.search_big_package_info(pda_lang=pda_lang, type=tally_state))
#按托盘理货时返回未使用的托盘信息,按尾程时返回小包信息
if tally_state == 'unprocessed_goods' or (tally_state == 'checked_goods' and not is_pallet):
group_dict[key]['big_package_arr'].append(
pkg.search_big_package_info(pda_lang=pda_lang, type=tally_state))
# 按托盘理货时返回未使用的托盘信息,按尾程时返回小包信息
if is_pallet:
unused_pallets = request.env['cc.pallet'].sudo().search([('usage_state', '=', 'unused'),('express_company_id', '=', key)])
pallet_info_arr=[pallet.search_pallet_info() for pallet in unused_pallets]
# 如果是未理货,查未使用托盘;如果是已理货,查已使用托盘
if tally_state == 'unprocessed_goods':
domain = [('usage_state', '=', 'unused')]
else:
domain = [('usage_state', '=', 'used')]
unused_pallets = request.env['cc.pallet'].sudo().search([('express_company_id', '=', key)] + domain)
pallet_info_arr = [pallet.search_pallet_info() for pallet in unused_pallets]
group_dict[key]['pallet_info_arr'] = pallet_info_arr
group_dict[key]['pallet_info_arr'].sort(key=lambda x: x.get('name', ''))#根据托盘号升序排序
group_dict[key]['pallet_info_arr'].sort(key=lambda x: x.get('name', '')) # 根据托盘号升序排序
else:
group_dict[key]['ship_package_arr'].extend(
[ship_package_item.search_ship_package_info(pda_lang=pda_lang) for ship_package_item in
......@@ -785,86 +795,11 @@ class OrderController(http.Controller):
'zh': '系统解析错误,错误原因是%s' % e
}
logging.info('pallet_tally error:%s' % e)
res['message'] = exceptions_msg_dic[pda_lang] # _('System parsing error, the reason for the error is %s', e) # 系统解析错误,错误原因是
res['message'] = exceptions_msg_dic[
pda_lang] # _('System parsing error, the reason for the error is %s', e) # 系统解析错误,错误原因是
logging.info('pallet_tally res:%s' % res)
return res
@http.route('/api/pallet/tally/complete', type='json', auth='public', csrf=False)
def pallet_tally_complete(self):
"""
按托盘理货完成接口
处理理货完成后的数据
"""
kwargs = json.loads(request.httprequest.data)
pda_lang = kwargs.get('pda_lang') or 'zh'
res = {'state': 201, 'message': ''}
operation = 'pallet_tally'
tally_user_id = kwargs.get('tally_user_id')
try:
logging.info('pallet_tally_complete kwargs:%s' % kwargs)
pallet_data = kwargs.get('pallet_data', [])
if not pallet_data:
res['message'] = {
'en': 'Pallet data is required',
'zh': '托盘数据必须提供'
}[pda_lang]
return res
for pallet_item in pallet_data:
pallet_id = pallet_item.get('pallet_id')
usage_time = pallet_item.get('usage_time')
big_package_nos = pallet_item.get('big_package_nos', [])
if not pallet_id or not usage_time or not big_package_nos:
continue
# 获取托盘对象
pallet = request.env['cc.pallet'].sudo().browse(pallet_id)
if not pallet.exists():
continue
# 获取大包对象
big_packages = request.env['cc.big.package'].sudo().search([
('big_package_no', 'in', big_package_nos)
])
if big_packages:
# 更新托盘状态为已使用
pallet.update_usage_state(big_packages,usage_time)
# 创建成功的PDA扫码记录
bl_obj = big_packages[0].bl_id if big_packages else None
if bl_obj:
request.env['pda.scan.record'].sudo().create_scan_record(
operation=operation,
record_type='tally',
bill_number=bl_obj.bl_no,
transfer_number=bl_obj.transfer_bl_no,
state='success',
bl_id=bl_obj.id,
operation_time=usage_time,
operator_id=tally_user_id
)
res['state'] = 200
except Exception as e:
error = str(e)
logging.info('pallet_tally_complete error:%s' % error)
exceptions_msg_dic = {
'en': 'System parsing error, the reason for the error is %s' % error,
'zh': '系统解析错误,错误原因是%s' % error
}
res['message'] = exceptions_msg_dic[pda_lang]
# 创建失败的PDA扫码记录
request.env['pda.scan.record'].sudo().create_scan_record(
operation=operation,
record_type='tally',
bill_number='',
transfer_number='',
state='failed',
failure_reason=error,
operator_id=tally_user_id
)
logging.info('pallet_tally_complete res:%s' % res)
return res
@http.route('/api/pallet/handover', type='json', auth='public', csrf=False)
def pallet_handover(self):
"""
......@@ -883,112 +818,29 @@ class OrderController(http.Controller):
'zh': '系统解析错误,错误原因是%s' % e
}
logging.info('pallet_handover error:%s' % e)
res['message'] = exceptions_msg_dic[pda_lang] # _('System parsing error, the reason for the error is %s', e) # 系统解析错误,错误原因是
res['message'] = exceptions_msg_dic[
pda_lang] # _('System parsing error, the reason for the error is %s', e) # 系统解析错误,错误原因是
logging.info('pallet_handover res:%s' % res)
return res
@http.route('/api/pallet/handover/complete', type='json', auth='public', csrf=False)
def pallet_handover_complete(self):
"""
按托盘交货完成接口
处理交货完成后的数据
"""
kwargs = json.loads(request.httprequest.data)
pda_lang = kwargs.get('pda_lang') or 'zh'
res = {'state': 201, 'message': ''}
operation = 'pallet_handover'
tally_user_id = kwargs.get('tally_user_id')
try:
logging.info('pallet_handover_complete kwargs:%s' % kwargs)
pallet_data = kwargs.get('pallet_data', [])
if not pallet_data:
res['message'] = {
'en': 'Pallet data is required',
'zh': '托盘数据必须提供'
}[pda_lang]
return res
for pallet_item in pallet_data:
pallet_id = pallet_item.get('pallet_id')
handover_time = pallet_item.get('handover_time')
plate_number = pallet_item.get('plate_number', '')
if not pallet_id or not handover_time:
continue
# 获取托盘对象
pallet = request.env['cc.pallet'].sudo().browse(pallet_id)
if not pallet.exists():
continue
# 更新托盘交货时间和车牌号
pallet.delivery_plate_number = plate_number
# 更新托盘关联的大包交货信息
for pkg in pallet.package_ids:
pkg.update_big_package_info(
action_type='handover',
tally_state='handover_completed',
tally_user_id=tally_user_id,
tally_time=handover_time
)
# 创建成功的PDA扫码记录
if pallet.package_ids:
bl_obj = pallet.package_ids[0].bl_id
if bl_obj:
request.env['pda.scan.record'].sudo().create_scan_record(
operation=operation,
record_type='handover',
bill_number=bl_obj.bl_no,
transfer_number=bl_obj.transfer_bl_no,
state='success',
bl_id=bl_obj.id,
operation_time=handover_time,
operator_id=tally_user_id
)
res['state'] = 200
except Exception as e:
error = str(e)
logging.info('pallet_handover_complete error:%s' % error)
exceptions_msg_dic = {
'en': 'System parsing error, the reason for the error is %s' % error,
'zh': '系统解析错误,错误原因是%s' % error
}
res['message'] = exceptions_msg_dic[pda_lang]
# 创建失败的PDA扫码记录
request.env['pda.scan.record'].sudo().create_scan_record(
operation=operation,
record_type='handover',
bill_number='',
transfer_number='',
state='failed',
failure_reason=error,
operator_id=tally_user_id
)
logging.info('pallet_handover_complete res:%s' % res)
return res
@http.route('/api/update/pallet/big/package/tally/detail', type='json', auth='public', methods=['GET', 'POST'],
csrf=False)
def update_pallet_big_package_tally_detail(self):
"""
修改尾程快递按托盘号的理货/交货信息
修改尾程快递按托盘号的理货信息
:return:
"""
kwargs = json.loads(request.httprequest.data)
pda_lang = kwargs.get('pda_lang') or 'zh'
res = {'state': 201, 'message': ''}
action_type = kwargs.get('action_type') or 'tally' # tally / handover
operation = 'pallet_tally' if action_type == 'tally' else 'pallet_handover'#按托盘理货/交
action_type = 'tally'
operation = 'pallet_tally' # 按托盘理
tally_user_id = False # 理货人ID
ship_packages = []
try:
logging.info('update_pallet_big_package_tally_detail kw:%s' % kwargs)
if action_type and kwargs.get('pallet_arr'):
#判断托盘数组里面的托盘号在托盘表里面是否存在
if kwargs.get('pallet_arr'):
# 判断托盘数组里面的托盘号在托盘表里面是否存在
pallet_nos = [pallet_item.get('pallet_number') for pallet_item in kwargs.get('pallet_arr')]
pallet_obj = request.env['cc.pallet'].sudo().search([('name', 'in', pallet_nos)])
if not pallet_obj:
......@@ -999,11 +851,12 @@ class OrderController(http.Controller):
return res
# 将托盘状态更新为已使用
all_big_package_arr = []
for pallet_item in kwargs.get('pallet_arr'):
pallet_number = pallet_item.get('pallet_number')
pallet_use_date = pallet_item.get('pallet_use_date')
big_package_arr = pallet_item.get('big_package_arr', [])
pallet_number = pallet_item.get('pallet_number') # 托盘号
pallet_use_date = pallet_item.get('pallet_use_date') # 托盘使用日期
big_package_arr = pallet_item.get('big_package_arr', []) # 大包号数组
all_big_package_arr.extend(big_package_arr)
# 找到对应的托盘对象
pallet = pallet_obj.filtered(lambda p: p.name == pallet_number)
if pallet and big_package_arr:
......@@ -1014,34 +867,18 @@ class OrderController(http.Controller):
if big_package_objs:
# 调用托盘的update_usage_state方法
pallet.update_usage_state(big_package_objs, pallet_use_date)
big_package_arr=[]
error_no_arr=[]
for pallet_item in kwargs.get('pallet_arr'):
#检查托盘内的大包号是否存在
big_package_arr.extend(pallet_item.get('big_package_arr'))
if big_package_arr:
big_package_obj = request.env['cc.big.package'].sudo().search([('big_package_no', 'in', big_package_arr)])
if not big_package_obj:
error_no_arr.extend(big_package_arr)
if error_no_arr:
res['message'] = {
'en': 'Big package number [%s] does not exist' % ','.join(error_no_arr),
'zh': '大包号[%s]不存在' % ','.join(error_no_arr)
}[pda_lang]
return res
tally_user_id=kwargs['big_package_arr'][0].get('tally_user_id') if kwargs.get('big_package_arr') else False
tally_user_id = kwargs['big_package_arr'][0].get('tally_user_id') if kwargs.get(
'big_package_arr') else False
big_package_exception_arr = {}
# 处理包裹信息
def process_packages(package_arr, package_type, ship_packages):
def process_packages(package_arr, ship_packages):
error_no_set = set() # 使用集合来存储错误信息
for package_item in package_arr:
file_str = 'big_package_no' # 大包号
package_no = package_item.get(file_str) # 包裹号
exception_cause_ids = package_item.get(
'exception_cause_ids') # 异常原因id数组
package_no = package_item.get('big_package_no') # 包裹号
exception_cause_ids = package_item.get('exception_cause_ids') # 异常原因id数组
package_obj = request.env[f'cc.big.package'].sudo().search(
[(file_str, '=', package_no)]) # 大包 1个
[('big_package_no', '=', package_no)]) # 大包 1个
if package_obj:
if exception_cause_ids:
for excep_item in exception_cause_ids:
......@@ -1076,9 +913,8 @@ class OrderController(http.Controller):
return error_no_set
# 处理大包
if kwargs.get('big_package_arr'):
error_no_arr = process_packages(
kwargs['big_package_arr'], 'big', ship_packages)
if all_big_package_arr:
error_no_arr = process_packages(all_big_package_arr, ship_packages)
if error_no_arr:
res['message'] = {
'en': 'Big package number [%s] does not exist' % ','.join(error_no_arr),
......@@ -1127,8 +963,8 @@ class OrderController(http.Controller):
else:
null_msg_dic = {
'en': 'The bill of lading number and action type must be provided; at least one of the following is required: big package data or pallet data.',
'zh': '类型必须提供;大包数据或托盘数据至少需要提供一个。'
'en': 'The pallet data must be provided.',
'zh': '托盘数据必须提供。'
}
res['message'] = null_msg_dic[pda_lang]
except Exception as e:
......@@ -1166,3 +1002,112 @@ class OrderController(http.Controller):
logging.info('update_pallet_big_package_tally_detail res:%s' % res)
return res
@http.route('/api/pallet/handover/complete', type='json', auth='public', csrf=False)
def pallet_handover_complete(self):
"""
按托盘交货完成接口
处理交货完成后的数据
"""
kwargs = json.loads(request.httprequest.data)
pda_lang = kwargs.get('pda_lang') or 'zh'
res = {'state': 201, 'message': ''}
operation = 'pallet_handover'
handover_user_id = kwargs.get('handover_user_id')
ship_packages = []
try:
logging.info('pallet_handover_complete kwargs:%s' % kwargs)
pallet_arr = kwargs.get('pallet_arr', [])
if not pallet_arr:
res['message'] = {
'en': 'Pallet data is required',
'zh': '托盘数据必须提供'
}[pda_lang]
return res
# 获取交货人
if not handover_user_id:
handover_user_id = kwargs.get('pallet_arr')[0].get('handover_user_id') # 交货人
# 处理托盘以及大包信息
def process_packages(pallet_data, ship_packages):
error_no_set = set() # 使用集合来存储错误信息
for pallet_item in pallet_data:
pallet_number = pallet_item.get('pallet_number') # 托盘号
pallet_obj = request.env['cc.pallet'].sudo().search([('name', '=', pallet_number)])
if not pallet_obj:
error_no_set.add(pallet_number)
continue
plate_number = pallet_item.get('plate_number', '') # 车牌号
handover_time = pallet_item.get('handover_time') # 交货时间
pallet_obj.update_pallet_info(delivery_plate_number=plate_number) # 更新托盘车牌号
package_obj = pallet_obj.package_ids # 获取托盘下的大包
if package_obj:
for package in package_obj:
# 添加小包信息
ship_packages.append({
'id': package.ship_package_ids.ids,
'bl_id': package.bl_id.id,
'tally_time': handover_time
}) # 小包
# 更新大包交货信息
package_obj.update_big_package_info(action_type='handover',
tally_state='handover_completed',
tally_user_id=handover_user_id,
tally_time=handover_time) # 修改交货信息
return error_no_set
# 处理大包
error_no_arr = process_packages(pallet_arr, ship_packages)
if error_no_arr:
res['message'] = {
'en': 'Big package number [%s] does not exist' % ','.join(error_no_arr),
'zh': '大包号[%s]不存在' % ','.join(error_no_arr)
}[pda_lang]
return res
res['state'] = 200
# 有小包 就更新小包状态和同步
if ship_packages:
# 获取最晚的操作时间
latest_operation_time = self._get_latest_operation_time(ship_packages)
# 在这里创建成功的pda扫码记录
bl_obj = request.env['cc.bl'].sudo().search(
[('id', 'in', [ship_package.get('bl_id') for ship_package in ship_packages])])
logging.info(f"bl_obj: {bl_obj}")
for bl in bl_obj:
request.env['pda.scan.record'].sudo().create_scan_record(
operation=operation,
record_type='handover',
bill_number=bl.bl_no,
transfer_number=bl.transfer_bl_no,
state='success',
bl_id=bl.id,
operation_time=latest_operation_time,
operator_id=handover_user_id)
redis_conn = request.env['common.common'].sudo().get_redis()
if redis_conn and redis_conn != 'no':
bl_ids = [ship_package.get('bl_id') for ship_package in ship_packages]
logging.info('bl_ids:%s' % bl_ids)
redis_conn.lpush('mail_push_package_list', json.dumps(
{'ids': list(set(bl_ids)), 'ship_packages': str(ship_packages),
'action_type': 'handover'}))
except Exception as e:
error = str(e)
logging.info('pallet_handover_complete error:%s' % error)
exceptions_msg_dic = {
'en': 'System parsing error, the reason for the error is %s' % error,
'zh': '系统解析错误,错误原因是%s' % error
}
res['message'] = exceptions_msg_dic[pda_lang]
# 创建失败的PDA扫码记录
request.env['pda.scan.record'].sudo().create_scan_record(
operation=operation,
record_type='handover',
bill_number='',
transfer_number='',
state='failed',
failure_reason=error,
operator_id=handover_user_id
)
logging.info('pallet_handover_complete res:%s' % res)
return res
......@@ -24,10 +24,10 @@ class CcPallet(models.Model):
'express_company_name': self.express_company_id.name,#快递公司名称
'usage_state': self.usage_state,#使用状态 unused未使用 used已使用
'print_state': self.print_state,#打印状态 unprinted未打印 printed已打印
'sorting_time': self.sorting_time,#托盘理货时间
'delivery_time': self.delivery_time,#托盘交货时间
'sorting_time': str(self.sorting_time) if self.sorting_time else '',#托盘理货时间
'delivery_time': str(self.delivery_time) if self.delivery_time else '',#托盘交货时间
'package_count': self.package_count,#大包数量
'partner_id': self.partner_id.id,#使用客户id
'partner_name': self.partner_id.name,#使用客户名称
'delivery_plate_number': self.delivery_plate_number,#托盘交付车牌号
'delivery_plate_number': self.delivery_plate_number or '',#托盘交付车牌号
}
\ No newline at end of file
......@@ -9,6 +9,7 @@ from odoo import models, fields, api, _
_logger = logging.getLogger(__name__)
from odoo.exceptions import ValidationError
class CcPallet(models.Model):
# 模型名称
_name = 'cc.pallet'
......@@ -73,7 +74,7 @@ class CcPallet(models.Model):
pallet.delivery_time = False
# 托盘号(年月+4位数,不能重复生成)
name = fields.Char(string=_('Pallet Number'), copy=False,help=_('Pallet number format: YYYYMM + 4 digits'))
name = fields.Char(string=_('Pallet Number'), copy=False, help=_('Pallet number format: YYYYMM + 4 digits'))
# 托盘归属快递
express_company_id = fields.Many2one('cc.last.mile.provider', string=_('Express Company'), index=True)
# 使用状态
......@@ -103,11 +104,15 @@ class CcPallet(models.Model):
# 托盘交付车牌号
delivery_plate_number = fields.Char(string=_('Delivery Plate Number'))
def update_pallet_info(self, **kwargs):
"""更新托盘信息"""
if kwargs.get('delivery_plate_number', ''):
self.delivery_plate_number = kwargs['delivery_plate_number']
# 当大包关联到托盘时,自动更新使用状态
def update_usage_state(self,success_package,usage_date):
def update_usage_state(self, success_package, usage_date):
"""更新托盘使用状态"""
for pallet in self:
if pallet.package_ids:
pallet.usage_state = 'used'
# 关联大包到托盘
pallet.package_ids = [(4, package_id.id, 0) for package_id in success_package]
......@@ -121,13 +126,13 @@ class CcPallet(models.Model):
related_packages = package.bl_id.big_package_ids.filtered(
lambda p: p.pallet_number == new_pallet_number) # 查找对应提单下相同托盘号的所有大包
warning_package_arr = [related_package.big_package_no for related_package in related_packages if
related_package.pallet_usage_date != usage_date]
str(related_package.pallet_usage_date) != usage_date]
if warning_package_arr:
raise ValidationError(
_('Big Package No :%s ,The same bill of lading, same pallet number, and usage date must be consistent!') % (
'\n'.join(warning_package_arr))) # 大包号关联的同一提单,同一托盘号,使用日期必须一致
# 更新大包的托盘信息
package.update_pallet_info(new_pallet_number, usage_date,pallet.id)
package.update_pallet_info(new_pallet_number, usage_date, pallet.id)
if old_pallet_number:
# %s %s更改了托盘号,由%s变更为%s,托盘使用日期%s变更为%s
......@@ -145,9 +150,6 @@ class CcPallet(models.Model):
body = _('%s at %s associated %d packages to pallet %s') % (
self.env.user.name, fields.Datetime.now(), len(success_package), pallet.name)
pallet.message_post(body=body)
else:
pallet.usage_state = 'unused'
def action_print_labels(self):
"""打印标签动作"""
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论