Я сделал приложение, используя валютный плагин для представления денег, он представляет 3 класса домена, Money
, и ExchangeRate
.Лучший способ помочь производительности плагинов валют при выполнении вычислений
вот класс домена Money
:
Просто ради проще объяснить, давайте просто скажем, что у меня есть 2 классов: SalesOrder
и OrderItem
.
SalesOrder:
class SalesOrder {
static hasMany = [orderItems:OrderItem]
List<OrderItem> orderItems
String customer
def getTotal(){
Money total = Money.getInstance("0 USD")
orderItems.each{
total+=it.getTotal()
}
total
}
}
OrderItem:
class OrderItem{
static belongsTo = [salesOrder:SalesOrder]
static embedded = ['price']
Money price
int quantity
String itemName
def getTotal(){
price * quantity
}
}
Цель состоит в том, чтобы получить в общей сложности для каждого SalesOrder
, так как я не думаю, что я могу написать запрос для Money
для расчета общего
(потому что exchangeRate и валюта участвуют в каждом объекте Money):
У меня может быть одна сумма денег, которая определяется как «сумма: 25, валюта: доллар США» и другая «сумма: 500, валюта: JPY», если я просто запрошу сумму, результат будет выключен, так как он не будет конвертировать валюту в одну и ту же.
, я был вынужден бежать петли через каждый OrderItem
в SalesOrder
, как вы можете себе представить, выступление было настолько плохо, что мне потребовалось около 18 секунд, чтобы получить в общей сложности в течение 30 SalesOrder
с. (Я смог снизить это до 9 секунд после добавления «orderItems fetch:« join »в статическом сопоставлении SalesOrder, но еще 9 секунд все еще слишком много)
Этот плагин не очень популярен, t найти случай, когда любой, кто сталкивался с такими вещами, поэтому, если у вас есть опыт в решении этой проблемы, пожалуйста, помогите мне.
Thanks
, потому что валюта/обменный курс участвуют, не все деньги сохраняются в той же валюте, преобразование должно быть выполнено для каждого денежного объекта, который имеет другую валюту. Я мог бы сохранить один «25 долларов США» и один «5000 JPY», если вы просто запросите сумму, общая сумма будет отключена на много. – 16dots
ОК, я понял. Я бы добавил новое поле для хранения цены в одной валюте, скажем в '$' и сохранил все другие валютные значения, пересчитав в '$'. Таким образом, вы всегда можете получить сумму в долларах и перевести ее в целевую валюту. Это не очень прямолинейно, но у вас едва ли есть другой вариант здесь – injecteer