Java項目—嗖嗖移動業務大廳

嗖嗖移動業務大廳包類(以下圖):java

  

 

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

 

Common:微信

 1 package cn.common;
 2 
 3 import java.text.DecimalFormat;
 4 import java.util.HashMap;
 5 import java.util.Map;
 6 
 7 /**
 8  * 公共類
 9  */
10 @SuppressWarnings("unused")
11 public class Common {
12     /**
13      * double類型格式化
14      * @param data
15      * @return
16      */
17     public static String dataFormat(double data) {
18         DecimalFormat formatData = new DecimalFormat("#.0");
19         return formatData.format(data);
20     }
21     
22     /**
23      * double類型兩數相減
24      * @param num1
25      * @param num2
26      * @return
27      */
28     public static double sub(double num1,double num2){
29         return (num1*10-num2*10)/10;
30     }
31 }

 

ConsumType:app

1 package cn.common;
2 
3 /**
4  * 消費類型
5  */
6 public enum ConsumType {
7    TALK,SMS,NETWORK
8 }

 

ConsumInfo:dom

 1 package cn.entity;
 2 
 3 import cn.common.ConsumType;
 4 
 5 /**
 6  * 消費信息
 7  */
 8 @SuppressWarnings("unused")
 9 public class ConsumInfo {
10     private String cardNumber;  //卡號
11     private String type;  //消費類型:通話、發短信、上網
12     private int consumData;   //消費數據   通話:分鐘   發短信:條   上網:MB
13     
14     public ConsumInfo(){}
15     public ConsumInfo(String cardNumber, String type, int consumData) {
16         super();
17         this.cardNumber = cardNumber;
18         this.type = type;
19         this.consumData = consumData;
20     }
21     public String getCardNumber() {
22         return cardNumber;
23     }
24     public void setCardNumber(String cardNumber) {
25         this.cardNumber = cardNumber;
26     }
27     public String getType() {
28         return type;
29     }
30     public void setType(String type) {
31         this.type = type;
32     }
33     public int getConsumData() {
34         return consumData;
35     }
36     public void setConsumData(int consumData) {
37         this.consumData = consumData;
38     }    
39 }

 

MobileCard:ide

  1 package cn.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 }

 

NetPackage:工具

 1 package cn.entity;
 2 
 3 import cn.common.Common;
 4 import cn.service.NetService;
 5 
 6 /**
 7  * 網蟲套餐
 8  */
 9 public class NetPackage extends ServicePackage implements NetService {
10     private int flow; // 上網流量(MB)
11     
12     public NetPackage() {
13         //套餐數據初始化
14         this.flow = 1024 * 3;
15         this.price = 68.0;
16     }
17 
18     public NetPackage(int flow) {
19         super();
20         this.flow = flow;
21     }
22     
23     public int getFlow() {
24         return flow;
25     }
26 
27     public void setFlow(int flow) {
28         this.flow = flow;
29     }
30 
31     
32 
33     @Override
34     public void showInfo() {
35         System.out.println("網蟲套餐:上網流量是" + flow / 1024 + "GB/月,月資費是"
36                 + this.price + "元/月。");
37     }
38 
39     /**
40      * 提供上網服務
41      */
42     @SuppressWarnings("unused")
43     public void netPlay2(int flow, MobileCard card) throws Exception {
44         int reminFlow = this.flow - card.getRealFlow();  //卡中可支付的免費流量
45         // 判斷套餐中的上網流量是否足夠支付本次上網服務
46         if (this.flow <= reminFlow) {
47             // 套餐中上網流量足夠:修改該卡實際上網流量數據
48             card.setRealFlow(card.getRealFlow() + flow);
49         } else {
50             // 套餐中上網流量不夠:額外消費需按0.1元/條付費,額外消費金額=0.1*(該卡實際消費上網流量+本次消費上網流量-套餐包含的上網流量)
51             double consumeMoney = 0.1 * (flow-reminFlow);
52             // 該卡帳戶餘額足夠支付:修改該卡實際使用的上網流量、帳戶餘額、當月消費金額
53             if (card.getMoney() >= consumeMoney) {
54                 //消耗的流量增長
55                 card.setRealFlow(card.getRealFlow() + flow);
56                 // 當前帳戶餘額=當前帳戶餘額-額外消費金額
57                 card.setMoney(card.getMoney() - consumeMoney);
58                 // 當月消費金額=當月消費金額+額外消費金額
59                 card.setConsumAmount(card.getConsumAmount() + consumeMoney);
60             } else {
61                 
62                 int temp = (int)(card.getMoney()/0.1); //當前餘額夠大
63                 throw new Exception("您的餘額不足,請充值後再使用!");
64             }
65         }
66     }
67     
68     /**
69      * 提供上網服務
70      */
71     public int netPlay(int flow, MobileCard card) throws Exception {
72         int temp = flow;
73         for(int i=0;i<flow;i++){
74             if(this.flow-card.getRealFlow()>=1){
75                 //第一種狀況:套餐剩餘流量能夠支持使用1M流量            
76                 card.setRealFlow(card.getRealFlow()+1); //實際使用流量加1MB                
77             }else if(card.getMoney()>=0.1){
78                 //第二種狀況:套餐流量已用完,帳戶餘額能夠支付1M流量,使用帳戶餘額支付
79                 card.setRealFlow(card.getRealFlow()+1); //實際使用流量加1MB
80                 card.setMoney(Common.sub(card.getMoney(),0.1)); //帳戶餘額消費0.1元(1M流量費用)
81                 card.setConsumAmount(card.getConsumAmount() + 0.1);
82             }else{
83                 temp = i;
84                 throw new Exception("本次已使用流量"+i+"MB,您的餘額不足,請充值後再使用!");
85             }
86         }
87         return temp;
88     }
89 }

 

