Java获取外汇

前言

工作项目所负责的模块需要用到货币汇率,本篇仅个人记录。

创建数据库

DROP TABLE IF EXISTS `currency_rate`;
CREATE TABLE `currency_rate`  (`id` bigint(20) NOT NULL COMMENT 'id',`currency_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '货币编码',`currency_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '货币所属国家',`rate` decimal(24, 6) NULL DEFAULT NULL COMMENT '汇率',`create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建人',`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '货币汇率表' ROW_FORMAT = Dynamic;

 创建完数据库可以用自己项目的工具来生成代码,这里我就不贴代码了

业务代码

我的功能不是算钱的仅做校验,不用搞个实时的写个定时任务,每天定时获取一下就行,如果要做实时的建议使用聚合数据 API https://www.juhe.cn/docs/api/id/23 。

我这里用的:中国货币网-中国外汇交易中心主办 (chinamoney.com.cn) get请求方式、返回json类型。

 枚举类:
package com.sinosoft.springbootplus.lft.business.common.enums;import com.sinosoft.springbootplus.mybaitsextend.dict.interfaces.DictEnum;import java.util.HashMap;/*** 币种枚举*/
public enum CurrencyEnum implements DictEnum {USD("USD", "美元"),EUR("EUR", "欧元"),JPY("JPY", "日元"), // 注意这里特殊处理了JPYHKD("HKD", "港币"),GBP("GBP", "英镑"),AUD("AUD", "澳元"),NZD("NZD", "新西兰元"),SGD("SGD", "新加坡元"),CHF("CHF", "瑞士法郎"),CAD("CAD", "加元"),MOP("MOP", "澳门元"),MYR("MYR", "马来西亚林吉特"),RUB("RUB", "俄罗斯卢布"),ZAR("ZAR", "南非兰特"),KRW("KRW", "韩元"),AED("AED", "阿联酋迪拉姆"),SAR("SAR", "沙特里亚尔"),HUF("HUF", "匈牙利福林"),PLN("PLN", "波兰兹罗提"),DKK("DKK", "丹麦克朗"),SEK("SEK", "瑞典克朗"),NOK("NOK", "挪威克朗"),TRY("TRY", "土耳其里拉"),MXN("MXN", "墨西哥比索"),THB("THB", "泰铢"),CNY("CNY", "人民币");private final String value;private final String label;CurrencyEnum(String value, String label) {this.value = value;this.label = label;}private static HashMap<String, CurrencyEnum> data = new HashMap<>();static {for (CurrencyEnum currencyEnum : CurrencyEnum.values()) {data.put(currencyEnum.getValue(), currencyEnum);}}public static CurrencyEnum parse(String code) {if (data.containsKey(code)) {return data.get(code);}return null;}@Overridepublic String getValue() {return this.value;}@Overridepublic String getlable() {return this.label;}@Overridepublic String getDictName() {return "币种";}@Overridepublic String getDictDesc() {return "币种";}
}
application.yml
#货币汇率
hl:# 货币汇率接口地址url: https://www.chinamoney.com.cn/ags/ms/cm-u-bk-ccpr/CcprHisNew
 CurrencyRateConfig
package com.sinosoft.springbootplus.lft.business.dispatch.tourbank.config;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;/*** 货币汇率** @author gj*/
@Configuration
@ConfigurationProperties(prefix = "hl"
)
@Data
public class CurrencyRateConfig {private String url;
}
 定时任务方法:
@Transactional(rollbackFor = Exception.class)public void pullCurrencyRate(String text) throws Exception {log.info("开始获取货币汇率");//?startDate=2024-07-19&endDate=2024-07-19&pageNum=1&pageSize=30//String s = "https://www.chinamoney.com.cn/ags/ms/cm-u-bk-ccpr/CcprHisNew";String today = DateUtil.today();Map<String, Object> query = new HashMap<>(4);query.put("startDate", today);query.put("endDate", today);query.put("pageNum", "1");query.put("pageSize", "30");String response = OkHttpRequestUtils.doGet(currencyRateConfig.getUrl(), query);log.info("获取货币汇率返回结果:{}", response);CurrencyRateVo currencyRateVo = JSONObject.parseObject(response, CurrencyRateVo.class);List<CurrencyRateData> data = currencyRateVo.getData();if (data.get(0).getTotal() > 0) {//获取货币名称List<String> searchlist = data.get(0).getSearchlist();//货币汇率List<String> values = currencyRateVo.getRecords().get(0).getValues();List<CurrencyRate> currencyRateList = new ArrayList<>();CurrencyEnum[] enums = CurrencyEnum.values();//存入表中for (int i = 0; i <25; i++) {//货币名称String currencyName = searchlist.get(i);String rate = values.get(i);CurrencyRate currency = new CurrencyRate();currency.setCurrencyName(enums[i].getlable()).setCurrencyCode(enums[i].getValue());if (StringUtils.contains(currencyName, CurrencyEnum.USD.getValue())||StringUtils.contains(currencyName, CurrencyEnum.EUR.getValue())||StringUtils.contains(currencyName, CurrencyEnum.HKD.getValue())||StringUtils.contains(currencyName, CurrencyEnum.GBP.getValue())||StringUtils.contains(currencyName, CurrencyEnum.AUD.getValue())||StringUtils.contains(currencyName, CurrencyEnum.NZD.getValue())||StringUtils.contains(currencyName, CurrencyEnum.SGD.getValue())||StringUtils.contains(currencyName, CurrencyEnum.CHF.getValue())||StringUtils.contains(currencyName, CurrencyEnum.CAD.getValue())){currency.setRate(new BigDecimal(rate));} else if (StringUtils.contains(currencyName, CurrencyEnum.JPY.getValue())) {//日元currency.setRate(new BigDecimal(rate).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP));} else {currency.setRate(BigDecimal.ONE.divide(new BigDecimal(rate), 2, RoundingMode.HALF_UP));}currencyRateList.add(currency);}//删除数据currencyRateDomain.deleteAll();//存入数据mybatisBatchUtils.saveBatch(CurrencyRateMapper.class,CurrencyRate.class,currencyRateList);}log.info(currencyRateVo.toString());}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/386170.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小游戏之 三消(一)

首先设定一下 单个 方块 cell 类&#xff1a; 类定义和属性 init 方法 用于初始化方块&#xff0c;接收游戏实例、数据、宽度、道具类型和位置。 onWarning 方法 设置警告精灵的帧&#xff0c;并播放闪烁动作&#xff0c;用于显示方块的警告状态。 grow 方法 根据传入的方向…

21.发布确认模式-高级

问题 生产环境中由于一些不明原因&#xff0c;导致rabbitmq重启&#xff0c;在重启的期间生产者消息投递失败&#xff0c;导致消息丢失&#xff0c;需要手动处理恢复。那么如何才能进行rabbitmq的消息可靠性投递&#xff1f;特别是在极端的情况&#xff0c;rabbitmq集群不可用…

文件操作相关的精讲

目录&#xff1a; 思维导图 一. 文件定义 二. 文件的打开和关闭 三. 文件的顺序读写操作 四. 文件的随机读写操作 五. 文本文件和二进制文件 六. 文件读取结束的判断 七.文件缓冲区 思维导图&#xff1a; 一. 文件定义 1.文件定义 C语言中&#xff0c;文件是指一组相…

Vue3可媲美Element Plus Tree组件实战之移除节点

Element Plus Tree自定义节点内容示例中介绍了移除节点的用法&#xff0c;个人觉得作为提供给用户API&#xff0c;应该遵循迪米特法则&#xff0c;把功能实现的细节封装在组件内部&#xff0c;而提供给用户最简单的操作方式&#xff0c;同时在此基础上支持用户的扩展。 因此&a…

接口测试支持IDEA插件一键同步API、新增思维导图快速评审测试用例,MeterSphere开源持续测试工具v3.1.0版本发布

2024年7月29日&#xff0c;MeterSphere开源持续测试工具正式发布v3.1.0版本。 在这一版本中&#xff0c;接口测试方面&#xff0c;支持通过IDEA插件一键同步API至MeterSphere&#xff1b;测试管理方面&#xff0c;“测试用例”模块新增通过思维导图模式快捷评审测试用例。在“…

挑战房市预测领头羊:KNN vs. 决策树 vs. 线性回归

挑战房市预测领头羊&#xff08;KNN&#xff0c;决策树&#xff0c;线性回归&#xff09; 1. 介绍1.1 K最近邻&#xff08;KNN&#xff09;&#xff1a;与邻居的友谊1.1.1 KNN的基础1.1.2 KNN的运作机制1.1.3 KNN的优缺点 1.2 决策树&#xff1a;解码房价的逻辑树1.2.1 决策树的…

CSS实现文本溢出处理

1.单行文本溢出 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wid…

总结——TI_音频信号分析仪

一、简介 设备&#xff1a;MSPM0G3507 库&#xff1a;CMSIS-DSP TI 数据分析&#xff1a;FFT 软件&#xff1a;CCS CLion MATLAB 目的&#xff1a;对音频信号进行采样&#xff08;滤波偏置处理&#xff09;&#xff0c;通过FFT获取信号的频率成分&am…

【Vue3】watchEffect

【Vue3】watchEffect 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。本文…

了解Selenium中的WebElement

Selenium中到处都使用WebElement来执行各种操作。什么是WebElement&#xff1f;这篇文章将详细讨论WebElement。 Selenium中的WebElement是一个表示网站HTML元素的Java接口。HTML元素包含一个开始标记和一个结束标记&#xff0c;内容位于这两个标记之间。 HTML元素的重命名 …

C#插件 调用存储过程(输出参数类型)

存储过程 CREATE PROCEDURE [dbo].[GetSum]num1 INT,num2 INT,result INT OUTPUT AS BEGINselect result num1 num2 END C#代码 using Kingdee.BOS; using Kingdee.BOS.App.Data; using Kingdee.BOS.Core.Bill.PlugIn; using Kingdee.BOS.Util; using System; using System.…

放大电路总结

补充: 只有直流移动时才有Rbe动态等效电阻 从RsUs看进去,实际上不管接了什么东西都能够看成是一个Ri(输入电阻) Ri Ui/Ii Rb//Rbe Ui/Us Ri/(RiRs) Aus (Uo/Ui)*(Ui/Us) Au *Ri/(RiRs) 当前面是一个电压源的信号 我们就需要输入电阻更大 Ro--->输出电阻--->将…

基于FFmpeg和SDL的音视频解码播放的实现过程与相关细节

目录 1、视频播放器原理 2、FFMPEG解码 2.1 FFMPEG库 2.2、数据类型 2.3、解码 2.3.1、接口函数 2.3.2、解码流程 3、SDL播放 3.1、接口函数 3.2、视频播放 3.3、音频播放 4、音视频的同步 4.1、获取音频的播放时间戳 4.2、获取当前视频帧时间戳 4.3、获取视…

MongoDB教程(二十三):关于MongoDB自增机制

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、MongoD…

加密货币赋能跨境电商:PayPal供应链金融服务如何引领行业新趋势

跨境电商行业近年来呈现出爆发式增长&#xff0c;随着全球化贸易壁垒的降低和数字经济的快速发展&#xff0c;越来越多的商家和消费者跨越国界进行交易。根据eMarketer的数据&#xff0c;全球跨境电商交易额在2023年已超过4万亿美元&#xff0c;并预计在未来几年内仍将保持两位…

《Java初阶数据结构》----6.<优先级队列之PriorityQueue底层:堆>

前言 大家好&#xff0c;我目前在学习java。之前也学了一段时间&#xff0c;但是没有发布博客。时间过的真的很快。我会利用好这个暑假&#xff0c;来复习之前学过的内容&#xff0c;并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区…

ProxmoxPVE虚拟化平台--安装PVE虚拟机

Proxmox 虚拟机 Proxmox是一个基于Debian Linux和KVM的虚拟化平台&#xff0c;‌它提供了虚拟化的环境&#xff0c;‌允许用户在同一台物理机上运行多个虚拟机。‌Proxmox虚拟环境&#xff08;‌PVE&#xff09;‌是一个开源项目&#xff0c;‌由Proxmox Server Solutions Gmb…

重生之我当程序猿外包

第一章 个人介绍与收入历程 我出生于1999年&#xff0c;在大四下学期进入了一家互联网公司实习。当时的实习工资是3500元&#xff0c;公司还提供住宿。作为一名实习生&#xff0c;这个工资足够支付生活开销&#xff0c;每个月还能给父母转1000元&#xff0c;自己留2500元用来吃…

科普文:万字详解Kafka基本原理和应用

一、Kafka 简介 1. 消息引擎系统ABC Apache Kafka是一款开源的消息引擎系统&#xff0c;也是一个分布式流处理平台。除此之外&#xff0c;Kafka还能够被用作分布式存储系统&#xff08;极少&#xff09;。 A. 常见的两种消息引擎系统传输协议&#xff08;即用什么方式把消息…

探索 Milvus 存储系统:如何评估和优化 Milvus 存储性能

欢迎来到探索 Milvus 系列。Milvus 是一款支持水平扩展和具备出色性能的开源向量数据库。Milvus 的核心是其强大的存储系统&#xff0c;是数据持久化和存储的关键基础。该系统包括几个关键组成部分&#xff1a;元数据存储&#xff08;meta storage&#xff09;、消息存储&#…