嗖嗖移動大廳 源代碼 Java初級小項目


  今天再給大家分享一個小項目:嗖嗖移動業務大廳。用的是Java語言開發的,代碼很多,概括的功能也很全面。系統是模擬移動、聯通、電信國內三大通信運營商的功能,有用戶登錄用戶注冊話費充值使用嗖嗖資費說明退出系統本月賬單查詢套餐余量查詢打印消費詳單套餐變更辦理退網等功能(后附源代碼)!  


一 、 項目概述

  技能要求

   使用面向對象設計的思想
   合理運用異常處理
   使用集合框架存儲數據,不使用數據庫
   使用 I/O 操作實現對文件的讀寫


   開發工具

  JDK 7.0、MyEclipse。


   需求概述

  移動、聯通、電信是國內三大通信運營商,每個運營商提供了不同的品牌套餐來應對不同的用戶群,例如北京移動,主要有全球通、神州行、動感地帶三大品牌套餐,每種套餐的內容和資費不同。現嗖嗖移動是一擬定的通信運營商,提供了話嘮套餐網蟲套餐超人套餐,各種套餐所包含的服務內容及資費如表 1 所示。

   如實際使用中,超出套餐內包含的通話時長、短信條數或上網流量時,按以下規則計費:

   超出的通話:0.2 元/分鍾
   超出的短信:0.1 元/分鍾
   超出的上網流量:0.1 元/MB
  本項目嗖嗖移動業務大廳提供了嗖嗖移動用戶的日常常用功能,包括新用戶注冊、本月賬單查詢、套餐余量查詢、打印消費詳單、套餐變更、辦理退網、話費充值、查看消費記錄、查看資費說明功能,另外,還可以模擬用戶通話、上網、發短信的場景進行相應的扣費並記錄消費信息。各功能介紹如表 2 所示。

 二 、 項目業務流程描述

1.整體業務流程

嗖嗖移動項目的各個功能實際都是掛在功能菜單上的,其中主菜單包含 6 個功能,當用戶輸入 1~5 之間的功能編號后,驗證卡號,如果該卡號已注冊,執行相應功能后返回主菜單,否則,退出系統。如圖 1 所示。

                                         圖 1 主菜單

  當使用已注冊用戶登錄並通過驗證后,即顯示二級菜單,包含 5 個功能,如圖 2 所示。當輸入 1~5 之外的功能編號時,返回主菜單。

                                         圖 2 二級菜單

2. 用戶注冊

該功能可以看作是去營業廳辦理新卡的過程。主要分成以下幾個步驟:
1) 選擇卡號(從隨機生成的 9 個以“139”開頭的卡號中選擇一個,輸入序號即可)。
2) 選擇套餐(共 3 類套餐,選擇其中一個,輸入所對應的序號即可)。
3) 輸入用戶名、密碼信息(相當於現在各營業廳的實名登錄,輸入用戶名和密碼即可)。
4) 輸入預存話費金額:這里需保存預存的金額足以支付一個月的套餐費用,否則給出信息提示“您預存的話費金額不足以支付本月固定套餐資費,請重新充值!”。

5) 注冊新卡
實現效果如圖 3 所示。

                                        圖 3 用戶注冊

3. 本月賬單查詢

本月賬單可以顯示以下信息:
 卡號。
 套餐月資費。
 合計(是套餐固定資費和超出套餐使用費用總和)。
 賬戶余額。
運行效果如圖 4 所示。

                                      圖 4 本月賬單查詢

4. 套餐余量查詢

本功能用來顯示該卡所屬套餐內所剩余的免費通話時長、短信條數、上網流量,不同品牌套餐所支持的服務不同,因此顯示的內容不同。運行效果如圖 5 所示。

                                         圖 5 套餐余量查詢

5. 添加和打印消費清單

實現向消費記錄中添加一條該卡的消費記錄(該功能可在使用嗖嗖功能中調用),並實現打印該卡的消費記錄,打印前先從消費記錄中查找是否存在此卡的消費記錄,如存在則提示“已添加一條消費記錄。”,將消費記錄輸出到文本文件中,格式如圖 5 所示。如不存在,提示用戶相應信息,如圖 6 所示。

                                      圖 5 消費記錄

                                    圖 6 該卡不存在消費記錄

6.使用嗖嗖

(1)隨機進入某個場景

模擬嗖嗖用戶使用卡的過程。選擇該功能后,輸入當前卡號,通過驗證后,可隨機進入表 3 所示的 6 個場景(當然還可以再設計其他場景),要求所進入的場景的服務類型是該卡所屬套餐所支持的(例如網蟲套餐只能進入服務類型為“上網”的場景)。

