银行卡模拟器修改余额,Delphi大模型计算

简介: Pascal开发的AI增强型余额计算模型,支持多账户管理、收支/转账交易、日期范围统计及JSON导入导出

下载地址:http://lanzou.com.cn/i4f9f0f07

image.png

Project Structure

Project : 余额计算模型AI版

Folder : jisuanmoxingaiban

Files : 26

Size : 91.3 KB

Generated: 2026-03-23 16:17:21

jisuanmoxingaiban/
├── README.md [188 B]
├── config/
│ ├── Adapter.json [688 B]
│ ├── Factory.properties [604 B]
│ ├── Scheduler.xml [1.5 KB]
│ └── application.properties [603 B]
├── documents/
│ ├── Dispatcher.py [4.5 KB]
│ ├── Proxy.ts [3.3 KB]
│ └── Util.py [5.7 KB]
├── features/
│ ├── Client.js [3.9 KB]
│ ├── Handler.py [5.5 KB]
│ └── Observer.js [2.8 KB]
├── implementation/
│ └── Service.py [4.8 KB]
├── inject/
│ ├── Helper.go [2.5 KB]
│ └── Resolver.go [3 KB]
├── package.json [688 B]
├── pom.xml [1.4 KB]
├── ports/
│ └── Provider.js [3.3 KB]
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ ├── Cache.java [6.7 KB]
│ │ │ ├── Controller.java [6.2 KB]
│ │ │ ├── Converter.java [7.5 KB]
│ │ │ ├── Manager.java [6.2 KB]
│ │ │ ├── Repository.java [6.4 KB]
│ │ │ └── Worker.java [4.6 KB]
│ │ └── resources/
│ └── test/
│ └── java/
└── token/
├── Parser.java [5.8 KB]
└── Pool.ts [2.8 KB]

pascal
unit BalanceSystem;

interface

uses
System.SysUtils, System.Classes, System.Generics.Collections, System.JSON;

type
// 交易类型枚举
TTransactionType = (ttIncome, ttExpense, ttTransfer);

// 交易记录类
TTransaction = class
private
FID: string;
FAmount: Double;
FType: TTransactionType;
FDescription: string;
FTransactionDate: TDateTime;
FCategory: string;
FCreateTime: TDateTime;
public
constructor Create;
property ID: string read FID write FID;
property Amount: Double read FAmount write FAmount;
property TransactionType: TTransactionType read FType write FType;
property Description: string read FDescription write FDescription;
property TransactionDate: TDateTime read FTransactionDate write FTransactionDate;
property Category: string read FCategory write FCategory;
property CreateTime: TDateTime read FCreateTime write FCreateTime;
end;

// 账户类
TAccount = class
private
FAccountID: string;
FAccountName: string;
FInitialBalance: Double;
FCurrentBalance: Double;
FTransactions: TObjectList;
function CalculateBalance: Double;
public
constructor Create;
destructor Destroy; override;
procedure AddTransaction(ATransaction: TTransaction);
procedure RemoveTransaction(ATransactionID: string);
function GetTransactionsByDateRange(AStartDate, AEndDate: TDateTime): TObjectList;
property AccountID: string read FAccountID write FAccountID;
property AccountName: string read FAccountName write FAccountName;
property InitialBalance: Double read FInitialBalance write FInitialBalance;
property CurrentBalance: Double read FCurrentBalance write FCurrentBalance;
end;

// 余额计算引擎
TBalanceCalculator = class
private
FAccounts: TObjectList;
FTotalBalance: Double;
procedure UpdateTotalBalance;
public
constructor Create;
destructor Destroy; override;
function AddAccount(AAccount: TAccount): Boolean;
function RemoveAccount(AAccountID: string): Boolean;
function GetAccountBalance(AAccountID: string): Double;
function GetTotalBalance: Double;
function CalculateBalanceByDateRange(AStartDate, AEndDate: TDateTime): Double;
function ExportToJSON: string;
procedure ImportFromJSON(AJSON: string);
property Accounts: TObjectList read FAccounts;
property TotalBalance: Double read FTotalBalance;
end;

implementation

{ TTransaction }

