嗖嗖移动大厅(Java小项目)

嗖嗖移动业务大厅(源码已上传,免费下载)

1. 项目需求

​ 中国移动,中国联通,中国电信是国内3大通信运营商,每个运营商都提供了不同的品牌套餐来应对不同的用户群,比如北京移动主要有全球通,神州行,动感地带等3大品牌套餐,每种套餐的内容和费用不同,嗖嗖移动是一个假定的通信运营商,提供了话痨套餐,网虫套餐,超人套餐,各种套餐所包含的服务内容及费用如下表:

品牌套餐话痨套餐网虫套餐超人套餐
通话时长(分钟)6000300
上网流量02010
短信条数(条)100050
费用(元/月)586878

​ 如实际使用中超出套餐内包含的通话时长,短信条数和上网流量,则按一下规则计费:

  • 超出的通话: 0.2元/分
  • 超出的短信:0.1元/条
  • 超出的上网流量:0.1元/MB

​ 本任务实现的"嗖嗖移动业务大厅"提供了嗖嗖移动用户的常用功能,包括新用户注册,本月账单查询,套餐余量查询,打印消费详情,套餐变更,办理退网,话费充值,查看消费记录,查看话费说明等功能.另外,还可以模拟用户通话,上网,发送短信的场景进行相应的扣费并记录消费信息.各功能介绍如下表:

菜单级别功能描述
主菜单用户登录输入正确的手机号码和密码进入二级菜单列表
主菜单用户注册录入信息并开卡,用户输入的信息包括:选择卡号,选择套餐类型,输入用户名和密码,预存话费金额(预存话费金额必须满足以支付所选套餐的一个月的费用)
主菜单使用嗖嗖输入正确的手机号码和密码之后,随机进入本号码所属套餐可以支持的一个场景,消费套餐余量或者话费余额,并记录消费信息.当话费余额不足时,抛出异常提醒用户充值
主菜单话费充值输入正确的用户名和密码之后,可为该卡号充值
主菜单资费说明提供各品牌套餐所包含的通话时长,上网流量,短信条数,月费用等
主菜单退出系统提出本系统
二级菜单本月账单查询可查询该卡号的套餐费用,实际消费金额,账户余额
二级菜单套餐余量查询可查询该卡号的套餐余量
二级菜单打印消费详情输入正确的卡号和密码后,可打印当前卡号用户的消费详单, 使用输出流把用户信息输出到文件
二级菜单套餐变更可变更为其他套餐类型,变更后话费余额需减去变更后的套餐费用,余额不足时需要给出信息提示,套餐变更后重新统计卡中实际消费数据以及当月消费金额
二级菜单办理退网输入正确的卡号和密码后,可以从已注册的号码列表中删除本号码,并退出系统

2. 项目使用的技术

  • 面向对象的思想
  • 封装,继承,多态,接口的使用
  • 异常处理的合理使用
  • 集合框架的使用
  • I/O 操作实现对文件的写
  • MySQL数据
  • JDBC操作数据库

3.项目需求分析

3.1 实体类和接口

  • Card(电话号码类)
    • cardNumber 卡号
    • status 状态
  • MoboleCard(嗖嗖移动卡类)
  • cardNumber 卡号
  • username 用户名
  • password 密码
  • serPackage 所属套餐
  • money 账户余额
  • status 状态
  • monthlyConsumptionRecords(月消费记录类)
    • cardNumber 卡号
    • consumAmount 当月消费金额
    • realTalkTime 当月实际通话时长
    • realSMSCount 当月实际发送短信条数
    • realFlow 当月实际上网流量
    • consumeDate 消费日期
  • **套餐类 SerPackage **
  • talkTime 通话时长
  • smsCount 短信条数
  • price 套餐月资费
  • flow 上网流量
  • type 套餐类型
  • 套餐类型类 SerPackageType
  • name 套餐名称
  • ConsumInfo(消费信息类)
  • cardNumber 卡号
  • type 消费类型
  • consumData 消费数据
  • consumeDate 消费日期
  • Scene(使用场景类)
  • type 场景类型
  • data 场景消费数据
  • description description
  • RechargeRecord(充值记录类)
    • amount 充值金额
  • rechargeDate 充值日期
  • cardNumber 卡号

3.2 各功能效果图

1. 菜单显示页面,以及登录

在这里插入图片描述

卡号或密码错误:
在这里插入图片描述

卡号被禁用:
在这里插入图片描述

登录成功:
在这里插入图片描述

2. 用户注册

在这里插入图片描述
如果预存花费不足则提示
在这里插入图片描述

3. 本月账单查询

在这里插入图片描述

4. 套餐余量查询

在这里插入图片描述
-50条代表使用超出50条短信

5. 添加和打印消費清单

在这里插入图片描述

打印出来的消费详情通过I/O流输出到对应的用户文档中

在这里插入图片描述
在这里插入图片描述

如果没有消费记录:
在这里插入图片描述

6. 使用嗖嗖

功能分析

1) 模拟嗖嗖用户使用卡的过程,选择该功能后,输入当前卡号,通过验证后,可随机进入如下表的6个场景,要求所进入的场景的服务类型是该卡所属套餐支持的(如网虫套餐只能进入服务类型为"上网"的场景)

序号服务类型描述
0通话问候客户,谁知其如此难缠,通话90分钟
1通话询问妈妈身体状况,本地通话30分钟
2短信参与环境保护实施方案问卷调查,发送短信5条
3短信同时朋友本人已换手机号码,发送短信50条
4上网和女朋友微信视频聊天,使用流量1GB
5上网晚上手机在线追剧,一不留神睡着了,使用流量2GB
  1. 模拟消费,进入场景之后,将按场景的描述要求消费套餐余量,如果套餐余量不足,则需要按套餐外的费用规则扣费,成功消费后,添加一条消费记录
    在这里插入图片描述

如果消费失败:
在这里插入图片描述
> 卡号被禁用后不能进行登录和使用嗖嗖操作

7. 办理退网

在这里插入图片描述
办理退网后,该卡号的相关记录都会被删除,卡号状态也将恢复成可选状态0

8 套餐变更

