提交 a05f8190 authored 作者: 伍姿英's avatar 伍姿英

Merge branch 'release/3.0.0'

......@@ -31,6 +31,7 @@
'views/cc_node_view.xml',
'views/cc_ship_package_view.xml',
'views/cc_bl_view.xml',
'views/pda_scan_record_views.xml',
],
'demo': [
......
# -*- coding: utf-8 -*-
import json
import logging
from datetime import datetime
from odoo import http, exceptions
# from odoo.addons.queue_job import job
......@@ -105,6 +106,14 @@ class OrderController(http.Controller):
bl_obj = request.env['cc.bl'].sudo().deal_bl_no_and_transfer_bl_no(
bl_no) # 提单号去掉杠和空格,并转换为小写,优先匹配提单号,匹配不到则匹配转单号
if bl_obj:
# 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
if bl_obj.state in state_arr:
res['bl_info'] = bl_obj.search_bl_info(
pda_lang=pda_lang, type=action_type)
......@@ -136,17 +145,24 @@ class OrderController(http.Controller):
@http.route('/api/update/big/package/tally/detail', type='json', auth='public', methods=['GET', 'POST'], csrf=False)
def update_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 = 'bill_tally' if action_type == 'tally' else 'bill_handover'
bl_obj = False
tally_user_id = False # 理货人ID
try:
logging.info('update_big_package_tally_detail kw:%s' % kwargs)
if kwargs.get('bl_no') and action_type and (
kwargs.get('big_package_arr') or kwargs.get('ship_package_arr') or kwargs.get('pallet_arr')):
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 (
kwargs['pallet_arr'][0].get('tally_user_id') if kwargs.get('pallet_arr') else False))
bl_no = kwargs['bl_no']
state_arr = ['draft', 'ccing']
bl_obj = request.env['cc.bl'].sudo().deal_bl_no_and_transfer_bl_no(
......@@ -270,6 +286,18 @@ class OrderController(http.Controller):
email_language=lang)
ship_wizard_obj.confirm() # 发送邮件
res['state'] = 200
# 获取最晚的操作时间
latest_operation_time = self._get_latest_operation_time(ship_packages)
# 创建成功的pda扫码记录
request.env['pda.scan.record'].sudo().create_scan_record(
operation=operation,
record_type=action_type,
bill_number=bl_obj.bl_no,
transfer_number=bl_obj.transfer_bl_no,
state='success',
bl_id=bl_obj.id,
operation_time=latest_operation_time,
operator_id=tally_user_id)
logging.info(
'update_big_package_tally_detail ship_packages:%s' % len(ship_packages))
# 有小包 就更新小包状态和同步
......@@ -291,12 +319,33 @@ class OrderController(http.Controller):
}
res['message'] = null_msg_dic[pda_lang]
except Exception as e:
logging.info('update_big_package_tally_detail error:%s' % e)
error = str(e)
logging.info('update_big_package_tally_detail error:%s' % error)
exceptions_msg_dic = {
'en': 'System parsing error, the reason for the error is %s' % e,
'zh': '系统解析错误,错误原因是%s' % e
'en': 'System parsing error, the reason for the error is %s' % error,
'zh': '系统解析错误,错误原因是%s' % error
}
res['message'] = exceptions_msg_dic[pda_lang]
# 创建失败的pda扫码记录
if bl_obj:
request.env['pda.scan.record'].sudo().create_scan_record(
operation=operation,
record_type=action_type,
bill_number=bl_obj.bl_no,
transfer_number=bl_obj.transfer_bl_no,
state='failed',
bl_id=bl_obj.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('res:%s' % res)
return res
......@@ -311,10 +360,14 @@ class OrderController(http.Controller):
pda_lang = kwargs.get('pda_lang') or 'zh'
res = {'state': 201, 'message': ''}
action_type = kwargs.get('action_type') or 'tally' # tally / handover
operation = 'tail_tally' if action_type == 'tally' else 'tail_handover'
tally_user_id = False # 理货人ID
ship_packages = []
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')):
ship_packages = []
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 = {}
......@@ -417,14 +470,27 @@ class OrderController(http.Controller):
email_language=lang)
ship_wizard_obj.confirm() # 发送邮件
res['state'] = 200
logging.info(
'update_big_package_tally_detail ship_packages:%s' % len(ship_packages))
logging.info('update_pro_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':
# redis_conn.lpush('push_ship_package_state', json.dumps(
# {'bl_id': bl_obj.id, 'ship_package_ids': ship_package_ids}))
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(
......@@ -438,12 +504,38 @@ class OrderController(http.Controller):
}
res['message'] = null_msg_dic[pda_lang]
except Exception as e:
logging.info('update_pro_big_package_tally_detail error:%s' % 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' % e,
'zh': '系统解析错误,错误原因是%s' % e
'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('res:%s' % res)
return res
......@@ -491,8 +583,7 @@ 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
......@@ -506,8 +597,9 @@ class OrderController(http.Controller):
res = {'state': 201, 'message': ''}
try:
logging.info('last_mile_delivery kwargs:%s' % kwargs)
return self._get_last_mile_grouped('checked_goods', pda_lang)
# 按尾程交货时,检查时间风险 大包或小包对应的提单是否已存在成功扫码记录
res = self._get_last_mile_grouped('checked_goods', pda_lang)
return res
except Exception as e:
exceptions_msg_dic = {
'en': 'System parsing error, the reason for the error is %s' % e,
......@@ -519,6 +611,37 @@ class OrderController(http.Controller):
logging.info('last_mile_delivery res:%s' % res)
return res
@http.route('/api/last_mile/delivery/time_check', type='json', auth='public', csrf=False)
def last_mile_delivery_time_check(self):
"""
按尾程快递交货接口,查询系统所有清关中的提单,且大包状态为已理货的数量,按下一阶段服务商名称分组,下一个阶段服务商名称匹配尾程快递传给PDA。传输字段与理货的一致。
"""
kwargs = json.loads(request.httprequest.data)
pda_lang = kwargs.get('pda_lang') or 'zh'
res = {'state': 201, 'message': ''}
try:
logging.info('last_mile_delivery_time_check kwargs:%s' % kwargs)
all_bl_ids_in_request = kwargs['bl_ids']
logging.info(f"all_bl_ids_in_request: {all_bl_ids_in_request}")
if all_bl_ids_in_request:
bl_objs = request.env['cc.bl'].sudo().search([('id', 'in', all_bl_ids_in_request)])
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
res['state'] = 200
except Exception as e:
exceptions_msg_dic = {
'en': 'System parsing error, the reason for the error is %s' % e,
'zh': '系统解析错误,错误原因是%s' % e
}
logging.info('last_mile_delivery_time_check error:%s' % e)
res['message'] = exceptions_msg_dic[pda_lang]
logging.info('last_mile_delivery_time_check res:%s' % res)
return res
def _get_last_mile_grouped(self, tally_state, pda_lang):
lang = 'zh_CN' if pda_lang == 'zh' else 'en_US' # 语言
# 1. 查所有清关中提单
......@@ -551,4 +674,87 @@ class OrderController(http.Controller):
provider_info_arr = list(group_dict.values())
# 按服务商名称升序排序
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,
'bl_ids': list(set(list(map(lambda x: x.bl_id.id, big_packages))))}
def _check_delivery_time_risk(self, bl_obj, pda_lang='zh'):
"""
检查提单交货时间倒序风险
:param bl_obj: 提单对象
:param pda_lang: 语言设置
:return: 检查结果字典
"""
# 获取配置的交货操作晚于提货操作的时间参数(分钟)
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),
('record_type', '=', 'tally'), # 理货类型
('state', '=', 'success') # 成功状态
], order='operation_time desc', limit=1)
if pda_records:
latest_tally_record = pda_records[0]
current_time = request.env['common.common'].sudo().get_utc_time(datetime.now())
# Ensure operation_time is also timezone-aware (UTC)
operation_time = latest_tally_record.operation_time
time_diff = (datetime.strptime(current_time, '%Y-%m-%d %H:%M:%S') - operation_time).total_seconds() / 60
logging.info(f"current_time: {current_time}, operation_time: {operation_time},time_diff: {time_diff}")
# 如果时间差小于等于配置的参数,则存在风险
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
}
def _get_latest_operation_time(self, ship_packages):
"""
获取最晚的操作时间
:param ship_packages: 小包列表
:return: 最晚的操作时间字符串
"""
latest_time = None
for ship_package in ship_packages:
tally_time = ship_package.get('tally_time')
if tally_time:
# 如果tally_time是字符串,转换为datetime对象进行比较
if isinstance(tally_time, str):
try:
# 尝试解析时间字符串
from datetime import datetime
parsed_time = datetime.strptime(tally_time, '%Y-%m-%d %H:%M:%S')
if latest_time is None or parsed_time > latest_time:
latest_time = parsed_time
except ValueError:
# 如果解析失败,记录日志但继续处理
logging.warning(f"无法解析时间字符串: {tally_time}")
continue
elif isinstance(tally_time, datetime):
# 如果已经是datetime对象
if latest_time is None or tally_time > latest_time:
latest_time = tally_time
# 返回最晚时间的字符串格式
if latest_time:
return latest_time.strftime('%Y-%m-%d %H:%M:%S')
else:
return request.env['common.common'].sudo().get_utc_time(datetime.now())
......@@ -6,11 +6,11 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-19 08:47+0000\n"
"PO-Revision-Date: 2025-03-19 16:51+0800\n"
"POT-Creation-Date: 2025-08-05 06:34+0000\n"
"PO-Revision-Date: 2025-08-05 14:38+0800\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: zh\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
......@@ -25,7 +25,7 @@ msgstr "<span class=\"o_stat_text\">小包</span>"
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.form_cc_bl_view_inherit
msgid "<span class=\"o_stat_text\">Ship Packages</span>"
msgstr "<span class=\"o_stat_text\">小包</span>"
msgstr "Ship Package"
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_bl_sync_log__api_customer
......@@ -49,6 +49,11 @@ msgstr ""
msgid "AppSecret"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model,name:ccs_connect_tiktok.model_ir_attachment
msgid "Attachment"
msgstr "附件"
#. module: ccs_connect_tiktok
#: model:ir.actions.server,name:ccs_connect_tiktok.action_batch_sync_bl_status
msgid "Batch Sync Bill Of Loading Status"
......@@ -69,11 +74,43 @@ msgstr "批量更新小包状态向导"
msgid "Big Package"
msgstr "大包"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields.selection,name:ccs_connect_tiktok.selection__pda_scan_record__operation__bill_handover
#, python-format
msgid "Bill Handover"
msgstr "按提单交货"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__bill_number
#, python-format
msgid "Bill Number"
msgstr "提单号"
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_bl__bl_sync_log_ids
msgid "Bill Of Loading Sync Logs"
msgstr "关务提单状态同步日志"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields.selection,name:ccs_connect_tiktok.selection__pda_scan_record__operation__bill_tally
#, python-format
msgid "Bill Tally"
msgstr "按提单理货"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__bl_id
#, python-format
msgid "Bill of Lading"
msgstr "提单"
#. module: ccs_connect_tiktok
#: model:ir.model,name:ccs_connect_tiktok.model_cc_bl
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_bl_sync_log__bl_id
......@@ -134,21 +171,35 @@ msgstr "清关文件"
msgid "Config Settings"
msgstr "配置设置"
#. module: ccs_connect_tiktok
#: model_terms:ir.actions.act_window,help:ccs_connect_tiktok.action_pda_scan_record
msgid "Create your first PDA scan record"
msgstr "创建第一条PDA扫码记录"
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api__create_uid
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__create_uid
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_bl_sync_log__create_uid
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_ship_package_sync_log__create_uid
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__create_uid
msgid "Created by"
msgstr ""
msgstr "创建人"
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api__create_date
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__create_date
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_bl_sync_log__create_date
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_ship_package_sync_log__create_date
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__create_date
msgid "Created on"
msgstr ""
msgstr "创建时间"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#, python-format
msgid "Creation failed: %s"
msgstr "创建失败: %s"
#. module: ccs_connect_tiktok
#: model:ir.model.fields,help:ccs_connect_tiktok.field_cc_node__interval_minutes
......@@ -160,15 +211,46 @@ msgstr "前置节点之间的默认间隔时间(分钟)。"
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__display_name
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_bl_sync_log__display_name
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_ship_package_sync_log__display_name
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__display_name
msgid "Display Name"
msgstr ""
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields.selection,name:ccs_connect_tiktok.selection__pda_scan_record__state__failed
#, python-format
msgid "Failed"
msgstr "失败"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__failure_reason
#, python-format
msgid "Failure Reason"
msgstr "失败原因"
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_cc_bl_sync_log_view
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_cc_ship_package_sync_log_view
msgid "Group By"
msgstr "分组"
#. module: ccs_connect_tiktok
#: model:ir.model,name:ccs_connect_tiktok.model_ir_http
msgid "HTTP Routing"
msgstr "HTTP 路由"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields.selection,name:ccs_connect_tiktok.selection__pda_scan_record__record_type__handover
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.view_pda_scan_record_search
#, python-format
msgid "Handover"
msgstr "交货"
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_batch_input_ship_package_status_wizard__ship_package_ids
msgid "Have Node Package"
......@@ -179,6 +261,7 @@ msgstr "已更新节点"
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__id
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_bl_sync_log__id
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_ship_package_sync_log__id
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__id
msgid "ID"
msgstr ""
......@@ -198,6 +281,7 @@ msgstr "是否同步"
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log____last_update
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_bl_sync_log____last_update
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_ship_package_sync_log____last_update
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record____last_update
msgid "Last Modified on"
msgstr ""
......@@ -206,6 +290,7 @@ msgstr ""
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__write_uid
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_bl_sync_log__write_uid
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_ship_package_sync_log__write_uid
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__write_uid
msgid "Last Updated by"
msgstr ""
......@@ -214,6 +299,7 @@ msgstr ""
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__write_date
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_bl_sync_log__write_date
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_ship_package_sync_log__write_date
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__write_date
msgid "Last Updated on"
msgstr ""
......@@ -225,8 +311,6 @@ msgstr "未同步"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/cc_bill_loading.py:0
#: code:addons/ccs_connect_tiktok/models/cc_bill_loading_new.py:0
#: code:addons/ccs_connect_tiktok/models/cc_bill_loading_old.py:0
#, python-format
msgid "Not Sync Ship Packages"
msgstr "待同步小包"
......@@ -263,6 +347,27 @@ msgstr "操作时间"
msgid "Operate User"
msgstr "操作人"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__operation
#, python-format
msgid "Operation"
msgstr "操作"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.actions.act_window,name:ccs_connect_tiktok.action_pda_scan_record
#: model:ir.model,name:ccs_connect_tiktok.model_pda_scan_record
#: model:ir.ui.menu,name:ccs_connect_tiktok.menu_pda_scan_record
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.view_pda_scan_record_form
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.view_pda_scan_record_search
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.view_pda_scan_record_tree
#, python-format
msgid "PDA Scan Record"
msgstr "PDA扫码记录"
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_cc_node__interval_minutes
msgid "Predecessor Node Interval (Minutes)"
......@@ -300,11 +405,34 @@ msgstr "小包"
msgid "Skip Check"
msgstr "跳过检查"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/ir_attachment.py:0
#, python-format
msgid "Sorry, you are not allowed to access this document."
msgstr ""
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__state
#, python-format
msgid "State"
msgstr "状态"
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.form_cc_bl_view_inherit
msgid "State Explain"
msgstr "状态说明"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields.selection,name:ccs_connect_tiktok.selection__pda_scan_record__state__success
#, python-format
msgid "Success"
msgstr "成功"
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.form_cc_bl_view_inherit
msgid "Sync Bill Of Loading Status"
......@@ -377,6 +505,31 @@ msgstr "编码"
msgid "TK Process Code"
msgstr "进度编码"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields.selection,name:ccs_connect_tiktok.selection__pda_scan_record__operation__tail_handover
#, python-format
msgid "Tail Handover"
msgstr "按尾程交货"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields.selection,name:ccs_connect_tiktok.selection__pda_scan_record__operation__tail_tally
#, python-format
msgid "Tail Tally"
msgstr "按尾程理货"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields.selection,name:ccs_connect_tiktok.selection__pda_scan_record__record_type__tally
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.view_pda_scan_record_search
#, python-format
msgid "Tally"
msgstr "理货"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/wizard/batch_input_ship_package_statu_wizard.py:0
......@@ -403,6 +556,22 @@ msgid ""
"number!"
msgstr "单号【%s】需填写在排除单号中!"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__transfer_number
#, python-format
msgid "Transfer Number"
msgstr "转运单号"
#. module: ccs_connect_tiktok
#. odoo-python
#: code:addons/ccs_connect_tiktok/models/pda_scan_record.py:0
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__record_type
#, python-format
msgid "Type"
msgstr "类型"
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.tree_cc_bl_view_inherit
msgid "UnSync Package Count"
......@@ -477,6 +646,11 @@ msgstr ""
msgid "业务信息"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_res_config_settings__delivery_time
msgid "交货操作晚于提货操作X分钟"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_ao_tt_api_log__push_time
msgid "产生时间"
......@@ -507,6 +681,12 @@ msgstr ""
msgid "失败原因"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.actions.server,name:ccs_connect_tiktok.cron_delete_log_ir_actions_server
#: model:ir.cron,cron_name:ccs_connect_tiktok.cron_delete_log
msgid "定时删除历史日志"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_res_config_settings__tt_customer_id
msgid "客户"
......@@ -542,6 +722,11 @@ msgstr ""
msgid "推出"
msgstr ""
#. module: ccs_connect_tiktok
#: model:ir.model.fields,field_description:ccs_connect_tiktok.field_pda_scan_record__operator_id
msgid "操作人"
msgstr ""
#. module: ccs_connect_tiktok
#: model_terms:ir.ui.view,arch_db:ccs_connect_tiktok.search_ao_tt_api_log_view
msgid "昨日日志"
......
......@@ -8,6 +8,7 @@ from . import cc_node
from . import cc_bill_loading
from . import ir_attachment
from . import http
from . import pda_scan_record
# -*- coding: utf-8 -*-
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class PDAScanRecord(models.Model):
_name = 'pda.scan.record'
_description = _('PDA Scan Record') # PDA扫码记录
_order = 'create_date desc'
_rec_name = 'bill_number'
@api.onchange('operation')
def _onchange_operation(self):
"""根据操作自动设置类型"""
if self.operation:
if 'tally' in self.operation:
self.record_type = 'tally'
elif 'handover' in self.operation:
self.record_type = 'handover'
operator_id = fields.Many2one('res.users', string='操作人', required=True)
operation_time = fields.Datetime(string='操作时间', required=True, default=fields.Datetime.now)
operation = fields.Selection([
('bill_tally', _('Bill Tally')), # 按提单理货
('tail_tally', _('Tail Tally')), # 按尾程理货
('bill_handover', _('Bill Handover')), # 按提单交货
('tail_handover', _('Tail Handover')) # 按尾程交货
], string=_('Operation'), required=True) # 操作
record_type = fields.Selection([
('tally', _('Tally')), # 理货
('handover', _('Handover')) # 交货
], string=_('Type'), required=True) # 类型
bill_number = fields.Char(string=_('Bill Number')) # 提单号
transfer_number = fields.Char(string=_('Transfer Number')) # 转运单号
# 增加提单关联字段
bl_id = fields.Many2one('cc.bl', string=_('Bill of Lading'), ondelete='cascade') # 提单对象
#增加状态 成功 失败
state = fields.Selection([
('success', _('Success')),
('failed', _('Failed'))
], string=_('State'), required=True)
failure_reason = fields.Char(string=_('Failure Reason')) # 失败原因
@api.model
def create_scan_record(self, operation, record_type, bill_number, transfer_number, state, operator_id=False, bl_id=False, failure_reason=False, operation_time=False):
"""
创建扫码记录的方法,供接口调用
Create scan record method for API calls
"""
try:
if not operator_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_data = {
'operator_id': operator_id,
'operation': operation,
'record_type': record_type,
'bill_number': bill_number,
'transfer_number': transfer_number,
'bl_id': bl_id,
'state': state,
'failure_reason': failure_reason
}
# 如果传入了自定义操作时间,使用它
if operation_time:
record_data['operation_time'] = operation_time
record = self.create(record_data)
return {
'success': True,
'record_id': record.id,
'message': ''
}
except Exception as e:
return {
'success': False,
'message': _('Creation failed: %s') % str(e) # 创建失败
}
\ No newline at end of file
......@@ -15,6 +15,8 @@ class ResConfigSettings(models.TransientModel):
tt_app_secret = fields.Char('AppSecret', default='')
tt_version = fields.Char('接口版本', default='3.0')
tt_customer_id = fields.Many2one('res.partner', string='客户')
#交货操作晚于提货操作X分钟【默认80分钟】
delivery_time = fields.Integer('交货操作晚于提货操作X分钟', default=80,config_parameter='delivery_time')
@api.model
def get_values(self):
......@@ -29,13 +31,15 @@ class ResConfigSettings(models.TransientModel):
tt_app_secret = config.get_param('tt_app_secret', default='')
tt_version = config.get_param('tt_version', default='')
tt_customer_id = config.get_param('tt_customer_id', default=False)
delivery_time = config.get_param('delivery_time', default=80)
customer = self.env['res.partner'].sudo().search([('id', '=', tt_customer_id)])
values.update(
tt_url=tt_url,
tt_app_key=tt_app_key,
tt_app_secret=tt_app_secret,
tt_version=tt_version,
tt_customer_id=customer
tt_customer_id=customer,
delivery_time=delivery_time
)
return values
......@@ -47,3 +51,4 @@ class ResConfigSettings(models.TransientModel):
ir_config.set_param("tt_app_secret", self.tt_app_secret or "")
ir_config.set_param("tt_version", self.tt_version or "")
ir_config.set_param("tt_customer_id", self.tt_customer_id.id or False)
ir_config.set_param("delivery_time", self.delivery_time or 80)
\ No newline at end of file
......@@ -12,3 +12,6 @@ access_cc_bl_sync_log_base.group_erp_manager,cc_bl_sync_log base.group_erp_manag
access_cc_bl_sync_log_ccs_base.group_clearance_of_customs_manager,cc_bl_sync_log ccs_base.group_clearance_of_customs_manager,ccs_connect_tiktok.model_cc_bl_sync_log,ccs_base.group_clearance_of_customs_manager,1,0,0,0
access_cc_bl_sync_log_ccs_base.group_clearance_of_customs_user,cc_bl_sync_log ccs_base.group_clearance_of_customs_user,ccs_connect_tiktok.model_cc_bl_sync_log,ccs_base.group_clearance_of_customs_user,1,0,0,0
access_pda_scan_record_user,pda.scan.record.user,model_pda_scan_record,base.group_user,1,1,1,0
access_pda_scan_record_manager,pda.scan.record.manager,model_pda_scan_record,base.group_system,1,1,1,1
......@@ -25,6 +25,10 @@
<label for="tt_customer_id"/>
<field name="tt_customer_id"/>
</div>
<div class="text-muted">
<label for="delivery_time"/>
<field name="delivery_time"/>
</div>
</div>
</div>
<div class="col-12 col-lg-6 o_setting_box">
......
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- PDA扫码记录列表视图 -->
<record id="view_pda_scan_record_tree" model="ir.ui.view">
<field name="name">pda.scan.record.tree</field>
<field name="model">pda.scan.record</field>
<field name="arch" type="xml">
<tree string="PDA Scan Record" decoration-info="state == 'success'" decoration-danger="state == 'failed'">
<field name="operator_id" />
<field name="operation_time"/>
<field name="operation"/>
<field name="record_type"/>
<field name="bill_number"/>
<field name="transfer_number"/>
<field name="bl_id" invisible="1"/>
<field name="state"/>
<field name="failure_reason" optional="hide"/>
</tree>
</field>
</record>
<!-- PDA扫码记录表单视图 -->
<record id="view_pda_scan_record_form" model="ir.ui.view">
<field name="name">pda.scan.record.form</field>
<field name="model">pda.scan.record</field>
<field name="arch" type="xml">
<form string="PDA Scan Record">
<header>
<field name="state" widget="statusbar"/>
</header>
<sheet>
<group>
<group>
<field name="operator_id" />
<field name="operation_time"/>
<field name="operation"/>
</group>
<group>
<field name="record_type"/>
<field name="bl_id" invisible="1"/>
<field name="bill_number"/>
<field name="transfer_number"/>
</group>
</group>
<group>
<field name="failure_reason" attrs="{'invisible': [('state', '=', 'success')]}" />
</group>
</sheet>
</form>
</field>
</record>
<!-- PDA扫码记录搜索视图 -->
<record id="view_pda_scan_record_search" model="ir.ui.view">
<field name="name">pda.scan.record.search</field>
<field name="model">pda.scan.record</field>
<field name="arch" type="xml">
<search string="PDA Scan Record">
<field name="operator_id"/>
<field name="operation_time"/>
<field name="operation"/>
<field name="record_type"/>
<field name="bill_number"/>
<field name="transfer_number"/>
<filter string="Tally" name="tally" domain="[('record_type', '=', 'tally')]"/>
<filter string="Handover" name="handover" domain="[('record_type', '=', 'handover')]"/>
</search>
</field>
</record>
<!-- PDA扫码记录动作 -->
<record id="action_pda_scan_record" model="ir.actions.act_window">
<field name="name">PDA Scan Record</field>
<field name="res_model">pda.scan.record</field>
<field name="view_mode">tree,form</field>
<field name="search_view_id" ref="view_pda_scan_record_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create your first PDA scan record
</p>
</field>
</record>
<!-- 菜单项 -->
<menuitem id="menu_pda_scan_record"
name="PDA Scan Record"
action="action_pda_scan_record"
sequence="21"/>
</odoo>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论