constructor TTransaction.Create;
begin
FID := TGuid.NewGuid.ToString;
FCreateTime := Now;
FTransactionDate := Now;
FAmount := 0;
FType := ttIncome;
FDescription := '';
FCategory := '';
end;

{ TAccount }

constructor TAccount.Create;
begin
FAccountID := TGuid.NewGuid.ToString;
FTransactions := TObjectList.Create(True);
FInitialBalance := 0;
FCurrentBalance := 0;
end;

destructor TAccount.Destroy;
begin
FTransactions.Free;
inherited;
end;

procedure TAccount.AddTransaction(ATransaction: TTransaction);
begin
if ATransaction = nil then
raise Exception.Create('交易记录不能为空');

FTransactions.Add(ATransaction);
FCurrentBalance := CalculateBalance;
end;

function TAccount.CalculateBalance: Double;
var
Transaction: TTransaction;
begin
Result := FInitialBalance;

for Transaction in FTransactions do
begin
case Transaction.TransactionType of
ttIncome: Result := Result + Transaction.Amount;
ttExpense: Result := Result - Transaction.Amount;
ttTransfer: ; // 转账在账户间处理
end;
end;
end;

procedure TAccount.RemoveTransaction(ATransactionID: string);
var
i: Integer;
begin
for i := 0 to FTransactions.Count - 1 do
begin
if FTransactions[i].ID = ATransactionID then
begin
FTransactions.Delete(i);
Break;
end;
end;
FCurrentBalance := CalculateBalance;
end;

function TAccount.GetTransactionsByDateRange(AStartDate, AEndDate: TDateTime): TObjectList;
var
Transaction: TTransaction;
begin
Result := TObjectList.Create(False);

for Transaction in FTransactions do
begin
if (Transaction.TransactionDate >= AStartDate) and
(Transaction.TransactionDate <= AEndDate) then
begin
Result.Add(Transaction);
end;
end;
end;

{ TBalanceCalculator }

constructor TBalanceCalculator.Create;
begin
FAccounts := TObjectList.Create(True);
FTotalBalance := 0;
end;

destructor TBalanceCalculator.Destroy;
begin
FAccounts.Free;
inherited;
end;

function TBalanceCalculator.AddAccount(AAccount: TAccount): Boolean;
begin
try
FAccounts.Add(AAccount);
UpdateTotalBalance;
Result := True;
except
Result := False;
end;
end;

function TBalanceCalculator.RemoveAccount(AAccountID: string): Boolean;
var
i: Integer;
begin
Result := False;
for i := 0 to FAccounts.Count - 1 do
begin
if FAccounts[i].AccountID = AAccountID then
begin
FAccounts.Delete(i);
UpdateTotalBalance;
Result := True;
Break;
end;
end;
end;

function TBalanceCalculator.GetAccountBalance(AAccountID: string): Double;
var
Account: TAccount;
begin
Result := 0;
for Account in FAccounts do
begin
if Account.AccountID = AAccountID then
begin
Result := Account.CurrentBalance;
Break;
end;
end;
end;

function TBalanceCalculator.GetTotalBalance: Double;
begin
UpdateTotalBalance;
Result := FTotalBalance;
end;

procedure TBalanceCalculator.UpdateTotalBalance;
var
Account: TAccount;
begin
FTotalBalance := 0;
for Account in FAccounts do
begin
FTotalBalance := FTotalBalance + Account.CurrentBalance;
end;
end;

function TBalanceCalculator.CalculateBalanceByDateRange(AStartDate, AEndDate: TDateTime): Double;
var
Account: TAccount;
Transactions: TObjectList;
Transaction: TTransaction;
begin
Result := 0;

for Account in FAccounts do
begin
Transactions := Account.GetTransactionsByDateRange(AStartDate, AEndDate);
try
for Transaction in Transactions do
begin
case Transaction.TransactionType of
ttIncome: Result := Result + Transaction.Amount;
ttExpense: Result := Result - Transaction.Amount;
end;
end;
finally
Transactions.Free;
end;
end;
end;

function TBalanceCalculator.ExportToJSON: string;
var
JSONObj: TJSONObject;
AccountsArray: TJSONArray;
AccountObj: TJSONObject;
TransArray: TJSONArray;
TransObj: TJSONObject;
Account: TAccount;
Transaction: TTransaction;
begin
JSONObj := TJSONObject.Create;
try
AccountsArray := TJSONArray.Create;