在这里插入图片描述
如果跟换套餐相同提示
在这里插入图片描述
如果余额不足以更换套餐提示
在这里插入图片描述

9. 话费充值

在这里插入图片描述

10.查看资费说明

查看嗖嗖移动大厅中所有的套餐的资费说明
在这里插入图片描述

4、代码实现思路

项目工程示图(采用三层架构的模式)

在这里插入图片描述

主要实现代码

1、一级菜单框架

/**
     * 显示一级菜单
     */
    public void showFirstMenu() {
        System.out.println("******************欢迎使用嗖嗖移动业务大厅******************");
        System.out.println("1.用户登录\t2.用户注册\t3.使用嗖嗖\t4.话费充值\t5.资费说明\t6.退出系统 ");
        System.out.print("请选择:");
        int choose = input.nextInt();
        switch (choose) {
            case 1:
                //用户登录
                doLogin();
                break;
            case 2:
                //用户注册
                doRegister();
                showFirstMenu();
                break;
            case 3:
                //使用嗖嗖
                useSoSo();
//                showFirstMenu();
                break;
            case 4:
                //话费充值   作业
                topUp();
                showFirstMenu();
                break;
            case 5:
                //资费说明
                costInfo();
                showFirstMenu();
                break;
            case 6:
                //退出系统
                exitSystem();
                break;
            default:
                System.out.println("输入有误!请重新输入!");
                showFirstMenu(); //方法递归,构建成一个循环
                break;
        }

    }

2、二级菜单框架

/**
     * 二级菜单
     */
    private void showSecondMenu() {
        System.out.println("******嗖嗖移动用户菜单******");
        System.out.println("1.本月账单查询");
        System.out.println("2.套餐余量查询"); //作业
        System.out.println("3.打印消费详情");
        System.out.println("4.套餐变更");
        System.out.println("5.办理退网");
        System.out.print("请选择(输入1-5选择功能,其他键返回上一级):");
        int choose = input.nextInt();
        switch (choose) {
            case 1:
                //查询本月账单
                queryCurrentMonthBill();
                showSecondMenu();
                break;
            case 2:
                querySerPackageFree();
                showSecondMenu();
                break;
            case 3:
                printConsumeInfo();
                showSecondMenu();
                break;
            case 4:
                changeSerPackage();
                showSecondMenu();
                break;
            case 5:
                quitNetWork();
                break;
            default:
                //返回到上级菜单
                showFirstMenu();
                break;
        }
    }

3、用户登录

/**
     * 处理登录
     */
    private void doLogin() {
        /**
         * 1. 用户输入卡号以及密码
         * 2. 使用jdbc发送select语句到数据库表根据卡号,密码查询
         * 3. 如果记录存在, 判断是否是禁用状态, 如果禁用状态, 返回错误信息 "该卡号已被禁用!"
         * 4. 如果记录不存在,  返回错误信息 "卡号或者密码错误"
         * 5. 如果记录存在,可用状态, 登录成功, 进入到二级菜单
         */
        MoboleCardServiceImpl moboleCardService = new MoboleCardServiceImpl();
        System.out.println("请输入手机卡号:");
        String cardNumber = input.next();
        System.out.println("请输入密码:");
        String password = input.next();
        List<MoboleCard> login = moboleCardService.login(cardNumber, password);
        //通过卡号查询卡号状态
        List<MoboleCard> moboleCard = moboleCardService.queryStatusByCardNumber(cardNumber);
        if (login.isEmpty()) {
            System.out.println("【友情提示】:卡号或密码错误!");
            showFirstMenu();
        } else if (moboleCard.get(0).getStatus() == 1) {
            System.out.println("【友情提示】:该卡号已被禁用,请充值!");
            showFirstMenu();
        } else
            currentLoginCard = cardNumber;//把登录的卡号存储起来
        showSecondMenu();

    }

4、用户注册

/**
     * 处理注册
     */
    private void doRegister() {
        /**
         * 1. 查询所有可选的卡号, 并显示
         * 2. 用户选择卡号
         * 3. 查询所有的套餐类型,并展示,用户选择套餐
         * 4. 用户输入姓名,密码, 以及预存的金额
         * 5. 根据套餐类型查询对应用户选择的套餐, 并判断用户预存金额是否满足支付
         * 6. 如果不满足, 请重新输入预存金额
         * 7. 如果满足, 可以办理
         * 8. 往tb_mobole_card表添加一条记录
         * 9. 往tb_recharge_record表添加一条充值记录
         * 10. 修改tb_card对应cardNumber的卡的状态
         * 11. 办理成功,打印卡信息以及套餐信息
         */
        //1. 查询所有可选的卡号, 并显示
        System.out.println("**************可选择的卡号**************:");
        CardServiceImpl cardService = new CardServiceImpl();
        List<Card> cards = cardService.queryAll();
        int i = 0;
        for (Card card : cards) {
            System.out.print(card.getId() + "." + card.getCardNumber() + "\t");
            i++;
            if (i % 3 == 0) {
                System.out.println();
            }
        }

        System.out.println("请选择您的卡号:");
        int cardId = input.nextInt();
        Card card = cardService.queryById(cardId);

        Serpackage serpackage = null;
        int num = 0;
        out:
        while (true) {
            System.out.print("1、话痨套餐\t2、网虫套餐\t3、超人套餐");
            System.out.print("\t请选择服务套餐:");
            num = input.nextInt();
            SerpackageServiceImpl serpackageService = new SerpackageServiceImpl();
            if (num >= 1 && num <= 3) {
                serpackage = serpackageService.queryById(num);
                break out;
            } else
                System.out.println("输入有误,请重新输入!");
            break;
        }

        System.out.println("请输入用户名:");
        String registerName = input.next();
        System.out.println("请输入密码:");
        String registerPass = input.next();

        System.out.println("请输入预存话费金额:");
        Double money = input.nextDouble();
        Double balance = money - serpackage.getPrice();//余额
        if (balance < 0) {
            System.out.println("您预存话费不足以支付本月套餐费用,请重新输入!");
            return;
        } else {
            //插入用户数据
            MoboleCardServiceImpl moboleCardService = new MoboleCardServiceImpl();
            MoboleCard moboleCard = new MoboleCard(0, card.getCardNumber(), registerName, registerPass, num, balance, 0);
            moboleCardService.insert(moboleCard);
            //修改卡号状态为1
            int status = cardService.cardStatus(1, card.getCardNumber());

            //找到套餐name
            SerpackageTypeServiceImpl serpackageTypeService = new SerpackageTypeServiceImpl();
            SerpackageType serpackageType = serpackageTypeService.queryById(num);

            //将充值记录存入tb_recharge_record表
            RechargeRecordServiceImpl recordService = new RechargeRecordServiceImpl();
            /**
             * 获取注册日期
             */
//            LocalDate localDate = LocalDate.now();
//            java.sql.Date sqlDate = new java.sql.Date(new Date());

            int insert = recordService.insert(new RechargeRecord(0, money, null, card.getCardNumber()));
            if (insert > 0) {
                System.out.println("注册成功!卡号:" + card.getCardNumber() + ",用户名:" + registerName + ",当前余额:" + balance + "元\n" +
                        serpackageType.getName() + "通话时长:" + serpackage.getTalkTime() + "分钟/月\n" +
                        serpackageType.getName() + "短信条数:" + serpackage.getSmsCount() + "条/月\n" +
                        serpackageType.getName() + "月资费:" + serpackage.getPrice() + "元/月\n" +
                        serpackageType.getName() + "上网流量:" + serpackage.getFlow() + "兆/月\n");
            } else
                System.out.println("注册失败!");
        }

    }

