下载地址:www.wenshushu.vip/download.ph…
在金融科技领域,模拟银行账户数据对于开发和测试场景非常有用。本文将介绍一个支持农业银行、工商银行、建设银行、邮政银行、招商银行和中国银行的余额生成器,采用Java(JAR)和Python双框架实现。
系统架构设计
该余额生成器具有以下特点:
- 支持六大主流银行账户模拟
- 生成符合各银行规范的虚拟账号
- 产生合理的余额变动记录
- 提供Java(JAR)和Python两种调用方式
public class BankBalanceGenerator {
public enum Bank {
AGRICULTURAL("农业银行", "6228"),
INDUSTRIAL("工商银行", "6222"),
CONSTRUCTION("建设银行", "6227"),
POSTAL("邮政银行", "6221"),
MERCHANTS("招商银行", "6225"),
CHINA("中国银行", "4563");
private final String name;
private final String prefix;
Bank(String name, String prefix) {
this.name = name;
this.prefix = prefix;
}
public String getName() {
return name;
}
public String getPrefix() {
return prefix;
}
}
private static final Random random = new Random();
public static String generateAccountNumber(Bank bank) {
StringBuilder sb = new StringBuilder(bank.getPrefix());
for (int i = 0; i < 12; i++) {
sb.append(random.nextInt(10));
}
return sb.toString();
}
public static double generateBalance() {
// 生成0-100万之间的随机余额,保留2位小数
return Math.round(random.nextDouble() * 1000000 * 100) / 100.0;
}
public static String generateBankCard(Bank bank) {
return generateAccountNumber(bank);
}
public static void main(String[] args) {
// 示例用法
Bank bank = Bank.AGRICULTURAL;
String account = generateAccountNumber(bank);
double balance = generateBalance();
System.out.println("银行: " + bank.getName());
System.out.println("账号: " + account);
System.out.println("余额: " + balance + "元");
}
}
from enum import Enum
class Bank(Enum):
AGRICULTURAL = ("农业银行", "6228")
INDUSTRIAL = ("工商银行", "6222")
CONSTRUCTION = ("建设银行", "6227")
POSTAL = ("邮政银行", "6221")
MERCHANTS = ("招商银行", "6225")
CHINA = ("中国银行", "4563")
def __init__(self, name, prefix):
self._name = name
self._prefix = prefix
@property
def name(self):
return self._name
@property
def prefix(self):
return self._prefix
def generate_account_number(bank):
"""生成符合银行规范的账号"""
account = bank.prefix
account += ''.join([str(random.randint(0, 9)) for _ in range(12)])
return account
def generate_balance():
"""生成随机余额"""
return round(random.uniform(0, 1000000), 2)
def generate_transaction_history(account, days=30):
"""生成交易记录"""
history = []
for day in range(days, 0, -1):
transactions = random.randint(0, 5)
for _ in range(transactions):
amount = round(random.uniform(-5000, 5000), 2)
history.append({
'date': f"{day}天前",
'amount': amount,
'type': '支出' if amount < 0 else '收入',
'balance': 0 # 将在后续计算
})
# 计算每次交易后的余额
current_balance = generate_balance()
for record in reversed(history):
current_balance -= record['amount']
record['balance'] = round(current_balance, 2)
return history
def get_bank_balance(bank_type):
"""获取银行余额信息"""
bank = Bank[bank_type.upper()]
account = generate_account_number(bank)
balance = generate_balance()
history = generate_transaction_history(account)
return {
'bank': bank.name,
'account': account,
'balance': balance,
'currency': 'CNY',
'history': history[-10:] # 返回最近10条记录
}
if __name__ == "__main__":
# 示例用法
from pprint import pprint
result = get_bank_balance("agricultural")
pprint(result)
import java.io.InputStreamReader;
public class PythonCaller {
public static String callPythonScript(String bankType) {
try {
String pythonScriptPath = "path/to/bank_generator.py";
ProcessBuilder pb = new ProcessBuilder("python", pythonScriptPath, bankType);
Process p = pb.start();
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
StringBuilder result = new StringBuilder();
while ((line = in.readLine()) != null) {
result.append(line);
}
return result.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}