for Account in FAccounts do
begin
  AccountObj := TJSONObject.Create;
  AccountObj.AddPair('account_id', Account.AccountID);
  AccountObj.AddPair('account_name', Account.AccountName);
  AccountObj.AddPair('initial_balance', TJSONNumber.Create(Account.InitialBalance));
  AccountObj.AddPair('current_balance', TJSONNumber.Create(Account.CurrentBalance));

  TransArray := TJSONArray.Create;
  for Transaction in Account.FTransactions do
  begin
    TransObj := TJSONObject.Create;
    TransObj.AddPair('id', Transaction.ID);
    TransObj.AddPair('amount', TJSONNumber.Create(Transaction.Amount));
    TransObj.AddPair('type', Integer(Transaction.TransactionType).ToString);
    TransObj.AddPair('description', Transaction.Description);
    TransObj.AddPair('date', DateToISO8601(Transaction.TransactionDate));
    TransObj.AddPair('category', Transaction.Category);
    TransArray.Add(TransObj);
  end;

  AccountObj.AddPair('transactions', TransArray);
  AccountsArray.Add(AccountObj);
end;

JSONObj.AddPair('accounts', AccountsArray);
JSONObj.AddPair('total_balance', TJSONNumber.Create(FTotalBalance));
JSONObj.AddPair('export_time', DateToISO8601(Now));

Result := JSONObj.Format;

finally
JSONObj.Free;
end;
end;

procedure TBalanceCalculator.ImportFromJSON(AJSON: string);
var
JSONObj: TJSONObject;
AccountsArray: TJSONArray;
AccountObj: TJSONObject;
TransArray: TJSONArray;
TransObj: TJSONObject;
Account: TAccount;
Transaction: TTransaction;
i, j: Integer;
begin
JSONObj := TJSONObject.ParseJSONValue(AJSON) as TJSONObject;
if JSONObj = nil then
raise Exception.Create('无效的JSON格式');

try
// 清空现有数据
FAccounts.Clear;

if JSONObj.TryGetValue<TJSONArray>('accounts', AccountsArray) then
begin
  for i := 0 to AccountsArray.Count - 1 do
  begin
    AccountObj := AccountsArray.Items[i] as TJSONObject;

    Account := TAccount.Create;
    Account.AccountID := AccountObj.GetValue<string>('account_id');
    Account.AccountName := AccountObj.GetValue<string>('account_name');
    Account.InitialBalance := AccountObj.GetValue<Double>('initial_balance');

    if AccountObj.TryGetValue<TJSONArray>('transactions', TransArray) then
    begin
      for j := 0 to TransArray.Count - 1 do
      begin
        TransObj := TransArray.Items[j] as TJSONObject;

        Transaction := TTransaction.Create;
        Transaction.ID := TransObj.GetValue<string>('id');
        Transaction.Amount := TransObj.GetValue<Double>('amount');
        Transaction.TransactionType := TTransactionType(TransObj.GetValue<Integer>('type'));
        Transaction.Description := TransObj.GetValue<string>('description');
        Transaction.TransactionDate := ISO8601ToDate(TransObj.GetValue<string>('date'));
        Transaction.Category := TransObj.GetValue<string>('category');

        Account.AddTransaction(Transaction);
      end;
    end;

    FAccounts.Add(Account);
  end;
end;

UpdateTotalBalance;

finally
JSONObj.Free;
end;
end;

end.
使用示例
pascal
program BalanceSystemDemo;

{$APPTYPE CONSOLE}

uses
System.SysUtils,
BalanceSystem;