5、使用嗖嗖

/**
     * 使用soso, 模拟某张卡的使用.
     */
    private void useSoSo() {
        // 使用嗖嗖, 1. 套餐余量  >= 消费的数量  只需要把套餐余量 - 消费数量
        //         2. 套餐余量 < 消费的数量    超出部分使用额外扣费
        //           2.1  卡的余额支付额外扣费: 正常消费
        //           2.2  卡的余额无法满足额外扣费: 只能消费余额最大可消费的数量
       /*
         1. 输入卡号,查询卡,做验证,卡号存在(在moboleCard表存在),状态可用
         2. 查询所有的场景, 随机选择一个场景
         3. 根据卡的套餐类型 查询办理的套餐,得到套餐的免费使用数量
         4. 根据卡号,当月日期 查询这张表的当月消费记录,
            第一种情况: 有记录, 表示这张卡当月已经开始消费
            第二种情况: 无记录: 表示该卡当月未消费, 需要添加该卡当月消费记录: 0 0 0
         5. 计算套餐余量 = 套餐免费使用量 - 当月消费数量   第一种情况:  >0: 有剩余量 套餐余量 = 差  第二种情况:  <=0: 套餐余量 = 0
            计算最大消费数量 : 第一种情况:  等于场景消费数量     第二种情况:  卡最大消费数量
            卡最大消费数量 = 套餐余量 + 余额消费数量
         6. 往消费记录表添加一条消费记录, 修改月消费记录表: 修改卡的余额
         7.打印
       */
        // 1. 输入卡号,查询卡,做验证,卡号存在(在moboleCard表存在),状态可用
        System.out.println("请输入手机卡号:");
        String cardNumber = input.next();
        //判断卡号是否存在
        MoboleCardServiceImpl moboleCardService = new MoboleCardServiceImpl();
        List<MoboleCard> moboleCards = moboleCardService.queryByCardNumber(cardNumber);

        if (!moboleCards.isEmpty()){
            //判断卡号状态是否为0
            if (moboleCards.get(0).getStatus()==0){
                Random random = new Random();//定义随机数
                SenceServiceImpl senceService = new SenceServiceImpl();
                //获取卡号套餐类型
                Integer serPackage = moboleCards.get(0).getSerPackage();
                //如果类型为1,随机1~4功能
                if (serPackage==1){
                    Sence sence = senceService.queryById(random.nextInt(4) + 1);
                    System.out.println(sence.getDescription());

                    //插入消费信息记录
                    ConsuminfoServiceImpl consuminfoService = new ConsuminfoServiceImpl();
                    int insert = consuminfoService.insert(new Consuminfo(0, cardNumber, sence.getType(), sence.getData(), null));
                    if (insert>0){
                        //判断该卡号是否有月消费记录,有就修改,没有就添加
                        MonthlyConsumptionRecordsServiceImpl monthlyConsumptionRecordsService = new MonthlyConsumptionRecordsServiceImpl();
                        List<MonthlyConsumptionRecords> monthlyConsumptionRecords = monthlyConsumptionRecordsService.queryByCardNumber(cardNumber);
                        if (!monthlyConsumptionRecords.isEmpty()){//有月消费记录
                            switch (sence.getType()){
                                case "通话":
                                    //修改通话时间
                                    int talkTimeByCardNumber = monthlyConsumptionRecordsService.talkTimeByCardNumber(sence.getData(), cardNumber);
                                    //判断套餐通话时长是否超额
                                    //第一种情况:月消费记录表已经超额
                                    if (monthlyConsumptionRecords.get(0).getReal_Talk_Time()>600){
                                        //找到本次消费金额
                                        Double money1=sence.getData()*0.2;
                                        //扣除话费
                                        int i = moboleCardService.updateMoney(money1, cardNumber);
                                        //增加本月消费金额
                                        int i1 = monthlyConsumptionRecordsService.addMoney(money1, cardNumber);
                                        //判断余额是否小于0,小于则禁用卡号
                                        DisableCardNumber(cardNumber);
                                    }
                                    //第二种情况:本次消费加上月消费记录表中的金额才超额
                                    else if (sence.getData()+monthlyConsumptionRecords.get(0).getReal_Talk_Time()>600){

                                        Double money=(sence.getData()+monthlyConsumptionRecords.get(0).getReal_Talk_Time()-600)*0.2;
                                        //扣除话费
                                        int i = moboleCardService.updateMoney(money, cardNumber);

                                        //增加本月消费金额
                                        int i1 = monthlyConsumptionRecordsService.addMoney(money, cardNumber);
                                        //判断余额是否小于0,小于则禁用卡号
                                        DisableCardNumber(cardNumber);
                                    }
                                    break;
                                case "短信":
                                    //修改短信条数
                                    int smsCountByCardNumber = monthlyConsumptionRecordsService.smsCountByCardNumber(sence.getData(), cardNumber);
                                    //判断套餐短信是否超额
                                    //第一种情况:月消费记录表已经超额
                                    if (monthlyConsumptionRecords.get(0).getReal_SMS_Count()>100){
                                        //找到本次消费金额
                                        Double money1=sence.getData()*0.1;
                                        //扣除话费
                                        int i = moboleCardService.updateMoney(money1, cardNumber);
                                        //增加本月消费金额
                                        int i1 = monthlyConsumptionRecordsService.addMoney(money1, cardNumber);
                                        //判断余额是否小于0,小于则禁用卡号
                                        DisableCardNumber(cardNumber);
                                    }
                                    //第二种情况:本次消费加上月消费记录表中的金额才超额
                                    else if (sence.getData()+monthlyConsumptionRecords.get(0).getReal_SMS_Count()>100){
                                        Double money=(sence.getData()+monthlyConsumptionRecords.get(0).getReal_SMS_Count()-100)*0.1;
                                        //扣除话费
                                        int i = moboleCardService.updateMoney(money, cardNumber);
                                        //增加本月消费金额
                                        int i1 = monthlyConsumptionRecordsService.addMoney(money, cardNumber);
                                        //判断余额是否小于0,小于则禁用卡号
                                        DisableCardNumber(cardNumber);
                                    }
                                    break;
                                case "上网":
                                    //修改流量
                                    int flowByCardNumber = monthlyConsumptionRecordsService.flowByCardNumber(sence.getData(), cardNumber);
                                    //判断套餐流量是否超额
                                    //第一种情况:月消费记录表已经超额
                                    if (monthlyConsumptionRecords.get(0).getReal_Flow()>0){
                                        //找到本次消费金额
                                        Double money1=sence.getData()*0.01;
                                        //扣除话费
                                        int i = moboleCardService.updateMoney(money1, cardNumber);
                                        //增加本月消费金额
                                        int i1 = monthlyConsumptionRecordsService.addMoney(money1, cardNumber);
                                        //判断余额是否小于0,小于则禁用卡号
                                        DisableCardNumber(cardNumber);
                                    }
                                    //第二种情况:本次消费加上月消费记录表中的金额才超额
                                    else if (sence.getData()+monthlyConsumptionRecords.get(0).getReal_Flow()>0){
                                        Double money=(sence.getData()+monthlyConsumptionRecords.get(0).getReal_Flow()-0)*0.01;
                                        //扣除话费
                                        int i = moboleCardService.updateMoney(money, cardNumber);
                                        //增加本月消费金额
                                        int i1 = monthlyConsumptionRecordsService.addMoney(money, cardNumber);
                                        //判断余额是否小于0,小于则禁用卡号
                                        DisableCardNumber(cardNumber);
                                    }
                                    break;
                            }
                        }else if (monthlyConsumptionRecords.isEmpty()){//没有月消费记录
                            //添加月消费记录
                            switch (sence.getType()){
                                case "通话":
                                    int insert1 = monthlyConsumptionRecordsService.insert(new MonthlyConsumptionRecords(0, cardNumber, 0.0, sence.getData(), 0, 0, null));

                                    break;
                                case "短信":
                                    int insert2 = monthlyConsumptionRecordsService.insert(new MonthlyConsumptionRecords(0, cardNumber, 0.0,0,  sence.getData(), 0, null));

                                    break;
                                case "上网":
                                    int insert3 = monthlyConsumptionRecordsService.insert(new MonthlyConsumptionRecords(0, cardNumber, 0.0,0,0,   sence.getData(), null));

                                    break;
                            }
                        }
                    }


                    //如果类型为2,随机5~6功能
                }else if (serPackage==2){
                    Sence sence = senceService.queryById(random.nextInt(2) + 5);
                    System.out.println(sence.getDescription());
                    //插入消费信息记录
                    ConsuminfoServiceImpl consuminfoService = new ConsuminfoServiceImpl();
                    int insert = consuminfoService.insert(new Consuminfo(0, cardNumber, sence.getType(), sence.getData(), null));
                    if (insert>0){
                        //判断该卡号是否有月消费记录,有就修改,没有就添加
                        MonthlyConsumptionRecordsServiceImpl monthlyConsumptionRecordsService = new MonthlyConsumptionRecordsServiceImpl();
                        List<MonthlyConsumptionRecords> monthlyConsumptionRecords = monthlyConsumptionRecordsService.queryByCardNumber(cardNumber);
                        if (!monthlyConsumptionRecords.isEmpty()){//有月消费记录
                            switch (sence.getType()){
                                case "通话":
                                    //修改通话时间
                                    int talkTimeByCardNumber = monthlyConsumptionRecordsService.talkTimeByCardNumber(sence.getData(), cardNumber);
                                    //判断套餐通话时长是否超额
                                    //第一种情况:月消费记录表已经超额
                                    if (monthlyConsumptionRecords.get(0).getReal_Talk_Time()>600){
                                        //找到本次消费金额
                                        Double money1=sence.getData()*0.2;
                                        //扣除话费
                                        int i = moboleCardService.updateMoney(money1, cardNumber);
                                        //增加本月消费金额
                                        int i1 = monthlyConsumptionRecordsService.addMoney(money1, cardNumber);
                                        //判断余额是否小于0,小于则禁用卡号
                                        DisableCardNumber(cardNumber);
                                    }
                                    //第二种情况:本次消费加上月消费记录表中的金额才超额
                                    else if (sence.getData()+monthlyConsumptionRecords.get(0).getReal_Talk_Time()>600){

                                        Double money=(sence.getData()+monthlyConsumptionRecords.get(0).getReal_Talk_Time()-600)*0.2;
                                        //扣除话费
                                        int i = moboleCardService.updateMoney(money, cardNumber);

                                        //增加本月消费金额
                                        int i1 = monthlyConsumptionRecordsService.addMoney(money, cardNumber);
                                        //判断余额是否小于0,小于则禁用卡号
                                        DisableCardNumber(cardNumber);
                                    }
                                    break;
                                case "短信":
                                    //修改短信条数
                                    int smsCountByCardNumber = monthlyConsumptionRecordsService.smsCountByCardNumber(sence.getData(), cardNumber);
                                    //判断套餐短信是否超额
                                    //第一种情况:月消费记录表已经超额
                                    if (monthlyConsumptionRecords.get(0).getReal_SMS_Count()>100){
                                        //找到本次消费金额
                                        Double money1=sence.getData()*0.1;
                                        //扣除话费
                                        int i = moboleCardService.updateMoney(money1, cardNumber);
                                        //增加本月消费金额
                                        int i1 = monthlyConsumptionRecordsService.addMoney(money1, cardNumber);
                                        //判断余额是否小于0,小于则禁用卡号
                                        DisableCardNumber(cardNumber);
                                    }
                                    //第二种情况:本次消费加上月消费记录表中的金额才超额
                                    else if (sence.getData()+monthlyConsumptionRecords.get(0).getReal_SMS_Count()>100){
                                        Double money=(sence.getData()+monthlyConsumptionRecords.get(0).getReal_SMS_Count()-100)*0.1;
                                        //扣除话费
                                        int i = moboleCardService.updateMoney(money, cardNumber);
                                        //增加本月消费金额
                                        int i1 = monthlyConsumptionRecordsService.addMoney(money, cardNumber);
                                        //判断余额是否小于0,小于则禁用卡号
                                        DisableCardNumber(cardNumber);
                                    }
                                    break;
                                case "上网":
                                    //修改流量
                                    int flowByCardNumber = monthlyConsumptionRecordsService.flowByCardNumber(sence.getData(), cardNumber);
                                    //判断套餐流量是否超额
                                    //第一种情况:月消费记录表已经超额
                                    if (monthlyConsumptionRecords.get(0).getReal_Flow()>0){
                                        //找到本次消费金额
                                        Double money1=sence.getData()*0.01;
                                        //扣除话费
                                        int i = moboleCardService.updateMoney(money1, cardNumber);
                                        //增加本月消费金额
                                        int i1 = monthlyConsumptionRecordsService.addMoney(money1, cardNumber);
                                        //判断余额是否小于0,小于则禁用卡号
                                        DisableCardNumber(cardNumber);
                                    }
                                    //第二种情况:本次消费加上月消费记录表中的金额才超额
                                    else if (sence.getData()+monthlyConsumptionRecords.get(0).getReal_Flow()>0){
                                        Double money=(sence.getData()+monthlyConsumptionRecords.get(0).getReal_Flow()-0)*0.01;
                                        //扣除话费
                                        int i = moboleCardService.updateMoney(money, cardNumber);
                                        //增加本月消费金额
                                        int i1 = monthlyConsumptionRecordsService.addMoney(money, cardNumber);
                                        //判断余额是否小于0,小于则禁用卡号
                                        DisableCardNumber(cardNumber);
                                    }
                                    break;
                            }
                        }else if (monthlyConsumptionRecords.isEmpty()){//没有月消费记录
                            //添加月消费记录
                            switch (sence.getType()){
                                case "通话":
                                    int insert1 = monthlyConsumptionRecordsService.insert(new MonthlyConsumptionRecords(0, cardNumber, 0.0, sence.getData(), 0, 0, null));

                                    break;
                                case "短信":
                                    int insert2 = monthlyConsumptionRecordsService.insert(new MonthlyConsumptionRecords(0, cardNumber, 0.0,0,  sence.getData(), 0, null));
   
                                    break;
                                case "上网":
                                    int insert3 = monthlyConsumptionRecordsService.insert(new MonthlyConsumptionRecords(0, cardNumber, 0.0,0,0,   sence.getData(), null));

                                    break;
                            }
                        }
                    }

                    //如果类型为3,随机1~6功能
                }else if (serPackage==3){
                    Sence sence = senceService.queryById(random.nextInt(6) + 1);
                    System.out.println(sence.getDescription());
                    //插入消费信息记录
                    ConsuminfoServiceImpl consuminfoService = new ConsuminfoServiceImpl();
                    int insert = consuminfoService.insert(new Consuminfo(0, cardNumber, sence.getType(), sence.getData(), null));
                    if (insert>0){
                        //判断该卡号是否有月消费记录,有就修改,没有就添加
                        MonthlyConsumptionRecordsServiceImpl monthlyConsumptionRecordsService = new MonthlyConsumptionRecordsServiceImpl();
                        List<MonthlyConsumptionRecords> monthlyConsumptionRecords = monthlyConsumptionRecordsService.queryByCardNumber(cardNumber);
                        if (!monthlyConsumptionRecords.isEmpty()){//有月消费记录
                            switch (sence.getType()){
                                case "通话":
                                    //修改通话时间
                                    int talkTimeByCardNumber = monthlyConsumptionRecordsService.talkTimeByCardNumber(sence.getData(), cardNumber);
                                    //判断套餐通话时长是否超额
                                    //第一种情况:月消费记录表已经超额
                                    if (monthlyConsumptionRecords.get(0).getReal_Talk_Time()>600){
                                        //找到本次消费金额
                                        Double money1=sence.getData()*0.2;
                                        //扣除话费
                                        int i = moboleCardService.updateMoney(money1, cardNumber);
                                        //增加本月消费金额
                                        int i1 = monthlyConsumptionRecordsService.addMoney(money1, cardNumber);
                                        //判断余额是否小于0,小于则禁用卡号
                                        DisableCardNumber(cardNumber);
                                    }
                                    //第二种情况:本次消费加上月消费记录表中的金额才超额
                                    else if (sence.getData()+monthlyConsumptionRecords.get(0).getReal_Talk_Time()>600){

                                        Double money=(sence.getData()+monthlyConsumptionRecords.get(0).getReal_Talk_Time()-600)*0.2;
                                        //扣除话费
                                        int i = moboleCardService.updateMoney(money, cardNumber);

                                        //增加本月消费金额
                                        int i1 = monthlyConsumptionRecordsService.addMoney(money, cardNumber);
                                        //判断余额是否小于0,小于则禁用卡号
                                        DisableCardNumber(cardNumber);
                                    }
                                    break;
                                case "短信":
                                    //修改短信条数
                                    int smsCountByCardNumber = monthlyConsumptionRecordsService.smsCountByCardNumber(sence.getData(), cardNumber);
                                    //判断套餐短信是否超额
                                    //第一种情况:月消费记录表已经超额
                                    if (monthlyConsumptionRecords.get(0).getReal_SMS_Count()>100){
                                        //找到本次消费金额
                                        Double money1=sence.getData()*0.1;
                                        //扣除话费
                                        int i = moboleCardService.updateMoney(money1, cardNumber);
                                        //增加本月消费金额
                                        int i1 = monthlyConsumptionRecordsService.addMoney(money1, cardNumber);
                                        //判断余额是否小于0,小于则禁用卡号
                                        DisableCardNumber(cardNumber);
                                    }
                                    //第二种情况:本次消费加上月消费记录表中的金额才超额
                                    else if (sence.getData()+monthlyConsumptionRecords.get(0).getReal_SMS_Count()>100){
                                        Double money=(sence.getData()+monthlyConsumptionRecords.get(0).getReal_SMS_Count()-100)*0.1;
                                        //扣除话费
                                        int i = moboleCardService.updateMoney(money, cardNumber);
                                        //增加本月消费金额
                                        int i1 = monthlyConsumptionRecordsService.addMoney(money, cardNumber);
                                        //判断余额是否小于0,小于则禁用卡号
                                        DisableCardNumber(cardNumber);
                                    }
                                    break;
                                case "上网":
                                    //修改流量
                                    int flowByCardNumber = monthlyConsumptionRecordsService.flowByCardNumber(sence.getData(), cardNumber);
                                    //判断套餐流量是否超额
                                    //第一种情况:月消费记录表已经超额
                                    if (monthlyConsumptionRecords.get(0).getReal_Flow()>0){
                                        //找到本次消费金额
                                        Double money1=sence.getData()*0.01;
                                        //扣除话费
                                        int i = moboleCardService.updateMoney(money1, cardNumber);
                                        //增加本月消费金额
                                        int i1 = monthlyConsumptionRecordsService.addMoney(money1, cardNumber);
                                        //判断余额是否小于0,小于则禁用卡号
                                        DisableCardNumber(cardNumber);
                                    }
                                    //第二种情况:本次消费加上月消费记录表中的金额才超额
                                    else if (sence.getData()+monthlyConsumptionRecords.get(0).getReal_Flow()>0){
                                        Double money=(sence.getData()+monthlyConsumptionRecords.get(0).getReal_Flow()-0)*0.01;
                                        //扣除话费
                                        int i = moboleCardService.updateMoney(money, cardNumber);
                                        //增加本月消费金额
                                        int i1 = monthlyConsumptionRecordsService.addMoney(money, cardNumber);
                                        //判断余额是否小于0,小于则禁用卡号
                                        DisableCardNumber(cardNumber);
                                    }
                                    break;
                            }
                        }else if (monthlyConsumptionRecords.isEmpty()){//没有月消费记录
                            //添加月消费记录
                            switch (sence.getType()){
                                case "通话":
                                    int insert1 = monthlyConsumptionRecordsService.insert(new MonthlyConsumptionRecords(0, cardNumber, 0.0, sence.getData(), 0, 0, null));

                                    break;
                                case "短信":
                                    int insert2 = monthlyConsumptionRecordsService.insert(new MonthlyConsumptionRecords(0, cardNumber, 0.0,0,  sence.getData(), 0, null));

                                    break;
                                case "上网":
                                    int insert3 = monthlyConsumptionRecordsService.insert(new MonthlyConsumptionRecords(0, cardNumber, 0.0,0,0,   sence.getData(), null));

                                    break;
                            }
                        }
                    }
                }

            }else {
                System.out.println("该卡号已被禁用,请充值!");
            }
        }else {
            System.out.println("该手机卡号不存在!");
        }
        showFirstMenu();
    }

