ATM应用实现

前端界面——控制器——Service层——Dao层——数据库

主程序:

package bank.atm;

import bank.atm.controller.bank.ATMController;
import bank.atm.domain.ATM;
import bank.atm.domain.Bank;
import bank.atm.ui.ATMUISupport;
import bank.atm.util.tools.BasicTools;

import java.util.Scanner;

public class SystemEnter {
    public static ATM atmSys;//ATM实例

    /**
     * ATM 系统入口的main方法
     */
    public SystemEnter() {
    }

    public static void main(String[] args) {
        if (atmSys == null) {
            instanceATM();
        }

        ATMUISupport.drawingWelcomeUI();//输出欢迎界面
    }

    private static void instanceATM() {
        Scanner input = BasicTools.getScanner();
        System.out.println("请输入测试应用的ATM编号");
        String atmId = input.next();
        Bank bank = null;

        try {
            ATMController atmCtrl = new ATMController();
            atmSys = atmCtrl.loadATMById(atmId);
            bank = atmCtrl.loadBankById(atmSys.getBankId());
            atmSys.setBank(bank);
        } catch (Exception var4) {
            var4.printStackTrace();
        }

    }
}

UI界面:

package bank.atm.ui;

import bank.atm.SystemEnter;
import bank.atm.controller.account.AccountInfoController;
import bank.atm.domain.AccountInfo;
import bank.atm.util.tools.BasicTools;

import java.math.BigDecimal;
import java.util.Map;
import java.util.Scanner;

public class ATMUISupport {
    public ATMUISupport() {
    }

    /**
     * 输入ATM机号码以后的欢迎界面
     */
    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();
        AccountInfoController accountCtrl = new AccountInfoController();
        AccountInfo account = accountCtrl.validateAccountInfo(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() {
        boolean flag = false;

        while(true) {//循环处理用户密码输入及选择退卡
            System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
            System.out.println(">>>>>>>>> 继续请输入1  退卡请输入0 >>>>>>>>>>");
            System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
            Scanner input = BasicTools.getScanner();//new一个Scanner
            String action = input.next();//使用字符串接收用户输入
            if (!action.trim().equals("1")) {//用户选择退出
                flag = true;//设置flag为true,方便后面调用退出界面的方法
                break;//退出循环,这个循环下面的内容都不再执行
            }

            System.out.println("************ 请输入6位数字密码 **************");
            String password = input.next();//使用字符串接收用户输入
            if (BasicTools.validDig(password) && password.length() == 6) {//调用验证密码是否都是数字的方法,并且密码的长度要求等于6
                /* 执行数据库密码验证 */
                AccountInfoController controller = new AccountInfoController();//声明一个controller对象
                /* 执行验证密码的方法,传入的参数是获取当前atmSys(银行卡对象)的账号和密码 */
                int res = controller.validatePassword(SystemEnter.atmSys.getAccount().getAccount(), Integer.parseInt(password));
                if (res == 1) {//验证密码通过
                    break;//结束本次循环
                }

                /**
                 * 修改密码输入错误次数
                 */
                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("##########################################");
                } else 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 = true;
                    break;//退出循环
                }
            } else {
                System.out.println("*********** 系统提示:密码必需是6位数字  *****************");
            }
        }

