一、详细项目功能分析

1.功能菜单界面

通过ATMUISupport类实现系统的取款、存款、余额查询、转账、密码修改等界面显示功能。

代码如下:

private static void drawingBizUI() {System.out.println("\n\n");System.out.println("□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□");if(SystemEnter.atmSys.getTotal().doubleValue()>=SystemEnter.atmSys.getSingleWithdrawMin().doubleValue()){System.out.println("□□□□□ 取款请输入 1 □□□□□□□□□□□□□□□□□□□□□□□□□");}System.out.println("□□□□□ 存款请输入 2 □□□□□□□□□□□□□□□□□□□□□□□□□");System.out.println("□□□□□ 转账请输入 3 □□□□□□□□□□□□□□□□□□□□□□□□□");System.out.println("□□□□□ 查询请输入 4 □□□□□□□□□□□□□□□□□□□□□□□□□");System.out.println("□□□□□ 修改密码请输入 5 □□□□□□□□□□□□□□□□□□□□□□");System.out.println("□□□□□ 退卡请输入 6 □□□□□□□□□□□□□□□□□□□□□□□□□");System.out.println("□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□");System.out.println("---------   请按以上提示输入回车继续    ---------");String action = BasicTools.getScanner().next();confimOperation(action);//调用确认用户选择项方法}

具体实现结果如下:

2.账号密码验证界面

(1)账号的有效性的实现: 通过对AccountInfoConntrol类中的validdateAccountInfo()方法的调用实现快速准确识别用户的银行卡是否有效并给出相应的提示。

(2)密码的正确性的实现:通过对AccountInfoConntrol类中的validatePassword()方法的调用来实现密码验证该银行卡的密码与输入的的密码的一致性;如果密码输入错误则应提示重新输入密码,如果用户连续输入三次以上密码错误则对用户的银行卡实施锁定,锁定后的银行卡不能进行任何交易,必需持卡人持本人身份证到银行营业厅解除密码锁定并在锁定时给出系统提示“对不起,三次验证密码错误,此卡已被锁定,请持本人身份证到本行营业厅解除锁定”。

银行卡锁定代码:

SystemEnter.atmSys.modifyPasswordInputErrorNum();System.out.println("##########################################");System.out.println("##########    系统提示 密码不正确        ###########");System.out.println("##########################################");if(SystemEnter.atmSys.getAccount().getPasswordEnterErrorNumber() == 2){System.err.println("##########################################");System.err.println("#########  您已经2次输入密码错误      ############");System.err.println("#########  如果3次输入错误将锁定此卡     ##########");System.err.println("##########################################");continue;}if(SystemEnter.atmSys.getAccount().getPasswordEnterErrorNumber() == 3){System.err.println("##########################################");System.err.println("#########  您已经3次输入密码不错误      ###########");System.err.println("#########  此卡已被冻结 如果是您本人    ###########");System.err.println("########  请持有效证件到本行柜台办理    ###########");System.err.println("##########################################");/* 调用方法,锁定银行卡*/controller.lockAccount(SystemEnter.atmSys.getAccount().getAccount());flag = 1;break;}
lockAccount()方法的代码:
public int lockAccount(String cardNumber) throws Exception {int res = 0;String sql="UPDATE ACCOUNT_INFO SET FROZEN = 1 WHERE ACCOUNT = ?";Connection conn = null;PreparedStatement ps = null;try {conn = DataSourceManager.getConnection();ps = conn.prepareStatement(sql);//设置参数ps.setString(1, cardNumber);//执行查询语句res = ps.executeUpdate();} catch (SQLException throwables) {throwables.printStackTrace();}finally {DataSourceManager.close(ps);DataSourceManager.close(conn);}return res;}

密码的有效性代码:

if(!BasicTools.validDig(password) || password.length() != 6){// 密码格式不正确System.out.println("*********** 系统提示:密码必需是6位数字  *****************");continue;// 结束本次循环}

具体实现结果如下:

3.取款界面

(1)取款业务的实现:通过对AccountInfoDaoImp类中的countEverydayDrawingSum()方法的调用实现对该银行卡的取款业务

取款业务代码:

public Map<String, BigDecimal> countEverydayDrawingSum(String cardNumber) {Map<String, BigDecimal> map=new HashMap<String, BigDecimal>();String sql = "SELECT SUM(AMOUNT) everydayDrawingSum,COUNT(AMOUNT) everydayDrawingNum "+ "FROM BUSINESS "+ "WHERE ACCOUNTID = ? AND BUSID ='OUTCODE200' ";Connection conn = null;PreparedStatement ps = null;ResultSet set = null;try {conn = DataSourceManager.getConnection();ps = conn.prepareStatement(sql);//设置参数ps.setString(1, cardNumber);//执行查询语句set = ps.executeQuery();while (set.next()){BigDecimal bd=set.getBigDecimal("everydayDrawingSum");map.put("everydayDrawingSum",bd==null?new BigDecimal(0):bd);map.put("everydayDrawingNum",set.getBigDecimal("everydayDrawingNum"));}}catch (Exception e){e.printStackTrace();}finally {DataSourceManager.close(set);DataSourceManager.close(ps);DataSourceManager.close(conn);}return map;}

(2)余额验证功能:用户每次单笔取款操作时系统应检查用户余额去除实际用户取款后的金额是否低于卡中最低限额,如果低于最低限额则不执行本次取款操作并应提示用户余额不足。

代码实现:

// 账户余额不足
if(account.getBalance().subtract(money.add(new BigDecimal(poundage))).doubleValue() < 1)
{
mapRes.put("res",new Double(-1));
return mapRes;
}

(3)金额限制功能实现:取款界面应提供用户输入框接收用户输入的取款金额;取款金额应不大于每次单笔交易的最高限额并且累计不能超出24小时的最高限额,取款金额限定整百数额,不支持十位金额取款操作。

// 累计取款总额超出ATM最高限制
if(new BigDecimal(sum).add(money).doubleValue()
{
SystemEnter.atmSys.getEverydayWithdrawMax().doubleValue())
{
mapRes.put("res",new Double(-2));
return mapRes;
}
// 累计取款次数已超出ATM最高限制
if(num == SystemEnter.atmSys.getWithdrawFrequencyMax().intValue())
{
mapRes.put("res",new Double(-3));
return mapRes;
}
// 累计取款总和超出银行卡每日取款累计和上限
if(sum + money.doubleValue() > account.getTodayOutMax().doubleValue() )
{
mapRes.put("res",new Double(-4));
return mapRes;
}
//验证取款金额是否数字
if(!BasicTools.validDig(money)){
System.err.println("########## 系统提示 必需是数字 ###########");
System.err.println("##### 继续取款请输入1 返回主菜单请输入2 #####");
if("1".equals(BasicTools.getScanner().next())){continue;//结束本次循环
}
break;
}
//验证取款金额是否大于余额
else if(Integer.parseInt(money)%100!=0){
System.err.println("########## 系统提示 取款金额必需是整百数字 ###########");
System.err.println("##### 继续取款请输入1 返回主菜单请输入2 #####");
if("1".equals(BasicTools.getScanner().next())){continue;//结束本次循环
}break;
}

具体实现结果:

4.余额查询界面

系统应提供余额查询功能,在用户选择查询余额操作后应正确显示用户卡内的余额。

代码实现:

public AccountInfo BusinessQuery(String account) {String sql = "SELECT * FROM ACCOUNT_INFO WHERE ACCOUNT = ?";AccountInfo account1=null;Connection conn = null;PreparedStatement ps = null;ResultSet set = null;try {conn = DataSourceManager.getConnection();ps = conn.prepareStatement(sql);//设置参数ps.setString(1, account);//执行查询语句set = ps.executeQuery();while (set.next()){account1=new AccountInfo();account1.setAccount(set.getString("ACCOUNT"));account1.setId(set.getString("ID"));account1.setPassword(set.getString("PASSWORD"));account1.setAccountType(set.getShort("ACCOUNT_TYPE"));account1.setBalance(set.getBigDecimal("BALANCE"));account1.setTodayOutMax(set.getBigDecimal("TODAY_OUT_MAX"));account1.setTodayTaMax(set.getBigDecimal("TODAY_TA_MAX"));account1.setUserId(set.getString("USERID"));account1.setBankId(set.getString("BANKID"));account1.setFrozen(set.getShort("FROZEN"));account1.setLocation(set.getString("LOCATION"));account1.getCreateTime(set.getDate("CREATETIME"));}}catch (Exception e){e.printStackTrace();}finally {DataSourceManager.close(set);DataSourceManager.close(ps);DataSourceManager.close(conn);}return account1;}

实现结果:

5.转账功能界面

转账功能:通过对AccountInfoDaoImp类中的TransferAccounts()方法的调用实现从本卡转到本行其他账户或其它行账户的交易功能

实现代码:

public int TransferAccounts(String account, BigDecimal amount, double serviceCharge,String account2) {int res = 0;/* 更新账户余额SQL*/String sql0 = "UPDATE ACCOUNT_INFO SET BALANCE = BALANCE-?-? WHERE ACCOUNT = ?";/* 添加交易记录SQL*/String sql2 = "INSERT INTO BUSINESS2 (ID,ACCOUNTID1,BUSID1,AMOUNT1,"+"ACCOUNTID2,BUSID2,AMOUNT2,POUNDAGE,DESCRIPTION)"+"VALUES(?,?,?,?,?,?,?,?,?)";/* 更新ATM余额SQL*/String sql3 = "UPDATE ATM SET TOTAL = TOTAL - ? WHERE ID = ?";/* 更新账户余额SQL*/String sql4 = "UPDATE ACCOUNT_INFO SET BALANCE = BALANCE+? WHERE ACCOUNT = ?";Connection conn = null;PreparedStatement ps = null;PreparedStatement ps2 = null;PreparedStatement ps3 = null;PreparedStatement ps4 = null;try {conn = DataSourceManager.getConnection();conn.setAutoCommit(false);// 关闭自动提交ps = conn.prepareStatement(sql0);ps.setBigDecimal(1,amount);ps.setDouble(2,serviceCharge);ps.setString(3, account2);res += ps.executeUpdate();ps2 = conn.prepareStatement(sql2);ps2.setString(1, UUID.randomUUID().toString());ps2.setString(2,account2);ps2.setString(3,"OUTCODE200");ps2.setBigDecimal(4, amount);ps2.setString(5,account);ps2.setString(6,"INCODE200");ps2.setBigDecimal(7, amount);ps2.setDouble(8,serviceCharge);ps2.setString(9,"ATM"+account2+"向"+account+"转账");res += ps2.executeUpdate();ps3 = conn.prepareStatement(sql3);ps3.setBigDecimal(1, amount);ps3.setString(2, SystemEnter.atmSys.getId());res += ps3.executeUpdate();ps = conn.prepareStatement(sql4);ps.setBigDecimal(1,amount);ps.setString(2, account);res += ps.executeUpdate();} catch (Exception e) {try {System.out.println("撤销事务");conn.rollback(); // 撤销事务操作} catch (SQLException e1) {e1.printStackTrace();}e.printStackTrace();}finally{DataSourceManager.close(ps);DataSourceManager.close(ps2);DataSourceManager.close(conn);}return res;}

(2)验证功能:转出金额是否符合银行规定(最高转账金额,余额是否充足)。

代码部分:

//转账的银行卡1余额不足
if(SystemEnter.atmSys.getAccount().getBalance().subtract((money).add(new BigDecimal(poundage))).doubleValue() < 1){
mapRes.put("res",new Double(-1));
return mapRes;
}if(new BigDecimal(sum).add(money).doubleValue() >
SystemEnter.atmSys.getEverydayTurnOutMax().doubleValue()){
mapRes.put("res",new Double(-2));
return mapRes;
}
if(num == SystemEnter.atmSys.getWithdrawFrequencyMax().intValue()){
mapRes.put("res",new Double(-3));
return mapRes;
}
if(sum + money.doubleValue() > account.getTodayTaMax().doubleValue() ){
mapRes.put("res",new Double(-4));
return mapRes;
}
if (res.get("res").intValue()==4){
System.out.println("☆☆☆☆☆☆☆☆ 恭喜您,本次业务交易成功! ☆☆☆☆☆☆☆☆");
System.out.println("☆☆☆☆☆☆☆ 本次转账 "+money+"元☆☆☆☆☆☆☆☆");
SystemEnter.atmSys.modifyAccountBalance(new BigDecimal(money),-1);
System.out.println("ATM当前余额"+SystemEnter.atmSys.getTotal().doubleValue());
System.out.println("银行卡当前余额"+(SystemEnter.atmSys.getAccount().getBalance().doubleValue()-res.get("poundage")));
}else if (res.get("res").intValue()==-1){
System.out.println("☆☆☆☆☆☆☆☆ 本次操作时跨行转账,收取手续费后余额不足! ☆☆☆☆☆☆☆☆");
}else if (res.get("res").intValue()==-2){
System.out.println("☆☆☆☆☆☆☆☆ 每日累计转账总额已超出ATM最高上限☆☆☆☆☆☆☆☆");
}else if (res.get("res").intValue()==-3){
System.out.println("☆☆☆☆☆☆☆☆ 每日累计次数已超过ATM最高限制 ☆☆☆☆☆☆☆☆");
}else if (res.get("res").intValue()==-4){
System.out.println("☆☆☆☆☆☆☆☆ 每日累计转账总和超出最高限制 ☆☆☆☆☆☆☆☆");
}

实现结果:

6.修改密码界面

        (1)修改密码功能:通过对AccountInfoDaoImp类中的TransferAccounts()方法的调用实现密码修改。

public int ModifyPasswordy(String account, String password1) {int res = 0;String sql="UPDATE ACCOUNT_INFO SET PASSWORD = ? WHERE ACCOUNT = ?";Connection conn = null;PreparedStatement ps = null;try {conn = DataSourceManager.getConnection();ps = conn.prepareStatement(sql);//设置参数ps.setString(1, password1);//执行查询语句ps.setString(2, account);//执行查询语句res = ps.executeUpdate();} catch (SQLException throwables) {throwables.printStackTrace();}finally {DataSourceManager.close(ps);DataSourceManager.close(conn);}return res;}

(2) 验证密码格式功能:

System.out.println("************ 请输入新的6位数字密码 **************");
String password2 =BasicTools.getScanner().next();
if(!BasicTools.validDig(password2) || password2.length() != 6){// 密码格式不正确
System.out.println("*********** 系统提示:密码必需是6位数字  *****************");
continue;// 结束本次循环
}else{
if(password1.equals(password2)){
int map=controller.ModifyPasswordy(SystemEnter.atmSys.getAccount().getAccount(),password1);
if(map==1){
System.out.println("☆☆☆☆☆☆☆☆ 恭喜您,本次密码修改成功! ☆☆☆☆☆☆☆☆");
}
}else {
System.out.println("*********** 系统提示:两次密码输入不一致  *****************");
continue;// 结束本次循环
}
}

实现结果:

二、代码实现

SystemEnter.java

package atm.bank;import atm.bank.controller.bank.ATMController;
import atm.bank.domain.ATM;
import atm.bank.domain.Bank;
import atm.bank.ui.ATMUISupport;
import atm.bank.util.tools.BasicTools;import java.util.Scanner;public class SystemEnter {public static ATM atmSys;public static void main(String[] args) {if(atmSys==null)instanceATM();ATMUISupport.drawingWelcomeUI();/*测试BigDecimalBigDecimal bigDec=new BigDecimal("123.62");BigDecimal bigDec2=new BigDecimal("116.93");BigDecimal res=bigDec.subtract(bigDec2);System.out.println(res.doubleValue());System.out.println(123.32-116.93);*/}private static void instanceATM() {Scanner input= BasicTools.getScanner();System.out.println("请输入测试应用的ATM编号");String atmId=input.next();Bank bank=null;try {ATMController atmController=new ATMController();atmSys=atmController.loadATMById(atmId);bank=atmController.loadBankById(atmSys.getBankId());atmSys.setBank(bank);} catch (Exception e) {e.printStackTrace();}}
}

domain包下的类:

AccountInfo.java

package atm.bank.domain;import java.math.BigDecimal;
import java.util.Date;
/*** 用户账户(银行卡)实体类,* @author Administrator**/
public class AccountInfo {private String id;//主键private String account;//账号private String password;//密码private int accountType;// 账号类型 0= 存折 1=银行卡private BigDecimal balance;//余额private BigDecimal todayOutMax;//每日累计取款最高限额private BigDecimal todayTaMax;//每日累计转账最高限额private String userId;//用户idprivate String bankId;//银行idprivate int frozen; // 账号是否被冻结private String location;//开户所在地private Date createTime;//开户时间private int passwordEnterErrorNumber; // 密码输入错误次数记录(非持久化字段)public String getId() {return id;}public void setId(String id) {this.id = id;}public String getAccount() {return account;}public void setAccount(String account) {this.account = account;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getAccountType() {return accountType;}public void setAccountType(int accountType) {this.accountType = accountType;}public BigDecimal getBalance() {return balance;}public void setBalance(BigDecimal balance) {this.balance = balance;}public BigDecimal getTodayOutMax() {return todayOutMax;}public void setTodayOutMax(BigDecimal todayOutMax) {this.todayOutMax = todayOutMax;}public BigDecimal getTodayTaMax() {return todayTaMax;}public void setTodayTaMax(BigDecimal todayTaMax) {this.todayTaMax = todayTaMax;}public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getBankId() {return bankId;}public void setBankId(String bankId) {this.bankId = bankId;}public int getFrozen() {return frozen;}public void setFrozen(int frozen) {this.frozen = frozen;}public String getLocation() {return location;}public void setLocation(String location) {this.location = location;}public Date getCreateTime(java.sql.Date createtime) {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public int getPasswordEnterErrorNumber() {return passwordEnterErrorNumber;}public void setPasswordEnterErrorNumber(int passwordEnterErrorNumber) {this.passwordEnterErrorNumber = passwordEnterErrorNumber;}}

ATM.java

package atm.bank.domain;import java.math.BigDecimal;
/*** ATM 取款机系统* @author Administrator**/
public class ATM {private String id;// 主键private String code;//ATM编号private String bankId;//银行idprivate int state=1;//Atm 系统状态private BigDecimal total;//Atm当前货币金额private BigDecimal singleDepositMin;//单次存款最低限额private BigDecimal singleWithdrawMin;//单次取款最低限额private BigDecimal singleDepositMax ;//单次存款最高限额private BigDecimal singleWithdrawMax;//单次取款最高限额private BigDecimal everydayWithdrawMax;//每日取款最高限额private BigDecimal singleTurnOutMax;//单笔转账最高限额private BigDecimal everydayTurnOutMax;//每日累计转账最高限额private BigDecimal withdrawFrequencyMax;//每日最高取款次数private String location;// Atm 所在地址private String description;//备注private Bank bank; // 所属银行,非持久化字段private AccountInfo account; //当前ATM中操作银行卡, 非持久化字段public String getId() {return id;}public void setId(String id) {this.id = id;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public int getState() {return state;}public void setState(int state) {this.state = state;}public BigDecimal getTotal() {return total;}public void setTotal(BigDecimal total) {this.total = total;}public BigDecimal getSingleDepositMin() {return singleDepositMin;}public void setSingleDepositMin(BigDecimal singleDepositMin) {this.singleDepositMin = singleDepositMin;}public BigDecimal getSingleWithdrawMin() {return singleWithdrawMin;}public void setSingleWithdrawMin(BigDecimal singleWithdrawMin) {this.singleWithdrawMin = singleWithdrawMin;}public BigDecimal getSingleDepositMax() {return singleDepositMax;}public void setSingleDepositMax(BigDecimal singleDepositMax) {this.singleDepositMax = singleDepositMax;}public BigDecimal getSingleWithdrawMax() {return singleWithdrawMax;}public void setSingleWithdrawMax(BigDecimal singleWithdrawMax) {this.singleWithdrawMax = singleWithdrawMax;}public BigDecimal getEverydayWithdrawMax() {return everydayWithdrawMax;}public void setEverydayWithdrawMax(BigDecimal everydayWithdrawMax) {this.everydayWithdrawMax = everydayWithdrawMax;}public BigDecimal getSingleTurnOutMax() {return singleTurnOutMax;}public void setSingleTurnOutMax(BigDecimal singleTurnOutMax) {this.singleTurnOutMax = singleTurnOutMax;}public BigDecimal getEverydayTurnOutMax() {return everydayTurnOutMax;}public void setEverydayTurnOutMax(BigDecimal everydayTurnOutMax) {this.everydayTurnOutMax = everydayTurnOutMax;}public BigDecimal getWithdrawFrequencyMax() {return withdrawFrequencyMax;}public void setWithdrawFrequencyMax(BigDecimal withdrawFrequencyMax) {this.withdrawFrequencyMax = withdrawFrequencyMax;}public String getLocation() {return location;}public void setLocation(String location) {this.location = location;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public String getBankId() {return bankId;}public void setBankId(String bankId) {this.bankId = bankId;}public Bank getBank() {return bank;}public void setBank(Bank bank) {this.bank = bank;}public AccountInfo getAccount() {return account;}public void setAccount(AccountInfo account) {this.account = account;}/***  修改密码输入错误次数*/public void modifyPasswordInputErrorNum(){this.getAccount().setPasswordEnterErrorNumber(this.getAccount().getPasswordEnterErrorNumber()+1);}/**** @param money*            金额* @param flag*            操作标识 (1 =增加余额; -1 = 减少余额)*/public void modifyATMBalance(BigDecimal money,int flag){this.setTotal(flag==1?this.getTotal().add(money):this.getTotal().subtract(money));}/**** @param money*            金额* @param flag*            操作标识 (1 =增加余额; -1 = 减少余额)*/public void modifyAccountBalance(BigDecimal money,int flag){this.getAccount().setBalance((flag==1?this.getAccount().getBalance().add(money):this.getAccount().getBalance().subtract(money)));}
}

Bank.java

package atm.bank.domain;import java.math.BigDecimal;
/*** 银行实体类* @author Administrator**/
public class Bank {private String id ;//主键private String name;//银行名称private BigDecimal crossOutMin;//跨行取款手续费最低标准private BigDecimal crossOutMax;//跨行取款手续费最高标准private int crossOutPercent;//跨行取款手续费比率private BigDecimal crossInMin;//跨行存款手续费最低标准private BigDecimal crossInMax;//跨行存款手续费最高标准private int crossInPercent;//跨行存款手续费比率private int crossTaPercent;//跨行转账手续费比率private BigDecimal crossTaMin;//跨行转账最低手续费private BigDecimal crossTaMax;//跨行转账最高手续费public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public BigDecimal getCrossOutMax() {return crossOutMax;}public void setCrossOutMax(BigDecimal crossOutMax) {this.crossOutMax = crossOutMax;}public BigDecimal getCrossInMin() {return crossInMin;}public void setCrossInMin(BigDecimal crossInMin) {this.crossInMin = crossInMin;}public BigDecimal getCrossInMax() {return crossInMax;}public void setCrossInMax(BigDecimal crossInMax) {this.crossInMax = crossInMax;}public BigDecimal getCrossTaMin() {return crossTaMin;}public void setCrossTaMin(BigDecimal crossTaMin) {this.crossTaMin = crossTaMin;}public BigDecimal getCrossTaMax() {return crossTaMax;}public void setCrossTaMax(BigDecimal crossTaMax) {this.crossTaMax = crossTaMax;}public int getCrossOutPercent() {return crossOutPercent;}public void setCrossOutPercent(int crossOutPercent) {this.crossOutPercent = crossOutPercent;}public int getCrossInPercent() {return crossInPercent;}public void setCrossInPercent(int crossInPercent) {this.crossInPercent = crossInPercent;}public int getCrossTaPercent() {return crossTaPercent;}public void setCrossTaPercent(int crossTaPercent) {this.crossTaPercent = crossTaPercent;}public BigDecimal getCrossOutMin() {return crossOutMin;}public void setCrossOutMin(BigDecimal crossOutMin) {this.crossOutMin = crossOutMin;}
}

ui包下:

ATMUISupport.java

package atm.bank.ui;import atm.bank.SystemEnter;
import atm.bank.controller.account.AccountInfoConntrol;
import atm.bank.controller.bank.ATMController;
import atm.bank.domain.ATM;
import atm.bank.domain.AccountInfo;
import atm.bank.util.tools.BasicTools;import java.math.BigDecimal;
import java.util.Map;
import java.util.Scanner;
/*** ATM 画系界面组件类* @author Administrator**/
public class ATMUISupport {/*** 输出系统欢迎界面*/public static void drawingWelcomeUI(){System.out.println("**********************************************");System.out.println("**********************************************");System.out.println("*********** 欢迎使用 ["+SystemEnter.atmSys.getBank().getName()+"] ATM系统************");System.out.println("*********** 此系统已经与报警中心联网 ***************");System.out.println("*********** 如果你遇到危险时请按下报警按钮***********");System.out.println("*********** 警察叔叔会第一时间来帮助你的哦***********");System.out.println("****************<<无卡 无存折>>*****************");System.out.println("**********************************************");if(SystemEnter.atmSys.getAccount() == null)drawingInsertCardUI();}/*** 输出插入银行卡界面*/public static void drawingInsertCardUI(){System.out.println("//");System.out.println("// 请插入银行卡 /");System.out.println("//");String cardNum = BasicTools.getScanner().next();AccountInfoConntrol accountCtrl = new AccountInfoConntrol();/* 调用方法实现验证卡号是否正确*/AccountInfo account = accountCtrl.validdateAccountInfo(cardNum);if(account == null){// 卡无效System.out.println("您的银行卡是无效的");drawingPullOutUI();// 退卡}else{// 银行卡有效if(account.getFrozen() == 1){// 如果卡被锁定System.err.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");System.err.println("!!!!!!!!!!! 此卡处于锁定状态,请退卡 !!!!!!!!!!!!");System.err.println("!!!! 如需解锁,请本人持有效证件到本行柜台办理   !!!!!!");System.err.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");drawingPullOutUI();// 退卡,返回欢迎界面}else{SystemEnter.atmSys.setAccount(account);// 设置为ATM中正在操作的卡drawingEnterPasswordUI();// 调用提示用户输入密码方法}}}/*** 输出提示用户输入密码界面*/public static void drawingEnterPasswordUI(){int flag = 0;// 标志while(true){// 循环处理用户密码输入及选择退卡System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");System.out.println(">>>>>>>>> 继续请输入1  退卡请输入0 >>>>>>>>>>");System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");Scanner input = BasicTools.getScanner();String action = input.next();if(action.trim().equals("1")){// 用户选择继续,输入密码System.out.println("************ 请输入6位数字密码 **************");String password = input.next();if(!BasicTools.validDig(password) || password.length() != 6){// 密码格式不正确System.out.println("*********** 系统提示:密码必需是6位数字  *****************");continue;// 结束本次循环}else{// 输入密码合格/* 执行数据库密码验证*/AccountInfoConntrol controller = new AccountInfoConntrol();int res = controller.validatePassword(SystemEnter.atmSys.getAccount().getAccount(),Integer.parseInt(password));if( res == 1){// 验证密码通过break; // 跳出整个while循环}else{// 如果密码验证失败SystemEnter.atmSys.modifyPasswordInputErrorNum();System.out.println("##########################################");System.out.println("##########    系统提示 密码不正确        ###########");System.out.println("##########################################");if(SystemEnter.atmSys.getAccount().getPasswordEnterErrorNumber() == 2){System.err.println("##########################################");System.err.println("#########  您已经2次输入密码错误      ############");System.err.println("#########  如果3次输入错误将锁定此卡     ##########");System.err.println("##########################################");continue;}if(SystemEnter.atmSys.getAccount().getPasswordEnterErrorNumber() == 3){System.err.println("##########################################");System.err.println("#########  您已经3次输入密码不错误      ###########");System.err.println("#########  此卡已被冻结 如果是您本人    ###########");System.err.println("########  请持有效证件到本行柜台办理    ###########");System.err.println("##########################################");/* 调用方法,锁定银行卡*/controller.lockAccount(SystemEnter.atmSys.getAccount().getAccount());flag = 1;break;}continue;// 结束本次循环}}}else{// 退卡flag = 1;break;}}if(flag == 0)drawingBizUI(); // 调用输出主菜单elsedrawingPullOutUI();// 返回欢迎界面}/*** 打印主菜单的方法*//*** 退卡的方法**/public static void drawingPullOutUI(){System.out.println("✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳");System.out.println("✳✳✳✳✳✳✳✳✳✳✳请取出你的银行卡✳✳✳✳✳✳✳✳✳✳✳");System.out.println("✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳");System.out.println("✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳");System.out.println("✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳✳");SystemEnter.atmSys.setAccount(null);drawingWelcomeUI();}/*** 打印主菜单的方法*/private static void drawingBizUI() {System.out.println("\n\n");System.out.println("□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□");if(SystemEnter.atmSys.getTotal().doubleValue()>=SystemEnter.atmSys.getSingleWithdrawMin().doubleValue()){System.out.println("□□□□□ 取款请输入 1 □□□□□□□□□□□□□□□□□□□□□□□□□");}System.out.println("□□□□□ 存款请输入 2 □□□□□□□□□□□□□□□□□□□□□□□□□");System.out.println("□□□□□ 转账请输入 3 □□□□□□□□□□□□□□□□□□□□□□□□□");System.out.println("□□□□□ 查询请输入 4 □□□□□□□□□□□□□□□□□□□□□□□□□");System.out.println("□□□□□ 修改密码请输入 5 □□□□□□□□□□□□□□□□□□□□□□");System.out.println("□□□□□ 退卡请输入 6 □□□□□□□□□□□□□□□□□□□□□□□□□");System.out.println("□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□");System.out.println("---------   请按以上提示输入回车继续    ---------");String action = BasicTools.getScanner().next();confimOperation(action);//调用确认用户选择项方法}private static void confimOperation(String action){switch(action){case "1"://取款菜单drawingWithMoneyUI();break;case "2"://存款菜单drawingDepositUI();break;case "3"://转账菜单drawingTransferAccountsUI();break;case "4"://业务查询菜单drawingBusinessQueryUI();break;case "5"://修改密码菜单drawingModifyPasswordyUI();break;case "6"://退卡drawingPullOutUI();break;default:退卡drawingPullOutUI();break;}}/*** 取款菜单*/private static void drawingWithMoneyUI() {Boolean bool=true;System.out.println("1");while (bool){System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");System.out.println("$$$$$$$$$$$$$$$ 请输入取款金额  $$$$$$$$$$$$$$$$");System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");String money=BasicTools.getScanner().next();//验证是否是数字if(!BasicTools.validDig(money)){System.err.println("########## 系统提示 必需是数字 ###########");System.err.println("##### 继续取款请输入1 返回主菜单请输入2 #####");if("1".equals(BasicTools.getScanner().next())){continue;//结束本次循环}break;}else if(Integer.parseInt(money)%100!=0){ //验证取款金额是否大于余额System.err.println("########## 系统提示 取款金额必需是整百数字 ###########");System.err.println("##### 继续取款请输入1 返回主菜单请输入2 #####");if("1".equals(BasicTools.getScanner().next())){continue;//结束本次循环}break;}else if (Double.parseDouble(money)>SystemEnter.atmSys.getTotal().doubleValue()){//验证金额大于等于金额System.err.println("########## 系统提示 ATM 余额不足###########");System.err.println("##### 继续取款请输入1 返回主菜单请输入2 #####");if("1".equals(BasicTools.getScanner().next())){continue;//结束本次循环}break;}else if (Double.parseDouble(money)>SystemEnter.atmSys.getAccount().getBalance().doubleValue()){//验证取款金额大于等于卡余额System.err.println("########## 系统提示 您的账号余额不足###########");System.err.println("##### 继续取款请输入1 返回主菜单请输入2 #####");if("1".equals(BasicTools.getScanner().next())){continue;//结束本次循环}break;}else if(Double.parseDouble(money)>SystemEnter.atmSys.getSingleDepositMax().doubleValue()){//验证取款金额大于ATM单次最高取款金额System.err.println("########## 系统提示 单次取款金额大于ATM单次取款上限###########");System.err.println("##### 继续取款请输入1 返回主菜单请输入2 #####");if("1".equals(BasicTools.getScanner().next())){continue;//结束本次循环}break;}else {//取款后修改ATM系统实例余额与ATM中银行卡余额AccountInfoConntrol ctrl = new AccountInfoConntrol();Map<String,Double> res = ctrl.withrawMoney(SystemEnter.atmSys.getAccount(), new BigDecimal(money));if (res.get("res").intValue()==3){System.out.println("☆☆☆☆☆☆☆☆ 恭喜您,本次业务交易成功! ☆☆☆☆☆☆☆☆");System.out.println("☆☆☆☆☆☆☆ 本次取款 "+money+"元☆☆☆☆☆☆☆☆");SystemEnter.atmSys.modifyATMBalance(new BigDecimal(money),-1);SystemEnter.atmSys.modifyAccountBalance(new BigDecimal(money),-1);System.out.println("ATM当前余额"+SystemEnter.atmSys.getTotal().doubleValue());System.out.println("银行卡当前余额"+(SystemEnter.atmSys.getAccount().getBalance().doubleValue()-res.get("poundage")));}else if (res.get("res").intValue()==-1){System.out.println("☆☆☆☆☆☆☆☆ 本次操作时跨行取款,收取手续费后余额不足! ☆☆☆☆☆☆☆☆");}else if (res.get("res").intValue()==-2){System.out.println("☆☆☆☆☆☆☆☆ 每日累计取款总额已超出ATM最高上限 ☆☆☆☆☆☆☆☆");}else if (res.get("res").intValue()==-3){System.out.println("☆☆☆☆☆☆☆☆ 每日累计次数已超过ATM最高限制 ☆☆☆☆☆☆☆☆");}else if (res.get("res").intValue()==-4){System.out.println("☆☆☆☆☆☆☆☆ 每日累计取款总和超出最高限制 ☆☆☆☆☆☆☆☆");}break;}}drawingBizUI();//返回主菜单}/*** 存款菜单*/private static void drawingDepositUI() {//System.out.println("存款");while (true) {System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");System.out.println("$$$$$$$$$$$$$$$ 请输入存款金额  $$$$$$$$$$$$$$$$");System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");String money=BasicTools.getScanner().next();if(!BasicTools.validDig(money)){System.err.println("########## 系统提示 必需是数字 ###########");System.err.println("##### 继续取款请输入1 返回主菜单请输入2 #####");if("1".equals(BasicTools.getScanner())){continue;}break;}else if(Integer.parseInt(money)%100!=0){ //验证取款金额是否大于余额System.err.println("########## 系统提示 取款金额必需是整百数字 ###########");System.err.println("##### 继续取款请输入1 返回主菜单请输入2 #####");if("1".equals(BasicTools.getScanner().next())){continue;//结束本次循环}break;}else {AccountInfoConntrol ctrl=new AccountInfoConntrol();Map<String,Double> res=ctrl.DepositMoney(SystemEnter.atmSys.getAccount(),new BigDecimal(money));if (res.get("res").intValue()==3){System.out.println("☆☆☆☆☆☆☆☆ 恭喜您,本次业务交易成功! ☆☆☆☆☆☆☆☆");System.out.println("☆☆☆☆☆☆☆ 本次存款 "+money+"元☆☆☆☆☆☆☆☆");SystemEnter.atmSys.modifyATMBalance(new BigDecimal(money),1);SystemEnter.atmSys.modifyAccountBalance(new BigDecimal(money),1);System.out.println("ATM当前余额"+SystemEnter.atmSys.getTotal().doubleValue());System.out.println("银行卡当前余额"+SystemEnter.atmSys.getAccount().getBalance().doubleValue());}else if(res.get("res").intValue() == -1){System.out.println("☆☆☆☆☆☆☆☆ 银行卡不是所属银行,不可以进行存款 ☆☆☆☆☆☆☆☆");}else if (res.get("res").intValue()==-2){System.out.println("☆☆☆☆☆☆☆☆ 单次存款小于最低限额,不可以进行存款 ☆☆☆☆☆☆☆☆");}else if (res.get("res").intValue()==-3){System.out.println("☆☆☆☆☆☆☆☆ 单次存款大于最高限额,不可以进行存款 ☆☆☆☆☆☆☆☆");}break;}}drawingBizUI();// 返回主菜单}/*** 转账菜单*/private static void drawingTransferAccountsUI() {System.out.println("转账");while (true){System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");System.out.println("$$$$$$$$$$$$$$$ 请输入转账的银行卡号  $$$$$$$$$$$$$$$$");System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");String cardNumber=BasicTools.getScanner().next();AccountInfoConntrol ctrl=new AccountInfoConntrol();AccountInfo account=ctrl.validdateAccountInfo(cardNumber);if(account==null){System.err.println("您的输入的银行卡号是无效的");System.err.println("##### 继续转出请输入1 返回主菜单请输入2 #####");if("1".equals(BasicTools.getScanner().next())){continue;//结束本次循环}drawingTransferAccountsUI();} else if(cardNumber.equals(SystemEnter.atmSys.getAccount().getAccount())){System.err.println("您的输入的银行卡号是已插入的银行卡号");System.err.println("##### 继续转出请输入1 返回主菜单请输入2 #####");if("1".equals(BasicTools.getScanner().next())){continue;//结束本次循环}drawingTransferAccountsUI();}else {System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");System.out.println("$$$$$$$$$$$$$$$ 请输入转出存款金额  $$$$$$$$$$$$$$$$");System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");String money = BasicTools.getScanner().next();if (!BasicTools.validDig(money)) {System.err.println("########## 系统提示 必需是数字 ###########");System.err.println("##### 继续转出请输入1 返回主菜单请输入2 #####");if ("1".equals(BasicTools.getScanner())) {continue;}break;}else if(Integer.parseInt(money)%100!=0){ //验证取款金额是否大于余额System.err.println("########## 系统提示 取款金额必需是整百数字 ###########");System.err.println("##### 继续转出请输入1 返回主菜单请输入2 #####");if("1".equals(BasicTools.getScanner().next())){continue;//结束本次循环}break;}else if (Double.parseDouble(money)>SystemEnter.atmSys.getAccount().getBalance().doubleValue()){//验证取款金额大于等于卡余额System.err.println("########## 系统提示 您的账号余额不足###########");System.err.println("##### 继续转出请输入1 返回主菜单请输入2 #####");if("1".equals(BasicTools.getScanner().next())){continue;//结束本次循环}break;}else if(Double.parseDouble(money)>SystemEnter.atmSys.getSingleTurnOutMax().doubleValue()){//验证取款金额大于ATM单次最高取款金额System.err.println("########## 系统提示 单次取款金额大于ATM单次取款上限###########");System.err.println("##### 继续转出请输入1 返回主菜单请输入2 #####");if("1".equals(BasicTools.getScanner().next())){continue;//结束本次循环}break;}else {Map<String, Double> res = ctrl.TransferAccounts(account,new BigDecimal(money));if (res.get("res").intValue()==4){System.out.println("☆☆☆☆☆☆☆☆ 恭喜您,本次业务交易成功! ☆☆☆☆☆☆☆☆");System.out.println("☆☆☆☆☆☆☆ 本次转账 "+money+"元☆☆☆☆☆☆☆☆");SystemEnter.atmSys.modifyAccountBalance(new BigDecimal(money),-1);System.out.println("ATM当前余额"+SystemEnter.atmSys.getTotal().doubleValue());System.out.println("银行卡当前余额"+(SystemEnter.atmSys.getAccount().getBalance().doubleValue()-res.get("poundage")));}else if (res.get("res").intValue()==-1){System.out.println("☆☆☆☆☆☆☆☆ 本次操作时跨行转账,收取手续费后余额不足! ☆☆☆☆☆☆☆☆");}else if (res.get("res").intValue()==-2){System.out.println("☆☆☆☆☆☆☆☆ 每日累计转账总额已超出ATM最高上限 ☆☆☆☆☆☆☆☆");}else if (res.get("res").intValue()==-3){System.out.println("☆☆☆☆☆☆☆☆ 每日累计次数已超过ATM最高限制 ☆☆☆☆☆☆☆☆");}else if (res.get("res").intValue()==-4){System.out.println("☆☆☆☆☆☆☆☆ 每日累计转账总和超出最高限制 ☆☆☆☆☆☆☆☆");}break;}}}drawingBizUI();//返回主菜单}/*** 业务查询菜单*/private static void drawingBusinessQueryUI() {System.out.println("业务查询菜单");while (true){System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");System.out.println("$$$$$$$$$$$$$$ 进入余额查询页面  $$$$$$$$$$$$$");System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");AccountInfoConntrol ctrl=new AccountInfoConntrol();AccountInfo account=ctrl.BusinessQuery(SystemEnter.atmSys.getAccount().getAccount());System.out.println("银行卡当前余额"+account.getBalance());break;}drawingBizUI();//返回主菜单}/*** 修改密码菜单*/private static void drawingModifyPasswordyUI() {System.out.println("修改密码菜单");System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");System.out.println("$$$$$$$$$$$$$$$ 进入修改密码菜单  $$$$$$$$$$$$$$$$");System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");int flag = 0;// 标志while(true){// 循环处理用户密码输入及选择退卡/* 执行数据库密码验证*/System.out.println("************ 请输入银行卡的6位数字密码 **************");String password =BasicTools.getScanner().next();if(!BasicTools.validDig(password) || password.length() != 6){// 密码格式不正确System.out.println("*********** 系统提示:密码必需是6位数字  *****************");continue;// 结束本次循环}else {AccountInfoConntrol controller = new AccountInfoConntrol();int res = controller.validatePassword(SystemEnter.atmSys.getAccount().getAccount(),Integer.parseInt(password));if (res == 1) {// 验证密码通过//输入密码//再次输入密码System.out.println("************ 请输入新的6位数字密码 **************");String password1 =BasicTools.getScanner().next();if(!BasicTools.validDig(password1) || password1.length() != 6){// 密码格式不正确System.out.println("*********** 系统提示:密码必需是6位数字  *****************");continue;// 结束本次循环}else{System.out.println("************ 请输入新的6位数字密码 **************");String password2 =BasicTools.getScanner().next();if(!BasicTools.validDig(password2) || password2.length() != 6){// 密码格式不正确System.out.println("*********** 系统提示:密码必需是6位数字  *****************");continue;// 结束本次循环}else{if(password1.equals(password2)){int map =controller.ModifyPasswordy(SystemEnter.atmSys.getAccount().getAccount(),password1);if(map==1){System.out.println("☆☆☆☆☆☆☆☆ 恭喜您,本次密码修改成功! ☆☆☆☆☆☆☆☆");}}else {System.out.println("*********** 系统提示:两次密码输入不一致  *****************");continue;// 结束本次循环}}}break; // 跳出整个while循环} else {// 如果密码验证失败SystemEnter.atmSys.modifyPasswordInputErrorNum();System.out.println("##########################################");System.out.println("##########    系统提示 密码不正确        ###########");System.out.println("##########################################");if (SystemEnter.atmSys.getAccount().getPasswordEnterErrorNumber() == 2) {System.err.println("##########################################");System.err.println("#########  您已经2次输入密码错误      ############");System.err.println("#########  如果3次输入错误将锁定此卡     ##########");System.err.println("##########################################");continue;}if (SystemEnter.atmSys.getAccount().getPasswordEnterErrorNumber() == 3) {System.err.println("##########################################");System.err.println("#########  您已经3次输入密码不错误      ###########");System.err.println("#########  此卡已被冻结 如果是您本人    ###########");System.err.println("########  请持有效证件到本行柜台办理    ###########");System.err.println("##########################################");/* 调用方法,锁定银行卡*/controller.lockAccount(SystemEnter.atmSys.getAccount().getAccount());flag = 1;break;}continue;// 结束本次循环}}}if(flag == 0)drawingBizUI(); // 调用输出主菜单elsedrawingPullOutUI();// 返回欢迎界面}
}

util包下:

db包下:

DataSourceManager.java

package atm.bank.util.db;import java.sql.*;public class DataSourceManager {public static Connection getConnection() {Connection conn = null;try {Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//固定String dbURL = "jdbc:sqlserver://localhost:1433;DatabaseName=ATM";//ip地址、端口、数据库名conn = DriverManager.getConnection(dbURL, "sa", "sa");} catch (SQLException | ClassNotFoundException e) {e.printStackTrace();}return conn;// 返回连接对象}/* 关闭数据库连接的重载方法*/public static void close(Connection conn) {try {if (conn != null && !conn.isClosed())conn.close();} catch (SQLException e) {e.printStackTrace();}}public static void close(Statement state) {try {if (state != null && !state.isClosed())state.close();} catch (SQLException e) {e.printStackTrace();}}public static void close(ResultSet set) {try {if (set != null && !set.isClosed())set.close();} catch (SQLException e) {e.printStackTrace();}}
}

tools包下:

BasicTools.java

package atm.bank.util.tools;import atm.bank.domain.Bank;import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.util.Scanner;import static java.net.URLDecoder.decode;public final class BasicTools {private static Scanner scanner;public  static  String getClassPath(){String classPath=null;String filePath=BasicTools.class.getClassLoader().getResource("").toString();try {if(filePath!=null&&!filePath.trim().equals("")){filePath=decode(filePath,"UTF-8");classPath=filePath.substring(filePath.indexOf("/")+1);}} catch (UnsupportedEncodingException e) {e.printStackTrace();}return classPath;}public static Scanner getScanner(){if (scanner==null)scanner=new Scanner(System.in);return scanner;}/*** 验证是否是数字* @param res* @return boolen*/public static boolean validDig(String res){char [] chs=res.toCharArray();for(int i=0;i<chs.length;i++)if (!Character.isDigit(chs[i]))return false;return true;}public static double cossBankWithdrawal(Bank bank, BigDecimal amount) {double poundage=0;double a=amount.multiply(new BigDecimal(bank.getCrossOutPercent())).divide(new BigDecimal(100)).doubleValue();//取款数额×手续费百分数÷100//如果:取款数额×手续费百分数÷100  < 最低手续费; 则按最低标准收取手续费//如果:取款数额×手续费百分数÷100  > 最高手续费; 则按最高标准收取手续费if(a < bank.getCrossOutMin().doubleValue()){poundage = bank.getCrossOutMin().doubleValue();// 按最低标准收取}else if(a > bank.getCrossOutMax().doubleValue()){poundage = bank.getCrossOutMax().doubleValue();// 按最高标准收取}else{poundage = a;// 按正常比率收取}return poundage;}
}

controller包下:

account包下:

AccountInfoConntrol.java

package atm.bank.controller.account;import atm.bank.domain.AccountInfo;
import atm.bank.service.account.AccountInfoServiceImp;import java.math.BigDecimal;
import java.util.Map;/*** 银行卡操作控制层组件*/
public class AccountInfoConntrol {/*** 验证账号是否有效** @param cardNumber 卡号* @return*/public AccountInfo validdateAccountInfo(String cardNumber) {AccountInfo account = null;account = new AccountInfoServiceImp().validateAccountInfo(cardNumber);return account;}/*** 验证密码是否正确** @param cardNumber 卡号* @param password   密码* @return*/public int validatePassword(String cardNumber, int password) {return  new AccountInfoServiceImp().validatePassword(cardNumber,password);}public int lockAccount(String cardNumber)  {return new AccountInfoServiceImp().lockAccount(cardNumber);}public Map<String, Double> withrawMoney(AccountInfo account, BigDecimal money) {return new AccountInfoServiceImp().withrawMoney(account,money);}public Map<String, Double> DepositMoney(AccountInfo account, BigDecimal money) {return new AccountInfoServiceImp().DepositMoney(account,money);}public Map<String,Double> TransferAccounts(AccountInfo account, BigDecimal money)  {return new AccountInfoServiceImp().TransferAccounts(account,money);}public AccountInfo BusinessQuery(String account) {return new AccountInfoServiceImp().BusinessQuery(account);}public int ModifyPasswordy(String account, String password1) {return new AccountInfoServiceImp().ModifyPasswordy(account,password1);}
}

bank包下:

ATMController.java

package atm.bank.controller.bank;import atm.bank.dao.bank.ATMDaoImp;
import atm.bank.dao.bank.BankDaoImp;
import atm.bank.domain.ATM;import atm.bank.domain.Bank;
import atm.bank.service.bank.ATMServiceImp;
import atm.bank.service.bank.BankServiceImp;public class ATMController {/*** desc: 按照给定的ATM id 加载ATM* @param id ATM id* @return ATM 实例* @throws Exception*/public ATM loadATMById(String id) throws Exception {return new ATMServiceImp().loadATMById(id);}/*** desc: 按照给定的Bank id 加载ATM* @param id 银行id* @return Bank 实例* @throws Exception*/public Bank loadBankById(String id) throws Exception {return new BankServiceImp().loadBankById(id);}
}

dao包下:

account包下:

AccountInfoDao.java

package atm.bank.dao.account;import atm.bank.domain.AccountInfo;import java.math.BigDecimal;public interface AccountInfoDao {/* 验证账号是否有效*/public AccountInfo validateAccountInfo(String cardNumber) throws Exception;/* 验证密码*/public int validatePassword(String cardNumber, int password) throws Exception;/* 锁定银行卡*/public int lockAccount(String cardNumer) throws Exception;/* 取款*/public int withrawMoney(String account, BigDecimal bigDecimal,double serviceCharge)throws Exception;
}
AccountInfoDaoImp.java
package atm.bank.dao.account;import atm.bank.SystemEnter;
import atm.bank.domain.AccountInfo;
import atm.bank.util.db.DataSourceManager;
import atm.bank.util.tools.BasicTools;import java.math.BigDecimal;
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;public class AccountInfoDaoImp implements AccountInfoDao{/**** @param cardNumber 卡号* @return*/@Overridepublic AccountInfo validateAccountInfo(String cardNumber) {String sql = "SELECT * FROM ACCOUNT_INFO WHERE ACCOUNT = ?";AccountInfo account=null;Connection conn = null;PreparedStatement ps = null;ResultSet set = null;try {conn = DataSourceManager.getConnection();ps = conn.prepareStatement(sql);//设置参数ps.setString(1, cardNumber);//执行查询语句set = ps.executeQuery();while (set.next()){account=new AccountInfo();account.setAccount(set.getString("ACCOUNT"));account.setId(set.getString("ID"));account.setPassword(set.getString("PASSWORD"));account.setAccountType(set.getShort("ACCOUNT_TYPE"));account.setBalance(set.getBigDecimal("BALANCE"));account.setTodayOutMax(set.getBigDecimal("TODAY_OUT_MAX"));account.setTodayTaMax(set.getBigDecimal("TODAY_TA_MAX"));account.setUserId(set.getString("USERID"));account.setBankId(set.getString("BANKID"));account.setFrozen(set.getShort("FROZEN"));account.setLocation(set.getString("LOCATION"));account.getCreateTime(set.getDate("CREATETIME"));}}catch (Exception e){e.printStackTrace();}finally {DataSourceManager.close(set);DataSourceManager.close(ps);DataSourceManager.close(conn);}return account;}/**** @param cardNumber 卡号* @param password 数据库中的密码* @return*/@Overridepublic int validatePassword(String cardNumber, int password) {int res = 0;String sql = "SELECT COUNT(ID) RESULTS FROM ACCOUNT_INFO "+ "WHERE ACCOUNT = ? AND PASSWORD = ?";Connection conn = null;PreparedStatement ps = null;ResultSet set = null;try {conn = DataSourceManager.getConnection();ps = conn.prepareStatement(sql);ps.setString(1,cardNumber); ps.setInt(2,password);set = ps.executeQuery();while(set.next()){res = set.getInt("RESULTS");}} catch (Exception e) {e.printStackTrace();}finally{DataSourceManager.close(set);DataSourceManager.close(ps);DataSourceManager.close(conn);}return res;}/*** 锁定卡* @param cardNumber 卡号* @return* @throws Exception*/@Overridepublic int lockAccount(String cardNumber) throws Exception {int res = 0;String sql="UPDATE ACCOUNT_INFO SET FROZEN = 1 WHERE ACCOUNT = ?";Connection conn = null;PreparedStatement ps = null;try {conn = DataSourceManager.getConnection();ps = conn.prepareStatement(sql);//设置参数ps.setString(1, cardNumber);//执行查询语句res = ps.executeUpdate();} catch (SQLException throwables) {throwables.printStackTrace();}finally {DataSourceManager.close(ps);DataSourceManager.close(conn);}return res;}/*** 取款* @param account 账号* @param amount 交易金额* @param serviceCharge 手续费* @return int*/@Overridepublic int withrawMoney(String account, BigDecimal amount, double serviceCharge) throws Exception {int res = 0;/* 更新账户余额SQL*/String sql0 = "UPDATE ACCOUNT_INFO SET BALANCE = BALANCE-?-? WHERE ACCOUNT = ?";/* 添加交易记录SQL*/String sql2 = "INSERT INTO BUSINESS (ID,ACCOUNTID,BUSID,AMOUNT,"+ "POUNDAGE,DESCRIPTION) "+"VALUES(?,?,?,?,?,?)";/* 更新ATM余额SQL*/String sql3 = "UPDATE ATM SET TOTAL = TOTAL - ? WHERE ID = ?";Connection conn = null;PreparedStatement ps = null;PreparedStatement ps2 = null;PreparedStatement ps3 = null;try {conn = DataSourceManager.getConnection();conn.setAutoCommit(false);// 关闭自动提交ps = conn.prepareStatement(sql0);ps.setBigDecimal(1,amount);ps.setDouble(2,serviceCharge);ps.setString(3, account);res += ps.executeUpdate();ps2 = conn.prepareStatement(sql2);ps2.setString(1, UUID.randomUUID().toString());ps2.setString(2,account);ps2.setString(3,"OUTCODE200");ps2.setBigDecimal(4, amount);ps2.setDouble(5,serviceCharge);ps2.setString(6,"ATM 取款");res += ps2.executeUpdate();ps3 = conn.prepareStatement(sql3);ps3.setBigDecimal(1, amount);ps3.setString(2, SystemEnter.atmSys.getId());res += ps3.executeUpdate();conn.commit();// 提交事务} catch (Exception e) {try {System.out.println("撤销事务");conn.rollback(); // 撤销事务操作} catch (SQLException e1) {e1.printStackTrace();}e.printStackTrace();}finally{DataSourceManager.close(ps);DataSourceManager.close(ps2);DataSourceManager.close(conn);}return res;}/*** desc:统计每日累计已取款金额总和与每日累计已取款次数* @param cardNumber 卡号* @return Map<String,BigDecimal>*/public Map<String, BigDecimal> countEverydayDrawingSum(String cardNumber) {Map<String, BigDecimal> map=new HashMap<String, BigDecimal>();String sql = "SELECT SUM(AMOUNT) everydayDrawingSum,COUNT(AMOUNT) everydayDrawingNum "+ "FROM BUSINESS "+ "WHERE ACCOUNTID = ? AND BUSID ='OUTCODE200' ";Connection conn = null;PreparedStatement ps = null;ResultSet set = null;try {conn = DataSourceManager.getConnection();ps = conn.prepareStatement(sql);//设置参数ps.setString(1, cardNumber);//执行查询语句set = ps.executeQuery();while (set.next()){BigDecimal bd=set.getBigDecimal("everydayDrawingSum");map.put("everydayDrawingSum",bd==null?new BigDecimal(0):bd);map.put("everydayDrawingNum",set.getBigDecimal("everydayDrawingNum"));}}catch (Exception e){e.printStackTrace();}finally {DataSourceManager.close(set);DataSourceManager.close(ps);DataSourceManager.close(conn);}return map;}public Map<String, BigDecimal> countEverydayDepositSum(String cardNumber) {Map<String, BigDecimal> map=new HashMap<>();String sql = "SELECT SUM(AMOUNT) everydayDrawingSum,COUNT(AMOUNT) everydayDrawingNum "+ "FROM BUSINESS1 "+ "WHERE ACCOUNTID = ? AND BUSID ='OUTCODE200' ";Connection conn = null;PreparedStatement ps = null;ResultSet set = null;try {conn = DataSourceManager.getConnection();ps = conn.prepareStatement(sql);ps.setString(1,cardNumber);set = ps.executeQuery();while(set.next()){BigDecimal bd = set.getBigDecimal("everydayDrawingSum");map.put("everydayDrawingSum",bd==null?new BigDecimal(0):bd);map.put("everydayDrawingNum",set.getBigDecimal("everydayDrawingNum"));}} catch (Exception ex) {ex.printStackTrace();}finally{DataSourceManager.close(set);DataSourceManager.close(ps);DataSourceManager.close(conn);}return map;}public int DepositMoney(String account, BigDecimal amount) {int res=0;/* 更新账户余额SQL*/String sql0 = "UPDATE ACCOUNT_INFO SET BALANCE = BALANCE+? WHERE ACCOUNT = ?";/* 添加交易记录SQL*/String sql2 = "INSERT INTO BUSINESS1 (ID,ACCOUNTID,BUSID,AMOUNT,"+ "POUNDAGE,DESCRIPTION) "+ "VALUES(?,?,?,?,?,?)";/* 更新ATM余额SQL*/String sql3 = "UPDATE ATM SET TOTAL = TOTAL + ? WHERE ID = ?";Connection conn = null;PreparedStatement ps = null;PreparedStatement ps2 = null;PreparedStatement ps3 = null;try {conn = DataSourceManager.getConnection();conn.setAutoCommit(false);// 关闭自动提交ps = conn.prepareStatement(sql0);ps.setBigDecimal(1,amount);ps.setString(2, account);res += ps.executeUpdate();ps2 = conn.prepareStatement(sql2);ps2.setString(1,UUID.randomUUID().toString());ps2.setString(2,account);ps2.setString(3,"OUTCODE200");ps2.setBigDecimal(4, amount);ps2.setDouble(5,0);ps2.setString(6,"ATM 存款");res += ps2.executeUpdate();ps3 = conn.prepareStatement(sql3);ps3.setBigDecimal(1, amount);ps3.setString(2, SystemEnter.atmSys.getId());res += ps3.executeUpdate();conn.commit();// 提交事务} catch (Exception e) {try {System.out.println("撤销事务");conn.rollback(); // 撤销事务操作} catch (SQLException e1) {e1.printStackTrace();}e.printStackTrace();}finally{DataSourceManager.close(ps);DataSourceManager.close(ps2);DataSourceManager.close(conn);}return res;}public Map<String, BigDecimal> countEverydayTransferAccountsSum(String cardNumber) {Map<String, BigDecimal> map=new HashMap<>();String sql = "SELECT SUM(AMOUNT1) everydayDrawingSum,COUNT(AMOUNT1) everydayDrawingNum "+ "FROM BUSINESS2 "+ "WHERE ACCOUNTID1 = ?";Connection conn = null;PreparedStatement ps = null;ResultSet set = null;try {conn = DataSourceManager.getConnection();ps = conn.prepareStatement(sql);ps.setString(1,cardNumber);set = ps.executeQuery();while(set.next()){BigDecimal bd = set.getBigDecimal("everydayDrawingSum");map.put("everydayDrawingSum",bd==null?new BigDecimal(0):bd);map.put("everydayDrawingNum",set.getBigDecimal("everydayDrawingNum"));}} catch (Exception ex) {ex.printStackTrace();}finally{DataSourceManager.close(set);DataSourceManager.close(ps);DataSourceManager.close(conn);}return map;}public int TransferAccounts(String account, BigDecimal amount, double serviceCharge,String account2) {int res = 0;/* 更新账户余额SQL*/String sql0 = "UPDATE ACCOUNT_INFO SET BALANCE = BALANCE-?-? WHERE ACCOUNT = ?";/* 添加交易记录SQL*/String sql2 = "INSERT INTO BUSINESS2 (ID,ACCOUNTID1,BUSID1,AMOUNT1,"+"ACCOUNTID2,BUSID2,AMOUNT2,POUNDAGE,DESCRIPTION)"+"VALUES(?,?,?,?,?,?,?,?,?)";/* 更新ATM余额SQL*/String sql3 = "UPDATE ATM SET TOTAL = TOTAL - ? WHERE ID = ?";/* 更新账户余额SQL*/String sql4 = "UPDATE ACCOUNT_INFO SET BALANCE = BALANCE+? WHERE ACCOUNT = ?";Connection conn = null;PreparedStatement ps = null;PreparedStatement ps2 = null;PreparedStatement ps3 = null;PreparedStatement ps4 = null;try {conn = DataSourceManager.getConnection();conn.setAutoCommit(false);// 关闭自动提交ps = conn.prepareStatement(sql0);ps.setBigDecimal(1,amount);ps.setDouble(2,serviceCharge);ps.setString(3, account2);res += ps.executeUpdate();ps2 = conn.prepareStatement(sql2);ps2.setString(1, UUID.randomUUID().toString());ps2.setString(2,account2);ps2.setString(3,"OUTCODE200");ps2.setBigDecimal(4, amount);ps2.setString(5,account);ps2.setString(6,"INCODE200");ps2.setBigDecimal(7, amount);ps2.setDouble(8,serviceCharge);ps2.setString(9,"ATM"+account2+"向"+account+"转账");res += ps2.executeUpdate();ps3 = conn.prepareStatement(sql3);ps3.setBigDecimal(1, amount);ps3.setString(2, SystemEnter.atmSys.getId());res += ps3.executeUpdate();ps = conn.prepareStatement(sql4);ps.setBigDecimal(1,amount);ps.setString(2, account);res += ps.executeUpdate();} catch (Exception e) {try {System.out.println("撤销事务");conn.rollback(); // 撤销事务操作} catch (SQLException e1) {e1.printStackTrace();}e.printStackTrace();}finally{DataSourceManager.close(ps);DataSourceManager.close(ps2);DataSourceManager.close(conn);}return res;}public AccountInfo BusinessQuery(String account) {String sql = "SELECT * FROM ACCOUNT_INFO WHERE ACCOUNT = ?";AccountInfo account1=null;Connection conn = null;PreparedStatement ps = null;ResultSet set = null;try {conn = DataSourceManager.getConnection();ps = conn.prepareStatement(sql);//设置参数ps.setString(1, account);//执行查询语句set = ps.executeQuery();while (set.next()){account1=new AccountInfo();account1.setAccount(set.getString("ACCOUNT"));account1.setId(set.getString("ID"));account1.setPassword(set.getString("PASSWORD"));account1.setAccountType(set.getShort("ACCOUNT_TYPE"));account1.setBalance(set.getBigDecimal("BALANCE"));account1.setTodayOutMax(set.getBigDecimal("TODAY_OUT_MAX"));account1.setTodayTaMax(set.getBigDecimal("TODAY_TA_MAX"));account1.setUserId(set.getString("USERID"));account1.setBankId(set.getString("BANKID"));account1.setFrozen(set.getShort("FROZEN"));account1.setLocation(set.getString("LOCATION"));account1.getCreateTime(set.getDate("CREATETIME"));}}catch (Exception e){e.printStackTrace();}finally {DataSourceManager.close(set);DataSourceManager.close(ps);DataSourceManager.close(conn);}return account1;}public int ModifyPasswordy(String account, String password1) {int res = 0;String sql="UPDATE ACCOUNT_INFO SET PASSWORD = ? WHERE ACCOUNT = ?";Connection conn = null;PreparedStatement ps = null;try {conn = DataSourceManager.getConnection();ps = conn.prepareStatement(sql);//设置参数ps.setString(1, password1);//执行查询语句ps.setString(2, account);//执行查询语句res = ps.executeUpdate();} catch (SQLException throwables) {throwables.printStackTrace();}finally {DataSourceManager.close(ps);DataSourceManager.close(conn);}return res;}
}

Bank包下:

ATMDao.java

package atm.bank.dao.bank;import atm.bank.domain.ATM;
/*** ATM DAO 数据持久层组件接口* @author Administrator**/
public interface ATMDao {public ATM loadATMById(String id) throws Exception;
}

ATMDaoImp.java

package atm.bank.dao.bank;import atm.bank.domain.ATM;
import atm.bank.util.db.DataSourceManager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/*** ATM DAO 数据持久层组件接口实现类* @author Administrator**/
public class ATMDaoImp implements ATMDao{/*** desc:按照id加载ATM实例* @param id ATM id* @return ATM 实例*/@Overridepublic ATM loadATMById(String id) throws Exception {String sql = "SELECT *"+ "FROM ATM WHERE ID = ?";ATM atm = null;// 返回的atm实例Connection conn = null;PreparedStatement ps = null;ResultSet set = null;try {conn = DataSourceManager.getConnection();ps = conn.prepareStatement(sql);ps.setString(1,id);// 设置参数set = ps.executeQuery();//执行查询while(set.next()){atm = new ATM();atm.setBankId(set.getString("BEAN_ID"));atm.setCode(set.getString("CODE"));atm.setDescription(set.getString("DESCRIPTION"));atm.setEverydayTurnOutMax(set.getBigDecimal("EVERYDAY_TURN_OUT_MAX"));atm.setEverydayWithdrawMax(set.getBigDecimal("EVERYDAY_WITHDRAW_MAX"));atm.setId(set.getString("ID"));atm.setLocation(set.getString("LOCATION"));atm.setSingleDepositMax(set.getBigDecimal("SINGLE_DEPOSIT_MAX"));atm.setSingleDepositMin(set.getBigDecimal("SINGLE_DEPOSIT_MIN"));atm.setSingleTurnOutMax(set.getBigDecimal("SINGLE_TURN_OUT_MAX"));atm.setSingleWithdrawMax(set.getBigDecimal("SINGLE_WITHDRAW_MAX"));atm.setSingleWithdrawMin(set.getBigDecimal("SINGLE_WITHDRAW_MIN"));atm.setWithdrawFrequencyMax(set.getBigDecimal("WITHDRAW_FREQUENCY_MAX"));atm.setState(set.getInt("STATE"));atm.setTotal(set.getBigDecimal("TOTAL"));}} catch (Exception ex) {ex.printStackTrace();}finally{DataSourceManager.close(set);DataSourceManager.close(ps);DataSourceManager.close(conn);}return atm;}
}

BankDao.java

package atm.bank.dao.bank;import atm.bank.domain.Bank;
/*** Bank DAO 数据持久层组件接口* @author Administrator**/
public interface BankDao {public Bank loadBankById(String id) throws Exception;
}

BankDaoImp.java

package atm.bank.dao.bank;import atm.bank.domain.ATM;
import atm.bank.domain.Bank;
import atm.bank.util.db.DataSourceManager;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;public class BankDaoImp implements BankDao{@Overridepublic Bank loadBankById(String id) throws Exception {String sql ="SELECT ID,NAME,CROSS_OUT_MIN,CROSS_OUT_MAX,CROSS_OUT_PERCENT,"+ "CROSS_IN_MIN,CROSS_IN_MAX,CROSS_IN_PERCENT,CROSS_TA_PERCENT,"+ "CROSS_TA_MIN,CROSS_TA_MAX "+ "FROM BANK WHERE ID = ?";Bank bank = null;// 返回的Bank实例Connection conn = null;PreparedStatement ps = null;ResultSet set = null;try {conn = DataSourceManager.getConnection();ps = conn.prepareStatement(sql);ps.setString(1,id); // 设置参数set = ps.executeQuery();while(set.next()){bank = new Bank();bank.setCrossInMax(set.getBigDecimal("CROSS_IN_MAX"));bank.setCrossInMin(set.getBigDecimal("CROSS_IN_MIN"));bank.setCrossInPercent(set.getInt("CROSS_IN_PERCENT"));bank.setCrossOutMin(set.getBigDecimal("CROSS_OUT_MIN"));bank.setCrossOutMax(set.getBigDecimal("CROSS_OUT_MAX"));bank.setCrossOutPercent(set.getInt("CROSS_OUT_PERCENT"));bank.setCrossTaMax(set.getBigDecimal("CROSS_TA_MAX"));bank.setCrossTaMin(set.getBigDecimal("CROSS_TA_MIN"));bank.setCrossTaPercent(set.getInt("CROSS_TA_PERCENT"));bank.setId(set.getString("ID"));bank.setName(set.getString("NAME"));}} catch (Exception ex) {ex.printStackTrace();}finally{DataSourceManager.close(set);DataSourceManager.close(ps);DataSourceManager.close(conn);}return bank;}}

service包下:

account包下:

AccountInfoService.java

package atm.bank.service.account;import atm.bank.domain.AccountInfo;import java.math.BigDecimal;
import java.util.Map;/*** AccountInfo(账户) 服务层操作通用接口* @author Administrator**/
public interface AccountInfoService {/* 验证账号是否有效*/public AccountInfo validateAccountInfo(String cardNumber) throws Exception;/* 验证密码*/public int validatePassword(String cardNumber, int password) throws Exception;/* 锁定银行卡*/public int lockAccount(String cardNubmer) throws Exception;/* 存款 */public Map<String, Double> DepositMoney(AccountInfo account, BigDecimal money)throws Exception;/* 转账 */public Map<String, Double> TransferAccounts(AccountInfo account, BigDecimal money)throws Exception;public AccountInfo BusinessQuery(String account);public int ModifyPasswordy(String account, String password1);/* 取款 */}

AccountInfoServiceImp.java

package atm.bank.service.account;import atm.bank.SystemEnter;
import atm.bank.dao.account.AccountInfoDaoImp;
import atm.bank.domain.AccountInfo;
import atm.bank.util.tools.BasicTools;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;/*** AccountInfo(账户) 服务层通用接口实现类* @author Administrator**/
public class AccountInfoServiceImp implements AccountInfoService {/*** desc : 验证账号是否有效* @param cardNumber 卡号* @return AccountInfo 实例*/@Overridepublic AccountInfo validateAccountInfo(String cardNumber) {return new AccountInfoDaoImp().validateAccountInfo(cardNumber);}/*** desc : 验证账号密码* @param cardNumber 卡号* @param password 密码* @return int*/@Overridepublic int validatePassword(String cardNumber, int password) {return new AccountInfoDaoImp().validatePassword(cardNumber,password);}@Overridepublic int lockAccount(String cardNubmer){try {return new AccountInfoDaoImp().lockAccount(cardNubmer);} catch (Exception e) {e.printStackTrace();}return 0;}/**** @param account 账号* @param money 交易金额* @return int -1银行卡不是所属银行,不可以进行转账*/@Overridepublic Map<String, Double> DepositMoney(AccountInfo account, BigDecimal money) {int res=0;Map<String,Double> mapRes = new HashMap<String,Double>();if(!account.getBankId().equals(SystemEnter.atmSys.getBankId())){mapRes.put("res",new Double(-1));return mapRes; // 账户余额不足}System.out.println("本次存款之前,存款余额"+SystemEnter.atmSys.getAccount().getBalance());Map<String,BigDecimal> map =new AccountInfoDaoImp().countEverydayDepositSum(account.getAccount());int num = map.get("everydayDrawingNum").intValue();// 累计存款次数System.out.println("本次存款之前,存款总次数"+num);if(money.doubleValue()<SystemEnter.atmSys.getSingleDepositMin().doubleValue()){mapRes.put("res",new Double(-2));return mapRes; // 账户余额不足}if(money.doubleValue()>SystemEnter.atmSys.getSingleDepositMax().doubleValue()){mapRes.put("res",new Double(-3));return mapRes; // 账户余额不足}try {res = new AccountInfoDaoImp().DepositMoney(account.getAccount(),money);mapRes.put("res",new Double(res));} catch (Exception e) {e.printStackTrace();}return mapRes;}/**** @param account 转入账户* @param money 金额* @return -1账户余额不足* @throws Exception*/@Overridepublic Map<String, Double> TransferAccounts(AccountInfo account, BigDecimal money)  {Map<String,Double> mapRes=new HashMap<String,Double>();int res=0;double poundage=0;/*如果银行卡所属银行Id不等于Atm系统所属银行ID,收款跨行取款服务费*/if (!account.getBankId().equals(SystemEnter.atmSys.getBankId())){poundage= BasicTools.cossBankWithdrawal(SystemEnter.atmSys.getBank(),money);if(SystemEnter.atmSys.getAccount().getBalance().subtract((money).add(new BigDecimal(poundage))).doubleValue() < 1){mapRes.put("res",new Double(-1));return mapRes;//转账的银行卡1余额不足}}Map<String,BigDecimal> map=new AccountInfoDaoImp().countEverydayTransferAccountsSum(account.getAccount());double sum=map.get("everydayDrawingSum").doubleValue();//累计取款总和System.out.println("银行卡"+SystemEnter.atmSys.getAccount().getAccount()+"之前已转出总额"+sum);int num=map.get("everydayDrawingNum").intValue();//累计取款次数System.out.println("银行卡"+SystemEnter.atmSys.getAccount().getAccount()+"之前已转出总次数"+num);if(new BigDecimal(sum).add(money).doubleValue() >SystemEnter.atmSys.getEverydayTurnOutMax().doubleValue()){mapRes.put("res",new Double(-2));return mapRes;//转账的银行卡1余额不足}if(num == SystemEnter.atmSys.getWithdrawFrequencyMax().intValue()){mapRes.put("res",new Double(-3));return mapRes;//转账的银行卡1余额不足}if(sum + money.doubleValue() > account.getTodayTaMax().doubleValue() ){mapRes.put("res",new Double(-4));return mapRes;//转账的银行卡1余额不足}try {res=new AccountInfoDaoImp().TransferAccounts(account.getAccount(),money,poundage,SystemEnter.atmSys.getAccount().getAccount());mapRes.put("res",new Double(res));mapRes.put("poundage",new Double(poundage));}catch (Exception e){e.printStackTrace();}return mapRes;}@Overridepublic AccountInfo BusinessQuery(String account) {return new AccountInfoDaoImp().BusinessQuery(account);}@Overridepublic int ModifyPasswordy(String account, String password1) {return new AccountInfoDaoImp().ModifyPasswordy(account,password1);}/**** @param account 账户* @param money 服务费* @return int -1账户余额不足 -2累计取款总额超出ATM最高上限* -3累计次数已超过ATM最高限制 -4累计取款总和超出银行卡每日取款累计和上限*/public Map<String, Double> withrawMoney(AccountInfo account, BigDecimal money) {Map<String,Double> mapRes = new HashMap<String,Double>();int res=0;double poundage=0;/*如果银行卡所属银行Id不等于Atm系统所属银行ID,收款跨行取款服务费*/if (!account.getBankId().equals(SystemEnter.atmSys.getBankId())){poundage= BasicTools.cossBankWithdrawal(SystemEnter.atmSys.getBank(),money);if(account.getBalance().subtract(money.add(new BigDecimal(poundage))).doubleValue() < 1){mapRes.put("res",new Double(-1));return mapRes; // 账户余额不足}}Map<String,BigDecimal> map=new AccountInfoDaoImp().countEverydayDrawingSum(account.getAccount());double sum=map.get("everydayDrawingSum").doubleValue();//累计取款总和System.out.println("本次取款之前已取款总额"+sum);int num=map.get("everydayDrawingSum").intValue();//累计取款次数System.out.println("本次取款之前已取款总次数"+num);if(new BigDecimal(sum).add(money).doubleValue() >SystemEnter.atmSys.getEverydayWithdrawMax().doubleValue()){mapRes.put("res",new Double(-2));return mapRes; // 累计取款总额超出ATM最高限制}if(num == SystemEnter.atmSys.getWithdrawFrequencyMax().intValue()){mapRes.put("res",new Double(-3));return mapRes; // 累计取款次数已超出ATM最高限制}if(sum + money.doubleValue() > account.getTodayOutMax().doubleValue() ){mapRes.put("res",new Double(-4));return mapRes; // 累计取款总和超出银行卡每日取款累计和上限}try {res=new AccountInfoDaoImp().withrawMoney(account.getAccount(),money,poundage);mapRes.put("res",new Double(res));mapRes.put("poundage",new Double(poundage));}catch (Exception e){e.printStackTrace();}return mapRes;}}

bank包下:
ATMService.java

package atm.bank.service.bank;import atm.bank.domain.ATM;
/*** ATM Service 服务层组件接口* @author Administrator**/
public interface ATMService {public ATM loadATMById(String id)throws Exception;
}
ATMServiceImp.java
package atm.bank.service.bank;import atm.bank.dao.bank.ATMDaoImp;
import atm.bank.domain.ATM;
/*** ATM Service 服务层组件接口实现类* @author Administrator**/
public class ATMServiceImp implements ATMService {@Overridepublic ATM loadATMById(String id) throws Exception {return new ATMDaoImp().loadATMById(id);}}

BankService.java

package atm.bank.service.bank;import atm.bank.domain.Bank;
/*** Bank Service 数据持久层组件接口* @author Administrator**/
public interface BankService {public Bank loadBankById(String id)throws Exception;
}

BankServiceImp.java

package atm.bank.service.bank;import atm.bank.dao.bank.BankDaoImp;
import atm.bank.domain.Bank;
/*** Bank Service 数据持久层组件接口实现类* @author Administrator**/
public class BankServiceImp implements BankService {@Overridepublic Bank loadBankById(String id) throws Exception {return new BankDaoImp().loadBankById(id);}}

模拟ATM机存取款管理系统相关推荐

  1. 模拟ATM机存取款管理系统C语言课程设计

    模拟ATM机存取款管理系统(只列出了大体的框架,需要源码的朋友请私信联系.) 1.问题描述 模拟银行的自动取款机使用过程中的界面和用户交互过程.实现查询银行卡余额.取款.修改密码.退出系统等功能. 2 ...

  2. 模拟ATM机存取款管理系统设计(C++)

    模拟ATM机存取款管理系统设计 有问题欢迎私信哦 1.1问题描述: 模拟银行自动存取款机使用过程中的界面和用户交互过程,实现查询银行卡余额.取款.修改密码.退出系统等功能. 1.2基本要求(功能要求) ...

  3. JAVA构造函数存取款,C语言如何实现ATM机存取款系统

    C语言如何实现ATM机存取款系统 C语言利用结构体和构造函数并且采用输入输出文件实现ATM机系统.下面是小编为大家带来的关于C语言如何实现ATM机存取款系统的知识,欢迎阅读. C语言如何实现ATM机存 ...

  4. 用js实现ATM机存取款功能

    js是一个功能十分强大的脚本语言,通过js能实现很多有意思的demo!而要实现那些功能炫酷.特效美观的东西DOM操作是必不可少且尤为重要的!这个ATM机存取款的案例,就用到js中一些简单的DOM操作来 ...

  5. 模拟一个ATM机存取款系统

    手动创建两个用户 //用户的账号密码private static String account ="1";//账号private static String password =& ...

  6. 一个简易的ATM机存取款系统

    模拟银行的自动取款机的使用,实现查询余额.取款.存款.转账.退出系统等功能.不少于10名用户的信息,假设每个用户仅一个账户. 基本要求: 1.基于显示器.键盘完成ATM机中基本人机交互. 2.设计应用 ...

  7. 模拟银行ATM自助存取款系统

    #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> int ...

  8. 模拟银行ATM存款存取款的相关功能

    模拟银行ATM存款存取款的相关功能 具体需求: 模拟.3张银行卡,1001,1002,1003,分别设置密码和余额(可以用9个变里分别保存卡号.密码和余额) 提示用户输入银行卡和密码 如果用户输入正确 ...

  9. C语言作业银行ATM系统,C语言银行存取款管理系统

    <C语言银行存取款管理系统>由会员分享,可在线阅读,更多相关<C语言银行存取款管理系统(16页珍藏版)>请在人人文库网上搜索. 1.高级语言程序设计 课程设计报告得分:信电工程 ...

最新文章

  1. 30K 月薪运维工程师面试考什么?滴滴17年春招笔试题
  2. C#中泛型的相关知识点总结
  3. mysql 3种报错_MySQL读取Binlog日志常见的3种错误-阿里云开发者社区
  4. pb retrieve时停止工作_大佬们挂在嘴边的PE、PB是什么?
  5. Apaceh配置httpd-vhosts虚拟主机
  6. 语义分割论文阅读:FCN、PSPNet、DDRNet、BiseNet、BiseNetV2、deeplabv3
  7. Springboot项目部署到外部Tomcat
  8. 力扣76,最小覆盖字串(JavaScript)
  9. 虚拟机里linux7关不了,虚拟机上CentOS 7关闭防火墙操作
  10. python机器学习案例系列教程——BIRCH聚类
  11. javascript 高级程序设计_所以 JavaScript 到底是什么?我居然懵了????
  12. 始终都要覆盖toString()方法
  13. win7更新_今天,Win7正式终止更新,扫雷成为历史
  14. 云队友丨张朝阳不再狂妄,搜狐的艰难复苏路
  15. 我对“心即理,致良知,知行合一”和《王阳明四句教》的的理解。
  16. python正版软件多少钱_正版数据库软件需要多少钱
  17. Soul App打造社交元宇宙,打破次元壁
  18. 向量检索的索引构建算法综述
  19. 身份证号码校验(JavaScript)
  20. FTP主动模式和被动模式!

热门文章

  1. 艾乐云后台伪装404恶搞页,后台恶搞伪装单页
  2. 微信公众号包含敏感信息
  3. VC++年月日时间和64位时间的使用及相互转换(附源码)
  4. 1715. 苹果和橘子的个数
  5. 分享和推广产品是成功淘宝客的技巧
  6. QT程序自动升级方案
  7. 如何用织梦在本地搭建网站?
  8. 【复盘比赛】SDP 2021@NAACL LongSumm 科学论⽂⻓摘要生成任务 第一名
  9. ADO Execute 方法 (ADO Connection)
  10. 2020计算机应用基础历年真题,2020北京自考计算机应用基础真题及答案