6、查询本月账单

//查询本月账单
    private void queryCurrentMonthBill() {
        MoboleCardServiceImpl moboleCardService = new MoboleCardServiceImpl();
        List<MoboleCard> moboleCard = moboleCardService.queryByCardNumber(currentLoginCard);

        SerpackageServiceImpl serpackageService = new SerpackageServiceImpl();
        Serpackage serpackage = serpackageService.queryById(moboleCard.get(0).getSerPackage());

        //找出已经消费的套餐信息
        MonthlyConsumptionRecordsServiceImpl service = new MonthlyConsumptionRecordsServiceImpl();
        List<MonthlyConsumptionRecords> records = service.queryByCardNumber(currentLoginCard);
        //判断是否有消费记录,有就修改,没有就不修改
        if (!records.isEmpty()){
            System.out.println("*****本月账单查询*****");
            System.out.println("您的卡号:" + currentLoginCard + ",当月账单:\n" +
                    "套餐资费:" + serpackage.getPrice() +
                    "\n合计:" + (serpackage.getPrice()+records.get(0).getConsum_Amount()) +
                    "\n账户余额:" + (moboleCard.get(0).getMoney()-records.get(0).getConsum_Amount()));
        }else {
            System.out.println("*****本月账单查询*****");
            System.out.println("您的卡号:" + currentLoginCard + ",当月账单:\n" +
                    "套餐资费:" + serpackage.getPrice() +
                    "\n合计:" + (serpackage.getPrice()) +
                    "\n账户余额:" + (moboleCard.get(0).getMoney()));
        }

    }