        if (!flag) {
            drawingBizUI();//输入密码正确时flag是false,这里!flase等于true,条件满足,转到登录成功后页面:主菜单
        } else {//退卡
            drawingPullOutUI();//用户选择退出时或者密码累积输错3次时flag是true,返回到退出界面
        }

    }

    /**
     * 打印主菜单的方法
     */
    private static void drawingBizUI() {
        System.out.println("\n\n");
        System.out.println("□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□");
        /* 判断取款机里的钱是否大于最小的单次取款金额(100元),如果钱不够,就不显示取款菜单了,只能进行存款和转账操作 */
        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("---------   请按以上提示输入回车继续    ---------");
        /* 获取用户的输入,调用confirmOperation方法,判断用户的输入并调用相应的方法 */
        String action = BasicTools.getScanner().next();
        confirmOperation(action);//调用确认用户选择项方法
    }

    /**
     * 主菜单判断用户输入数字,调用对应方法
     * @param action
     */
    private static void confirmOperation(String action) {
        switch(action.hashCode()) {
            case 49:
                if (action.equals("1")) {
                    drawingWithdrawMoneyUI();
                    return;
                }
                break;
            case 50:
                if (action.equals("2")) {
                    drawingDepositUI();
                    return;
                }
                break;
            case 51:
                if (action.equals("3")) {
                    drawingTransferAccountsUI();
                    return;
                }
                break;
            case 52:
                if (action.equals("4")) {
                    drawingBusinessQueryUI();
                    return;
                }
                break;
            case 53:
                if (action.equals("5")) {
                    drawingModifyPasswordUI();
                    return;
                }
                break;
            case 54:
                if (action.equals("6")) {
                    drawingPullOutUI();
                    return;
                }
        }

        drawingPullOutUI();
    }

    /**
     * 退卡的方法
     */
    public static void drawingPullOutUI() {
        System.out.println("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");
        System.out.println("※※※※※※※※※※      请取出您的银行卡     ※※※※※※※※※※");
        System.out.println("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");
        SystemEnter.atmSys.setAccount((AccountInfo)null);//设置银行卡为null
        drawingWelcomeUI();//返回欢迎页面
    }

    /**
     * 取款菜单
     */
    private static void drawingWithdrawMoneyUI() {
        boolean bool = true;
        System.out.println("取款");

        while(bool) {
            System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
            System.out.println("$$$$$$$$$$$$$$$ 请输入取款金额  $$$$$$$$$$$$$$$$");
            System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
            String money = BasicTools.getScanner().next();//用字符串接收用户输入
            //验证是否是数字
            if (!BasicTools.validDig(money)) {//调用BasicTools类里验证是否为数字的方法
                System.err.println("########## 系统提示 必需是数字 ###########");
                System.err.println("##### 继续取款请输入1 返回主菜单请输入2 #####");
                if ("1".equals(BasicTools.getScanner().next())) {
                    continue;//结束这个循环
                }
            //验证是否是整百数字
            } else if (Integer.parseInt(money) % 100 != 0) {//转换成数值类型,除以100取余,如果余数不等于0意味着不是整百数数字
                System.err.println("########## 系统提示 取款金额必需是整佰数 ###########");
                System.err.println("##### 继续取款请输入1 返回主菜单请输入2 #####");
                if ("1".equals(BasicTools.getScanner().next())) {
                    continue;
                }
            //验证取款金额大于ATM剩余金额
            } else if (Double.parseDouble(money) > SystemEnter.atmSys.getTotal().doubleValue()) {//比较用户取款金额和ATM余额
                System.err.println("########## 系统提示 ATM 余额不足 ###########");
                System.err.println("##### 继续取款请输入1 返回主菜单请输入2 #####");
                if ("1".equals(BasicTools.getScanner().next())) {
                    continue;
                }
            //验证取款金额大于等于卡余额
            } else if (Double.parseDouble(money) > SystemEnter.atmSys.getAccount().getBalance().doubleValue() - 1.0D) {//取款金额是否大于卡余额减一
                System.err.println("########## 系统提示 您的账户余额不足 ###########");
                System.err.println("##### 继续取款请输入1 返回主菜单请输入2 #####");
                if ("1".equals(BasicTools.getScanner().next())) {
                    continue;
                }
            //验证取款金额大于ATM单次最高取款金额
            } else {
                if (Double.parseDouble(money) > SystemEnter.atmSys.getSingleWithdrawMax().doubleValue()) {//取款金额是否大于ATM单次最高取款金额
                    System.err.println("########## 系统提示 单次取款金额不能大于ATM单次取款上限" + SystemEnter.atmSys.getSingleWithdrawMax().longValue() + " ###########");
                    System.err.println("##### 继续取款请输入1 返回主菜单请输入2 #####");
                    if ("1".equals(BasicTools.getScanner().next())) {
                        continue;
                    }
                    break;
                }
                //取款后修改ATM系统实例余额与ATM中银行卡余额
                AccountInfoController ctrl = new AccountInfoController();
                //调用控制器中withdrawMoney的方法,获取到当前的ATM机对象,并将金额作为参数传递过去
                Map<String, Double> map = ctrl.withdrawMoney(SystemEnter.atmSys.getAccount(), new BigDecimal(money));
                if (((Double)map.get("res")).intValue() == 3) {
                    System.out.println("☆☆☆☆☆☆☆☆ 恭喜您,本次业务交易成功! ☆☆☆☆☆☆☆☆");
                    System.out.println("☆☆☆☆☆☆☆ 本次取款 " + money + "元☆☆☆☆☆☆☆☆");
                    SystemEnter.atmSys.modifyATMBalance(new BigDecimal(money), -1);
                    SystemEnter.atmSys.modifyAccountBalance(new BigDecimal(money), (Double)map.get("poundage"), -1);
                    System.out.println("☆☆☆☆☆☆☆ 手续费 " + map.get("poundage").doubleValue() + "元☆☆☆☆☆☆☆☆");
                    System.out.println("ATM 当前余额 " + SystemEnter.atmSys.getTotal().doubleValue());
                    System.out.println("银行卡 当前余额 " + SystemEnter.atmSys.getAccount().getBalance().doubleValue());
                } else if (((Double)map.get("res")).intValue() == -1) {
                    System.out.println("☆☆☆☆☆☆☆☆ 本次操作是跨行取款,收取手续费后余额不足 ☆☆☆☆☆☆☆☆");
                } else if (((Double)map.get("res")).intValue() == -2) {
                    System.out.println("☆☆☆☆☆☆☆☆ 每日累计取款总额已超出ATM最高限制 ☆☆☆☆☆☆☆☆");
                } else if (((Double)map.get("res")).intValue() == -3) {
                    System.out.println("☆☆☆☆☆☆☆☆ 每日累计取款次数已超出ATM最高限制 ☆☆☆☆☆☆☆☆");
                } else if (((Double)map.get("res")).intValue() == -4) {
                    System.out.println("☆☆☆☆☆☆☆☆ 每日累计取款总额超出银行卡最高限制 ☆☆☆☆☆☆☆☆");
                }
            }
            break;
        }

        drawingBizUI();//返回主菜单
    }


    /**
     * 存款菜单
     */
    private static void drawingDepositUI() {
        System.out.println("存款");
        boolean bool = true;

        while(bool) {
            System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
            System.out.println("$$$$$$$$$$$$$$$ 请输入存款金额  $$$$$$$$$$$$$$$$");
            System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
            String money2 = BasicTools.getScanner().next();//用字符串接收用户输入
            //验证是否是数字
            if (!BasicTools.validDig(money2)) {//调用BasicTools类里验证是否为数字的方法
                System.err.println("########## 系统提示 必需是数字 ###########");
                System.err.println("##### 继续存款请输入1 返回主菜单请输入2 #####");
                if ("1".equals(BasicTools.getScanner().next())) {
                    continue;//结束这个循环
                }
                //验证是否是整百数字
            } else if (Integer.parseInt(money2) % 100 != 0) {//转换成数值类型,除以100取余,如果余数不等于0意味着不是整百数数字
                System.err.println("########## 系统提示 存款金额必需是整佰数 ###########");
                System.err.println("##### 继续存款请输入1 返回主菜单请输入2 #####");
                if ("1".equals(BasicTools.getScanner().next())) {
                    continue;
                }
                //验证存款金额小于ATM单次最低存款金额
            } else if (Double.parseDouble(money2) < SystemEnter.atmSys.getSingleDepositMin().doubleValue()){//存款金额是否小于ATM单次最低存款金额
                System.err.println("########## 系统提示 单次存款金额不能小于ATM单次存款下限" + SystemEnter.atmSys.getSingleDepositMin().longValue() + " ###########");
                System.err.println("##### 继续存款请输入1 返回主菜单请输入2 #####");
                if ("1".equals(BasicTools.getScanner().next())) {
                    continue;
                }
                break;
                //验证存款金额大于ATM单次最高存款金额
            } else{
                if (Double.parseDouble(money2) > SystemEnter.atmSys.getSingleDepositMax().doubleValue()) {//存款金额是否大于ATM单次最高存款金额
                    System.err.println("########## 系统提示 单次存款金额不能大于ATM单次存款上限" + SystemEnter.atmSys.getSingleDepositMax().longValue() + " ###########");
                    System.err.println("##### 继续存款请输入1 返回主菜单请输入2 #####");
                    if ("1".equals(BasicTools.getScanner().next())) {
                        continue;
                    }
                    break;
                }
                //存款后修改ATM系统实例余额与ATM中银行卡余额
                AccountInfoController ctrl = new AccountInfoController();
                //调用控制器中withdrawMoney的方法,获取到当前的ATM机对象,并将金额作为参数传递过去
                Map<String, Double> map = ctrl.depositMoney(SystemEnter.atmSys.getAccount(), new BigDecimal(money2));
                if (((Double)map.get("res")).intValue() == 3) {
                    System.out.println("☆☆☆☆☆☆☆☆ 恭喜您,本次业务交易成功! ☆☆☆☆☆☆☆☆");
                    System.out.println("☆☆☆☆☆☆☆ 本次存款 " + money2 + "元☆☆☆☆☆☆☆☆");
                    SystemEnter.atmSys.modifyATMBalance(new BigDecimal(money2), 1);
                    SystemEnter.atmSys.modifyAccountBalance(new BigDecimal(money2), (Double)map.get("poundage"), 1);
                    System.out.println("☆☆☆☆☆☆☆ 手续费 " + map.get("poundage").doubleValue() + "元☆☆☆☆☆☆☆☆");
                    System.out.println("ATM 当前余额 " + SystemEnter.atmSys.getTotal().doubleValue());
                    System.out.println("银行卡 当前余额 " + SystemEnter.atmSys.getAccount().getBalance().doubleValue());
                } else {
                    System.out.println("☆☆☆☆☆☆☆☆ 未知错误 ☆☆☆☆☆☆☆☆");
                }
            }
            break;
        }

        drawingBizUI();//返回主菜单
    }

    /**
     * 转账菜单
     */
    private static void drawingTransferAccountsUI() {

        /**
         * 请用户输入转账银行卡号界面
         */
        System.out.println("//////////////////////////////////////////////");
        System.out.println("////// 请输入要转入的银行卡卡号 /////////////////////////////");
        System.out.println("//////////////////////////////////////////////");
        String cardNum2 = BasicTools.getScanner().next();
        AccountInfoController accountCtrl = new AccountInfoController();
        AccountInfo account2 = accountCtrl.validateAccountInfo(cardNum2);
        if (account2 == null) {//卡无效
            System.out.println("您的银行卡是无效的");
            System.err.println("##### 重新输入卡号请输入1 返回主菜单请输入2 #####");
            String flag = BasicTools.getScanner().next();//用字符串接收用户输入
            if (flag=="1"){
                drawingTransferAccountsUI();//重新输入银行卡
            }else if(flag == "2"){
                drawingBizUI();//返回主菜单
            }else{
                System.out.println("无法识别您的输入!");
                drawingBizUI();//返回主菜单
            }
        } else if (account2.getFrozen() == 1) {//银行卡被锁定
            System.err.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
            System.err.println("!!!!!!!!!!! 此卡处于锁定状态,无法转账 !!!!!!!!!!!!");
            System.err.println("!!!! 如需解锁,请本人持有效证件到本行柜台办理   !!!!!!");
            System.err.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
            drawingBizUI();//返回主菜单
        } else {//银行卡有效
            SystemEnter.atmSys.setAccount2(account2);//设置为ATM中要转入的银行卡
            System.out.println("要转入的卡号为:"+SystemEnter.atmSys.getAccount2().getAccount());
        }

        /**
         * 转账的操作
         */
        boolean bool = true;
        System.out.println("转账");

        while(bool) {
            System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
            System.out.println("$$$$$$$$$$$$$$$ 请输入转账金额  $$$$$$$$$$$$$$$$");
            System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
            String money = BasicTools.getScanner().next();//用字符串接收用户输入
            //验证是否是数字
            if (!BasicTools.validDig(money)) {//调用BasicTools类里验证是否为数字的方法
                System.err.println("########## 系统提示 必需是数字 ###########");
                System.err.println("##### 继续转账请输入1 返回主菜单请输入2 #####");
                if ("1".equals(BasicTools.getScanner().next())) {
                    continue;//结束这个循环
                }
                //验证转账金额大于等于卡余额
            } else if (Double.parseDouble(money) > SystemEnter.atmSys.getAccount().getBalance().doubleValue() - 1.0D) {//转账金额是否大于卡余额减一
                System.err.println("########## 系统提示 您的账户余额不足 ###########");
                System.err.println("##### 继续转账请输入1 返回主菜单请输入2 #####");
                if ("1".equals(BasicTools.getScanner().next())) {
                    continue;
                }
            } else {
                if (Double.parseDouble(money) > SystemEnter.atmSys.getSingleTurnOutMax().doubleValue()) {//转账金额是否大于ATM单次最高转账金额
                    System.err.println("########## 系统提示 单次转账金额不能大于ATM单次转账上限" + SystemEnter.atmSys.getSingleTurnOutMax().longValue() + " ###########");
                    System.err.println("##### 继续转账请输入1 返回主菜单请输入2 #####");
                    if ("1".equals(BasicTools.getScanner().next())) {
                        continue;
                    }
                    break;
                }

                //转账后修改ATM中银行卡余额
                AccountInfoController ctrl = new AccountInfoController();
                //调用控制器中withdrawMoney的方法,获取到当前的ATM机对象,并将金额作为参数传递过去
                Map<String, Double> map = ctrl.transferMoney(SystemEnter.atmSys.getAccount(), new BigDecimal(money),SystemEnter.atmSys.getAccount2());
                if (((Double)map.get("res")).intValue() == 4) {
                    System.out.println("☆☆☆☆☆☆☆☆ 恭喜您,本次业务交易成功! ☆☆☆☆☆☆☆☆");
                    System.out.println("☆☆☆☆☆☆☆ 本次转账 " + money + "元☆☆☆☆☆☆☆☆");
                    /* 减少转出银行卡的余额 */
                    SystemEnter.atmSys.modifyAccountBalance(new BigDecimal(money), (Double)map.get("poundage"), -1);
                    /* 增加转入银行卡的余额 */
                    SystemEnter.atmSys.modifyAccount2Balance(new BigDecimal(money), 1);
                    System.out.println("☆☆☆☆☆☆☆ 手续费 " + map.get("poundage").doubleValue() + "元☆☆☆☆☆☆☆☆");
                    System.out.println("ATM 当前余额 " + SystemEnter.atmSys.getTotal().doubleValue());
                    System.out.println("银行卡 当前余额 " + SystemEnter.atmSys.getAccount().getBalance().doubleValue());
                } else if (((Double)map.get("res")).intValue() == -1) {
                    System.out.println("☆☆☆☆☆☆☆☆ 本次操作是跨行转账,收取手续费后余额不足 ☆☆☆☆☆☆☆☆");
                } else if (((Double)map.get("res")).intValue() == -2) {
                    System.out.println("☆☆☆☆☆☆☆☆ 每日累计转账总额已超出ATM最高限制 ☆☆☆☆☆☆☆☆");
                } else if (((Double)map.get("res")).intValue() == -4) {
                    System.out.println("☆☆☆☆☆☆☆☆ 每日累计转账总额超出银行卡最高限制 ☆☆☆☆☆☆☆☆");
                }
            }
            break;
        }

        drawingBizUI();//返回主菜单
    }

    private static void drawingBusinessQueryUI() {
        System.out.println("查询");
    }

    private static void drawingModifyPasswordUI() {
        System.out.println("修改密码");
    }
}

