# -*- coding: utf-8 -*- from odoo import models, fields, api class GameCurrency(models.Model): _name = 'game.currency' _description = '游戏货币等级' _order = 'level asc' level = fields.Integer(string='等级', required=True) name = fields.Char(string='名称', required=True) desc = fields.Text(string='描述') rate = fields.Integer( string='兑换比例', default=1, help='多少单位本货币可兑换 1 单位下一等级货币。例如 100 墟铢 = 1 灵币,则墟铢的 rate 为 100。' ) @api.model def convert(self, amount, from_level, to_level): """按等级汇率将 amount 从 from_level 换算为 to_level 货币。 汇率方向:低等级 → 高等级 为除以 rate,高等级 → 低等级 为乘以 rate。 最高等级货币(元玺)的 rate 固定为 1,仅作占位。 """ if from_level == to_level: return amount currencies = self.search_read([], ['level', 'rate'], order='level asc') rate_map = {c['level']: c['rate'] or 1 for c in currencies} if from_level < to_level: # 低等级 → 高等级:逐级除以兑换比例 result = amount for lv in range(from_level, to_level): result = result / rate_map.get(lv, 1) return result else: # 高等级 → 低等级:逐级乘以兑换比例 result = amount for lv in range(to_level, from_level): result = result * rate_map.get(lv, 1) return result