procedure DemoBalanceSystem;
var
Calculator: TBalanceCalculator;
Account1, Account2: TAccount;
Transaction1, Transaction2, Transaction3: TTransaction;
JSONData: string;
begin
try
Calculator := TBalanceCalculator.Create;
try
// 创建账户
Account1 := TAccount.Create;
Account1.AccountName := '工资卡';
Account1.InitialBalance := 5000;
Calculator.AddAccount(Account1);

  Account2 := TAccount.Create;
  Account2.AccountName := '储蓄卡';
  Account2.InitialBalance := 10000;
  Calculator.AddAccount(Account2);

  // 添加交易记录
  Transaction1 := TTransaction.Create;
  Transaction1.Amount := 8000;
  Transaction1.TransactionType := ttIncome;
  Transaction1.Description := '工资收入';
  Transaction1.Category := '工资';
  Account1.AddTransaction(Transaction1);

  Transaction2 := TTransaction.Create;
  Transaction2.Amount := 500;
  Transaction2.TransactionType := ttExpense;
  Transaction2.Description := '购物';
  Transaction2.Category := '生活';
  Account1.AddTransaction(Transaction2);

  Transaction3 := TTransaction.Create;
  Transaction3.Amount := 2000;
  Transaction3.TransactionType := ttExpense;
  Transaction3.Description := '房租';
  Transaction3.Category := '住房';
  Account2.AddTransaction(Transaction3);

  // 输出余额信息
  Writeln('=== 账户余额 ===');
  Writeln(Format('%s: %.2f', [Account1.AccountName, Calculator.GetAccountBalance(Account1.AccountID)]));
  Writeln(Format('%s: %.2f', [Account2.AccountName, Calculator.GetAccountBalance(Account2.AccountID)]));
  Writeln(Format('总余额: %.2f', [Calculator.GetTotalBalance]));

  // 导出JSON
  JSONData := Calculator.ExportToJSON;
  Writeln(#13#10'=== 导出数据 ===');
  Writeln(JSONData);

  // 演示日期范围查询
  Writeln(#13#10'=== 本月交易总额 ===');
  Writeln(Format('交易总额: %.2f', [Calculator.CalculateBalanceByDateRange(EncodeDate(2024, 1, 1), EncodeDate(2024, 1, 31))]));

finally
  Calculator.Free;
end;

except
on E: Exception do
Writeln('错误: ', E.Message);
end;

Readln;
end;

begin
DemoBalanceSystem;
end.

相关文章
|
2天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
10241 34
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
14天前
|
人工智能 安全 Linux
【OpenClaw保姆级图文教程】阿里云/本地部署集成模型Ollama/Qwen3.5/百炼 API 步骤流程及避坑指南
2026年,AI代理工具的部署逻辑已从“单一云端依赖”转向“云端+本地双轨模式”。OpenClaw(曾用名Clawdbot)作为开源AI代理框架,既支持对接阿里云百炼等云端免费API,也能通过Ollama部署本地大模型,完美解决两类核心需求:一是担心云端API泄露核心数据的隐私安全诉求;二是频繁调用导致token消耗过高的成本控制需求。
5926 14
|
22天前
|
人工智能 JavaScript Ubuntu
5分钟上手龙虾AI!OpenClaw部署(阿里云+本地)+ 免费多模型配置保姆级教程(MiniMax、Claude、阿里云百炼)
OpenClaw(昵称“龙虾AI”)作为2026年热门的开源个人AI助手,由PSPDFKit创始人Peter Steinberger开发,核心优势在于“真正执行任务”——不仅能聊天互动,还能自动处理邮件、管理日程、订机票、写代码等,且所有数据本地处理,隐私完全可控。它支持接入MiniMax、Claude、GPT等多类大模型,兼容微信、Telegram、飞书等主流聊天工具,搭配100+可扩展技能,成为兼顾实用性与隐私性的AI工具首选。
23186 120
|
8天前
|
人工智能 JavaScript API
解放双手!OpenClaw Agent Browser全攻略(阿里云+本地部署+免费API+网页自动化场景落地)
“让AI聊聊天、写代码不难,难的是让它自己打开网页、填表单、查数据”——2026年,无数OpenClaw用户被这个痛点困扰。参考文章直击核心:当AI只能“纸上谈兵”,无法实际操控浏览器,就永远成不了真正的“数字员工”。而Agent Browser技能的出现,彻底打破了这一壁垒——它给OpenClaw装上“上网的手和眼睛”,让AI能像真人一样打开网页、点击按钮、填写表单、提取数据,24小时不间断完成网页自动化任务。
1927 4

热门文章

最新文章