控制器:

package bank.atm.controller.account;

import bank.atm.domain.AccountInfo;
import bank.atm.service.account.AccountInfoServiceImp;

import java.math.BigDecimal;
import java.util.Map;

/**
 * 银行卡操作控制层组件
 * @author Administrator
 *
 */
public class AccountInfoController {

    /**
     * desc : 验证账号是否有效
     * @param cardNumber 卡号
     * @return AccountInfo 实例
     */
    public AccountInfo validateAccountInfo(String cardNumber){
        AccountInfo account = null;
        account = new AccountInfoServiceImp().validateAccountInfo(cardNumber);
        return account;
    }

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

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

    /**
     * 锁定银行卡的方法
     * @param cardNubmer
     * @return
     * @throws Exception
     */
    public int lockAccount(String cardNubmer) {

        return new AccountInfoServiceImp().lockAccount(cardNubmer);
    }

    /**
     * 取款
     * @param account
     * @param money
     * @return Map<String,BigDecimal>
     */
    public Map<String,Double> withdrawMoney(AccountInfo account, BigDecimal money){
        return new AccountInfoServiceImp().withdrawMoney(account,money);
    }

    /**
     * 存款
     * @param account
     * @param money
     * @return Map<String,BigDecimal>
     */
    public Map<String, Double> depositMoney(AccountInfo account, BigDecimal money){
        return new AccountInfoServiceImp().depositMoney(account, money);
    }

