在跨境电商业务处理过程中,经常需要对币种进行转换,之后参与订单金额的精确换算。对于这种运算重要、频繁,并且准确性与性能要求都比较高,这对于研发人员是一种挑战。下面我将结合实际,提供币种转换方案,供各位参考使用。
开门见山,我先把输出的目标表展示如下,有了该对应关系表,我们就可以不经过计算快速查出需要转换的币种汇率。为了得到该迪卡尔汇率表,需要下面三步曲。
第一步,需要定时从阿里云中获取到每天的浮动汇率,存储到mysql表中。表结构如下(说明:脱敏后)
CREATE TABLE `exchange_rate` (
`bzbm` varchar(10) NOT NULL COMMENT '币种编码',
`hbmc` varchar(100) DEFAULT NULL COMMENT '货币名称',
`zsje` decimal(18,4) DEFAULT NULL COMMENT '当前折算金额',
`rmb` decimal(18,4) DEFAULT NULL COMMENT '当前人民币金额',
`hl` decimal(18,4) DEFAULT NULL COMMENT '汇率,计算公式,ZSJE÷RMB,保留四位小数',
`rq` varchar(20) DEFAULT NULL COMMENT '日期',
)
第二步,关键所在,编写视图脚本。
SELECT
b.rq,
b.bzbm,
SUM(
IF
(
b.`bzbm` = 'USD',
ROUND( b.rmb * b.hl / b.zsje, 2 ),
(
SELECT
ROUND( b.rmb * b.hl / t.zsje, 2 )
FROM
exchange_rate t
WHERE
t.rq = '2021-01-15'
AND t.bzbm = 'USD'
)
)
) AS 'USD',
SUM(
IF
(
b.`bzbm` = 'GBP',
ROUND( b.rmb * b.hl / b.zsje, 2 ),
(
SELECT
ROUND( b.rmb * b.hl / t.zsje, 2 )
FROM
exchange_rate t
WHERE
t.rq = '2021-01-15'
AND t.bzbm = 'GBP'
)
)
) AS 'GBP',
SUM(
IF
(
b.`bzbm` = 'JPY',
ROUND( b.rmb * b.hl / b.zsje, 2 ),
(
SELECT
ROUND( b.rmb * b.hl / t.zsje, 2 )
FROM
exchange_rate t
WHERE
t.rq = '2021-01-15'
AND t.bzbm = 'JPY'
)
)
) AS 'JPY',
SUM(
IF
(
b.`bzbm` = 'CAD',
ROUND( b.rmb * b.hl / b.zsje, 2 ),
(
SELECT
ROUND( b.rmb * b.hl / t.zsje, 2 )
FROM
exchange_rate t
WHERE
t.rq = '2021-01-15'
AND t.bzbm = 'CAD'
)
)
) AS 'CAD',
SUM(
IF
(
b.`bzbm` = 'EUR',
ROUND( b.rmb * b.hl / b.zsje, 2 ),
(
SELECT
ROUND( b.rmb * b.hl / t.zsje, 2 )
FROM
exchange_rate t
WHERE
t.rq = '2021-01-15'
AND t.bzbm = 'EUR'
)
)
) AS 'EUR'
FROM
exchange_rate b
WHERE
b.rq = '2021-01-15'
GROUP BY
bzbm
第三步、把redis与springboot结合,每次都从缓存中获取货币对应的汇率。