7、查询套餐余量

//查询套餐余量
    private void querySerPackageFree() {
        MoboleCardServiceImpl moboleCardService = new MoboleCardServiceImpl();
        List<MoboleCard> moboleCard = moboleCardService.queryByCardNumber(currentLoginCard);

        //找出初始套餐信息
        SerpackageServiceImpl serpackageService = new SerpackageServiceImpl();
        Serpackage serpackage = serpackageService.queryById(moboleCard.get(0).getSerPackage());

        //找出已经消费的套餐信息
        MonthlyConsumptionRecordsServiceImpl service = new MonthlyConsumptionRecordsServiceImpl();
        List<MonthlyConsumptionRecords> records = service.queryByCardNumber(currentLoginCard);
        //判断是否有消费记录,有就修改,没有就不修改
        if (!records.isEmpty()){
            System.out.println("*****套餐余量查询*****");
            System.out.println("您的卡号:" + currentLoginCard + ",套餐内剩余:\n" +
                    "通话时间:" + (serpackage.getTalkTime()-records.get(0).getReal_Talk_Time())+ "分钟" +
                    "\n短信条数:" + (serpackage.getSmsCount()-records.get(0).getReal_SMS_Count() + "条" +
                    "\n上网流量:" + (serpackage.getFlow()-records.get(0).getReal_Flow()) + "MB"));
        }else {
            System.out.println("*****套餐余量查询*****");
            System.out.println("您的卡号:" + currentLoginCard + ",套餐内剩余:\n" +
                    "通话时间:" + serpackage.getTalkTime()+ "分钟" +
                    "\n短信条数:" + serpackage.getSmsCount() + "条" +
                    "\n上网流量:" + serpackage.getFlow() + "MB");
        }

}

