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

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

上级 24b04c21
...@@ -3,7 +3,7 @@ import json ...@@ -3,7 +3,7 @@ import json
import logging import logging
from datetime import datetime from datetime import datetime
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
...@@ -361,12 +361,13 @@ class OrderController(http.Controller): ...@@ -361,12 +361,13 @@ class OrderController(http.Controller):
res = {'state': 201, 'message': ''} res = {'state': 201, 'message': ''}
action_type = kwargs.get('action_type') or 'tally' # tally / handover action_type = kwargs.get('action_type') or 'tally' # tally / handover
operation = 'tail_tally' if action_type == 'tally' else 'tail_handover' operation = 'tail_tally' if action_type == 'tally' else 'tail_handover'
tally_user_id = False # 理货人ID tally_user_id = False # 理货人ID
ship_packages = [] ship_packages = []
try: try:
logging.info('update_pro_big_package_tally_detail kw:%s' % kwargs) 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')): 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) kwargs['ship_package_arr'][0].get('tally_user_id') if kwargs.get('ship_package_arr') else False)
big_package_exception_arr = {} big_package_exception_arr = {}
ship_package_exception_arr = {} ship_package_exception_arr = {}
...@@ -583,7 +584,8 @@ class OrderController(http.Controller): ...@@ -583,7 +584,8 @@ class OrderController(http.Controller):
'zh': '系统解析错误,错误原因是%s' % e 'zh': '系统解析错误,错误原因是%s' % e
} }
logging.info('last_mile_tally error:%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) logging.info('last_mile_tally res:%s' % res)
return res return res
...@@ -647,11 +649,12 @@ class OrderController(http.Controller): ...@@ -647,11 +649,12 @@ class OrderController(http.Controller):
# if is_pallet: # if is_pallet:
# domain=[('state', '!=', 'done')]# 1. 按托盘理货时,查非已完成状态的提单 # domain=[('state', '!=', 'done')]# 1. 按托盘理货时,查非已完成状态的提单
# else: # else:
#先都查清关中的,如果以后要查非已完成状态的提单,再修改domain。而且查尾程快递和对应的大包或托盘信息得分两个接口 # 先都查清关中的,如果以后要查非已完成状态的提单,再修改domain。而且查尾程快递和对应的大包或托盘信息得分两个接口
domain=[('state', '=', 'ccing')]# 1. 按尾程理货时,查所有清关中提单 domain = [('state', '=', 'ccing')] # 1. 按尾程理货时,查所有清关中提单
bls = request.env['cc.bl'].sudo().search(domain) bls = request.env['cc.bl'].sudo().search(domain)
# 2. 查所有大包 # 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. 按"下一阶段服务商名称"分组 # 3. 按"下一阶段服务商名称"分组
group_dict = {} group_dict = {}
for pkg in big_packages: for pkg in big_packages:
...@@ -663,21 +666,28 @@ class OrderController(http.Controller): ...@@ -663,21 +666,28 @@ class OrderController(http.Controller):
if key not in group_dict: if key not in group_dict:
group_dict[key] = provider.search_pro_info() # 查询快递信息 group_dict[key] = provider.search_pro_info() # 查询快递信息
group_dict[key]['count'] = 0 group_dict[key]['count'] = 0
group_dict[key]['big_package_arr'] = []#大包信息 group_dict[key]['big_package_arr'] = [] # 大包信息
group_dict[key]['ship_package_arr'] = []#小包信息 group_dict[key]['ship_package_arr'] = [] # 小包信息
group_dict[key]['pallet_info_arr'] = []#托盘信息 group_dict[key]['pallet_info_arr'] = [] # 托盘信息
group_dict[key]['count'] += 1 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: 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'] = 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: else:
group_dict[key]['ship_package_arr'].extend( group_dict[key]['ship_package_arr'].extend(
[ship_package_item.search_ship_package_info(pda_lang=pda_lang) for ship_package_item in [ship_package_item.search_ship_package_info(pda_lang=pda_lang) for ship_package_item in
pkg.ship_package_ids]) pkg.ship_package_ids])
# 4. 返回 # 4. 返回
provider_info_arr = list(group_dict.values()) provider_info_arr = list(group_dict.values())
# 按服务商名称升序排序 # 按服务商名称升序排序
...@@ -785,86 +795,11 @@ class OrderController(http.Controller): ...@@ -785,86 +795,11 @@ class OrderController(http.Controller):
'zh': '系统解析错误,错误原因是%s' % e 'zh': '系统解析错误,错误原因是%s' % e
} }
logging.info('pallet_tally error:%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) logging.info('pallet_tally res:%s' % res)
return 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) @http.route('/api/pallet/handover', type='json', auth='public', csrf=False)
def pallet_handover(self): def pallet_handover(self):
""" """
...@@ -883,112 +818,29 @@ class OrderController(http.Controller): ...@@ -883,112 +818,29 @@ class OrderController(http.Controller):
'zh': '系统解析错误,错误原因是%s' % e 'zh': '系统解析错误,错误原因是%s' % e
} }
logging.info('pallet_handover error:%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) logging.info('pallet_handover res:%s' % res)
return 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'], @http.route('/api/update/pallet/big/package/tally/detail', type='json', auth='public', methods=['GET', 'POST'],
csrf=False) csrf=False)
def update_pallet_big_package_tally_detail(self): def update_pallet_big_package_tally_detail(self):
""" """
修改尾程快递按托盘号的理货/交货信息 修改尾程快递按托盘号的理货信息
:return: :return:
""" """
kwargs = json.loads(request.httprequest.data) kwargs = json.loads(request.httprequest.data)
pda_lang = kwargs.get('pda_lang') or 'zh' pda_lang = kwargs.get('pda_lang') or 'zh'
res = {'state': 201, 'message': ''} res = {'state': 201, 'message': ''}
action_type = kwargs.get('action_type') or 'tally' # tally / handover action_type = 'tally'
operation = 'pallet_tally' if action_type == 'tally' else 'pallet_handover'#按托盘理货/交 operation = 'pallet_tally' # 按托盘理
tally_user_id = False # 理货人ID tally_user_id = False # 理货人ID
ship_packages = [] ship_packages = []
try: try:
logging.info('update_pallet_big_package_tally_detail kw:%s' % kwargs) 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_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)]) pallet_obj = request.env['cc.pallet'].sudo().search([('name', 'in', pallet_nos)])
if not pallet_obj: if not pallet_obj:
...@@ -997,13 +849,14 @@ class OrderController(http.Controller): ...@@ -997,13 +849,14 @@ class OrderController(http.Controller):
'zh': '托盘号[%s]不存在' % ','.join(pallet_nos) 'zh': '托盘号[%s]不存在' % ','.join(pallet_nos)
}[pda_lang] }[pda_lang]
return res return res
# 将托盘状态更新为已使用 # 将托盘状态更新为已使用
all_big_package_arr = []
for pallet_item in kwargs.get('pallet_arr'): for pallet_item in kwargs.get('pallet_arr'):
pallet_number = pallet_item.get('pallet_number') pallet_number = pallet_item.get('pallet_number') # 托盘号
pallet_use_date = pallet_item.get('pallet_use_date') pallet_use_date = pallet_item.get('pallet_use_date') # 托盘使用日期
big_package_arr = pallet_item.get('big_package_arr', []) 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) pallet = pallet_obj.filtered(lambda p: p.name == pallet_number)
if pallet and big_package_arr: if pallet and big_package_arr:
...@@ -1014,34 +867,18 @@ class OrderController(http.Controller): ...@@ -1014,34 +867,18 @@ class OrderController(http.Controller):
if big_package_objs: if big_package_objs:
# 调用托盘的update_usage_state方法 # 调用托盘的update_usage_state方法
pallet.update_usage_state(big_package_objs, pallet_use_date) pallet.update_usage_state(big_package_objs, pallet_use_date)
big_package_arr=[] tally_user_id = kwargs['big_package_arr'][0].get('tally_user_id') if kwargs.get(
error_no_arr=[] 'big_package_arr') else False
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
big_package_exception_arr = {} big_package_exception_arr = {}
# 处理包裹信息 # 处理包裹信息
def process_packages(package_arr, package_type, ship_packages): def process_packages(package_arr, ship_packages):
error_no_set = set() # 使用集合来存储错误信息 error_no_set = set() # 使用集合来存储错误信息
for package_item in package_arr: for package_item in package_arr:
file_str = 'big_package_no' # 大包号 package_no = package_item.get('big_package_no') # 包裹号
package_no = package_item.get(file_str) # 包裹号 exception_cause_ids = package_item.get('exception_cause_ids') # 异常原因id数组
exception_cause_ids = package_item.get(
'exception_cause_ids') # 异常原因id数组
package_obj = request.env[f'cc.big.package'].sudo().search( 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 package_obj:
if exception_cause_ids: if exception_cause_ids:
for excep_item in exception_cause_ids: for excep_item in exception_cause_ids:
...@@ -1076,9 +913,8 @@ class OrderController(http.Controller): ...@@ -1076,9 +913,8 @@ class OrderController(http.Controller):
return error_no_set return error_no_set
# 处理大包 # 处理大包
if kwargs.get('big_package_arr'): if all_big_package_arr:
error_no_arr = process_packages( error_no_arr = process_packages(all_big_package_arr, ship_packages)
kwargs['big_package_arr'], 'big', ship_packages)
if error_no_arr: if error_no_arr:
res['message'] = { res['message'] = {
'en': 'Big package number [%s] does not exist' % ','.join(error_no_arr), 'en': 'Big package number [%s] does not exist' % ','.join(error_no_arr),
...@@ -1127,8 +963,8 @@ class OrderController(http.Controller): ...@@ -1127,8 +963,8 @@ class OrderController(http.Controller):
else: else:
null_msg_dic = { 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.', 'en': 'The pallet data must be provided.',
'zh': '类型必须提供;大包数据或托盘数据至少需要提供一个。' 'zh': '托盘数据必须提供。'
} }
res['message'] = null_msg_dic[pda_lang] res['message'] = null_msg_dic[pda_lang]
except Exception as e: except Exception as e:
...@@ -1166,3 +1002,112 @@ class OrderController(http.Controller): ...@@ -1166,3 +1002,112 @@ class OrderController(http.Controller):
logging.info('update_pallet_big_package_tally_detail res:%s' % res) logging.info('update_pallet_big_package_tally_detail res:%s' % res)
return 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): ...@@ -24,10 +24,10 @@ class CcPallet(models.Model):
'express_company_name': self.express_company_id.name,#快递公司名称 'express_company_name': self.express_company_id.name,#快递公司名称
'usage_state': self.usage_state,#使用状态 unused未使用 used已使用 'usage_state': self.usage_state,#使用状态 unused未使用 used已使用
'print_state': self.print_state,#打印状态 unprinted未打印 printed已打印 'print_state': self.print_state,#打印状态 unprinted未打印 printed已打印
'sorting_time': self.sorting_time,#托盘理货时间 'sorting_time': str(self.sorting_time) if self.sorting_time else '',#托盘理货时间
'delivery_time': self.delivery_time,#托盘交货时间 'delivery_time': str(self.delivery_time) if self.delivery_time else '',#托盘交货时间
'package_count': self.package_count,#大包数量 'package_count': self.package_count,#大包数量
'partner_id': self.partner_id.id,#使用客户id 'partner_id': self.partner_id.id,#使用客户id
'partner_name': self.partner_id.name,#使用客户名称 '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, _ ...@@ -9,6 +9,7 @@ from odoo import models, fields, api, _
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
from odoo.exceptions import ValidationError from odoo.exceptions import ValidationError
class CcPallet(models.Model): class CcPallet(models.Model):
# 模型名称 # 模型名称
_name = 'cc.pallet' _name = 'cc.pallet'
...@@ -43,7 +44,7 @@ class CcPallet(models.Model): ...@@ -43,7 +44,7 @@ class CcPallet(models.Model):
默认给值,随机选一个未存档的客户 默认给值,随机选一个未存档的客户
""" """
return self.env['res.partner'].search([('is_customer', '=', True), ('active', '=', True)], limit=1).id return self.env['res.partner'].search([('is_customer', '=', True), ('active', '=', True)], limit=1).id
# 计算字段:大包数量 # 计算字段:大包数量
@api.depends('package_ids') @api.depends('package_ids')
def _compute_package_count(self): def _compute_package_count(self):
...@@ -61,7 +62,7 @@ class CcPallet(models.Model): ...@@ -61,7 +62,7 @@ class CcPallet(models.Model):
pallet.sorting_time = max(sorting_times) pallet.sorting_time = max(sorting_times)
else: else:
pallet.sorting_time = False pallet.sorting_time = False
# 获取所有关联大包的尾程交货时间,取最晚的时间 # 获取所有关联大包的尾程交货时间,取最晚的时间
delivery_times = pallet.package_ids.filtered('delivery_time').mapped('delivery_time') delivery_times = pallet.package_ids.filtered('delivery_time').mapped('delivery_time')
if delivery_times: if delivery_times:
...@@ -73,7 +74,7 @@ class CcPallet(models.Model): ...@@ -73,7 +74,7 @@ class CcPallet(models.Model):
pallet.delivery_time = False pallet.delivery_time = False
# 托盘号(年月+4位数,不能重复生成) # 托盘号(年月+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) express_company_id = fields.Many2one('cc.last.mile.provider', string=_('Express Company'), index=True)
# 使用状态 # 使用状态
...@@ -98,56 +99,57 @@ class CcPallet(models.Model): ...@@ -98,56 +99,57 @@ class CcPallet(models.Model):
# 使用客户 # 使用客户
partner_id = fields.Many2one('res.partner', string=_('Customer'), default=get_partner_id, partner_id = fields.Many2one('res.partner', string=_('Customer'), default=get_partner_id,
domain=[('is_customer', '=', True)]) domain=[('is_customer', '=', True)])
# 托盘交付车牌号 # 托盘交付车牌号
delivery_plate_number = fields.Char(string=_('Delivery Plate Number')) 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: for pallet in self:
if pallet.package_ids: pallet.usage_state = 'used'
pallet.usage_state = 'used' # 关联大包到托盘
# 关联大包到托盘 pallet.package_ids = [(4, package_id.id, 0) for package_id in success_package]
pallet.package_ids = [(4, package_id.id, 0) for package_id in success_package] # 更新大包的托盘信息
for package in success_package:
old_pallet_number = package.pallet_number
new_pallet_number = pallet.name # 使用托盘的编号
old_usage_date = package.pallet_usage_date
# 同一提单,同一托盘号,使用日期必须一致
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
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))) # 大包号关联的同一提单,同一托盘号,使用日期必须一致
# 更新大包的托盘信息 # 更新大包的托盘信息
for package in success_package: package.update_pallet_info(new_pallet_number, usage_date, pallet.id)
old_pallet_number = package.pallet_number
new_pallet_number = pallet.name # 使用托盘的编号 if old_pallet_number:
old_usage_date = package.pallet_usage_date # %s %s更改了托盘号,由%s变更为%s,托盘使用日期%s变更为%s
body = _(
# 同一提单,同一托盘号,使用日期必须一致 '%s at %s changed the pallet number from %s to %s, and the pallet usage date from %s to %s') % (
related_packages = package.bl_id.big_package_ids.filtered( self.env.user.name, fields.Datetime.now(), old_pallet_number, new_pallet_number,
lambda p: p.pallet_number == new_pallet_number) # 查找对应提单下相同托盘号的所有大包 old_usage_date,
warning_package_arr = [related_package.big_package_no for related_package in related_packages if usage_date)
related_package.pallet_usage_date != usage_date] else:
if warning_package_arr: # 某人某时关联了托盘xxx,托盘使用日期xxxx
raise ValidationError( body = _('%s at %s associated tray %s, with a tray usage date of %s') % (
_('Big Package No :%s ,The same bill of lading, same pallet number, and usage date must be consistent!') % ( self.env.user.name, fields.Datetime.now(), new_pallet_number, usage_date)
'\n'.join(warning_package_arr))) # 大包号关联的同一提单,同一托盘号,使用日期必须一致 package.message_post(body=body)
# 更新大包的托盘信息 # 记录托盘关联日志
package.update_pallet_info(new_pallet_number, usage_date,pallet.id) body = _('%s at %s associated %d packages to pallet %s') % (
self.env.user.name, fields.Datetime.now(), len(success_package), pallet.name)
if old_pallet_number: pallet.message_post(body=body)
# %s %s更改了托盘号,由%s变更为%s,托盘使用日期%s变更为%s
body = _(
'%s at %s changed the pallet number from %s to %s, and the pallet usage date from %s to %s') % (
self.env.user.name, fields.Datetime.now(), old_pallet_number, new_pallet_number,
old_usage_date,
usage_date)
else:
# 某人某时关联了托盘xxx,托盘使用日期xxxx
body = _('%s at %s associated tray %s, with a tray usage date of %s') % (
self.env.user.name, fields.Datetime.now(), new_pallet_number, usage_date)
package.message_post(body=body)
# 记录托盘关联日志
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): def action_print_labels(self):
"""打印标签动作""" """打印标签动作"""
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论