模拟ATM机存取款管理系统

一、详细项目功能分析

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();
        /*测试BigDecimal
        BigDecimal 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;//用户id
    private String bankId;//银行id
    private 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;//银行id
    private 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(); // 调用输出主菜单
        else
            drawingPullOutUI();// 返回欢迎界面

    }

    /**
     * 打印主菜单的方法
     */

    /**
     * 退卡的方法
     *
     */
    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(); // 调用输出主菜单
        else
            drawingPullOutUI();// 返回欢迎界面
    }
}

 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
     */
    @Override
    public 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
     */
    @Override
    public 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
     */
    @Override
    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;
    }
    /**
     * 取款
     * @param account 账号
     * @param amount 交易金额
     * @param serviceCharge 手续费
     * @return int
     */
    @Override
    public 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 实例
     */
    @Override
    public 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{
    @Override
    public 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 实例
     */
    @Override
    public AccountInfo validateAccountInfo(String cardNumber) {

        return new AccountInfoDaoImp().validateAccountInfo(cardNumber);
    }

    /**
     * desc : 验证账号密码
     * @param cardNumber 卡号
     * @param password 密码
     * @return int
     */
    @Override
    public int validatePassword(String cardNumber, int password) {

        return new AccountInfoDaoImp().validatePassword(cardNumber,password);
    }

    @Override
    public int lockAccount(String cardNubmer){

        try {
            return new AccountInfoDaoImp().lockAccount(cardNubmer);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    /**
     *
     * @param account 账号
     * @param money 交易金额
     * @return int -1银行卡不是所属银行,不可以进行转账
     */
    @Override
    public 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
     */
    @Override
    public 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;
    }

    @Override
    public AccountInfo BusinessQuery(String account) {

        return new AccountInfoDaoImp().BusinessQuery(account);
    }

    @Override
    public 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 {

    @Override
    public 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 {

    @Override
    public Bank loadBankById(String id) throws Exception {

        return new BankDaoImp().loadBankById(id);
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值