Scene:this

 1 package cn.entity;
 2 
 3 /**
 4  * 使用場景
 5  */
 6 public class Scene {
 7     private String type;  //場景消費類型
 8     private int data;  //消費數據
 9     private String description;//場景描述
10     
11     public Scene(){}
12     public Scene(String type,int data,String description){
13         this.type = type;
14         this.data = data;
15         this.description = description;
16     }  
17     
18     public String getType() {
19         return type;
20     }
21     public void setType(String type) {
22         this.type = type;
23     }
24     public int getData() {
25         return data;
26     }
27     public void setData(int data) {
28         this.data = data;
29     }
30     public String getDescription() {
31         return description;
32     }
33     public void setDescription(String description) {
34         this.description = description;
35     }
36     
37 }

 

ServicePackage:spa

 1 package cn.entity;
 2 
 3 /**
 4  * 嗖嗖移動卡套餐
 5  */
 6 public abstract class ServicePackage {    
 7     protected double price;  //套餐月資費(元)
 8      
 9     public double getPrice() {
10         return price;
11     }
12 
13     public void setPrice(double price) {
14         this.price = price;
15     }
16 
17     //顯示套餐數據
18     public abstract void showInfo();
19 }

 

SuperPackage:.net

  1 package cn.entity;
  2 
  3 import cn.common.Common;
  4 import cn.service.CallService;
  5 import cn.service.NetService;
  6 import cn.service.SendService;
  7 
  8 /**
  9  * 超人套餐
 10  */
 11 public class SuperPackage extends ServicePackage implements CallService,
 12 SendService,NetService {
 13     private int talkTime;   //通話時長(分鐘)
 14     private int smsCount;   //短信條數(條)
 15     private int flow;  //上網流量(MB)
 16        
 17     public int getTalkTime() {
 18         return talkTime;
 19     }
 20 
 21 
 22     public void setTalkTime(int talkTime) {
 23         this.talkTime = talkTime;
 24     }
 25 
 26 
 27     public int getSmsCount() {
 28         return smsCount;
 29     }
 30 
 31 
 32     public void setSmsCount(int smsCount) {
 33         this.smsCount = smsCount;
 34     }
 35     
 36     public int getFlow() {
 37         return flow;
 38     }
 39 
 40     public void setFlow(int flow) {
 41         this.flow = flow;
 42     }
 43     
 44     public SuperPackage(){
 45         //套餐數據初始化
 46         this.talkTime = 200;
 47         this.smsCount = 50;
 48         this.flow = 1*1024;  
 49         this.price = 78.0;
 50     }
 51     @Override
 52     public void showInfo() {
 53         System.out.println("超人套餐:通話時長爲"+this.talkTime+"分鐘/月,短信條數爲"+this.smsCount+"條/月,上網流量爲"+this.flow/1024+"GB/月。");
 54     }
 55 
 56 
 57     /**
 58      * 提供上網服務
 59      */
 60     public int netPlay(int flow, MobileCard card) throws Exception {
 61         int temp = flow;
 62         for(int i=0;i<flow;i++){
 63             if(this.flow-card.getRealFlow()>=1){
 64                 //第一種狀況:套餐剩餘流量能夠支持使用1M流量            
 65                 card.setRealFlow(card.getRealFlow()+1); //實際使用流量加1MB                
 66             }else if(card.getMoney()>=0.1){
 67                 //第二種狀況:套餐流量已用完,帳戶餘額能夠支付1M流量,使用帳戶餘額支付
 68                 card.setRealFlow(card.getRealFlow()+1); //實際使用流量加1MB
 69                 card.setMoney(Common.sub(card.getMoney(),0.1)); //帳戶餘額消費0.1元(1M流量費用)
 70                 card.setConsumAmount(card.getConsumAmount() + 0.1);
 71             }else{
 72                 temp = i;
 73                 throw new Exception("本次已使用流量"+i+"MB,您的餘額不足,請充值後再使用!");
 74             }
 75         }
 76         return temp;
 77     }
 78 
 79     /**
 80      * 提供通話服務
 81      */
 82     public int call(int minCount, MobileCard card) throws Exception{
 83         int temp = minCount; 
 84         for(int i=0;i<minCount;i++){
 85             if(this.talkTime-card.getRealTalkTime()>=1){
 86                 //第一種狀況:套餐剩餘通話時長能夠付1分鐘通話            
 87                 card.setRealTalkTime(card.getRealTalkTime()+1); //實際通話數據加1                
 88             }else if(card.getMoney()>=0.2){
 89                 //第二種狀況:套餐通話時長已用完,帳戶餘額能夠支付1分鐘通話,使用帳戶餘額支付
 90                 card.setRealTalkTime(card.getRealTalkTime()+1); //實際使用通話時長1分鐘 
 91                 card.setMoney(Common.sub(card.getMoney(),0.2)); //帳戶餘額消費0.2元(1分鐘額外通話)
 92                 card.setConsumAmount(card.getConsumAmount() + 0.2);
 93             }else{
 94                 temp = i; //記錄實現通話分鐘數
 95                 throw new Exception("本次已通話"+i+"分鐘,您的餘額不足,請充值後再使用!");                
 96             }
 97         }
 98         return temp;
 99     }
100     
101     /**
102      * 提供短信服務
103      */
104     public int sendMessage(int smsCount, MobileCard card) throws Exception {
105         int temp = smsCount;
106         for(int i=0;i<smsCount;i++){
107             if(this.smsCount-card.getRealSMSCount()>=1){
108                 //第一種狀況:套餐剩餘短信條數能夠付1條短信            
109                 card.setRealSMSCount(card.getRealSMSCount()+1); //實際使用短信條數加1                
110             }else if(card.getMoney()>=0.1){
111                 //第二種狀況:套餐短信條數已用完,帳戶餘額能夠支付1條短信,使用帳戶餘額支付
112                 card.setRealSMSCount(card.getRealSMSCount()+1); 
113                 card.setMoney(Common.sub(card.getMoney(),0.1)); //帳戶餘額消費0.1元(1條短信費用)
114                 card.setConsumAmount(card.getConsumAmount() + 0.1);
115             }else{
116                 temp = i;
117                 throw new Exception("本次已發送短信"+i+"條,您的餘額不足,請充值後再使用!");
118             }
119         }
120         return temp;
121     }
122 
123 }

 