    /**
     * 转账
     * @param account
     * @param money
     * @param account2
     * @return
     */
    public Map<String,Double> transferMoney(AccountInfo account, BigDecimal money,AccountInfo account2){
        return new AccountInfoServiceImp().transferMoney(account,money,account2);
    }
}

基础工具:

package bank.atm.util.tools;

import bank.atm.domain.Bank;

import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.URLDecoder;
import java.util.Scanner;

public class BasicTools {
    private static Scanner scanner;

    public BasicTools() {
    }

    public static String getClassPath() {
        String classPath = null;
        String filePath = BasicTools.class.getClassLoader().getResource("").toString();

        try {
            if (filePath != null && !filePath.trim().equals("")) {
                filePath = URLDecoder.decode(filePath, "UTF-8");
                classPath = filePath.substring(filePath.indexOf("/") + 1);
            }
        } catch (UnsupportedEncodingException var3) {
            var3.printStackTrace();
        }

        return classPath;
    }

    /**
     * 定义一个获取Scanner的方法供其它类调用
     * @return
     */
    public static Scanner getScanner() {
        if (scanner == null) {
            scanner = new Scanner(System.in);
        }

        return scanner;
    }

    /**
     * 验证密码是否都是数字的方法,返回值是布尔类型
     * @param res
     * @return
     */
    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;
    }

    /**
     * 跨行取款手续费计算方法
     * @param bank
     * @param amount
     * @return
     */
    public static double crossBankWithdrawal(Bank bank, BigDecimal amount) {
        double poundage = 0.0D;
        //如果:取款数额*手续费百分数/100 < 最低手续费;则按最低标准收取手续费
        if (amount.multiply(new BigDecimal(bank.getCrossOutPercent()))
                .divide(new BigDecimal(100)).doubleValue() < bank.getCrossOutMin().doubleValue()) {
            poundage = bank.getCrossOutMin().doubleValue();
        //如果:取款数额*手续费百分数/100 > 最高手续费;则按最高标准收取手续费
        } else if (amount.multiply(new BigDecimal(bank.getCrossOutPercent()))
                .divide(new BigDecimal(100)).doubleValue() > bank.getCrossOutMax().doubleValue()) {
            poundage = bank.getCrossOutMax().doubleValue();
        //按正常比率收取
        } else {
            poundage = amount.multiply(new BigDecimal(bank.getCrossOutPercent()))
                    .divide(new BigDecimal(100)).doubleValue();
        }

        return poundage;//返回手续费的值
    }

    /**
     * 跨行存款手续费计算方法
     * @param bank
     * @param amount
     * @return
     */
    public static double crossBankDeposit(Bank bank, BigDecimal amount) {
        double poundage = 0.0D;
        //如果:存款数额*手续费百分数/100 < 最低手续费;则按最低标准收取手续费
        if (amount.multiply(new BigDecimal(bank.getCrossInPercent()))
                .divide(new BigDecimal(100)).doubleValue() < bank.getCrossInMin().doubleValue()) {
            poundage = bank.getCrossInMin().doubleValue();

        //如果:存款数额*手续费百分数/100 > 最高手续费;则按最高标准收取手续费
        } else if (amount.multiply(new BigDecimal(bank.getCrossInPercent()))
                .divide(new BigDecimal(100)).doubleValue() > bank.getCrossInMax().doubleValue()) {
            poundage = bank.getCrossInMax().doubleValue();

        //按正常比率收取
        } else {
            poundage = amount.multiply(new BigDecimal(bank.getCrossInPercent()))
                    .divide(new BigDecimal(100)).doubleValue();
        }

        return poundage;//返回手续费的值
    }

    /**
     * 跨行转账手续费计算方法
     * @param bank
     * @param amount
     * @return
     */
    public static double crossBankTransfer(Bank bank, BigDecimal amount) {
        double poundage = 0.0D;
        //如果:转账数额*手续费百分数/100 < 最低手续费;则按最低标准收取手续费
            if (amount.multiply(new BigDecimal(bank.getCrossTaPercent()))
                .divide(new BigDecimal(100)).doubleValue() < bank.getCrossTaMin().doubleValue()) {
            poundage = bank.getCrossTaMin().doubleValue();
            //如果:转账数额*手续费百分数/100 > 最高手续费;则按最高标准收取手续费
        } else if (amount.multiply(new BigDecimal(bank.getCrossTaPercent()))
                .divide(new BigDecimal(100)).doubleValue() > bank.getCrossTaMax().doubleValue()) {
            poundage = bank.getCrossTaMax().doubleValue();
            //按正常比率收取
        } else {
            poundage = amount.multiply(new BigDecimal(bank.getCrossTaPercent()))
                    .divide(new BigDecimal(100)).doubleValue();
        }

        return poundage;//返回手续费的值
    }
}

