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


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 }

Java项目——嗖嗖移动业务大厅的更多相关文章

  1. Java项目—嗖嗖移动业务大厅

    嗖嗖移动业务大厅包类(如下图): SosoMgr: package cn.biz; import java.util.Scanner; import cn.common.Common; import ...

  2. JAVA项目-嗖嗖移动

    /** * 移动卡类 */ public class MobileCard { private String cardNumber; //卡号 private String userName; //用 ...

  3. 如何用Maven创建一个普通Java项目

    一下内容包括:用Maven创建一个普通Java项目,并把该项目转成IDEA项目,导入到IDEA,最后把这个项目打包成一个jar文件. 有时候运行mvn命令失败,重复运行几次就OK了,无解(可能因为网络 ...

  4. Java项目经验

    Java项目经验 转自CSDN. Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点:1.掌握项目开发的基本步骤2.具备极强的面向对象的 ...

  5. 一次从0到1的java项目实践清单

    虽说工作就是简单的事情重复做,但不是所有简单的事你都能有机会做的. 我们平日工作里,大部分时候都是在做修修补补的工作,而这也是非常重要的.做好修补工作,做好优化工作,足够让你升职加薪! 但是如果有机会 ...

  6. 一份从0到1的java项目实践清单

    虽说工作就是简单的事情重复做,但不是所有简单的事你都能有机会做的. 我们平日工作里,大部分时候都是在做修修补补的工作,而这也是非常重要的.做好修补工作,做好优化工作,足够让你升职加薪! 但是如果有机会 ...

  7. JAVA项目中常用的异常处理情况总结

    JAVA项目中常用的异常知识点总结 1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用 ...

  8. Java项目中使用log记录日志的一些总结

    本文介绍了一下自己在Java项目中使用log的一些总结,从日志的作用.日志的选用.日志级别介绍.日志记录的一些最佳实践几个方面阐述. 日志的作用 主要作用包括: 1.出问题后定位当时问题 2.显示程序 ...

  9. 使用Maven创建Java项目

    在本教程中,我们将向你展示如何使用 Maven 来创建一个 Java 项目,导入其到Eclipse IDE,并打包 Java 项目到一个 JAR 文件. 所需要的工具: Maven 3.3.3 Ecl ...

随机推荐

  1. IO那些事

    IO(Input\Output): 即输入输出,通常指数据在存储器(内部和外部)或其他周边设备之间的输入和输出,是信息处理系统(例如计算机)与外部世界(可能是人类或另一信息处理系统)之间的通信.说的简 ...

  2. vue中解决chrome浏览器自动播放音频 和MP3语音打包到线上

    一.vue中解决chrome浏览器自动播放音频 需求 有新订单的时候,页面自动语音提示和弹出提示框: 问题 chrome浏览器在18年4月起,就在桌面浏览器全面禁止了音视频的自动播放功能.严格地来说, ...

  3. Recursive sequence (矩阵快速幂)2016ACM/ICPC亚洲区沈阳站

    题目 Farmer John likes to play mathematics games with his N cows. Recently, they are attracted by recu ...

  4. BST,Splay平衡树学习笔记

    BST,Splay平衡树学习笔记 1.二叉查找树BST BST是一种二叉树形结构,其特点就在于:每一个非叶子结点的值都大于他的左子树中的任意一个值,并都小于他的右子树中的任意一个值. 2.BST的用处 ...

  5. mysql 操作数据库

    创建数据库 CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name(数据库名字) #添加 IF NOT EXISTS,如果已有数据库,将会提醒,不会出现错 ...

  6. redhat系统服务器重启后提示An error occurred during the file system check.

    问题描述 浪潮一台NF8480M3外观红灯报警,鉴于无法登陆带外,只能对服务器进行断电重启操作 问题现象 重启后进入开机过程并报错,报错如下内容及图片如下所示,正常来说进入此界面后直接输入root密码 ...

  7. Zookeeper(1)---初识

    一.ZK简述 Zookeeper,它是一个分布式程序的协调服务,它主要是用来解决分布式应用中的一些数据管理问题,比如集群管理,分布式应用配置,分布式锁,服务注册/发现等等. 它是一个类似于文件系统的树 ...

  8. virtualbox 网络地址转换(NAT)

    网络地址转换 虚拟机可以访问主机 通过主机请求外网 但是主机不能请求虚拟机 所以要配置端口转发才行 host-only模式下 不同网段的不同虚拟机也可以互相ping通  比如 192.168.33.1 ...

  9. 通过SQL自动添加流水号

    通过SQL自动添加流水号 项目中往往有一些单据流水号或者流程流水号是希望通过新增一条记录后自动产生一个编号的,比如新增一条流程就自动根据当前日期自动添加该流程的流程流水号,下面介绍两种不同类型流水号通 ...

  10. 学会这三个命令,你就不再是git只会用三板斧的菜鸟了

    前言 在之前的文章当中我们介绍了最基本的git add.git commit和git push的用法以及基本原理,还介绍了gitignore文件的设置方法,从而让我们可以使用git add .来添加我 ...