提交 02028d58 authored 作者: 贺阳's avatar 贺阳

修改托盘理货

上级 2d04ffe8
...@@ -815,42 +815,20 @@ class OrderController(http.Controller): ...@@ -815,42 +815,20 @@ class OrderController(http.Controller):
pallet_id = pallet_item.get('pallet_id') pallet_id = pallet_item.get('pallet_id')
usage_time = pallet_item.get('usage_time') usage_time = pallet_item.get('usage_time')
big_package_nos = pallet_item.get('big_package_nos', []) big_package_nos = pallet_item.get('big_package_nos', [])
if not pallet_id or not usage_time or not big_package_nos: if not pallet_id or not usage_time or not big_package_nos:
continue continue
# 获取托盘对象 # 获取托盘对象
pallet = request.env['cc.pallet'].sudo().browse(pallet_id) pallet = request.env['cc.pallet'].sudo().browse(pallet_id)
if not pallet.exists(): if not pallet.exists():
continue continue
# 获取大包对象 # 获取大包对象
big_packages = request.env['cc.big.package'].sudo().search([ big_packages = request.env['cc.big.package'].sudo().search([
('big_package_no', 'in', big_package_nos) ('big_package_no', 'in', big_package_nos)
]) ])
if big_packages: if big_packages:
# 更新托盘状态为已使用 # 更新托盘状态为已使用
pallet.usage_state = 'used' pallet.update_usage_state(big_packages,usage_time)
# 关联大包到托盘
pallet.package_ids = [(4, pkg.id) for pkg in big_packages]
# 更新大包的托盘信息
for pkg in big_packages:
pkg.update_pallet_info(
pallet_number=pallet.name,
pallet_usage_date=usage_time,
pallet_id=pallet.id
)
# 更新大包理货状态
pkg.update_big_package_info(
action_type='tally',
tally_state='checked_goods',
tally_user_id=tally_user_id,
tally_time=usage_time
)
# 创建成功的PDA扫码记录 # 创建成功的PDA扫码记录
bl_obj = big_packages[0].bl_id if big_packages else None bl_obj = big_packages[0].bl_id if big_packages else None
if bl_obj: if bl_obj:
...@@ -991,4 +969,183 @@ class OrderController(http.Controller): ...@@ -991,4 +969,183 @@ class OrderController(http.Controller):
operator_id=tally_user_id operator_id=tally_user_id
) )
logging.info('pallet_handover_complete res:%s' % res) logging.info('pallet_handover_complete res:%s' % res)
return res return res
\ No newline at end of file
@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'#按托盘理货/交货
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'):
#判断托盘数组里面的托盘号在托盘表里面是否存在
pallet_nos = [pallet_item.get('pallet_no') for pallet_item in kwargs.get('pallet_arr')]
pallet_obj = request.env['cc.pallet'].sudo().search([('name', 'in', pallet_nos)])
if pallet_obj:
res['message'] = {
'en': 'Pallet number [%s] does not exist' % ','.join(pallet_nos),
'zh': '托盘号[%s]不存在' % ','.join(pallet_nos)
}[pda_lang]
return res
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
big_package_exception_arr = {}
# 处理包裹信息
def process_packages(package_arr, package_type, 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_obj = request.env[f'cc.big.package'].sudo().search(
[(file_str, '=', package_no)]) # 大包 1个
if package_obj:
if exception_cause_ids:
for excep_item in exception_cause_ids:
if excep_item not in big_package_exception_arr:
big_package_exception_arr[excep_item] = [
]
big_package_exception_arr[excep_item] += package_obj.ids
package_obj.update_exception_info(
exception_cause_ids) # 修改异常信息
tally_time = package_item.get('tally_time')
if (action_type == 'tally' and package_item.get('tally_state') == 'checked_goods') or (
action_type == 'handover' and package_item.get(
'tally_state') == 'handover_completed'):
for package in package_obj:
if (
action_type == 'tally' and package.tally_state == 'unprocessed_goods') or (
action_type == 'handover' and package.tally_state in (
'unprocessed_goods', 'checked_goods')):
ship_packages.append({
'id': package.ship_package_ids.ids,
'bl_id': package.bl_id.id,
'tally_time': tally_time
}) # 小包
package_obj.update_big_package_info(action_type=action_type,
tally_state=package_item.get(
'tally_state'),
tally_user_id=package_item.get(
'tally_user_id'),
tally_time=tally_time) # 修改理货信息
else:
error_no_set.add(package_no)
return error_no_set
# 处理大包
if kwargs.get('big_package_arr'):
error_no_arr = process_packages(
kwargs['big_package_arr'], 'big', 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
# 修改异常原因,发送异常邮件
lang = 'zh_CN' if pda_lang == 'zh' else 'en_US' # 语言
for exception_id, big_package in big_package_exception_arr.items():
if big_package:
big_wizard_obj = request.env[
'add.exception.info.wizard'].sudo().with_context({'active_id': big_package,
'active_name': 'cc.big.package',
'not_update_ex': True}).create_add_exception_wizard(
'big package', [exception_id], big_package_ids=big_package, send_email=True,
email_language=lang)
big_wizard_obj.confirm() # 发送邮件
res['state'] = 200
logging.info('update_pallet_big_package_tally_detail ship_packages:%s' % len(ship_packages))
# 有小包 就更新小包状态和同步
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=action_type,
bill_number=bl.bl_no,
transfer_number=bl.transfer_bl_no,
state='success',
bl_id=bl.id,
operation_time=latest_operation_time,
operator_id=tally_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': action_type}))
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': '类型必须提供;大包数据或托盘数据至少需要提供一个。'
}
res['message'] = null_msg_dic[pda_lang]
except Exception as e:
error = str(e)
logging.info('update_pro_big_package_tally_detail 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扫码记录
if ship_packages:
bl_obj = request.env['cc.bl'].sudo().search(
[('id', 'in', [ship_package.get('bl_id') for ship_package in ship_packages])], limit=1)
if bl_obj:
for bl in bl_obj:
request.env['pda.scan.record'].sudo().create_scan_record(
operation=operation,
record_type=action_type,
bill_number=bl.bl_no,
transfer_number=bl.transfer_bl_no,
state='failed',
bl_id=bl.id,
failure_reason=error,
operator_id=tally_user_id)
else:
request.env['pda.scan.record'].sudo().create_scan_record(
operation=operation,
record_type=action_type,
bill_number='',
transfer_number='',
state='failed',
failure_reason=error,
operator_id=tally_user_id)
logging.info('update_pallet_big_package_tally_detail res:%s' % res)
return res
...@@ -7,7 +7,7 @@ from odoo import models, fields, api, _ ...@@ -7,7 +7,7 @@ from odoo import models, fields, api, _
# 获取日志 # 获取日志
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
from odoo.exceptions import ValidationError
class CcPallet(models.Model): class CcPallet(models.Model):
# 模型名称 # 模型名称
...@@ -104,12 +104,47 @@ class CcPallet(models.Model): ...@@ -104,12 +104,47 @@ class CcPallet(models.Model):
delivery_plate_number = fields.Char(string=_('Delivery Plate Number')) delivery_plate_number = fields.Char(string=_('Delivery Plate Number'))
# 当大包关联到托盘时,自动更新使用状态 # 当大包关联到托盘时,自动更新使用状态
@api.model def update_usage_state(self,success_package,usage_date):
def update_usage_state(self):
"""更新托盘使用状态""" """更新托盘使用状态"""
for pallet in self: for pallet in self:
if pallet.package_ids: 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]
# 更新大包的托盘信息
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
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)
if old_pallet_number:
# %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: else:
pallet.usage_state = 'unused' pallet.usage_state = 'unused'
......
...@@ -36,44 +36,6 @@ class AssociatePalletWizard(models.TransientModel): ...@@ -36,44 +36,6 @@ class AssociatePalletWizard(models.TransientModel):
'\n'.join(fail_package))) # 不存在该大包,请检查输入信息 '\n'.join(fail_package))) # 不存在该大包,请检查输入信息
if success_package: if success_package:
# 关联大包到托盘
record.pallet_id.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 = record.pallet_id.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
related_package.pallet_usage_date != record.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, record.usage_date,record.pallet_id.id)
if old_pallet_number:
# %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,
record.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, record.usage_date)
package.message_post(body=body)
# 更新托盘的使用状态(理货时间和交货时间会自动通过计算字段更新) # 更新托盘的使用状态(理货时间和交货时间会自动通过计算字段更新)
record.pallet_id.update_usage_state() record.pallet_id.update_usage_state(success_package)
# 记录托盘关联日志
body = _('%s at %s associated %d packages to pallet %s') % (
self.env.user.name, fields.Datetime.now(), len(success_package), record.pallet_id.name)
record.pallet_id.message_post(body=body)
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论