Service层:

package bank.atm.service.account;

import bank.atm.SystemEnter;
import bank.atm.dao.account.AccountInfoDaoImp;
import bank.atm.domain.AccountInfo;
import bank.atm.util.tools.BasicTools;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

/**
 * 服务层通用接口的实现类
 */
public class AccountInfoServiceImp implements AccountInfoService{

    /* 空构造器 */
    public AccountInfoServiceImp() {
    }

    /**
     * 验证卡号是否有效,调用了AccountInfoDaoImp里的validateAccountInfo方法
     * @param cardNumber 卡号
     * @return AccountInfo 实例
     */
    public AccountInfo validateAccountInfo(String cardNumber) {
        return (new AccountInfoDaoImp()).validateAccountInfo(cardNumber);
    }

    /**
     * 验证账号密码,调用了AccountInfoDaoImp里的validatePassword方法
     * @param cardNumber 卡号
     * @param password 密码
     * @return int
     */
    public int validatePassword(String cardNumber, int password) {
        return (new AccountInfoDaoImp()).validatePassword(cardNumber, password);
    }

    /**
     * 锁定银行卡
     * @param cardNubmer 卡号
     * @return
     */
    public int lockAccount(String cardNubmer) {
        try {
            return (new AccountInfoDaoImp()).lockAccount(cardNubmer);
        } catch (Exception var3) {
            var3.printStackTrace();
            return 0;
        }
    }

