嗖嗖移动业务大厅包类(如下图):


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:

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

ConsumInfo:

 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:

  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:

 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:

 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:

  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:

 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 }

最新文章

  1. ActionBar设置自定义setCustomView()留有空白的问题
  2. 玩转动态编译 - 高级篇:一,IL访问静态属性和字段
  3. JS在window和document的应用
  4. ListBox实现拖拽排序功能
  5. Sequence(组合数学,集合不同元素的个数)
  6. android View各属性详解
  7. tk资料
  8. 查看DB文件的空间使用情况
  9. 前端HR告诉你—如何面试Web前端开发
  10. apache 运行php环境之困扰,无法加载多个不同的.html文件
  11. redhat下yum命令安装(替换为centos yum命令)
  12. jQuery 选择器 (一)
  13. USCiLab cereal json 序列化
  14. [minecraft]mcCoder制作有感
  15. Spring Boot开启的 2 种方式
  16. js 监听事件的叠加和移除
  17. VS 中的几种注释方法
  18. react native中的聊天气泡以及timer封装成的发送验证码倒计时
  19. Opendaylight的Carbon(碳)版本安装
  20. Connect to a ROS Network---2

热门文章

  1. 1-kubeadm部署1.18.0单master集群
  2. 《流畅的Python》 第一部分 序章 【数据模型】
  3. 跨境 TCP 传输优化实录 — 使用 BBR 解决 LFN 问题
  4. 多测师讲解html _链接标签004_高级讲师肖sir
  5. day05 Pyhton学习总结
  6. spring boot:接收数组参数及多文件混合json参数(spring boot 2.3.4)
  7. go 数组指针 指针数组
  8. centos8安装及配置nfs4
  9. dns配置文件的方式
  10. 普通人如何站在时代风口学好AI?这是我看过最好的答案