提交 bc64f871 authored 作者: 刘擎阳's avatar 刘擎阳

1.新增小包的发票下载功能

上级 e792068f
......@@ -13,6 +13,7 @@ import pytz
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError, UserError
_logger = logging.getLogger(__name__)
def get_rfc339_time(utc_time=None):
if not utc_time:
......@@ -260,6 +261,74 @@ class CcShipPackage(models.Model):
'logistic_order_no': self.logistic_order_no, # 物流订单号
}
def get_package_invoice_query_data(self):
push_data = {
"provider_order_id": self.logistic_order_no or '',
"declaretion_bill_id": self.customer_ref or '',
"reason": "业务需要"
}
# logging.info('小包发票下载 push_data:%s' % push_data)
return push_data
def operate_package_invoice_query(self):
data_arr = []
error_msg_arr = []
for item in self:
data = item.get_package_invoice_query_data()
data_arr.append((data, item))
tt_api_obj = self.env["ao.tt.api"].sudo()
async def perform_requests():
async with aiohttp.ClientSession() as session:
tasks = []
for index, data in enumerate(data_arr):
tasks.append(tt_api_obj.async_package_invoice_callback_track(session, data[0], data[1]))
responses = await asyncio.gather(*tasks)
return responses
# 在 Odoo 中运行异步任务
responses = asyncio.run(perform_requests())
for index, response_result in enumerate(responses):
package_obj = response_result[2]
response_data = response_result[0]
# big_obj.message_post(body="推送轨迹揽收", author_id=self.env.user.partner_id.id,
# email_from=self.env.user.partner_id.display_name)
# print(response_data)
# 使用 .get('code') 避免某些异常情况下缺少 'code' 键导致 KeyError
if response_data.get('code') != 0:
error_msg_arr.append(f"{package_obj.logistic_order_no}发票下载失败:{response_data.get('msg', '')}")
_logger.error(f"{package_obj.logistic_order_no}发票下载失败:{response_data.get('msg', '')}")
else:
# 获取发票列表
pdf_data_arr = response_data.get('data', {}).get('package_invoice_list', [])
attachment_commands = []
for pdf_index, pdf_data in enumerate(pdf_data_arr):
file_code = pdf_data.get('invoice_file_code')
if file_code:
# 动态生成附件名称,包含物流单号和索引
file_name = f"{package_obj.logistic_order_no}_invoice_{pdf_index + 1}.pdf"
# 组装 One2many / Many2many 创建指令 (0, 0, values)
attachment_commands.append((0, 0, {
'name': file_name,
'type': 'binary',
'datas': file_code, # Base64 文件内容
'res_model': package_obj._name, # 绑定当前模型
'res_id': package_obj.id, # 绑定当前记录 ID
'mimetype': 'application/pdf',
}))
# 批量写入并关联附件
if attachment_commands:
# 如果是覆盖之前的附件,可以把 attachment_commands 改为 [(5, 0, 0)] + attachment_commands
package_obj.invoice_attachment_ids.sudo().unlink()
package_obj.write({
'invoice_attachment_ids': attachment_commands
})
# package_obj.message_post(body="发票下载操作成功", author_id=self.env.user.partner_id.id,
# email_from=self.env.user.partner_id.display_name)
return error_msg_arr
# 继承提单对象t
class CcBl(models.Model):
......
......@@ -172,3 +172,17 @@ class TT(models.Model):
"""异步调用提单推送接口"""
# async with semaphore:
return await self.async_bl_callback_track_callback(session, data, bl_id)
async def async_package_invoice_query(self, session, push_data, package_id):
"""包裹发票下载"""
url = '/logistics/provider/customs/package_invoice_query?country=GB'
timestamp = int(time.time())
sign = self.generate_sign(timestamp, push_data)
response = await self.async_get_response(session, url, sign, timestamp, push_data)
# logging.info('async_package_invoice_query response:%s' % response)
return response, push_data, package_id
async def async_package_invoice_callback_track(self, session, data, package_id):
"""异步调用推送接口"""
# async with semaphore:
return await self.async_package_invoice_query(session, data, package_id)
......@@ -49,6 +49,10 @@
<field name="model">cc.ship.package</field>
<field name="inherit_id" ref="ccs_base.form_cc_ship_package_view"/>
<field name="arch" type="xml">
<header position="inside">
<button name="operate_package_invoice_query" string="包裹发票下载" type="object"
groups="ccs_base.group_clearance_of_customs_manager"/>
</header>
<notebook position="inside">
<page string="Sync Log">
<field name="sync_log_ids" widget="one2many_list"/>
......@@ -57,4 +61,17 @@
</field>
</record>
<record id="operate_package_invoice_query_server_action" model="ir.actions.server">
<field name="name">批量包裹发票下载</field>
<field name="model_id" ref="model_cc_ship_package"/>
<field name="binding_model_id" ref="model_cc_ship_package"/>
<field name="state">code</field>
<field name="binding_view_types">list</field>
<field name="groups_id" eval="[(4, ref('ccs_base.group_clearance_of_customs_manager'))]"/>
<field name="code">
if records:
action = records.operate_package_invoice_query()
</field>
</record>
</odoo>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论