    /**
     * 取款
     * @param account 账户
     * @param money 交易金额
     * @return 返回对象mapRes,返回值是对象里的res -1账户余额不足,-2累计取款总额超出ATM最高限制,
     * -3累计取款次数已超出ATM最高限制 -4累计取款总和超出银行卡每日取款累计和上限
     */
    public Map<String, Double> withdrawMoney(AccountInfo account, BigDecimal money) {
        Map<String, Double> mapRes = new HashMap();
        int res = 0;    //返回值
        double poundage = 0.0D; //服务费
        /* 如果银行卡所属银行ID不等于ATM系统所属银行ID,收取跨行取款服务费 */
        if (!account.getBankId().equals(SystemEnter.atmSys.getBankId())) {//如果银行卡对象所属的银行ID不等于当前ATM对象的所属银行ID
            /* 调用BasicTools中计算手续费的方法,手续费和银行和取款数额相关,所以传的参数是银行对象和取款金额 */
            poundage = BasicTools.crossBankWithdrawal(SystemEnter.atmSys.getBank(), money);
            //验证加上手续费以后账户余额是否还够取款.账户余额(Balance)减去(subtract)取款金额(money)是否小于1
            if (account.getBalance().subtract(money.add(new BigDecimal(poundage))).doubleValue() < 1.0D) {
                mapRes.put("res", new Double(-1.0D));//账户余额不足
                return mapRes;
            }
        }

        //查询验证账户每日累计取款次数及累计取款总和
        Map<String, BigDecimal> map = (new AccountInfoDaoImp()).countEverydayDrawingSum(account.getAccount());
        double sum = ((BigDecimal)map.get("everydayDrawingSum")).doubleValue();//累计取款总和
        System.out.println("本次取款之前已取款总额" + sum);
        int num = ((BigDecimal)map.get("everydayDrawingNum")).intValue();//累计取款次数
        System.out.println("本次取款之前已取款总次数" + num);
        if ((new BigDecimal(sum)).add(money).doubleValue() > SystemEnter.atmSys.getEverydayWithdrawMax().doubleValue()) {
            mapRes.put("res", new Double(-2.0D));//累计取款总额超出ATM最高限制
            return mapRes;
        } else if (num == SystemEnter.atmSys.getWithdrawFrequencyMax().intValue()) {
            mapRes.put("res", new Double(-3.0D));//累计取款次数已超出ATM最高限制
            return mapRes;
        } else if (sum + money.doubleValue() > account.getTodayOutMax().doubleValue()) {
            mapRes.put("res", new Double(-4.0D));//累计取款总和超出银行卡每日取款累计和上限
            return mapRes;
        } else {
            try {
                //取款的方法传的是3个参数,银行卡账号,取款金额,服务费
                int res1 = (new AccountInfoDaoImp()).withdrawMoney(account.getAccount(), money, poundage);
                mapRes.put("res", new Double((double)res1));
                mapRes.put("poundage", new Double(poundage));
            } catch (Exception var12) {
                var12.printStackTrace();
            }

            return mapRes;
        }
    }


    /**
     * 存款
     * @param account
     * @param money
     * @return 返回对象mapRes,返回值是对象里的res
     * @throws Exception
     */
    public Map<String, Double> depositMoney(AccountInfo account, BigDecimal money){
        Map<String, Double> mapRes = new HashMap();
        int res = 0;    //返回值
        double poundage = 0.0D; //服务费
        /* 如果银行卡所属银行ID不等于ATM系统所属银行ID,收取跨行取款服务费 */
        if (!account.getBankId().equals(SystemEnter.atmSys.getBankId())) {//如果银行卡对象所属的银行ID不等于当前ATM对象的所属银行ID
            /* 调用BasicTools中计算手续费的方法,手续费和银行和存款数额相关,所以传的参数是银行对象和存款金额 */
            poundage = BasicTools.crossBankDeposit(SystemEnter.atmSys.getBank(), money);
        }
        try {
            //存款的方法传的是3个参数,银行卡账号,存款金额,服务费
            int res1 = (new AccountInfoDaoImp()).depositMoney(account.getAccount(), money, poundage);
            mapRes.put("res", new Double((double)res1));
            mapRes.put("poundage", new Double(poundage));
        } catch (Exception var12) {
            var12.printStackTrace();
        }

        return mapRes;
    }

    /**
     * 转账
     * @param account 转出账户
     * @param money 转出金额
     * @param account2 转入账户
     * @return
     */
    public Map<String, Double> transferMoney(AccountInfo account, BigDecimal money,AccountInfo account2) {
        Map<String, Double> mapRes = new HashMap();
        int res = 0;    //返回值
        double poundage = 0.0D; //服务费
        /* 如果银行卡所属银行ID不等于ATM系统所属银行ID,收取跨行转账服务费 */
        if (!account.getBankId().equals(SystemEnter.atmSys.getBankId())) {//如果银行卡对象所属的银行ID不等于当前ATM对象的所属银行ID
            /* 调用BasicTools中计算手续费的方法,手续费和银行和转账数额相关,所以传的参数是银行对象和转账金额 */
            poundage = BasicTools.crossBankTransfer(SystemEnter.atmSys.getBank(), money);
            //验证加上手续费以后账户余额是否还够转账,账户余额(Balance)减去(subtract)转账金额(money)是否小于1
            if (account.getBalance().subtract(money.add(new BigDecimal(poundage))).doubleValue() < 1.0D) {
                mapRes.put("res", new Double(-1.0D));//账户余额不足
                return mapRes;
            }
        }

        //查询验证账户每日累计转账总和及银行卡每日累计转账和上限
        Map<String, BigDecimal> map = (new AccountInfoDaoImp()).countEverydayTransferSum(account.getAccount());
        double sum = ((BigDecimal)map.get("countEverydayTransferSum")).doubleValue();//累计转账总和
        System.out.println("本次转账之前已转账总额" + sum);
        if ((new BigDecimal(sum)).add(money).doubleValue() > SystemEnter.atmSys.getEverydayTurnOutMax().doubleValue()) {
            mapRes.put("res", new Double(-2.0D));//累计转账总额超出ATM最高限制
            return mapRes;
        } else if (sum + money.doubleValue() > account.getTodayTaMax().doubleValue()) {
            mapRes.put("res", new Double(-4.0D));//累计取款总和超出银行卡每日转账累计和上限
            return mapRes;
        } else {
            try {
                //取款的方法传的是4个参数,转出银行卡账号,转账金额,服务费,转入银行卡账号
                int res1 = (new AccountInfoDaoImp()).transferMoney(account.getAccount(), money, poundage,account2.getAccount());
                mapRes.put("res", new Double((double)res1));
                mapRes.put("poundage", new Double(poundage));
            } catch (Exception var12) {
                var12.printStackTrace();
            }

            return mapRes;
        }
    }
}

