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

1、关联托盘按钮的优化和功能优化

2、添加异常信息功能优化 3、翻译
上级 2705567e
......@@ -20,6 +20,8 @@
'wizard/batch_input_ship_package_statu_wizard.xml',
'wizard/export_bl_big_package_xlsx_wizard.xml',
'wizard/associate_pallet_wizard_views.xml',
'wizard/add_exception_info_wizard_views.xml',
'wizard/email_template.xml',
'data/data.xml',
'data/sequence.xml',
'views/menu_view.xml',
......
......@@ -14,5 +14,12 @@
<field name="key">parcel_export_num</field>
<field name="value">50000</field>
</record>
<!-- 默认发件邮箱-->
<record id="default_email_from" model="ir.config_parameter">
<field name="key">default_email_from</field>
<field name="value">847896395@qq.com</field>
</record>
</data>
</odoo>
\ No newline at end of file
差异被折叠。
......@@ -19,6 +19,7 @@ _logger = logging.getLogger(__name__)
class CcBigPackage(models.Model):
# 模型名称
_name = 'cc.big.package'
_inherit = ['mail.thread', 'mail.activity.mixin']
# 模型描述
_description = 'Big Package'
_rec_name = 'big_package_no'
......@@ -67,6 +68,16 @@ class CcBigPackage(models.Model):
exception_info_ids = fields.Many2many('cc.exception.info', 'bigpackage_exception_info_rel',
string='Exception Information')
def update_pallet_info(self, pallet_number, pallet_usage_date):
"""
修改托盘信息
:param pallet_number:
:param pallet_usage_date:
:return:
"""
self.pallet_usage_date = pallet_usage_date
self.pallet_number = pallet_number
# 创建显示包裹的action
def action_show_ship_package(self):
# 返回一个action,显示包裹
......@@ -90,17 +101,22 @@ class CcBigPackage(models.Model):
}
def action_link_pallet(self):
"""
点击关联托盘,弹出向导
"""
return {
'name': _('Link Pallet'),
'type': 'ir.actions.act_window',
'view_mode': 'form',
'views': [[False, "form"]],
'res_model': 'associate.pallet.wizard',
'target': 'new',
'context': {'active_id': self.id}
'context': {},
}
# if there ere no records selected, then select all draft expenses for the user
expenses = self.env['hr.expense'].search(
[('state', '=', 'draft'), ('sheet_id', '=', False), ('employee_id', '=', self.env.user.employee_id.id)])
if not expenses:
raise UserError(_('You have no expense to report'))
else:
return expenses.action_submit_expenses()
def action_cc_big_package(self):
"""
......@@ -125,15 +141,17 @@ class CcBigPackage(models.Model):
'view_mode': 'form',
'res_model': 'add.exception.info.wizard',
'target': 'new',
'context': {'active_id': self.id, 'default_action_type': 'big package'}
'context': {'active_id': self.ids, 'active_name': self[0]._name, 'default_big_package_ids': self.ids,
'default_action_type': 'big package'}
}
# 创建一个商品的业务对象,用来管理包裹的商品信息.商品信息包括所属包裹、SKU标识ID、商品中文名称、商品英文名称、出口HSCode,进口HSCode,重量、数量,数量单位,申报单价,运费, COD金额, VAT税率, 商品VAT,原产国, 类型:赠品,商品总价,商品链接,商品交税情况(包含:TTSTaxed: 已税
# Sentinel: 未税
# LSPTaxed: 未税
# SellerObligatio
# n: 未税)
# 创建一个商品的业务对象,用来管理包裹的商品信息.商品信息包括所属包裹、SKU标识ID、商品中文名称、商品英文名称、出口HSCode,进口HSCode,重量、数量,数量单位,申报单价,运费, COD金额, VAT税率, 商品VAT,原产国, 类型:赠品,商品总价,商品链接,商品交税情况(包含:TTSTaxed: 已税
# Sentinel: 未税
# LSPTaxed: 未税
# SellerObligatio
# n: 未税)
class CcPackageGood(models.Model):
# 模型名称
_name = 'cc.package.good'
......@@ -445,7 +463,8 @@ class CcShipPackage(models.Model):
'view_mode': 'form',
'res_model': 'add.exception.info.wizard',
'target': 'new',
'context': {'active_id': self.id, 'default_action_type': 'ship package'}
'context': {'active_id': self.ids, 'active_name': self[0]._name, 'default_ship_package_ids': self.ids,
'default_action_type': 'ship package'}
}
# 翻译
......
......@@ -15,8 +15,8 @@ class CCExceptionInfo(models.Model):
return obj
exception_code = fields.Char(string='Exception Code', default='/', required=True) # 异常编码*
reason = fields.Text(string='Reason', required=True, translate=True) # 异常原因
responsible_email = fields.Text(string='Responsible Email') # 异常接收负责人邮箱(可输入多个)
reason = fields.Text(string='Exception Reason', required=True, translate=True) # 异常原因
responsible_email = fields.Text(string='Exception Responsible Email') # 异常接收负责人邮箱(可输入多个)
# 异常编码增加唯一约束
_sql_constraints = [('exception_code_uniq', 'unique(exception_code)', 'The Exception Code must be unique.')]
from odoo import models, fields
class CCLastMileProvider(models.Model):
_name = 'cc.last.mile.provider'
_description = 'Last Mile Provider'
......@@ -7,8 +8,5 @@ class CCLastMileProvider(models.Model):
name = fields.Char(string='Courier Name', required=True) # 快递名称
abbreviation = fields.Char(string='Abbreviation', required=True) # 简称
tape_color_value = fields.Char(string='Tape Color Value') # 胶带色值
active = fields.Boolean(default=True) # 有效☑️
active = fields.Boolean('Active', default=True) # 有效☑️
matching_value = fields.Float(string='Matching Value') # 尾程快递匹配值
def __str__(self):
return f"LastMileProvider(courier_name={self.courier_name}, abbreviation={self.abbreviation}, tape_color_value={self.tape_color_value}, is_valid={self.is_valid}, matching_value={self.matching_value})"
\ No newline at end of file
......@@ -2,6 +2,7 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
batch_input_ship_package_status_wizard_group_user,batch_input_ship_package_status_wizard_group_user,ccs_base.model_batch_input_ship_package_status_wizard,base.group_user,1,1,1,1
export_bl_big_package_xlsx_wizard_group_user,export_bl_big_package_xlsx_wizard_group_user,ccs_base.model_export_bl_big_package_xlsx_wizard,base.group_user,1,1,1,1
associate_pallet_wizard_group_user,associate_pallet_wizard_group_user,ccs_base.model_associate_pallet_wizard,base.group_user,1,1,1,1
add_exception_info_wizard_group_user,add_exception_info_wizard_group_user,ccs_base.model_add_exception_info_wizard,base.group_user,1,1,1,1
......
odoo.define('ccs_base.order_link_pallet', function (require) {
"use strict";
var ListController = require('web.ListController');
ListController.include({
renderButtons: function ($node) {
this._super.apply(this, arguments);
if (this.$buttons) {
this.$buttons.on('click', '.o_list_order_link_pallet', this.order_link_pallet.bind(this));
}
},
order_link_pallet: function () {
var self = this;
self.do_action({
type: 'ir.actions.act_window',
name: _('Link Pallet'),
target: 'new',
res_model: 'associate.pallet.wizard',
views: [[false, 'form']],
context: {},
});
}
});
});
......@@ -13,28 +13,24 @@ export const BigPackageLinkPallet = {
this.http = useService('http');
this.fileInput = useRef('fileInput');
this.root = useRef("root");
this.isBigPackage = this.model.rootParams.resModel === "cc.big.package";
this.is_link = this.user.hasGroup("ccs_base.group_clearance_of_customs_manager");
// this.isBigPackage = this.model.rootParams.resModel === "cc.big.package";
// this.is_link = this.user.hasGroup("ccs_base.group_clearance_of_customs_manager");
// console.log('ccs isBigPackage:' + this.isBigPackage)
// console.log('ccs is_link:' + this.is_link)
},
displayLink() {
// 是大包的对象以及有清关清理的权限才显示按钮
return this.isBigPackage && this.is_link;
},
// displayLink() {
// console.log('ccs flag:' + this.isBigPackage && this.is_link)
// // 是大包的对象以及有清关清理的权限才显示按钮
// return this.isBigPackage && this.is_link;
// },
async onLinkPalletClick() {
// 点击按钮弹出关联托盘的向导
await this.actionService.doAction({
'name': _('Link Pallet'),
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'associate.pallet.wizard',
'target': 'new',
});
console.log('111111111')
// const action = await this.orm.call('cc.big.package', 'action_link_pallet', [""]);
// console.log('action:'+action)
// this.actionService.doAction(action);
const records = this.model.root.selection;
const recordIds = records.map((a) => a.resId);
const action = await this.orm.call('cc.big.package', 'action_link_pallet', [recordIds]);
this.actionService.doAction(action);
},
};
/** @odoo-module */
import { BigPackageLinkPallet } from '../mixins/link_pallet';
import {BigPackageLinkPallet} from '../mixins/link_pallet';
import { registry } from '@web/core/registry';
import { patch } from '@web/core/utils/patch';
import { useService } from '@web/core/utils/hooks';
import { listView } from "@web/views/list/list_view";
import {registry} from '@web/core/registry';
import {patch} from '@web/core/utils/patch';
import {useService} from '@web/core/utils/hooks';
import {listView} from "@web/views/list/list_view";
import { ListController } from "@web/views/list/list_controller";
import { ListRenderer } from "@web/views/list/list_renderer";
import {ListController} from "@web/views/list/list_controller";
const { onWillStart } = owl;
const {onWillStart} = owl;
export class BigPackageListController extends ListController {
setup() {
......@@ -19,8 +18,22 @@ export class BigPackageListController extends ListController {
this.actionService = useService('action');
this.rpc = useService("rpc");
this.user = useService("user");
this.isBigPackage = this.model.rootParams.resModel === "cc.big.package";
console.log('ccs isBigPackage:' + this.isBigPackage)
onWillStart(async () => {
this.is_link = await this.user.hasGroup("ccs_base.group_clearance_of_customs_manager");
console.log('ccs is_link:' + this.is_link)
});
}
displayLink() {
console.log('ccs flag:' + this.isBigPackage && this.is_link)
// 是大包的对象以及有清关清理的权限才显示按钮
return this.isBigPackage && this.is_link;
}
}
patch(BigPackageListController.prototype, 'big_package_list_controller_link_pallet', BigPackageLinkPallet);
registry.category('views').add('cc_big_package_tree', {
......
......@@ -12,6 +12,8 @@
<field name="ship_package_qty" string="Packages Qty"/>
<field name="goods_qty" string="Goods Qty"/>
<field name="is_cancel" string="Cancelled"/>
<field name="pallet_number"/>
<field name="pallet_usage_date"/>
<field name="tally_user_id" optional="show"/>
<field name="tally_time" optional="show"/>
<field name="tally_state" optional="show"/>
......@@ -25,7 +27,12 @@
<field name="arch" type="xml">
<form string="Big Package">
<header>
<!-- <button name="action_link_pallet" type="object"-->
<!-- string="Link Pallet"-->
<!-- groups="ccs_base.group_clearance_of_customs_manager"/>&lt;!&ndash; 关联托盘 &ndash;&gt;-->
<button name="action_package_exception_info" type="object"
string="Add Package Exception Information"
groups="ccs_base.group_clearance_of_customs_manager"/><!-- 添加包裹异常信息 -->
</header>
<sheet>
<div class="oe_button_box" name="button_box">
......@@ -55,7 +62,9 @@
<field name="big_package_no" string="Big Package No."/>
<field name="bl_id" string="Bill of Loading"/>
<field name="next_provider_name" string="Next Provider Name"/>
<field name="exception_info_ids" widget="many2many_tags"/>
<field name="pallet_number" readonly="1"/>
<field name="pallet_usage_date" readonly="1"/>
<field name="exception_info_ids" readonly="1" widget="many2many_tags"/>
<field name="is_cancel" string="Cancelled"/>
<field name="tally_state" readonly="1"/>
<field name="tally_user_id" readonly="1" options="{'no_create':True}"/>
......@@ -67,6 +76,11 @@
</group>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids"/>
<field name="activity_ids"/>
<field name="message_ids" options="{'post_refresh': 'recipients'}"/>
</div>
</form>
</field>
</record>
......@@ -116,15 +130,28 @@
<menuitem parent="" sequence="13" name="Big Package" id="menu_cc_big_package" action="action_cc_big_package"/>
<!-- <record id="action_cc_big_package_server" model="ir.actions.server">-->
<!-- <field name="name">全部航班</field>-->
<!-- <field name="model_id" ref="model_cc_big_package"/>-->
<!-- <field name="state">code</field>-->
<!-- <field name="code">-->
<!-- action = model.action_cc_big_package()-->
<!-- </field>-->
<!-- </record>-->
<record id="big_package_add_exception_info_server_action" model="ir.actions.server">
<field name="name">Batch Add Package Exception Information</field>
<field name="model_id" ref="model_cc_big_package"/>
<field name="binding_model_id" ref="model_cc_big_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.action_package_exception_info()
</field>
</record>
<!-- <record id="action_cc_big_package_server" model="ir.actions.server">-->
<!-- <field name="name">全部航班</field>-->
<!-- <field name="model_id" ref="model_cc_big_package"/>-->
<!-- <field name="state">code</field>-->
<!-- <field name="code">-->
<!-- action = model.action_cc_big_package()-->
<!-- </field>-->
<!-- </record>-->
<!-- <menuitem id="menu_cc_big_package" name="Big Package" action="action_cc_big_package_server" sequence="13"/>-->
<!-- <menuitem id="menu_cc_big_package" name="Big Package" action="action_cc_big_package_server" sequence="13"/>-->
</odoo>
\ No newline at end of file
......@@ -8,7 +8,9 @@
<group>
<field name="exception_code" readonly="1"/> <!-- 异常编码 -->
<field name="reason"/> <!-- 异常原因 -->
<field name="responsible_email"/> <!-- 异常接收负责人邮箱 -->
<field name="responsible_email"
placeholder="Multiple entries can be made, one email per line"/>
<!-- 异常接收负责人邮箱 可输入多个,一行一个邮箱 -->
</group>
</sheet>
</form>
......
......@@ -81,7 +81,7 @@
<header>
<button name="action_package_exception_info" type="object"
string="Add Package Exception Information"
groups="ccs_base.group_clearance_of_customs_manager"/><!-- 关联托盘 -->
groups="ccs_base.group_clearance_of_customs_manager"/><!-- 添加包裹异常信息 -->
<field name="state" string="Progress Status" widget="statusbar"/>
</header>
......@@ -98,7 +98,7 @@
<field name="big_package_id" string="Big Package"/>
<field name="bl_id" string="Bill of Loading"/>
<field name="next_provider_name" string="Next Provider Name"/>
<field name="exception_info_ids" widget="many2many_tags"/>
<field name="exception_info_ids" readonly="1" widget="many2many_tags"/>
<field name="process_time" readonly="1"/>
</group>
......@@ -310,15 +310,17 @@
<menuitem parent="" sequence="10" name="Ship Package" id="menu_cc_ship_package" action="action_cc_ship_package"/>
<!-- <record id="bl_line_translate_server_action" model="ir.actions.server">-->
<!-- <field name="name">Translate</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="code">-->
<!-- if records:-->
<!-- action = records.action_bl_line_translate()-->
<!-- </field>-->
<!-- </record>-->
<record id="ship_package_add_exception_info_server_action" model="ir.actions.server">
<field name="name">Batch Add Package Exception Information</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.action_package_exception_info()
</field>
</record>
</odoo>
\ No newline at end of file
......@@ -3,4 +3,5 @@
from . import batch_input_ship_package_statu_wizard
from . import export_bl_big_package_xlsx_wizard
from . import associate_pallet_wizard
from . import add_exception_info_wizard
from odoo import models, fields, api
# -*- coding: utf-8 -*-
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import logging
from odoo import models, fields, api, _
from odoo.exceptions import UserError
......@@ -12,16 +16,27 @@ class AddExceptionInfoWizard(models.TransientModel):
order_id = [self._context.get('active_id')]
return self.env[self._context.get('active_name')].browse(order_id)
def get_language(self):
"""
当前用户语言进行默认
:return:
"""
lang = self.env.user.lang
logging.info('lang:%s' % lang)
return lang
action_type = fields.Char(string='Action Type', hemp='ship package/big package')
exception_ids = fields.Many2many('exception.info', 'big_package_add_exception_rel', string='Exception Information',
big_package_ids = fields.Many2many('cc.big.package', 'exception_wizard_big_package_rel', string='Big Packages')
ship_package_ids = fields.Many2many('cc.ship.package', 'exception_wizard_ship_package_rel', string='Ship Packages')
exception_ids = fields.Many2many('cc.exception.info', 'big_package_add_exception_info_rel',
string='Exception Information',
required=True) # 异常信息(多选)
send_email = fields.Boolean(string='Send Email Notification', default=False) # 发送邮件通知
email_language = fields.Selection([
('zh', 'Chinese'),
('en', 'English')
], string='Email Language', default='zh') # 邮件语言
('zh_CN', 'Chinese'),
('en_US', 'English')
], string='Email Language', default=get_language) # 邮件语言
@api.multi
def confirm(self):
for record in self:
# 更新小包的异常信息
......@@ -29,25 +44,40 @@ class AddExceptionInfoWizard(models.TransientModel):
package_objs = self.get_order()
for package in package_objs:
package.exception_info_ids = [(6, 0, exception_objs.ids)] # 回写小包的异常信息
# 回写sns %s %s 操作了异常信息,异常原因:%s,%s发送%s邮件
body = _(
'%s at %s manipulated abnormal information, the reason for the abnormality is: %s, %s %s email') % (
self.env.user.name, fields.Datetime.now(),
'/'.join([exception.reason for exception in exception_objs]),
_('Sent') if record.send_email else _('Not Sent'),
(_('Chinese') if record.email_language == 'zh_CN' else _(
'English')) if record.send_email else '')
package.message_post(body=body)
# 发送邮件通知
if record.send_email:
self.send_email_notification(package)
self.send_email_notification(record, package_objs, exception_objs)
def send_email_notification(self, package, exception_objs):
def send_email_notification(self, wizard_obj, package_objs, exception_objs):
"""
发送对应语言的邮件 '/'.join([exception.reason for exception in exception_objs])
发送对应语言的邮件
"""
if self.email_language == 'zh':
template_id = self.env.ref('your_module.email_template_exception_notification')
if self.email_language == 'zh_CN':
template_id = self.env.ref('ccs_base.email_template_exception_notification')
else:
template_id = self.env.ref(
'your_module.email_template_exception_notification_en') # Assuming you have an English template
'ccs_base.email_template_exception_notification_en') # Assuming you have an English template
if template_id:
template_id.send_mail(package.id, force_send=True,
email_arr = []
for r in exception_objs:
if r.responsible_email:
email_arr += r.responsible_email.split('\n')
email_to = ','.join(set(email_arr)) # 取 异常信息里的邮箱
logging.info('email_to:%s' % email_to)
default_email_from = self.env["ir.config_parameter"].sudo().get_param("default_email_from")
template_id.send_mail(wizard_obj.id, force_send=True,
email_values={
'email_to': '',
'email_from': ''
'email_from': default_email_from,
'email_to': email_to
})
else:
raise UserError("Email template not found.")
raise UserError(_("Email template not found."))
......@@ -6,13 +6,16 @@
<form string="Add Exception Information">
<sheet>
<group>
<field name="exception_ids" widget="many2many_tags"/> <!-- 异常信息 -->
<field name="send_email"/> <!-- 实付发送邮件通知 -->
<field name="email_language"/> <!-- 邮件语言 -->
<field name="big_package_ids" widget="many2many_tags" readonly="1" invisible="1"/>
<field name="ship_package_ids" widget="many2many_tags" readonly="1" invisible="1"/>
<field name="exception_ids" widget="many2many_tags" required="1"/> <!-- 异常信息 -->
<field name="send_email"/> <!-- 发送邮件通知 -->
<field name="email_language"
attrs="{'required':[('send_email','=',True)]}"/> <!-- 邮件语言 -->
</group>
<footer>
<button string="Confirm" type="object" name="confirm" class="btn-primary"/>
<button string="Cancel" class="btn-secondary" special="cancel"/>
<button string="Close" special="cancel"/>
</footer>
</sheet>
</form>
......
# -*- coding: utf-8 -*-
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from datetime import date
from odoo import models, fields, api
from odoo import models, fields, api, _
from odoo.exceptions import Warning, ValidationError
class AssociatePalletWizard(models.TransientModel):
_name = 'associate.pallet.wizard'
_description = 'Associate Pallet Wizard'
usage_date = fields.Date(string='Usage Date', default=date.today) # 使用日期
pallet_number = fields.Char(string='Pallet Number', required=True) # 托盘号
def get_pallet_number(self):
"""
生成托盘号 从001开始,如果
:return: 新的托盘号
"""
try:
# 获取当前日期
current_date = fields.Date.today()
# 查找大包中最新的托盘号
latest_pallet = self.env['cc.big.package'].search([('pallet_usage_date', '=', str(current_date))],
order='pallet_number desc', limit=1)
# 生成新的托盘号
if latest_pallet:
new_pallet_number = int(latest_pallet.pallet_number) + 1
else:
new_pallet_number = 1 # 如果没有找到,默认从1开始
return str(new_pallet_number).zfill(3) # 返回格式化的托盘号
except Exception as e:
raise ValidationError(str(e))
usage_date = fields.Date(string='Usage Date', default=fields.Date.today) # 使用日期
pallet_number = fields.Char(string='Pallet Number', required=True, default=get_pallet_number) # 托盘号
big_package_numbers = fields.Text(string='Big Package Numbers') # 大包号(可输入多个)
def confirm(self):
for record in self:
if not record.pallet_number.isdigit():
raise ValidationError(_('The pallet number can only be entered as a number!')) # 托盘号只能输入数字!
if record.usage_date > fields.Date.today():
raise ValidationError(_('The usage date cannot be later than the current date!')) # 使用日期不能大于当前日期!
# 处理大包号
big_package_ids = record.big_package_numbers.splitlines()
for package_number in big_package_ids:
package = self.env['big.package'].search([('number', '=', package_number)], limit=1)
package = self.env['cc.big.package'].search([('big_package_no', '=', package_number)], limit=1)
if package:
# 更新托盘号和使用日期
# 回写大包的托盘号和使用日期
old_pallet_number = package.pallet_number
old_usage_date = package.usage_date
package.pallet_number = record.pallet_number
package.usage_date = record.usage_date
body = '%s %s更改了托盘号,由%s变更为%s,托盘使用日期%s变更为%s' % (
old_usage_date = package.pallet_usage_date
package.update_pallet_info(record.pallet_number, record.usage_date)
# %s %s更改了托盘号,由%s变更为%s,托盘使用日期%s变更为%s
if old_pallet_number:
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, record.pallet_number,
old_usage_date,
record.usage_date)
......
......@@ -6,13 +6,14 @@
<form string="Associate Pallet">
<sheet>
<group>
<field name="usage_date"/> <!-- 使用日期 -->
<field name="pallet_number"/> <!-- 托盘号 -->
<field name="big_package_numbers"/> <!-- 大包号 -->
<field name="usage_date" required="1"/> <!-- 使用日期 -->
<field name="pallet_number" required="1"/> <!-- 托盘号 -->
<field name="big_package_numbers" required="1"
placeholder="Multiple can be entered, one large package number per line"/> <!-- 大包号 可输入多个,一行一个大包号 -->
</group>
<footer>
<button string="Confirm" type="object" name="confirm" class="btn-primary"/>
<button string="Cancel" class="btn-secondary" special="cancel"/>
<button string="Close" special="cancel"/>
</footer>
</sheet>
</form>
......
<odoo>
<record id="email_template_exception_notification" model="mail.template">
<field name="name">Exception Notification</field>
<field name="model_id" ref="model_exception_info"/>
<field name="email_from">${(object.user_id.email or '')|safe}</field>
<field name="subject">大包(或小包)异常</field>
<field name="body_html">
<![CDATA[
<p>Dear all,</p>
<p>包裹:${object.big_package_numbers}(取大包号或小包物流订单号)</p>
<p>出现异常,异常原因:${object.reason}(若有多个,以/进行区分)</p>
<p>请知晓。</p>
<p>Best regards,</p>
<p>Your Team</p>
]]>
<field name="name">异常信息邮件</field>
<field name="model_id" ref="model_add_exception_info_wizard"/>
<field name="subject">{{ ('大包异常' if object.action_type == 'big package' else '小包异常') }}</field>
<field name="body_html" type="html">
<div style="margin: 0px; padding: 0px;">
<p style="margin: 0px; padding: 0px;">
您好
<br/>
<!-- 检查 big_package_ids 是否有值 -->
<t t-if="object.big_package_ids">
<t t-foreach="object.big_package_ids" t-as="big_package_id">
<div>包裹:
<t t-esc="big_package_id.big_package_no or ''"/>
</div>
</t>
</t>
<!-- 检查 ship_package_ids 是否有值 -->
<t t-if="object.ship_package_ids">
<t t-foreach="object.ship_package_ids" t-as="ship_package_id">
<div>包裹:
<t t-esc="ship_package_id.logistic_order_no or ''"/>
</div>
</t>
</t>
<div>出现异常,异常原因:
<t t-if="object.exception_ids">
<t t-esc="'/'.join([ex.reason for ex in object.exception_ids])"/>,请知晓。
</t>
<t t-if="not object.exception_ids">
无异常,请知晓。
</t>
</div>
</p>
</div>
</field>
<field name="body_html_en">
<![CDATA[
<p>Dear all,</p>
<p>Package: ${object.big_package_numbers} (取大包号或小包物流订单号)</p>
<p>Please know that there is an exception and the cause of the exception is: ${object.reason} (若有多个,以/进行区分).</p>
<p>Best regards,</p>
<p>Your Team</p>
]]>
</record>
<record id="email_template_exception_notification_en" model="mail.template">
<field name="name">Exception Notification</field>
<field name="model_id" ref="model_add_exception_info_wizard"/>
<field name="subject">{{ ('Big Package Exception' if object.action_type == 'big package' else 'Ship Package Exception') }}</field>
<field name="body_html" type="html">
<div style="margin: 0px; padding: 0px;">
<p style="margin: 0px; padding: 0px;">
Dear all
<br/>
<!-- 检查 big_package_ids 是否有值 -->
<t t-if="object.big_package_ids">
<t t-foreach="object.big_package_ids" t-as="big_package_id">
<div>Package:
<t t-esc="big_package_id.big_package_no or ''"/>
</div>
</t>
</t>
<!-- 检查 ship_package_ids 是否有值 -->
<t t-if="object.ship_package_ids">
<t t-foreach="object.ship_package_ids" t-as="ship_package_id">
<div>Package:
<t t-esc="ship_package_id.logistic_order_no or ''"/>
</div>
</t>
</t>
<div>Please know that there is an exception and the cause of the exception is
<t t-if="object.exception_ids">
<t t-esc="'/'.join([ex.reason for ex in object.exception_ids])"/>
</t>
<t t-if="not object.exception_ids">
No Exception
</t>
</div>
</p>
</div>
</field>
</record>
</odoo>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论