8、打印消费详单

//打印消费详单
    private void printConsumeInfo() {
        System.out.println("*****消费详单查询*****");
        //只能查询本年度的月消费详细
        //1.用户输入查询的月份, 判断用户输入月份<=当前月
        System.out.println("请输入本年需要查询的月份(1-12):");
        int month = input.nextInt();
        if (1<=month&&month<=12){
            ConsuminfoServiceImpl consuminfoService = new ConsuminfoServiceImpl();
            List<Consuminfo> consuminfos = consuminfoService.queryByMonth(currentLoginCard, month);
            if (!consuminfos.isEmpty()){
                System.out.println("序号\t类型\t数据\t日期");
                int i=1;
                for (Consuminfo consuminfo : consuminfos) {
                    System.out.println(i+"\t"+consuminfo.getType()+"\t"+consuminfo.getConsumData()+"\t"+consuminfo.getConsumeDate());
                    String info=i+"\t"+consuminfo.getType()+"\t"+consuminfo.getConsumData()+"\t"+consuminfo.getConsumeDate();
                    i++;
                    //IO流把消费数据存入消费单
                    BufferedWriter bufferedWriter =null;
                    Date date = new Date();
                    // 创建一个SimpleDateFormat对象,指定目标格式
                    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss");
                    // 使用formatter格式化Date对象
                    String formattedDate = formatter.format(date);
                    try {
                        bufferedWriter = new BufferedWriter(new FileWriter("D:\\飞思Java培训班\\项目\\嗖嗖移动大厅\\用户消费详情单\\"+currentLoginCard+"用户消费详情单"+formattedDate+".txt",true));
                        bufferedWriter.write(info);
                        bufferedWriter.newLine();
                        bufferedWriter.flush();
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }finally {
                        try {
                            if (bufferedWriter==null){
                                bufferedWriter.close();//关闭资源
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }else
                System.out.println("【友情提示】:对不起,不存在该卡号"+month+"月消费记录");

        }else
            System.out.println("输入有误,请重新输入!");


    }

9、变更套餐

//变更套餐
    private void changeSerPackage() {
        /*
          1.查询所有套餐名, 并输出,用户选择更改的套餐序号
          2. 用户选择套餐, 判断用户所选的套餐是否是当前套餐,如果是, 提示
          3. 如果不是, 获取用户选择的套餐, 判断卡号的余额是否满足支付套餐月租
          4.如果不满足, 友情提示
          5.如果满足:办理套餐变更 修改卡号所属套餐,以及扣余额
          6. 返回到二级菜单
         */
        System.out.println("*****套餐变更*****");
        System.out.print("1、话痨套餐\t2、网虫套餐\t3、超人套餐\t");
        System.out.println("请选择(序号):");
        int num = input.nextInt();
        if (num>=1&&num<=3){
            MoboleCardServiceImpl moboleCardService = new MoboleCardServiceImpl();
            List<MoboleCard> moboleCard = moboleCardService.queryByCardNumber(currentLoginCard);
            //如果套餐相同提示
            if(moboleCard.get(0).getSerPackage()==num){
                System.out.println("【友情提示】:您已经是该套餐的用户,无需更换!");
                showSecondMenu();
            }
            SerpackageServiceImpl serpackageService = new SerpackageServiceImpl();
            Serpackage serpackage = serpackageService.queryById(num);
            //如果跟换套餐余额不足提示
            if(moboleCard.get(0).getMoney()<serpackage.getPrice()){
                System.out.println("【友情提示】:对不起,您的余额不足以支付新套餐本月资费,请充值后办理变更套餐业务!");
                showSecondMenu();
            }
            //修改用户套餐编号
            int count = moboleCardService.serPackageByNumber(num, currentLoginCard);
            if (count>0){
                //扣除余额,更新余额
//                Double newMoney=moboleCard.get(0).getMoney()-serpackage.getPrice();
                int updateMoney = moboleCardService.updateMoney(serpackage.getPrice(), currentLoginCard);
                if (updateMoney>0){
                    //删除该用户之前的月消费表
                    MonthlyConsumptionRecordsServiceImpl recordsService = new MonthlyConsumptionRecordsServiceImpl();
                    int deleteByCardNumber = recordsService.deleteByCardNumber(currentLoginCard);

                    SerpackageTypeServiceImpl typeService = new SerpackageTypeServiceImpl();
                    System.out.println("【友情提示】:更换套餐成功!"+typeService.queryById(num).getName()+":通话时长:"
                            +serpackageService.queryById(num).getTalkTime()+"分钟/月,短信条数:"
                            +serpackageService.queryById(num).getSmsCount()+"条/月,上网流量:"
                            +serpackageService.queryById(num).getFlow()+"GB/月,月租:"
                            +serpackageService.queryById(num).getPrice()+"元/月");
                }
            }
        }else
            System.out.println("输入有误,请重新输入!");
//            showSecondMenu();

    }

10、办理退网

//办理退网
    private void quitNetWork() {
        //直接修改卡的状态
        System.out.println("*****办理退网*****");
        //删除用户表中的记录
        MoboleCardServiceImpl moboleCardService = new MoboleCardServiceImpl();
        int deleteById = moboleCardService.deleteById(moboleCardService.queryByCardNumber(currentLoginCard).get(0).getId());

        //修改卡号状态为0
        CardServiceImpl cardService = new CardServiceImpl();
        int cardStatus = cardService.cardStatus(0, currentLoginCard);

        //删除交易记录
        RechargeRecordServiceImpl recordService = new RechargeRecordServiceImpl();
        int delete = recordService.deleteByCardNumber(currentLoginCard);

        //删除月消费记录
        MonthlyConsumptionRecordsServiceImpl recordsService = new MonthlyConsumptionRecordsServiceImpl();
        int deleteByCardNumber = recordsService.deleteByCardNumber(currentLoginCard);

        //删除消费信息
        ConsuminfoServiceImpl consuminfoService = new ConsuminfoServiceImpl();
        int byCardNumber = consuminfoService.deleteByCardNumber(currentLoginCard);

        if (deleteById>0&&cardStatus>0&&delete>0&&deleteByCardNumber>0&&byCardNumber>0){
            System.out.println("【友情提示】:卡号"+currentLoginCard+"办理退网成功!");
            showFirstMenu();//返回一级菜单
        }else{
            System.out.println("退网失败,请重试!");
            showSecondMenu();//返回二级菜单
        }
    }

11、话费充值

/**
     * 话费充值
     */
    private void topUp() {
        //todo 话费充值
        System.out.println("*****话费充值*****");
        MoboleCardServiceImpl moboleCardService = new MoboleCardServiceImpl();
        System.out.println("请输入要充值的卡号:");
        String cardNumber = input.next();
        System.out.println("请输入充值金额:");
        double money = input.nextDouble();
        //添加金额
        int addMoney = moboleCardService.addMoney(money, cardNumber);

        if (addMoney>0){
            //添加消费记录
            RechargeRecordServiceImpl rechargeRecordService = new RechargeRecordServiceImpl();
            int insert = rechargeRecordService.insert(new RechargeRecord(0, money, null, cardNumber));
            if (insert>0){
                System.out.println("【充值成功】:充值成功,卡上金额:"+moboleCardService.queryByCardNumber(cardNumber).get(0).getMoney());
                //判断充值后余额是否小于0,不小于则解除禁用
                if (moboleCardService.queryByCardNumber(cardNumber).get(0).getMoney()>0){
                    UnblockCardNumber(cardNumber);//解除禁用
                }else {
                    System.out.println("余额小于0,请继续充值!");
                }
            }
        }else {
            System.out.println("输入有误,请输入正确的卡号!");
        }
    }

12、资费说明

/**
     * 费用说明
     */
    private void costInfo() {
        //todo  费用说明
        System.out.println("*****费用说明*****");
        System.out.println("序号\t套餐名称\t通话时长(分/月)\t短信条数(条/月)\t上网流量(GB/月)");
        //查询所有信息
        SerpackageTypeServiceImpl serpackageTypeService = new SerpackageTypeServiceImpl();
        List<SerpackageType> serpackageTypes = serpackageTypeService.queryAll();

        SerpackageServiceImpl serpackageService = new SerpackageServiceImpl();
        List<Serpackage> serpackages = serpackageService.queryAll();
        for (int i = 0; i < serpackageTypes.size(); i++) {
            System.out.println(serpackageTypes.get(i).getId()+"\t"+serpackageTypes.get(i).getName()
            +"\t"+serpackages.get(i).getTalkTime()+"\t\t\t\t"+serpackages.get(i).getSmsCount()
            +"\t\t\t\t"+serpackages.get(i).getFlow()/1024);
        }
    }

13、退出系统

/**
     * 退出系统
     */
    private void exitSystem() {
        System.out.println("欢迎使用本系统,系统正在退出...");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.exit(0);
    }

5、总结

“嗖嗖移动业务大厅”项目主要使用了以下技术和方法:

  1. 面向对象编程:整个项目采用了面向对象的设计思想,定义了多个类来模拟现实世界中的各种实体和行为。

  2. 类和对象:定义了多个类(如Card, MoboleCard, SerPackage等)及其属性和方法来表示系统中的实体和业务逻辑。

  3. 封装:将数据(属性)和操作数据的方法封装在类中,确保了数据的安全性和操作的便捷性。

  4. 继承:通过继承机制,子类可以扩展或修改父类的行为,例如,MoboleCard类可能继承自一个更通用的Card类。

  5. 多态:允许使用统一的接口来处理不同类型的对象,这在定义多种套餐类型和处理不同用户行为时非常有用。

  6. 接口的使用:通过定义接口,可以规定一组方法,由不同的类来实现这些接口,以支持不同的行为。

  7. 异常处理:在代码中合理使用异常处理来管理程序运行中可能出现的错误情况。

  8. 集合框架:使用Java集合框架(如List、Map等)来存储和管理数据集合。

  9. I/O 操作:使用输入输出流来实现对文件的读写操作,例如将用户的消费详情写入文件。

  10. 数据库使用:使用MySQL数据库来存储用户数据、套餐信息、消费记录等,通过JDBC与数据库进行交互。

  11. JDBC操作:通过JDBC连接和操作数据库,执行SQL语句进行数据的增删改查。

  12. 模拟用户交互:通过控制台输入输出与用户进行交互,模拟用户的各种操作,如登录、注册、查询等。

  13. 随机数生成:使用Random类来模拟用户使用场景的随机选择。

  14. 日期时间处理:使用DateSimpleDateFormat类来处理日期和时间,例如记录消费日期。

  15. 三层架构模式:项目采用了典型的三层架构模式,包括表示层、业务逻辑层和数据访问层,以实现功能的清晰分离和高内聚低耦合。

这些技术和方法共同构成了项目的基础,使得“嗖嗖移动业务大厅”能够提供用户注册、登录、查询、变更套餐、退网等一系列功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值