Dao层:

package bank.atm.dao.account;

import bank.atm.SystemEnter;
import bank.atm.domain.AccountInfo;
import bank.atm.util.db.DataSourceManager;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public class AccountInfoDaoImp implements AccountInfoDao {
    public AccountInfoDaoImp() {
    }

    /**
     * 验证卡号是否有效
     * @param cardNumber 卡号
     * @return AccountInfo 实例
     */
    public AccountInfo validateAccountInfo(String cardNumber) {
        String sql = "SELECT ID,ACCOUNT,ACCOUNT_TYPE,BALANCE,TODAY_OUT_MAX," +
                "TODAY_TA_MAX,BANKID,FROZEN,LOCATION,CREATETIME " +
                "FROM ACCOUNT_INFO WHERE ACCOUNT = ?";//查询AccountInfo银行卡账户信息表,如果有返回信息说明账号存在
        AccountInfo account = null;//创建一个AccountInfo对象
        Connection conn = null; //创建一个数据库连接
        PreparedStatement ps = null;//创建一个PreparedStatement接口对象
        ResultSet set = null;//创建一个ResultSet结果集对象

        try {
            conn = DataSourceManager.getConnection();//获取数据库连接
            ps = conn.prepareStatement(sql);//实例化PreparedStatement接口对象
            ps.setString(1, cardNumber);//用卡号补全查询参数的占位符
            set = ps.executeQuery();//执行查询,并把查询结果封装到ResultSet结果集对象里

            while(set.next()) {//如果set有内容
                account = new AccountInfo();//每次循环都实例化一个AccountInfo对象并把查询结果封装进去
                account.setAccount(cardNumber);
                account.setAccountType(set.getInt("ACCOUNT_TYPE"));
                account.setBalance(set.getBigDecimal("BALANCE"));
                account.setBankId(set.getString("BANKID"));
                account.setCreateTime(set.getDate("CREATETIME"));
                account.setFrozen(set.getInt("FROZEN"));
                account.setId(set.getString("ID"));
                account.setLocation(set.getString("LOCATION"));
                account.setTodayOutMax(set.getBigDecimal("TODAY_OUT_MAX"));
                account.setTodayTaMax(set.getBigDecimal("TODAY_TA_MAX"));
            }
        } catch (Exception var11) {
            var11.printStackTrace();
        } finally {
            DataSourceManager.close(set);
            DataSourceManager.close(ps);
            DataSourceManager.close(conn);
        }

        return account;//返回账户信息
    }

    /**
     * 验证密码的方法
     * @param cardNumber
     * @param password
     * @return
     */
    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);

            for(set = ps.executeQuery();  set.next(); res = set.getInt("RESULTS")) {
            }
        } catch (Exception var12) {
            var12.printStackTrace();
        } finally {
            DataSourceManager.close(set);
            DataSourceManager.close(ps);
            DataSourceManager.close(conn);
        }

        return res;
    }

    /**
     * 锁定银行卡
     * @param cardNumber 卡号
     * @return
     * @throws Exception
     */
    public int lockAccount(String cardNumber) throws Exception {
        int res = 0;
        String sql = "UPDATE ACCOUNT_INFO SET FROZEN = 1 WHERE ACCOUNT = ?";//设置冻结状态为1,银行卡冻结
        Connection conn = null;
        PreparedStatement ps = null;

        try {
            conn = DataSourceManager.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setString(1, cardNumber);
            res = ps.executeUpdate();
        } catch (Exception var10) {
            var10.printStackTrace();
        } finally {
            DataSourceManager.close(ps);
            DataSourceManager.close(conn);
        }

        return res;
    }

    /**
     * 取款
     * @param account 账户
     * @param amount 交易金额
     * @param serviceCharge 手续费
     * @return int
     * @throws Exception
     */
    public int withdrawMoney(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,BUSINESS_TIME,DESCRIPTION) " +
                "VALUES(?,?,?,?,?,SYSDATE,?)";
        /* 更新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 var20) {
            try {
                System.out.println("撤销事务");
                conn.rollback();//撤销事务操作
            } catch (SQLException var19) {
                var19.printStackTrace();
            }

            var20.printStackTrace();
        } finally {
            DataSourceManager.close(ps);
            DataSourceManager.close(ps2);
            DataSourceManager.close(conn);
        }

        return res;
    }

    /**
     * 统计每日累计已取款金额总和与每日累计已取款次数
     * @param cardNumber 卡号
     * @return Map<String, BigDecimal>
     */
    public Map<String, BigDecimal> countEverydayDrawingSum(String cardNumber) {
        Map<String, BigDecimal> map = new HashMap();
        /* 统计系统时间今天内的累计已取款金额和累计已取款次数 */
        /* everydayDrawingSum和everydayDrawingNum是每日累计已取款金额总和与每日累计已取款次数的别名
        *  OUTCODE200表示本次业务是取款 */
        String sql = "SELECT SUM(AMOUNT) everydayDrawingSum,COUNT(AMOUNT) everydayDrawingNum " +
                "FROM BUSINESS WHERE ACCOUNTID = ? AND BUSID ='OUTCODE200' " +
                "AND BUSINESS_TIME BETWEEN " +
                "TO_DATE(TO_CHAR(SYSDATE,'yyyy-mm-dd')||'00:00:00','yyyy-mm-dd hh24:mi:ss') " +
                "AND TO_DATE(TO_CHAR(SYSDATE,'yyyy-mm-dd')||'23:59:59','yyyy-mm-dd hh24:mi:ss')";
        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 var11) {
            var11.printStackTrace();
        } finally {
            DataSourceManager.close(set);
            DataSourceManager.close(ps);
            DataSourceManager.close(conn);
        }

        return map;
    }

    /**
     * 存款
     * @param account 账户
     * @param amount 交易金额
     * @param serviceCharge 手续费
     * @return int
     * @throws Exception
     */
    public int depositMoney(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,BUSINESS_TIME,DESCRIPTION) " +
                "VALUES(?,?,?,?,?,SYSDATE,?)";
        /* 更新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, "TID10011");
            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 var20) {
            try {
                System.out.println("撤销事务");
                conn.rollback();//撤销事务操作
            } catch (SQLException var19) {
                var19.printStackTrace();
            }

            var20.printStackTrace();
        } finally {
            DataSourceManager.close(ps);
            DataSourceManager.close(ps2);
            DataSourceManager.close(conn);
        }

        return res;
    }
    /**
     * 统计每日累计已转账金额总和
     * @param cardNumber 卡号
     * @return Map<String, BigDecimal>
     */
    public Map<String, BigDecimal> countEverydayTransferSum(String cardNumber) {
        Map<String, BigDecimal> map = new HashMap();
        /* 统计系统时间今天内的累计已转出金额 */
        /* everydayTransferSum和everydayTransferNum是每日累计已转账金额总和的别名
         * TID10012表示本次业务是转出 */
        String sql = "SELECT SUM(AMOUNT) countEverydayTransferSum " +
                "FROM BUSINESS WHERE ACCOUNTID = ? AND BUSID ='TID10012' " +
                "AND BUSINESS_TIME BETWEEN " +
                "TO_DATE(TO_CHAR(SYSDATE,'yyyy-mm-dd')||'00:00:00','yyyy-mm-dd hh24:mi:ss') " +
                "AND TO_DATE(TO_CHAR(SYSDATE,'yyyy-mm-dd')||'23:59:59','yyyy-mm-dd hh24:mi:ss')";
        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("countEverydayTransferSum");
                map.put("countEverydayTransferSum", bd == null ? new BigDecimal(0) : bd);
            }
        } catch (Exception var11) {
            var11.printStackTrace();
        } finally {
            DataSourceManager.close(set);
            DataSourceManager.close(ps);
            DataSourceManager.close(conn);
        }

        return map;
    }

    /**
     * 转账
     * @param account 账户
     * @param amount 交易金额
     * @param serviceCharge 手续费
     * @return int
     * @throws Exception
     */
    public int transferMoney(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 BUSINESS (ID,ACCOUNTID,BUSID,AMOUNT," +
                "POUNDAGE,BUSINESS_TIME,DESCRIPTION) " +
                "VALUES(?,?,?,?,?,SYSDATE,?)";

        /* 更新ATM余额SQL
        *  第一个问号是转入金额,第二个问号是转入账户卡号 */
        String sql3 = "UPDATE ACCOUNT_INFO SET BALANCE = BALANCE+? WHERE ACCOUNT = ?";

        /* 添加交易记录SQL */
        String sql4 = "INSERT INTO BUSINESS (ID,ACCOUNTID,BUSID,AMOUNT," +
                "POUNDAGE,BUSINESS_TIME,DESCRIPTION) " +
                "VALUES(?,?,?,?,?,SYSDATE,?)";

        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, account);
            res += ps.executeUpdate();

            ps2 = conn.prepareStatement(sql2);
            ps2.setString(1, UUID.randomUUID().toString());
            ps2.setString(2, account);
            ps2.setString(3, "TID10012");
            ps2.setBigDecimal(4, amount);
            ps2.setDouble(5, serviceCharge);
            ps2.setString(6, "银行卡 转出");
            res += ps2.executeUpdate();

            ps3 = conn.prepareStatement(sql3);
            ps3.setBigDecimal(1, amount);
            ps3.setString(2, account2);
            res += ps3.executeUpdate();

            ps4 = conn.prepareStatement(sql4);
            ps4.setString(1, UUID.randomUUID().toString());
            ps4.setString(2, account2);
            ps4.setString(3, "TID10013");
            ps4.setBigDecimal(4, amount);
            ps4.setDouble(5, serviceCharge);
            ps4.setString(6, "银行卡 转入");
            res += ps4.executeUpdate();
            conn.commit();//提交事务
        } catch (Exception var20) {
            try {
                System.out.println("撤销事务");
                conn.rollback();//撤销事务操作
            } catch (SQLException var19) {
                var19.printStackTrace();
            }

            var20.printStackTrace();
        } finally {
            DataSourceManager.close(ps);
            DataSourceManager.close(ps2);
            DataSourceManager.close(conn);
        }

        return res;
    }

}

 

posted @ 2021-12-14 22:49  伊万  阅读(113)  评论(0编辑  收藏  举报