(2)模擬消費
進入該場景這之后,將按場景的描述要求消耗套餐余量,如套餐余量不足,需按套餐外的資費規則扣費,成功消費后,添加一條消費記錄。效果如圖 7 所示。

                                       圖 7 使用嗖嗖成功

余額不足時,提示信息。如本場景通話時長為 30 分鍾,當通話至 10 分鍾時余額不足,拋出異常,並提示用戶“本次已通話 10 分鍾,您的余額不足,請充值后再使用!”如圖 8所示

                                        圖 8 余額不足的情況

(3)消費結束,添加消費記錄
消費完畢,在消費列表中添加一條消費記錄。並提示用戶“已添加一條消費記錄!”。按實際消費添加消費記錄,除非沒有消費。如圖 8 的情況,則此條消費記錄只需記錄實際通話時長 10 分鍾。

7. 辦理退網
本功能可實現將當前卡用戶從已注冊用戶列表中刪除,刪除后直接退出系統。運行效果如圖 9 所示。

                                      圖 9 辦理退網

8. 套餐變更
本功能類似我們去營業廳變量套餐,可以充分體會到使用面向對象后,代碼更加靈活,可維護性更強。
本項目中沒有引入對日期的記錄和處理,因此,這里默認套餐變更時間為本月的開始,選擇變量后的套餐為當前套餐之外的其他類型,否則顯示信息提示。如圖 10 所示。

                                       圖 10 選擇套餐錯誤

選擇套餐正確之后,還需判斷當前余額是否足以支付一個月的套餐資費,如不足,提示錯誤信息。如圖 11 所示。

                                      圖 11 變更套餐余額不足

如上述兩個條件都滿足時,套餐變量成功,顯示相應信息,如圖 12 所示。當前卡實際使用數據清零,當前卡所屬套餐修改為變量后的套餐類型,當前卡余額減去新套餐月資費,本月消費金額修改為新套餐月資費。

                                         圖 12 套餐變更成功

9. 話費充值
可為指定卡號充值,要求充值金額最少 50 元。充值成功后提示信息。運行效果如圖 13所示。

                                          圖 13 充值成功

通過最少充值金額驗證后,修改當前卡余額即可。


10. 查看資費說明
此功能需實現將文本文件(套餐資費說明.txt)中的信息顯示到控制台。本功能需使用 I/O 操作實現文本文件的寫入。


  以上是嗖嗖項目的整體需求概述,下面介紹如何搭建嗖嗖項目的框架結構:

