移动、联通、电信是国内三大通信运营商,每个运营商提供了不同的品牌套餐来应对不同的用户群,例如北京移动,主要有全球通、神州行、动感地带三大品牌套餐,每种套餐的内容和资费不同。现嗖嗖移动是一拟定的通信运营商,提供了话唠套餐、网虫套餐、超人套餐。 本项目嗖嗖移动业务大厅提供了嗖嗖移动用户的日常常用功能,包括新用户注册、本月账单查询、套餐余量查询、打印消费详单、套餐变更、办理退网、话费充值、查看消费记录、查看资费说明功能,另外,还可以模拟用户通话、上网、发短信的场景进行相应的扣费并记录消费信息。 技能要求 使用面向对象设计的思想 合理运用异常处理 使用集合框架存储数据,
嗖嗖移动业务大厅。用的是Java语言开发的,代码很多,概括的功能也很全面。系统是模拟移动、联通、电信国内三大通信运营商的功能,有用户登录、用户注册、话费充值、使用嗖嗖、资费说明、退出系统、本月账单查询、套餐余量查询、打印消费详单、套餐变更、办理退网等功能(后附源代码)!
一 、 项目概述
技能要求
使用面向对象设计的思想
合理运用异常处理
使用集合框架存储数据,不使用数据库
使用 I/O 操作实现对文件的读写
开发工具
JDK 7.0、MyEclipse。
需求概述
话唠套餐、网虫套餐、超人套餐,各种套餐所包含的服务内容及资费如表 1 所示。
如实际使用中,超出套餐内包含的通话时长、短信条数或上网流量时,按以下规则计费:
超出的通话:0.2 元/分钟
超出的短信:0.1 元/分钟
超出的上网流量:0.1 元/MB
本项目嗖嗖移动业务大厅提供了嗖嗖移动用户的日常常用功能,包括新用户注册、本月账单查询、套餐余量查询、打印消费详单、套餐变更、办理退网、话费充值、查看消费记录、查看资费说明功能,另外,还可以模拟用户通话、上网、发短信的场景进行相应的扣费并记录消费信息。各功能介绍如表 2 所示。
二 、 项目业务流程描述
1.整体业务流程
嗖嗖移动项目的各个功能实际都是挂在功能菜单上的,其中主菜单包含 6 个功能,当用户输入 1~5 之间的功能编号后,验证卡号,如果该卡号已注册,执行相应功能后返回主菜单,否则,退出系统。如图 1 所示。
图 1 主菜单
当使用已注册用户登录并通过验证后,即显示二级菜单,包含 5 个功能,如图 2 所示。当输入 1~5 之外的功能编号时,返回主菜单。
图 2 二级菜单
2. 用户注册
该功能可以看作是去营业厅办理新卡的过程。主要分成以下几个步骤:
1) 选择卡号(从随机生成的 9 个以“139”开头的卡号中选择一个,输入序号即可)。
2) 选择套餐(共 3 类套餐,选择其中一个,输入所对应的序号即可)。
3) 输入用户名、密码信息(相当于现在各营业厅的实名登录,输入用户名和密码即可)。
4) 输入预存话费金额:这里需保存预存的金额足以支付一个月的套餐费用,否则给出信息提示“您预存的话费金额不足以支付本月固定套餐资费,请重新充值!”。
5) 注册新卡
实现效果如图 3 所示。
图 3 用户注册
3. 本月账单查询
本月账单可以显示以下信息:
卡号。
套餐月资费。
合计(是套餐固定资费和超出套餐使用费用总和)。
账户余额。
运行效果如图 4 所示。
图 4 本月账单查询
4. 套餐余量查询
本功能用来显示该卡所属套餐内所剩余的免费通话时长、短信条数、上网流量,不同品牌套餐所支持的服务不同,因此显示的内容不同。运行效果如图 5 所示。
图 5 套餐余量查询
5. 添加和打印消费清单
实现向消费记录中添加一条该卡的消费记录(该功能可在使用嗖嗖功能中调用),并实现打印该卡的消费记录,打印前先从消费记录中查找是否存在此卡的消费记录,如存在则提示“已添加一条消费记录。”,将消费记录输出到文本文件中,格式如图 5 所示。如不存在,提示用户相应信息,如图 6 所示。
图 5 消费记录
图 6 该卡不存在消费记录
6.使用嗖嗖
(1)随机进入某个场景
模拟嗖嗖用户使用卡的过程。选择该功能后,输入当前卡号,通过验证后,可随机进入表 3 所示的 6 个场景(当然还可以再设计其他场景),要求所进入的场景的服务类型是该卡所属套餐所支持的(例如网虫套餐只能进入服务类型为“上网”的场景)。
(2)模拟消费
进入该场景这之后,将按场景的描述要求消耗套餐余量,如套餐余量不足,需按套餐外的资费规则扣费,成功消费后,添加一条消费记录。效果如图 7 所示。
图 7 使用嗖嗖成功
余额不足时,提示信息。如本场景通话时长为 30 分钟,当通话至 10 分钟时余额不足,抛出异常,并提示用户“本次已通话 10 分钟,您的余额不足,请充值后再使用!”如图 8所示
图 8 余额不足的情况
(3)消费结束,添加消费记录
消费完毕,在消费列表中添加一条消费记录。并提示用户“已添加一条消费记录!”。按实际消费添加消费记录,除非没有消费。如图 8 的情况,则此条消费记录只需记录实际通话时长 10 分钟。
7. 办理退网
本功能可实现将当前卡用户从已注册用户列表中删除,删除后直接退出系统。运行效果如图 9 所示。
图 9 办理退网
8. 套餐变更
本功能类似我们去营业厅变量套餐,可以充分体会到使用面向对象后,代码更加灵活,可维护性更强。
本项目中没有引入对日期的记录和处理,因此,这里默认套餐变更时间为本月的开始,选择变量后的套餐为当前套餐之外的其他类型,否则显示信息提示。如图 10 所示。
图 10 选择套餐错误
选择套餐正确之后,还需判断当前余额是否足以支付一个月的套餐资费,如不足,提示错误信息。如图 11 所示。
图 11 变更套餐余额不足
如上述两个条件都满足时,套餐变量成功,显示相应信息,如图 12 所示。当前卡实际使用数据清零,当前卡所属套餐修改为变量后的套餐类型,当前卡余额减去新套餐月资费,本月消费金额修改为新套餐月资费。
图 12 套餐变更成功
9. 话费充值
可为指定卡号充值,要求充值金额最少 50 元。充值成功后提示信息。运行效果如图 13所示。
图 13 充值成功
通过最少充值金额验证后,修改当前卡余额即可。
10. 查看资费说明
此功能需实现将文本文件(套餐资费说明.txt)中的信息显示到控制台。本功能需使用 I/O 操作实现文本文件的写入。
搭建嗖嗖项目的框架结构:
一、 实体类(Entity)
二、工具类 (utils)
下面是项目的整体代码结构:
实体类中的其中一个手机卡类:
1 package cn.soso.entity;
2 /**
3 * 手机卡
4 *
5 */
6 public class MobileCard {
7 private String cardNumber; //卡号
8 private String userName; //用户名
9 private String passWord; //密码
10 private ServicePackage serPackage; //所属套餐
11 private double consumAmount; //当月消费金额
12 private double money; //账户余额
13 private int realTalkTime; //实际通话时长(分钟)
14 private int realSMSCount; //实际发送短信条数(条)
15 private int realFlow; //实际上网流量
16
17 public MobileCard(){}
18
19 public MobileCard(String userName, String passWord, String cardNumber,
20 ServicePackage serPackage, double consumAmount, double money) {
21 super();
22 this.userName = userName;
23 this.passWord = passWord;
24 this.cardNumber = cardNumber;
25 this.serPackage = serPackage;
26 this.consumAmount = consumAmount;
27 this.money = money;
28 }
29
30 public String getUserName() {
31 return userName;
32 }
33
34 public void setUserName(String userName) {
35 this.userName = userName;
36 }
37
38 public String getPassWord() {
39 return passWord;
40 }
41
42 public void setPassWord(String passWord) {
43 this.passWord = passWord;
44 }
45
46 public String getCardNumber() {
47 return cardNumber;
48 }
49
50 public void setCardNumber(String cardNumber) {
51 this.cardNumber = cardNumber;
52 }
53
54 public ServicePackage getSerPackage() {
55 return serPackage;
56 }
57
58 public void setSerPackage(ServicePackage serPackage) {
59 this.serPackage = serPackage;
60 }
61
62 public double getConsumAmount() {
63 return consumAmount;
64 }
65
66 public void setConsumAmount(double consumAmount) {
67 this.consumAmount = consumAmount;
68 }
69
70 public double getMoney() {
71 return money;
72 }
73
74 public void setMoney(double money) {
75 this.money = money;
76 }
77
78 public int getRealTalkTime() {
79 return realTalkTime;
80 }
81
82 public void setRealTalkTime(int realTalkTime) {
83 this.realTalkTime = realTalkTime;
84 }
85
86 public int getRealSMSCount() {
87 return realSMSCount;
88 }
89
90 public void setRealSMSCount(int realSMSCount) {
91 this.realSMSCount = realSMSCount;
92 }
93
94 public int getRealFlow() {
95 return realFlow;
96 }
97
98 public void setRealFlow(int realFlow) {
99 this.realFlow = realFlow;
100 }
101
102 /**
103 * 显示卡信息
104 */
105 public void showMeg(){
106 System.out.println("卡号:"+this.cardNumber+" 用户名:"+this.userName+" 当前余额:"+this.money+"元。");
107 this.serPackage.showInfo();
108 }
109 }
整体业务流程类:
1 package cn.soso.biz;
2
3 import java.util.Scanner;
4
5 import cn.soso.common.Common;
6 import cn.soso.entity.MobileCard;
7 import cn.soso.entity.ServicePackage;
8 import cn.soso.utils.CardUtil;
9
10 /**
11 * 业务类
12 *
13 *
14 */
15 public class SosoMgr {
16 Scanner input = new Scanner(System.in);
17 CardUtil utils = new CardUtil();
18
19 public static void main(String[] args) {
20 SosoMgr soso = new SosoMgr();
21 soso.mainMenu();
22 System.out.println("谢谢使用!");
23 }
24
25 /**
26 * 主流程
27 */
28 public void mainMenu() {
29 int menuChoose = 0;
30 String mobileNumber= "";
31 String password = "";
32 utils.init();
33 utils.initScenes();
34 //Common.typesInit();
35 do {
36 System.out.println("\n*************欢迎使用嗖嗖移动业务大厅***************");
37 System.out.println("1.用户登录 2.用户注册 3.使用嗖嗖 4.话费充值 5.资费说明 6.退出系统");
38 System.out.print("请选择:");
39 menuChoose = input.nextInt();
40 // 分支语句:根据功能编号执行相应功能
41 switch (menuChoose) {
42 case 1:
43 //用户登录
44 System.out.print("请输入手机卡号:");
45 mobileNumber = input.next();
46 System.out.print("请输入密码:");
47 password = input.next();
48 if (utils.isExistCard(mobileNumber, password)) {
49 cardMenu(mobileNumber);
50 }else{
51 System.out.println("对不起,您输入的信息有误,无法登录!");
52 }
53 continue;
54 case 2:
55 //用户注册
56 registCard();
57 continue;
58 case 3:
59
60 //使用嗖嗖
61 System.out.print("请输入手机卡号:");
62 mobileNumber = input.next();
63
64 if (utils.isExistCard(mobileNumber)) {
65 try {
66 /* System.out.println("****使用之前****");
67 utils.showRemainDetail(mobileNumber);
68 utils.showAmountDetail(mobileNumber);*/
69 utils.userSoso(mobileNumber);
70 } catch (Exception e) {
71 System.err.println(e.getMessage());
72 }
73 }else{
74 System.out.println("对不起,该卡号未注册,不能使用!");
75 }
76
77 /*System.out.println("****使用之后****");
78 utils.showRemainDetail(mobileNumber);
79 utils.showAmountDetail(mobileNumber);*/
80 continue;
81 case 4:
82 //话费充值
83 System.out.print("请输入充值卡号:");
84 mobileNumber = input.next();
85 if (utils.isExistCard(mobileNumber)) {
86 System.out.print("请输入充值金额:");
87 double money = input.nextDouble();
88 utils.chargeMoney(mobileNumber, money);
89 }else{
90 System.out.println("对不起,要充值的卡号未注册,无法充值!");
91 }
92 continue;
93 case 5:
94 System.out.println("\n*****资费说明******");
95 utils.showDescription();
96 continue;
97 case 6:
98 //退出系统
99 break;
100 default:
101 //选择其他数字退出系统
102 break;
103 }
104 break;
105 } while (true);
106 }
107
108 /**
109 * 手机卡功能菜单
110 *
111 * @param number
112 * @return
113 */
114 public int cardMenu(String mobileNumber) {
115 int menuChoose = 0;
116 do {
117 System.out.println("\n*****嗖嗖移动用户菜单*****");
118 System.out.println("1.本月账单查询");
119 System.out.println("2.套餐余量查询");
120 System.out.println("3.打印消费详单");
121 System.out.println("4.套餐变更");
122 System.out.println("5.办理退网");
123 System.out.print("请选择(输入1~5选择功能,其他键返回上一级):");
124 menuChoose = input.nextInt();
125 switch (menuChoose) {
126 case 1:
127 System.out.println("\n*****本月账单查询******");
128 utils.showAmountDetail(mobileNumber);
129 continue;
130 case 2:
131 System.out.println("\n*****套餐余量查询******");
132 utils.showRemainDetail(mobileNumber);
133 continue;
134 case 3:
135 System.out.println("\n*****消费详单查询******");
136 utils.printConsumInfo(mobileNumber);
137 continue;
138 case 4:
139 System.out.println("\n*****套餐变更******");
140 System.out.print("1.话唠套餐 2.网虫套餐 3.超人套餐 请选择(序号):");
141 utils.changingPack(mobileNumber, input.next());
142 continue;
143 case 5:
144 System.out.println("\n*****办理退网******");
145 utils.delCard(mobileNumber);
146 System.out.println("谢谢使用!");
147 System.exit(1); //办理退网后退出系统
148
149 }
150
151 break;
152 } while (true);
153 return menuChoose;
154 }
155
156 /**
157 * 注册新卡流程
158 */
159 public void registCard(){
160 String[] newNumbers = utils.getNewNumbers(9);
161 //显示可供选择的手机号列表
162 System.out.println("*****可选择的卡号*****");
163
164 for(int i=0;i<9;i++){
165 System.out.print((i+1)+"."+newNumbers[i]+"\t\t");
166 if((i+1)%3==0){
167 System.out.println();
168 }
169 }
170 //选择手机号
171 System.out.print("请选择卡号(输入1~9的序号):");
172 String number = newNumbers[input.nextInt()-1];
173
174 //选择套餐类型
175 System.out.print("1.话唠套餐 2.网虫套餐 3.超人套餐, ");
176 System.out.print("请选择套餐(输入序号):");
177 //utils.getPackList();
178 //获取套餐对象
179 ServicePackage pack = utils.createPack(input.nextInt());
180
181 //输入用户名
182 System.out.print("请输入姓名:");
183 String name = input.next();
184
185 //输入密码
186 System.out.print("请输入密码:");
187 String password = input.next();
188
189 //输入预存话费金额
190 double money = 0;
191 System.out.print("请输入预存话费金额:");
192 money = input.nextDouble();
193 while(money<pack.getPrice()){
194 System.out.print("您预存的话费金额不足以支付本月固定套餐资费,请重新充值:");
195 money = input.nextDouble();
196 }
197
198 //创建新卡对象并添加
199 MobileCard newCard = new MobileCard(name,password,number,pack,pack.getPrice(),money-pack.getPrice());
200 utils.addCard(newCard);
201 }
202 }
手机卡工具类:
1 package cn.soso.utils;
2
3 import java.io.FileReader;
4 import java.io.FileWriter;
5 import java.io.IOException;
6 import java.io.Reader;
7 import java.io.Writer;
8 import java.text.DecimalFormat;
9 import java.util.ArrayList;
10 import java.util.HashMap;
11 import java.util.Iterator;
12 import java.util.List;
13 import java.util.Map;
14 import java.util.Random;
15 import java.util.Set;
16
17 import cn.soso.common.Common;
18 import cn.soso.entity.ConsumInfo;
19 import cn.soso.entity.MobileCard;
20 import cn.soso.entity.NetPackage;
21 import cn.soso.entity.Scene;
22 import cn.soso.entity.ServicePackage;
23 import cn.soso.entity.SuperPackage;
24 import cn.soso.entity.TalkPackage;
25 import cn.soso.service.CallService;
26 import cn.soso.service.NetService;
27 import cn.soso.service.SendService;
28
29 /**
30 * 手机卡工具类
31 *
32 *
33 */
34 public class CardUtil {
35 Map<String, MobileCard> cards = new HashMap<String, MobileCard>(); // 所有手机卡的列表
36 Map<String, List<ConsumInfo>> consumInfos = new HashMap<String, List<ConsumInfo>>(); // 所有手机卡消费记录的列表
37 List<Scene> scenes = new ArrayList<Scene>();
38
39 // 初始化用户
40 public void init() {
41 MobileCard card1 = new MobileCard("何玲玲", "123", "13965756432",
42 new TalkPackage(), 58.0, 42.0);
43 MobileCard card2 = new MobileCard("黄露露", "123", "13956712467",
44 new NetPackage(), 68.0, 32.0);
45 MobileCard card3 = new MobileCard("朱蓉蓉", "123", "13911568956",
46 new SuperPackage(), 78.0, 22.0);
47 MobileCard card4 = new MobileCard("桃跑跑", "123", "13924221868",
48 new TalkPackage(), 78.0, 2.0);
49 card4.setConsumAmount(98.0);
50 card4.setRealTalkTime(500);
51 card4.setRealSMSCount(100);
52 cards.put("13965756432", card1);
53 cards.put("13956712467", card2);
54 cards.put("13911568956", card3);
55 cards.put("13924221868", card4);
56 }
57
58 /**
59 * 使用场景初始化
60 */
61 public void initScenes(){
62 scenes.add(new Scene("通话",90,"问候客户,谁知其如此难缠 通话90分钟"));
63 scenes.add(new Scene("通话",30,"询问妈妈身体状况 本地通话30分钟"));
64 scenes.add(new Scene("短信",5,"参与环境保护实施方案问卷调查 发送短信5条"));
65 scenes.add(new Scene("短信",50,"通知朋友手机换号,发送短信50条"));
66 scenes.add(new Scene("上网",1*1024,"和女友微信视频聊天 使用流量1G"));
67 scenes.add(new Scene("上网",2*1024,"晚上手机在线看韩剧,不留神睡着啦! 使用流量 2G"));
68 }
69
70 /**
71 * 是否存在此卡用户
72
73 *
74 * @param number
75 * @param passWord
76 * @return
77 */
78 public boolean isExistCard(String number, String passWord) {
79 Set<String> numbers = cards.keySet();
80 Iterator<String> it = numbers.iterator();
81 while (it.hasNext()) {
82 String searchNum = it.next();
83 if (searchNum.equals(number)
84 && (cards.get(searchNum)).getPassWord().equals(passWord)) {
85 return true;
86 }
87 }
88 return false;
89 }
90
91 /**
92 * 查找指定卡号是否已注册
93 *
94 * @param searchNumber
95 * @return 未注册:false 已注册:true
96 */
97 public boolean isExistCard(String searchNumber) {
98 Set<String> numbers = cards.keySet();
99 for (String number : numbers) {
100 if (number.equals(searchNumber)) {
101 return true;
102 }
103 }
104 return false;
105 }
106
107 /**
108 * 创建卡号(以139开头 11位)
109 *
110 * @return 生成的随机手机卡号
111 */
112 public String createNumber() {
113 Random random = new Random();
114 boolean isExist = false; // 记录现有用户中是否存在此卡号用户 是:true 否:false
115 String number = "";
116 int temp = 0;
117 do {
118 isExist = false; // 标志位重置为false,用于控制外重循环,当生成了
119 // 生成的随机数是8位 不能小于10000000,否则重新生成
120 do {
121 temp = random.nextInt(100000000);
122 } while (temp < 10000000);
123 // 生成之前,前面加“139”
124 number = "139" + temp;
125 // 和现有用户的卡号比较,不能是重复
126 Set<String> cardNumbers = cards.keySet();
127 for (String cardNumber : cardNumbers) {
128 if (number.equals(cardNumber)) {
129 isExist = true;
130 break;
131 }
132 }
133 } while (isExist);
134 return number;
135 }
136
137 /**
138 * 生成指定个数的新卡号列表
139 *
140 * @param count
141 * 指定个数
142 * @return 卡号列表
143 */
144 public String[] getNewNumbers(int count) {
145
146 String[] numbers = new String[count];
147 for (int i = 0; i < count; i++) {
148 numbers[i] = createNumber();
149 }
150 return numbers;
151 }
152
153 /**
154 * 添加新卡
155 *
156 * @param card
157 * 新卡
158 */
159 public void addCard(MobileCard card) {
160 cards.put(card.getCardNumber(), card);
161 System.out.print("注册成功!");
162 card.showMeg();
163 }
164
165 /**
166 * 指定卡号办理退网
167 *
168 * @param card
169 */
170 public void delCard(String delNumber) {
171 if (isExistCard(delNumber)) {
172 cards.remove(delNumber);
173 System.out.println("卡号" + delNumber + "办理退网成功!");
174 } else {
175 System.out.println("对不起,该卡号未注册,不能办退退网!");
176 }
177 }
178
179 /**
180 * 查询指定卡套餐余量
181 *
182 * @param number
183 */
184 public void showRemainDetail(String searchNumber) {
185 MobileCard card; // 要查询的卡
186 int remainTalkTime;
187 int remainSmsCount;
188 int remainFlow;
189 StringBuffer meg = new StringBuffer();
190 card = cards.get(searchNumber);
191 meg.append("您的卡号是" + searchNumber + ",套餐内剩余:\n");
192 ServicePackage pack = card.getSerPackage();
193 if (pack instanceof TalkPackage) {
194 //向下转型为话唠套餐对象
195 TalkPackage cardPack = (TalkPackage) pack;
196 // 话唠套餐,查询套餐内剩余的通话时长和短信条数
197 remainTalkTime = cardPack.getTalkTime() > card
198 .getRealTalkTime() ? cardPack.getTalkTime()
199 - card.getRealTalkTime() : 0;
200 meg.append("通话时长:" + remainTalkTime + "分钟\n");
201 remainSmsCount = cardPack.getSmsCount() > card
202 .getRealSMSCount() ? cardPack.getSmsCount()
203 - card.getRealSMSCount() : 0;
204 meg.append("短信条数:" + remainSmsCount + "条");
205 } else if (pack instanceof NetPackage) {
206 //向下转型为网虫套餐对象
207 NetPackage cardPack = (NetPackage) pack;
208 // 网虫套餐:查询套餐内剩余的上网流量
209 remainFlow = cardPack.getFlow() > card.getRealFlow() ? cardPack
210 .getFlow() - card.getRealFlow() : 0;
211 meg.append("上网流量:" + Common.dataFormat(remainFlow * 1.0 / 1024)
212 + "GB");
213 } else if (pack instanceof SuperPackage) {
214 //向下转型为超人套餐对象
215 SuperPackage cardPack = (SuperPackage) pack;
216 // 超人套餐:查询套餐内剩余的通话时长、短信条数、上网流量
217 remainTalkTime = cardPack.getTalkTime() > card
218 .getRealTalkTime() ? cardPack.getTalkTime()
219 - card.getRealTalkTime() : 0;
220 meg.append("通话时长:" + remainTalkTime + "分钟\n");
221 remainSmsCount = cardPack.getSmsCount() > card
222 .getRealSMSCount() ? cardPack.getSmsCount()
223 - card.getRealSMSCount() : 0;
224 meg.append("短信条数:" + remainSmsCount + "条\n");
225 remainFlow = cardPack.getFlow() > card.getRealFlow() ? cardPack
226 .getFlow() - card.getRealFlow() : 0;
227 meg.append("上网流量:" + Common.dataFormat(remainFlow * 1.0 / 1024)
228 + "GB");
229 }
230 System.out.println(meg);
231 }
232
233 /**
234 * 查询指定卡当月消费详单
235 *
236 * @param searchNumber
237 */
238 public void showAmountDetail(String searchNumber) {
239 MobileCard card; // 要查询的卡
240 StringBuffer meg = new StringBuffer();
241 card = cards.get(searchNumber);
242 meg.append("您的卡号:" + card.getCardNumber() + ",当月账单:\n");
243 meg.append("套餐资费:" + card.getSerPackage().getPrice() + "元\n");
244 meg.append("合计:" + Common.dataFormat(card.getConsumAmount()) + "元\n");
245 meg.append("账户余额:" + Common.dataFormat(card.getMoney()) + "元");
246 // 显示本月消费详细信息
247 System.out.println(meg);
248 }
249
250
251 /**
252 * 指定卡号换套餐
253 *
254 * @param number
255 * @param packType
256 */
257 public void changingPack(String number, String packNum) {
258 MobileCard card; // 指定的手机卡
259 ServicePackage pack; // 要换的套餐
260 if (isExistCard(number)) {
261 card = cards.get(number);
262 // 获取要换的套餐对象
263 switch (packNum) {
264 case "1":
265 pack = new TalkPackage();
266 break;
267 case "2":
268 pack = new NetPackage();
269 break;
270 default:
271 pack = new SuperPackage();
272 break;
273 }
274 if (!(card.getSerPackage().getClass().getName().equals(pack.getClass().getName()))) {
275 // 该卡余额中减去当月套餐资费
276 if (card.getMoney() >= pack.getPrice()) {
277 card.setMoney(card.getMoney() - pack.getPrice());
278 // 换套餐
279 card.setSerPackage(pack);
280 // 当月实际使用数据清零
281 card.setRealTalkTime(0);
282 card.setRealFlow(0);
283 card.setRealSMSCount(0);
284 // 当月消费金额设置为新套餐月资费
285 card.setConsumAmount(pack.getPrice());
286 System.out.print("更换套餐成功!");
287 pack.showInfo();
288 } else {
289 System.out.println("对不起,您的余额不足以支付新套餐本月资费,请充值后再办理更换套餐业务!");
290 return;
291 }
292 } else {
293 System.out.println("对不起,您已经是该套餐用户,无需换套餐!");
294 }
295
296 } else {
297 System.out.println("对不起,该卡号未注册,不能换套餐!");
298 }
299 }
300
301 /**
302 * 为指定手机卡充值
303 *
304 * @param number
305 * 指定充值的卡号
306 * @param money
307 * 充值金额
308 */
309 public void chargeMoney(String number, double money) {
310 MobileCard card; // 指定的手机卡
311 if (money < 50) {
312 System.out.println("对不起,最低充值金额为50元!");
313 return;
314 }
315 card = cards.get(number);
316 card.setMoney(card.getMoney() + money);
317 System.out.println("充值成功,当前话费余额为" + Common.dataFormat(card.getMoney()) + "元。");
318 }
319
320 /**
321 * 添加一条指定卡的消费记录
322 *
323 * @param number
324 * 要添加消费记录的卡
325 * @param info
326 * 要添加的消费记录
327 */
328 public void addConsumInfo(String number, ConsumInfo info) {
329 Set<String> numbers = consumInfos.keySet();
330 Iterator<String> it = numbers.iterator();
331 List<ConsumInfo> infos = new ArrayList<ConsumInfo>();
332 boolean isExist = false; // 现有消费列表中是否存在此卡号消费记录,是:true 否:false
333 while (it.hasNext()) {
334 if (it.next().equals(number)) {
335 // 消费集合中已有该卡号消费记录,则找到该卡号的消费记录集合,添加一条即可
336 infos = consumInfos.get(number);
337 infos.add(info);
338 isExist = true;
339 System.out.println("已添加一条消费记录。");
340 break;
341 }
342 }
343 // 该集合中没有此卡号消费记录,则添加
344 if (!isExist) {
345 infos.add(info);
346 consumInfos.put(number, infos);
347 System.out.println("不存在此卡的消费记录,已添加一条消费记录。");
348 }
349 }
350
351 //打印消费记录
352 public void printConsumInfo(String number){
353 Writer fileWriter = null;
354 try {
355 fileWriter = new FileWriter(number+"消费记录.txt");
356 Set<String> numbers = consumInfos.keySet();
357 Iterator<String> it = numbers.iterator();
358 List<ConsumInfo> infos = new ArrayList<ConsumInfo>();//存储指定卡所有消费记录
359 boolean isExist = false; // 现有消费列表中是否存在此卡号消费记录,是:true 否:false
360 while (it.hasNext()) {
361 if (it.next().equals(number)) {
362 infos = consumInfos.get(number);
363 isExist = true;
364 break;
365 }
366 }
367 if(isExist){
368 //存在 此卡消费记录,写入文本文件
369 StringBuffer content = new StringBuffer("******"+number+"消费记录******\n");
370 content.append("序号\t类型\t数据(通话(条)/上网(MB)/短信(条))\n");
371 for(int i=0;i<infos.size();i++){
372 ConsumInfo info = infos.get(i);
373 content.append((i+1)+".\t"+info.getType()+"\t"+info.getConsumData()+"\n");
374 }
375 fileWriter.write(content.toString());
376 fileWriter.flush();
377
378 System.out.println("消费记录打印完毕!");
379 }else{
380 System.out.println("对不起,不存在此号码的消费记录,不能打印!");
381 }
382 } catch (IOException e) {
383 e.printStackTrace();
384 }finally{
385 if(fileWriter!=null){
386 try {
387 fileWriter.close();
388 } catch (IOException e) {
389 e.printStackTrace();
390 }
391 }
392 }
393 }
394
395 /**
396 * 使用嗖嗖
397 * @param number 当前卡号
398 * @throws Exception
399 */
400 public void userSoso(String number) {
401 MobileCard card = cards.get(number); // 获取此卡对象
402 ServicePackage pack = card.getSerPackage(); // 获取此卡所属套餐
403 Random random = new Random();
404 int ranNum = 0;
405 int temp = 0; //记录各场景中实际消费数据
406 do{
407
408 ranNum = random.nextInt(6);// 生成一个0~5之前的随机数
409 Scene scene = scenes.get(ranNum); //获取该序号所对应的场景
410 switch (ranNum) {
411 //序号为0或1为通话场景
412 case 0:
413 case 1:
414 // 判断该卡所属套餐是否支持通话功能
415 if (pack instanceof CallService) {
416 // 执行通话方法
417 System.out.println(scene.getDescription());
418 CallService callService = (CallService) pack;
419 try {
420 temp = callService.call(scene.getData(), card);
421 } catch (Exception e) {
422 e.printStackTrace();
423 }
424 // 添加一条消费记录
425 addConsumInfo(number, new ConsumInfo(number,
426 scene.getType(), temp));
427 break;
428 } else {
429 // 如果该卡套餐不支持通话功能,则重新生成随机数选择其他场景
430 continue;
431 }
432 //序号为2或3为发短信场景
433 case 2:
434 case 3:
435 // 判断该卡所属套餐是否支持短信功能
436 if (pack instanceof SendService) {
437 // 执行发短信方法
438 System.out.println(scene.getDescription());
439 SendService sendService = (SendService) pack;
440 try {
441 temp = sendService.sendMessage(scene.getData(), card);
442 } catch (Exception e) {
443 e.printStackTrace();
444 }
445 // 添加一条消费记录
446 addConsumInfo(number, new ConsumInfo(number,
447 scene.getType(), temp));
448 break;
449 } else {
450 // 如果该卡套餐不支持发短信功能,则重新生成随机数选择其他场景
451 continue;
452 }
453 //序号为4或5为发上网场景
454 case 4:
455 case 5:
456 // 判断该卡所属套餐是否支持上网功能
457 if (pack instanceof NetService) {
458 System.out.println(scene.getDescription());
459 NetService netService = (NetService) pack;
460 // 执行上网方法
461 try {
462 temp = netService.netPlay(scene.getData(), card);
463 } catch (Exception e) {
464 e.printStackTrace();
465 }
466 // 添加一条消费记录
467 addConsumInfo(number, new ConsumInfo(number,
468 scene.getType(), temp));
469 break;
470 } else {
471 // 如果该卡套餐不支持上网功能,则重新生成随机数选择其他场景
472 continue;
473 }
474 }
475 break;
476 }while(true);
477 }
478
479 /**
480 * 根据套餐序号返回套餐对象
481 *
482 * @param packNum
483 * 套餐序号
484 * @return 套餐对象
485 */
486 public ServicePackage createPack(int packId) {
487 ServicePackage pack = null;
488 switch (packId) {
489 case 1:
490 pack = new TalkPackage();
491 break;
492 case 2:
493 pack = new NetPackage();
494 break;
495 case 3:
496 pack = new SuperPackage();
497 break;
498 }
499 return pack;
500 }
501
502 /**
503 * 显示资费说明
504 */
505 public void showDescription(){
506 Reader rd = null;
507 try {
508 rd = new FileReader("套餐资费说明.txt");
509 char[] content = new char[1024];
510 int len = 0;
511 StringBuffer sb = new StringBuffer();
512 while((len=rd.read(content))!=-1){
513 sb.append(content,0,len); //拼接字符串
514 }
515 System.out.println(sb);
516 } catch (IOException e) {
517 // TODO Auto-generated catch block
518 e.printStackTrace();
519 }
520 }
521
522 }
小伙伴可以多多互动,一起多交流交流!!!O(∩_∩)O
喜欢前端、后端java开发的 可以到我的知乎主页(更多详细内容等你关注呦):https://www.zhihu.com/people/xing-chen-you-guang-pie-pie-pie,有详细视频、资料、教程,文档,值得拥有!!!希望可以一起努力,加油ヾ(◍°∇°◍)ノ゙!!!
B站有上传的更多项目视频,从Java基础到面向对象、Java高级API,以及SSM等框架的视频,地址:https://www.bilibili.com/video/BV15a411w7Jh