TalkPackage:code

 1 package cn.entity;
 2 
 3 import cn.common.Common;
 4 import cn.service.CallService;
 5 import cn.service.SendService;
 6 
 7 /**
 8  * 話嘮套餐
 9  */
10 public class TalkPackage extends ServicePackage implements CallService,
11         SendService {
12     private int talkTime; // 通話時長(分鐘)
13     private int smsCount; // 短信條數(條)
14 
15     public int getTalkTime() {
16         return talkTime;
17     }
18 
19     public void setTalkTime(int talkTime) {
20         this.talkTime = talkTime;
21     }
22 
23     public int getSmsCount() {
24         return smsCount;
25     }
26 
27     public void setSmsCount(int smsCount) {
28         this.smsCount = smsCount;
29     }
30 
31     public TalkPackage() {
32         //套餐數據初始化
33         this.talkTime = 500;
34         this.smsCount = 30;
35         this.price = 58.0;
36     }
37 
38     public TalkPackage(int talkTime, int smsCount) {
39         super();
40         this.talkTime = talkTime;
41         this.smsCount = smsCount;
42     }
43 
44     /**
45      * 顯示套餐詳情
46      */
47     public void showInfo() {
48         System.out.println("話嘮套餐:通話時長爲" + this.talkTime + "分鐘/月,短信條數爲"
49                 + this.smsCount + "條/月,資費爲" + this.price + "元/月。");
50     }
51     
52     public int call(int minCount, MobileCard card) throws Exception{
53         int temp = minCount; 
54         for(int i=0;i<minCount;i++){
55             if(this.talkTime-card.getRealTalkTime()>=1){
56                 //第一種狀況:套餐剩餘通話時長能夠付1分鐘通話            
57                 card.setRealTalkTime(card.getRealTalkTime()+1); //實際使用流量加1MB                
58             }else if(card.getMoney()>=0.2){
59                 //第二種狀況:套餐通話時長已用完,帳戶餘額能夠支付1分鐘通話,使用帳戶餘額支付
60                 card.setRealTalkTime(card.getRealTalkTime()+1); //實際使用通話時長1分鐘 
61                 card.setMoney(Common.sub(card.getMoney(),0.2)); //帳戶餘額消費0.2元(1M流量費用)
62                 card.setConsumAmount(card.getConsumAmount() + 0.2);
63             }else{
64                 temp = i; //記錄實現通話分鐘數
65                 throw new Exception("本次已通話"+i+"分鐘,您的餘額不足,請充值後再使用!");                
66             }
67         }
68         return temp;
69     }
70         
71     public int sendMessage(int smsCount, MobileCard card) throws Exception {
72         int temp = smsCount;
73         for(int i=0;i<smsCount;i++){
74             if(this.smsCount-card.getRealSMSCount()>=1){
75                 //第一種狀況:套餐剩餘短信條數能夠付1條短信            
76                 card.setRealSMSCount(card.getRealSMSCount()+1); //實際使用短信條數加1                
77             }else if(card.getMoney()>=0.1){
78                 //第二種狀況:套餐短信條數已用完,帳戶餘額能夠支付1條短信,使用帳戶餘額支付
79                 card.setRealSMSCount(card.getRealSMSCount()+1); 
80                 card.setMoney(Common.sub(card.getMoney(),0.1)); //帳戶餘額消費0.1元(1條短信費用)
81                 card.setConsumAmount(card.getConsumAmount() + 0.1);
82             }else{
83                 temp = i;
84                 throw new Exception("本次已發送短信"+i+"條,您的餘額不足,請充值後再使用!");
85             }
86         }
87         return temp;
88     }
89     
90 }

 

CallService:

 1 package cn.service;
 2 
 3 import cn.entity.MobileCard;
 4 
 5 /**
 6  * 通話服務接口
 7  */
 8 public interface CallService {
 9       //打電話
10       public int call(int minCount,MobileCard card) throws Exception;
11 }

 

NetService:

 1 package cn.service;
 2 
 3 import cn.entity.MobileCard;
 4 
 5 /**
 6  * 上網服務
 7  */
 8 public interface NetService {
 9     //上網
10      public int netPlay(int flow,MobileCard card) throws Exception;
11 }

 

SendService:

 1 package cn.service;
 2 
 3 import cn.entity.MobileCard;
 4 
 5 /**
 6  * 短信服務
 7  */
 8 public interface SendService {
 9     //發短信
10      public int sendMessage(int count,MobileCard card) throws Exception;
11 }

 

CardUtil:

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

 

執行程序結果圖(一部分):

相關文章
相關標籤/搜索