一、 實體類(Entity)

 二、工具類 (utils)

 


   下面是項目的整體代碼結構:

 實體類中的其中一個手機卡類:

  1 package cn.soso.entity;
  2 /**
  3  * 手機卡
  4  *
  5  */
  6 public class MobileCard {
  7     private String cardNumber;  //卡號
  8     private String userName;  //用戶名
  9     private String passWord;  //密碼    
 10     private ServicePackage serPackage;  //所屬套餐
 11     private double consumAmount;  //當月消費金額
 12     private double money;  //賬戶余額
 13     private int realTalkTime;  //實際通話時長(分鍾)
 14     private int realSMSCount;  //實際發送短信條數(條)
 15     private int realFlow;  //實際上網流量
 16     
 17     public MobileCard(){}
 18 
 19     public MobileCard(String userName, String passWord, String cardNumber,
 20             ServicePackage serPackage, double consumAmount, double money) {
 21         super();
 22         this.userName = userName;
 23         this.passWord = passWord;
 24         this.cardNumber = cardNumber;
 25         this.serPackage = serPackage;
 26         this.consumAmount = consumAmount;
 27         this.money = money;
 28     }
 29 
 30     public String getUserName() {
 31         return userName;
 32     }
 33 
 34     public void setUserName(String userName) {
 35         this.userName = userName;
 36     }
 37 
 38     public String getPassWord() {
 39         return passWord;
 40     }
 41 
 42     public void setPassWord(String passWord) {
 43         this.passWord = passWord;
 44     }
 45 
 46     public String getCardNumber() {
 47         return cardNumber;
 48     }
 49 
 50     public void setCardNumber(String cardNumber) {
 51         this.cardNumber = cardNumber;
 52     }
 53 
 54     public ServicePackage getSerPackage() {
 55         return serPackage;
 56     }
 57 
 58     public void setSerPackage(ServicePackage serPackage) {
 59         this.serPackage = serPackage;
 60     }
 61 
 62     public double getConsumAmount() {
 63         return consumAmount;
 64     }
 65 
 66     public void setConsumAmount(double consumAmount) {
 67         this.consumAmount = consumAmount;
 68     }
 69 
 70     public double getMoney() {
 71         return money;
 72     }
 73 
 74     public void setMoney(double money) {
 75         this.money = money;
 76     }
 77 
 78     public int getRealTalkTime() {
 79         return realTalkTime;
 80     }
 81 
 82     public void setRealTalkTime(int realTalkTime) {
 83         this.realTalkTime = realTalkTime;
 84     }
 85 
 86     public int getRealSMSCount() {
 87         return realSMSCount;
 88     }
 89 
 90     public void setRealSMSCount(int realSMSCount) {
 91         this.realSMSCount = realSMSCount;
 92     }
 93 
 94     public int getRealFlow() {
 95         return realFlow;
 96     }
 97 
 98     public void setRealFlow(int realFlow) {
 99         this.realFlow = realFlow;
100     }
101     
102     /**
103      * 顯示卡信息
104      */
105     public void showMeg(){
106         System.out.println("卡號:"+this.cardNumber+" 用戶名:"+this.userName+" 當前余額:"+this.money+"元。");
107         this.serPackage.showInfo();
108     }    
109 }

 

 整體業務流程類:

  1 package cn.soso.biz;
  2 
  3 import java.util.Scanner;
  4 
  5 import cn.soso.common.Common;
  6 import cn.soso.entity.MobileCard;
  7 import cn.soso.entity.ServicePackage;
  8 import cn.soso.utils.CardUtil;
  9 
 10 /**
 11  * 業務類
 12  * 
 13  * 
 14  */
 15 public class SosoMgr {
 16     Scanner input = new Scanner(System.in);
 17     CardUtil utils = new CardUtil();
 18     
 19     public static void main(String[] args) {
 20         SosoMgr soso = new SosoMgr();
 21         soso.mainMenu();
 22         System.out.println("謝謝使用!");
 23     }
 24 
 25     /**
 26      * 主流程
 27      */
 28     public void mainMenu() {
 29         int menuChoose = 0;
 30         String mobileNumber= "";
 31         String password = "";
 32         utils.init();
 33         utils.initScenes();
 34         //Common.typesInit();
 35         do {
 36             System.out.println("\n*************歡迎使用嗖嗖移動業務大廳***************");
 37             System.out.println("1.用戶登錄   2.用戶注冊   3.使用嗖嗖   4.話費充值  5.資費說明  6.退出系統");
 38             System.out.print("請選擇:");
 39             menuChoose = input.nextInt();
 40             // 分支語句:根據功能編號執行相應功能
 41             switch (menuChoose) {
 42             case 1:
 43                 //用戶登錄
 44                 System.out.print("請輸入手機卡號:");
 45                 mobileNumber = input.next();
 46                 System.out.print("請輸入密碼:");
 47                 password = input.next();
 48                 if (utils.isExistCard(mobileNumber, password)) {
 49                     cardMenu(mobileNumber);
 50                 }else{
 51                     System.out.println("對不起,您輸入的信息有誤,無法登錄!");
 52                 }
 53                 continue;
 54             case 2:
 55                 //用戶注冊
 56                 registCard();
 57                 continue;
 58             case 3:
 59                 
 60                 //使用嗖嗖
 61                 System.out.print("請輸入手機卡號:");
 62                  mobileNumber = input.next();                
 63                 
 64                 if (utils.isExistCard(mobileNumber)) {
 65                     try {
 66 /*                        System.out.println("****使用之前****");
 67                         utils.showRemainDetail(mobileNumber);
 68                         utils.showAmountDetail(mobileNumber);*/
 69                         utils.userSoso(mobileNumber);
 70                     } catch (Exception e) {
 71                         System.err.println(e.getMessage());
 72                     }
 73                 }else{
 74                     System.out.println("對不起,該卡號未注冊,不能使用!");
 75                 }
 76                 
 77                 /*System.out.println("****使用之后****");
 78                 utils.showRemainDetail(mobileNumber);
 79                 utils.showAmountDetail(mobileNumber);*/
 80                 continue;
 81             case 4:
 82                 //話費充值
 83                 System.out.print("請輸入充值卡號:");
 84                 mobileNumber = input.next();
 85                 if (utils.isExistCard(mobileNumber)) {
 86                 System.out.print("請輸入充值金額:");
 87                 double money = input.nextDouble();                
 88                 utils.chargeMoney(mobileNumber, money);
 89                 }else{
 90                     System.out.println("對不起,要充值的卡號未注冊,無法充值!");
 91                 }
 92                 continue;                
 93             case 5:
 94                 System.out.println("\n*****資費說明******");
 95                 utils.showDescription();
 96                 continue;    
 97             case 6:
 98                 //退出系統
 99                 break;
100             default:
101                 //選擇其他數字退出系統
102                 break;
103             }
104             break;
105         } while (true);
106     }
107 
108     /**
109      * 手機卡功能菜單
110      * 
111      * @param number
112      * @return
113      */
114     public int cardMenu(String mobileNumber) {
115            int menuChoose = 0;
116         do {
117             System.out.println("\n*****嗖嗖移動用戶菜單*****");
118             System.out.println("1.本月賬單查詢");
119             System.out.println("2.套餐余量查詢");
120             System.out.println("3.打印消費詳單");
121             System.out.println("4.套餐變更");
122             System.out.println("5.辦理退網");
123             System.out.print("請選擇(輸入1~5選擇功能,其他鍵返回上一級):");
124              menuChoose = input.nextInt();
125             switch (menuChoose) {
126             case 1:
127                 System.out.println("\n*****本月賬單查詢******");
128                 utils.showAmountDetail(mobileNumber);
129                 continue;
130             case 2:
131                 System.out.println("\n*****套餐余量查詢******");
132                 utils.showRemainDetail(mobileNumber);
133                 continue;
134             case 3:
135                 System.out.println("\n*****消費詳單查詢******");
136                 utils.printConsumInfo(mobileNumber);
137                 continue;
138             case 4:
139                 System.out.println("\n*****套餐變更******");
140                 System.out.print("1.話嘮套餐  2.網蟲套餐  3.超人套餐  請選擇(序號):");                
141                 utils.changingPack(mobileNumber, input.next());
142                 continue;
143             case 5:
144                 System.out.println("\n*****辦理退網******");
145                 utils.delCard(mobileNumber);
146                 System.out.println("謝謝使用!");
147                 System.exit(1);     //辦理退網后退出系統    
148                         
149             }
150             
151             break;
152         } while (true);
153         return menuChoose;
154     }
155     
156     /**
157      * 注冊新卡流程
158      */
159     public void registCard(){
160         String[] newNumbers = utils.getNewNumbers(9);
161         //顯示可供選擇的手機號列表
162         System.out.println("*****可選擇的卡號*****");
163         
164         for(int i=0;i<9;i++){
165             System.out.print((i+1)+"."+newNumbers[i]+"\t\t");
166             if((i+1)%3==0){
167                 System.out.println();
168             }
169         }
170         //選擇手機號
171         System.out.print("請選擇卡號(輸入1~9的序號):");        
172         String number = newNumbers[input.nextInt()-1];
173         
174         //選擇套餐類型
175         System.out.print("1.話嘮套餐  2.網蟲套餐  3.超人套餐,  ");
176         System.out.print("請選擇套餐(輸入序號):");
177         //utils.getPackList();
178         //獲取套餐對象 
179         ServicePackage pack = utils.createPack(input.nextInt());
180         
181         //輸入用戶名
182         System.out.print("請輸入姓名:");
183         String name = input.next();
184         
185         //輸入密碼
186         System.out.print("請輸入密碼:");
187         String password = input.next();
188         
189         //輸入預存話費金額
190         double money = 0;
191         System.out.print("請輸入預存話費金額:");
192          money = input.nextDouble();
193         while(money<pack.getPrice()){
194             System.out.print("您預存的話費金額不足以支付本月固定套餐資費,請重新充值:");
195             money = input.nextDouble();
196         }
197                 
198         //創建新卡對象並添加
199         MobileCard newCard = new MobileCard(name,password,number,pack,pack.getPrice(),money-pack.getPrice());
200         utils.addCard(newCard);        
201     }
202 }

 

 手機卡工具類:

  1 package cn.soso.utils;
  2 
  3 import java.io.FileReader;
  4 import java.io.FileWriter;
  5 import java.io.IOException;
  6 import java.io.Reader;
  7 import java.io.Writer;
  8 import java.text.DecimalFormat;
  9 import java.util.ArrayList;
 10 import java.util.HashMap;
 11 import java.util.Iterator;
 12 import java.util.List;
 13 import java.util.Map;
 14 import java.util.Random;
 15 import java.util.Set;
 16 
 17 import cn.soso.common.Common;
 18 import cn.soso.entity.ConsumInfo;
 19 import cn.soso.entity.MobileCard;
 20 import cn.soso.entity.NetPackage;
 21 import cn.soso.entity.Scene;
 22 import cn.soso.entity.ServicePackage;
 23 import cn.soso.entity.SuperPackage;
 24 import cn.soso.entity.TalkPackage;
 25 import cn.soso.service.CallService;
 26 import cn.soso.service.NetService;
 27 import cn.soso.service.SendService;
 28 
 29 /**
 30  * 手機卡工具類
 31  * 
 32  * 
 33  */
 34 public class CardUtil {
 35     Map<String, MobileCard> cards = new HashMap<String, MobileCard>(); // 所有手機卡的列表
 36     Map<String, List<ConsumInfo>> consumInfos = new HashMap<String, List<ConsumInfo>>(); // 所有手機卡消費記錄的列表
 37     List<Scene> scenes = new ArrayList<Scene>();
 38 
 39     // 初始化用戶
 40     public void init() {
 41         MobileCard card1 = new MobileCard("何玲玲", "123", "13965756432",
 42                 new TalkPackage(), 58.0, 42.0);
 43         MobileCard card2 = new MobileCard("黃露露", "123", "13956712467",
 44                 new NetPackage(), 68.0, 32.0);
 45         MobileCard card3 = new MobileCard("朱蓉蓉", "123", "13911568956",
 46                 new SuperPackage(), 78.0, 22.0);
 47         MobileCard card4 = new MobileCard("桃跑跑", "123", "13924221868",
 48                 new TalkPackage(), 78.0, 2.0);
 49         card4.setConsumAmount(98.0);
 50         card4.setRealTalkTime(500);
 51         card4.setRealSMSCount(100);
 52         cards.put("13965756432", card1);
 53         cards.put("13956712467", card2);
 54         cards.put("13911568956", card3);
 55         cards.put("13924221868", card4);
 56     }
 57     
 58     /**
 59      * 使用場景初始化
 60      */
 61     public void initScenes(){    
 62         scenes.add(new Scene("通話",90,"問候客戶,誰知其如此難纏 通話90分鍾"));
 63         scenes.add(new Scene("通話",30,"詢問媽媽身體狀況 本地通話30分鍾"));
 64         scenes.add(new Scene("短信",5,"參與環境保護實施方案問卷調查 發送短信5條"));
 65         scenes.add(new Scene("短信",50,"通知朋友手機換號,發送短信50條"));
 66         scenes.add(new Scene("上網",1*1024,"和女友微信視頻聊天   使用流量1G"));
 67         scenes.add(new Scene("上網",2*1024,"晚上手機在線看韓劇,不留神睡着啦! 使用流量 2G"));        
 68     }
 69 
 70     /**
 71      * 是否存在此卡用戶
 72 
 73      * 
 74      * @param number
 75      * @param passWord
 76      * @return
 77      */
 78     public boolean isExistCard(String number, String passWord) {
 79         Set<String> numbers = cards.keySet();
 80         Iterator<String> it = numbers.iterator();
 81         while (it.hasNext()) {
 82             String searchNum = it.next();
 83             if (searchNum.equals(number)
 84                     && (cards.get(searchNum)).getPassWord().equals(passWord)) {
 85                 return true;
 86             }
 87         }
 88         return false;
 89     }
 90     
 91     /**
 92      * 查找指定卡號是否已注冊
 93      * 
 94      * @param searchNumber
 95      * @return 未注冊:false 已注冊:true
 96      */
 97     public boolean isExistCard(String searchNumber) {
 98         Set<String> numbers = cards.keySet();
 99         for (String number : numbers) {
100             if (number.equals(searchNumber)) {
101                 return true;
102             }
103         }
104         return false;
105     }
106 
107     /**
108      * 創建卡號(以139開頭 11位)
109      * 
110      * @return 生成的隨機手機卡號
111      */
112     public String createNumber() {
113         Random random = new Random();
114         boolean isExist = false; // 記錄現有用戶中是否存在此卡號用戶 是:true 否:false
115         String number = "";
116         int temp = 0;
117         do {
118             isExist = false; // 標志位重置為false,用於控制外重循環,當生成了
119             // 生成的隨機數是8位 不能小於10000000,否則重新生成
120             do {
121                 temp = random.nextInt(100000000);
122             } while (temp < 10000000);
123             // 生成之前,前面加“139”
124             number = "139" + temp;
125             // 和現有用戶的卡號比較,不能是重復
126             Set<String> cardNumbers = cards.keySet();
127             for (String cardNumber : cardNumbers) {
128                 if (number.equals(cardNumber)) {
129                     isExist = true;
130                     break;
131                 }
132             }
133         } while (isExist);
134         return number;
135     }
136 
137     /**
138      * 生成指定個數的新卡號列表
139      * 
140      * @param count
141      *            指定個數
142      * @return 卡號列表
143      */
144     public String[] getNewNumbers(int count) {
145 
146         String[] numbers = new String[count];
147         for (int i = 0; i < count; i++) {
148             numbers[i] = createNumber();
149         }
150         return numbers;
151     }
152 
153     /**
154      * 添加新卡
155      * 
156      * @param card
157      *            新卡
158      */
159     public void addCard(MobileCard card) {
160         cards.put(card.getCardNumber(), card);
161         System.out.print("注冊成功!");
162         card.showMeg();
163     }
164 
165     /**
166      * 指定卡號辦理退網
167      * 
168      * @param card
169      */
170     public void delCard(String delNumber) {
171         if (isExistCard(delNumber)) {
172             cards.remove(delNumber);
173             System.out.println("卡號" + delNumber + "辦理退網成功!");
174         } else {
175             System.out.println("對不起,該卡號未注冊,不能辦退退網!");
176         }
177     }
178 
179     /**
180      * 查詢指定卡套餐余量
181      * 
182      * @param number
183      */
184     public void showRemainDetail(String searchNumber) {
185         MobileCard card; // 要查詢的卡
186         int remainTalkTime;
187         int remainSmsCount;
188         int remainFlow;
189         StringBuffer meg = new StringBuffer();
190             card = cards.get(searchNumber);
191             meg.append("您的卡號是" + searchNumber + ",套餐內剩余:\n");
192             ServicePackage pack = card.getSerPackage();
193             if (pack instanceof TalkPackage) {
194                 //向下轉型為話嘮套餐對象
195                 TalkPackage cardPack = (TalkPackage) pack;
196                 // 話嘮套餐,查詢套餐內剩余的通話時長和短信條數
197                 remainTalkTime = cardPack.getTalkTime() > card
198                         .getRealTalkTime() ? cardPack.getTalkTime()
199                         - card.getRealTalkTime() : 0;
200                 meg.append("通話時長:" + remainTalkTime + "分鍾\n");
201                 remainSmsCount = cardPack.getSmsCount() > card
202                         .getRealSMSCount() ? cardPack.getSmsCount()
203                         - card.getRealSMSCount() : 0;
204                 meg.append("短信條數:" + remainSmsCount + "條");
205             } else if (pack instanceof NetPackage) {
206                 //向下轉型為網蟲套餐對象
207                 NetPackage cardPack = (NetPackage) pack;
208                 // 網蟲套餐:查詢套餐內剩余的上網流量
209                 remainFlow = cardPack.getFlow() > card.getRealFlow() ? cardPack
210                         .getFlow() - card.getRealFlow() : 0;
211                 meg.append("上網流量:" + Common.dataFormat(remainFlow * 1.0 / 1024)
212                         + "GB");
213             } else if (pack instanceof SuperPackage) {
214                 //向下轉型為超人套餐對象
215                 SuperPackage cardPack = (SuperPackage) pack;
216                 // 超人套餐:查詢套餐內剩余的通話時長、短信條數、上網流量
217                 remainTalkTime = cardPack.getTalkTime() > card
218                         .getRealTalkTime() ? cardPack.getTalkTime()
219                         - card.getRealTalkTime() : 0;
220                 meg.append("通話時長:" + remainTalkTime + "分鍾\n");
221                 remainSmsCount = cardPack.getSmsCount() > card
222                         .getRealSMSCount() ? cardPack.getSmsCount()
223                         - card.getRealSMSCount() : 0;
224                 meg.append("短信條數:" + remainSmsCount + "條\n");
225                 remainFlow = cardPack.getFlow() > card.getRealFlow() ? cardPack
226                         .getFlow() - card.getRealFlow() : 0;
227                 meg.append("上網流量:" + Common.dataFormat(remainFlow * 1.0 / 1024)
228                         + "GB");
229             }
230             System.out.println(meg);
231     }
232 
233     /**
234      * 查詢指定卡當月消費詳單
235      * 
236      * @param searchNumber
237      */
238     public void showAmountDetail(String searchNumber) {
239         MobileCard card; // 要查詢的卡
240         StringBuffer meg = new StringBuffer();
241         card = cards.get(searchNumber);
242         meg.append("您的卡號:" + card.getCardNumber() + ",當月賬單:\n");
243         meg.append("套餐資費:" + card.getSerPackage().getPrice() + "元\n");
244         meg.append("合計:" + Common.dataFormat(card.getConsumAmount()) + "元\n");
245         meg.append("賬戶余額:" + Common.dataFormat(card.getMoney()) + "元");
246         // 顯示本月消費詳細信息
247         System.out.println(meg);
248     }
249 
250     
251     /**
252      * 指定卡號換套餐
253      * 
254      * @param number
255      * @param packType
256      */
257     public void changingPack(String number, String packNum) {
258         MobileCard card; // 指定的手機卡
259         ServicePackage pack; // 要換的套餐
260         if (isExistCard(number)) {
261             card = cards.get(number);
262             // 獲取要換的套餐對象
263             switch (packNum) {
264             case "1":
265                 pack = new TalkPackage();
266                 break;
267             case "2":
268                 pack = new NetPackage();
269                 break;
270             default:
271                 pack = new SuperPackage();
272                 break;
273             }        
274             if (!(card.getSerPackage().getClass().getName().equals(pack.getClass().getName()))) {
275                 // 該卡余額中減去當月套餐資費
276                 if (card.getMoney() >= pack.getPrice()) {
277                     card.setMoney(card.getMoney() - pack.getPrice());
278                     // 換套餐
279                     card.setSerPackage(pack);
280                     // 當月實際使用數據清零
281                     card.setRealTalkTime(0);
282                     card.setRealFlow(0);
283                     card.setRealSMSCount(0);
284                     // 當月消費金額設置為新套餐月資費
285                     card.setConsumAmount(pack.getPrice());
286                     System.out.print("更換套餐成功!");
287                     pack.showInfo();
288                 } else {
289                     System.out.println("對不起,您的余額不足以支付新套餐本月資費,請充值后再辦理更換套餐業務!");
290                     return;
291                 }
292             } else {
293                 System.out.println("對不起,您已經是該套餐用戶,無需換套餐!");
294             }
295 
296         } else {
297             System.out.println("對不起,該卡號未注冊,不能換套餐!");
298         }
299     }
300 
301     /**
302      * 為指定手機卡充值
303      * 
304      * @param number
305      *            指定充值的卡號
306      * @param money
307      *            充值金額
308      */
309     public void chargeMoney(String number, double money) {
310         MobileCard card; // 指定的手機卡
311         if (money < 50) {
312             System.out.println("對不起,最低充值金額為50元!");
313             return;
314         }
315             card = cards.get(number);
316             card.setMoney(card.getMoney() + money);
317             System.out.println("充值成功,當前話費余額為" + Common.dataFormat(card.getMoney()) + "元。");
318     }
319 
320     /**
321      * 添加一條指定卡的消費記錄
322      * 
323      * @param number
324      *            要添加消費記錄的卡
325      * @param info
326      *            要添加的消費記錄
327      */
328     public void addConsumInfo(String number, ConsumInfo info) {
329         Set<String> numbers = consumInfos.keySet();
330         Iterator<String> it = numbers.iterator();
331         List<ConsumInfo> infos = new ArrayList<ConsumInfo>();
332         boolean isExist = false; // 現有消費列表中是否存在此卡號消費記錄,是:true 否:false
333         while (it.hasNext()) {
334             if (it.next().equals(number)) {
335                 // 消費集合中已有該卡號消費記錄,則找到該卡號的消費記錄集合,添加一條即可
336                 infos = consumInfos.get(number);
337                 infos.add(info);
338                 isExist = true;
339                 System.out.println("已添加一條消費記錄。");
340                 break;
341             }
342         }
343         // 該集合中沒有此卡號消費記錄,則添加
344         if (!isExist) {
345             infos.add(info);
346             consumInfos.put(number, infos);
347             System.out.println("不存在此卡的消費記錄,已添加一條消費記錄。");
348         }
349     }
350     
351     //打印消費記錄
352     public void printConsumInfo(String number){
353         Writer fileWriter = null;
354         try {
355              fileWriter = new FileWriter(number+"消費記錄.txt");            
356             Set<String> numbers = consumInfos.keySet();
357             Iterator<String> it = numbers.iterator();
358             List<ConsumInfo> infos = new ArrayList<ConsumInfo>();//存儲指定卡所有消費記錄
359             boolean isExist = false; // 現有消費列表中是否存在此卡號消費記錄,是:true 否:false
360             while (it.hasNext()) {
361                 if (it.next().equals(number)) {
362                     infos = consumInfos.get(number);
363                     isExist = true;
364                     break;
365                 }
366             }
367             if(isExist){
368                 //存在 此卡消費記錄,寫入文本文件
369                 StringBuffer content = new StringBuffer("******"+number+"消費記錄******\n");
370                 content.append("序號\t類型\t數據(通話(條)/上網(MB)/短信(條))\n");
371                 for(int i=0;i<infos.size();i++){
372                     ConsumInfo info = infos.get(i);
373                     content.append((i+1)+".\t"+info.getType()+"\t"+info.getConsumData()+"\n");
374                 }
375                 fileWriter.write(content.toString());
376                 fileWriter.flush();
377                 
378                 System.out.println("消費記錄打印完畢!");
379             }else{
380                 System.out.println("對不起,不存在此號碼的消費記錄,不能打印!");
381             }            
382         } catch (IOException e) {            
383             e.printStackTrace();
384         }finally{
385             if(fileWriter!=null){
386                 try {
387                     fileWriter.close();
388                 } catch (IOException e) {                    
389                     e.printStackTrace();
390                 }
391             }
392         }
393     }
394     
395     /**
396      * 使用嗖嗖
397      * @param number 當前卡號
398      * @throws Exception 
399      */
400     public void userSoso(String number)  {        
401         MobileCard card = cards.get(number); // 獲取此卡對象
402         ServicePackage pack = card.getSerPackage(); // 獲取此卡所屬套餐
403         Random random = new Random();
404         int ranNum = 0;
405         int temp = 0;  //記錄各場景中實際消費數據
406         do{
407             
408             ranNum = random.nextInt(6);// 生成一個0~5之前的隨機數
409             Scene scene = scenes.get(ranNum); //獲取該序號所對應的場景
410             switch (ranNum) {
411             //序號為0或1為通話場景
412             case 0:
413             case 1:
414                 // 判斷該卡所屬套餐是否支持通話功能
415                 if (pack instanceof CallService) {
416                     // 執行通話方法
417                     System.out.println(scene.getDescription());
418                     CallService callService = (CallService) pack;
419                     try {
420                         temp = callService.call(scene.getData(), card);
421                     } catch (Exception e) {                            
422                         e.printStackTrace();
423                     }
424                     // 添加一條消費記錄
425                     addConsumInfo(number, new ConsumInfo(number,
426                             scene.getType(), temp));
427                     break;
428                 } else {
429                     // 如果該卡套餐不支持通話功能,則重新生成隨機數選擇其他場景
430                     continue;
431                 }
432                 //序號為2或3為發短信場景
433             case 2:
434             case 3:
435                 // 判斷該卡所屬套餐是否支持短信功能
436                 if (pack instanceof SendService) {
437                     // 執行發短信方法
438                     System.out.println(scene.getDescription());
439                     SendService sendService = (SendService) pack;
440                     try {
441                         temp = sendService.sendMessage(scene.getData(), card);
442                     } catch (Exception e) {                                                    
443                         e.printStackTrace();
444                     }
445                     // 添加一條消費記錄
446                     addConsumInfo(number, new ConsumInfo(number,
447                             scene.getType(), temp));
448                     break;
449                 } else {
450                     // 如果該卡套餐不支持發短信功能,則重新生成隨機數選擇其他場景
451                     continue;
452                 }
453                 //序號為4或5為發上網場景
454             case 4:
455             case 5:
456                 // 判斷該卡所屬套餐是否支持上網功能
457                 if (pack instanceof NetService) { 
458                     System.out.println(scene.getDescription());
459                     NetService netService = (NetService) pack;
460                     // 執行上網方法
461                     try {
462                         temp = netService.netPlay(scene.getData(), card);
463                     } catch (Exception e) {                        
464                         e.printStackTrace();
465                     }
466                     // 添加一條消費記錄
467                     addConsumInfo(number, new ConsumInfo(number,
468                             scene.getType(), temp));
469                     break;
470                 } else {
471                     // 如果該卡套餐不支持上網功能,則重新生成隨機數選擇其他場景
472                     continue;
473                 }                
474             }    
475             break;
476         }while(true);
477     }
478 
479     /**
480      * 根據套餐序號返回套餐對象
481      * 
482      * @param packNum
483      *            套餐序號
484      * @return 套餐對象
485      */
486     public ServicePackage createPack(int packId) {
487         ServicePackage pack = null;
488         switch (packId) {
489         case 1:
490             pack = new TalkPackage();
491             break;
492         case 2:
493             pack = new NetPackage();
494             break;
495         case 3:
496             pack = new SuperPackage();
497             break;
498         }
499         return pack;
500     }
501     
502     /**
503      * 顯示資費說明
504      */
505     public void showDescription(){
506         Reader rd = null;
507         try {
508             rd = new FileReader("套餐資費說明.txt");
509              char[] content = new char[1024];
510              int len = 0;
511              StringBuffer sb = new StringBuffer();
512                 while((len=rd.read(content))!=-1){
513                     sb.append(content,0,len);  //拼接字符串
514                 }
515                 System.out.println(sb);
516         } catch (IOException e) {
517             // TODO Auto-generated catch block
518             e.printStackTrace();
519         }
520     }
521     
522 }

   小伙伴可以多多互動,一起多交流交流!!!O(∩_∩)O

  喜歡前端、后端java開發的 可以到我的知乎主頁(更多詳細內容等你關注呦):https://www.zhihu.com/people/xing-chen-you-guang-pie-pie-pie,有詳細視頻、資料、教程,文檔,值得擁有!!!希望可以一起努力,加油ヾ(◍°∇°◍)ノ゙!!!  

  B站有上傳的更多項目視頻,從Java基礎到面向對象、Java高級API,以及SSM等框架的視頻,地址:https://www.bilibili.com/video/BV15a411w7Jh

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM