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

Merge branch 'release/3.15.0'

...@@ -13,6 +13,7 @@ import pytz ...@@ -13,6 +13,7 @@ import pytz
from odoo import models, fields, api, _ from odoo import models, fields, api, _
from odoo.exceptions import ValidationError, UserError from odoo.exceptions import ValidationError, UserError
_logger = logging.getLogger(__name__)
def get_rfc339_time(utc_time=None): def get_rfc339_time(utc_time=None):
if not utc_time: if not utc_time:
...@@ -260,6 +261,74 @@ class CcShipPackage(models.Model): ...@@ -260,6 +261,74 @@ class CcShipPackage(models.Model):
'logistic_order_no': self.logistic_order_no, # 物流订单号 '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 # 继承提单对象t
class CcBl(models.Model): class CcBl(models.Model):
......
...@@ -172,3 +172,17 @@ class TT(models.Model): ...@@ -172,3 +172,17 @@ class TT(models.Model):
"""异步调用提单推送接口""" """异步调用提单推送接口"""
# async with semaphore: # async with semaphore:
return await self.async_bl_callback_track_callback(session, data, bl_id) 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 @@ ...@@ -49,6 +49,10 @@
<field name="model">cc.ship.package</field> <field name="model">cc.ship.package</field>
<field name="inherit_id" ref="ccs_base.form_cc_ship_package_view"/> <field name="inherit_id" ref="ccs_base.form_cc_ship_package_view"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<header position="inside">
<button name="operate_package_invoice_query" string="获取发票" type="object"
groups="ccs_base.group_clearance_of_customs_user"/>
</header>
<notebook position="inside"> <notebook position="inside">
<page string="Sync Log"> <page string="Sync Log">
<field name="sync_log_ids" widget="one2many_list"/> <field name="sync_log_ids" widget="one2many_list"/>
...@@ -57,4 +61,17 @@ ...@@ -57,4 +61,17 @@
</field> </field>
</record> </record>
<record id="operate_package_invoice_query_server" 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_user'))]"/>
<field name="code">
if records:
action = records.operate_package_invoice_query()
</field>
</record>
</odoo> </odoo>
\ No newline at end of file
...@@ -82,13 +82,28 @@ ...@@ -82,13 +82,28 @@
</a> </a>
</div> </div>
</t> </t>
<!-- <t t-if="ext=='pdf'">-->
<!-- <div class="o_image_box float-start"-->
<!-- t-att-data-tooltip="'Download ' + file.name">-->
<!-- <a t-att-href="getUrl(file.id)"-->
<!-- aria-label="Download"-->
<!-- style="cursor: zoom-in;" data-fancybox=""-->
<!-- data-type="iframe">-->
<!-- <span class="o_image o_hover"-->
<!-- t-att-data-mimetype="file.mimetype"-->
<!-- t-att-data-ext="ext" role="img"-->
<!-- t-attf-data-src="/web/content/{{file.id}}"/>-->
<!-- </a>-->
<!-- </div>-->
<!-- </t>-->
<t t-if="ext=='pdf'"> <t t-if="ext=='pdf'">
<div class="o_image_box float-start" <div class="o_image_box float-start"
t-att-data-tooltip="'Download ' + file.name"> t-att-data-tooltip="'Download ' + file.name">
<!-- 移除了 data-fancybox,添加了 target="_blank" -->
<a t-att-href="getUrl(file.id)" <a t-att-href="getUrl(file.id)"
aria-label="Download" aria-label="Download"
style="cursor: zoom-in;" data-fancybox="" style="cursor: pointer;"
data-type="iframe"> target="_blank">
<span class="o_image o_hover" <span class="o_image o_hover"
t-att-data-mimetype="file.mimetype" t-att-data-mimetype="file.mimetype"
t-att-data-ext="ext" role="img" t-att-data-ext="ext" role="img"
...@@ -112,10 +127,19 @@ ...@@ -112,10 +127,19 @@
</div> </div>
</t> </t>
<!-- <div class="caption">-->
<!-- <a class="ml4"-->
<!-- t-att-data-tooltip="'Download ' + file.name"-->
<!-- t-att-href="getUrl(file.id)">-->
<!-- <t t-esc='file.name'/>-->
<!-- </a>-->
<!-- </div>-->
<div class="caption"> <div class="caption">
<!-- 添加了 target="_blank" -->
<a class="ml4" <a class="ml4"
t-att-data-tooltip="'Download ' + file.name" t-att-data-tooltip="'Download ' + file.name"
t-att-href="getUrl(file.id)"> t-att-href="getUrl(file.id)"
target="_blank">
<t t-esc='file.name'/> <t t-esc='file.name'/>
</a> </a>
</div> </div>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论