image.png

1、业务类

  1. import java.util.Scanner;
  2. import Lianxi.entityClass.MobileCard;
  3. import Lianxi.entityClass.ServicePackage;
  4. import Lianxi.utils.CardUtil;
  5. //业务类
  6. public class Soso {
  7. Scanner input = new Scanner(System.in);
  8. CardUtil utils = new CardUtil();
  9. public static void main(String[] args) {
  10. Soso soso = new Soso();
  11. soso.mainMenu();
  12. System.out.println("谢谢使用!");
  13. }
  14. /**
  15. * 主流程
  16. */
  17. public void mainMenu() {
  18. int menuChoose = 0;
  19. String mobileNumber= "";
  20. String password = "";
  21. utils.init();
  22. utils.initScenes();
  23. //Common.typesInit();
  24. do {
  25. System.out.println("\n*************欢迎使用嗖嗖移动业务大厅***************");
  26. System.out.println("1.用户登录 2.用户注册 3.使用嗖嗖 4.话费充值 5.资费说明 6.退出系统");
  27. System.out.print("请选择:");
  28. menuChoose = input.nextInt();
  29. // 分支语句:根据功能编号执行相应功能
  30. switch (menuChoose) {
  31. case 1:
  32. //用户登录
  33. System.out.print("请输入手机卡号:");
  34. mobileNumber = input.next();
  35. System.out.print("请输入密码:");
  36. password = input.next();
  37. if (utils.isExistCard(mobileNumber, password)) {
  38. cardMenu(mobileNumber);
  39. }else{
  40. System.out.println("对不起,您输入的信息有误,无法登录!");
  41. }
  42. continue;
  43. case 2:
  44. //用户注册
  45. registCard();
  46. continue;
  47. case 3:
  48. //使用嗖嗖
  49. System.out.print("请输入手机卡号:");
  50. mobileNumber = input.next();
  51. if (utils.isExistCard(mobileNumber)) {
  52. try {
  53. /* System.out.println("****使用之前****");
  54. utils.showRemainDetail(mobileNumber);
  55. utils.showAmountDetail(mobileNumber);*/
  56. utils.userSoso(mobileNumber);
  57. } catch (Exception e) {
  58. System.err.println(e.getMessage());
  59. }
  60. }else{
  61. System.out.println("对不起,该卡号未注册,不能使用!");
  62. }
  63. /*System.out.println("****使用之后****");
  64. utils.showRemainDetail(mobileNumber);
  65. utils.showAmountDetail(mobileNumber);*/
  66. continue;
  67. case 4:
  68. //话费充值
  69. System.out.print("请输入充值卡号:");
  70. mobileNumber = input.next();
  71. if (utils.isExistCard(mobileNumber)) {
  72. System.out.print("请输入充值金额:");
  73. double money = input.nextDouble();
  74. utils.chargeMoney(mobileNumber, money);
  75. }else{
  76. System.out.println("对不起,要充值的卡号未注册,无法充值!");
  77. }
  78. continue;
  79. case 5:
  80. System.out.println("\n*****资费说明******");
  81. utils.showDescription();
  82. continue;
  83. case 6:
  84. //退出系统
  85. break;
  86. default:
  87. //选择其他数字退出系统
  88. break;
  89. }
  90. break;
  91. } while (true);
  92. }
  93. /**
  94. * 手机卡功能菜单
  95. *
  96. * @param number
  97. * @return
  98. */
  99. public int cardMenu(String mobileNumber) {
  100. int menuChoose = 0;
  101. do {
  102. System.out.println("\n*****嗖嗖移动用户菜单*****");
  103. System.out.println("1.本月账单查询");
  104. System.out.println("2.套餐余量查询");
  105. System.out.println("3.打印消费详单");
  106. System.out.println("4.套餐变更");
  107. System.out.println("5.办理退网");
  108. System.out.print("请选择(输入1~5选择功能,其他键返回上一级):");
  109. menuChoose = input.nextInt();
  110. switch (menuChoose) {
  111. case 1:
  112. System.out.println("\n*****本月账单查询******");
  113. utils.showAmountDetail(mobileNumber);
  114. continue;
  115. case 2:
  116. System.out.println("\n*****套餐余量查询******");
  117. utils.showRemainDetail(mobileNumber);
  118. continue;
  119. case 3:
  120. System.out.println("\n*****消费详单查询******");
  121. utils.printConsumInfo(mobileNumber);
  122. continue;
  123. case 4:
  124. System.out.println("\n*****套餐变更******");
  125. System.out.print("1.话唠套餐 2.网虫套餐 3.超人套餐 请选择(序号):");
  126. utils.changingPack(mobileNumber, input.next());
  127. continue;
  128. case 5:
  129. System.out.println("\n*****办理退网******");
  130. utils.delCard(mobileNumber);
  131. System.out.println("谢谢使用!");
  132. System.exit(1); //办理退网后退出系统
  133. }
  134. break;
  135. } while (true);
  136. return menuChoose;
  137. }
  138. /**
  139. * 注册新卡流程
  140. */
  141. public void registCard(){
  142. String[] newNumbers = utils.getNewNumbers(9);
  143. //显示可供选择的手机号列表
  144. System.out.println("*****可选择的卡号*****");
  145. for(int i=0;i<9;i++){
  146. System.out.print((i+1)+"."+newNumbers[i]+"\t\t");
  147. if((i+1)%3==0){
  148. System.out.println();
  149. }
  150. }
  151. //选择手机号
  152. System.out.print("请选择卡号(输入1~9的序号):");
  153. String number = newNumbers[input.nextInt()-1];
  154. //选择套餐类型
  155. System.out.print("1.话唠套餐 2.网虫套餐 3.超人套餐, ");
  156. System.out.print("请选择套餐(输入序号):");
  157. //utils.getPackList();
  158. //获取套餐对象
  159. ServicePackage pack = utils.createPack(input.nextInt());
  160. //输入用户名
  161. System.out.print("请输入姓名:");
  162. String name = input.next();
  163. //输入密码
  164. System.out.print("请输入密码:");
  165. String password = input.next();
  166. //输入预存话费金额
  167. double money = 0;
  168. System.out.print("请输入预存话费金额:");
  169. money = input.nextDouble();
  170. while(money<pack.getPrice()){
  171. System.out.print("您预存的话费金额不足以支付本月固定套餐资费,请重新充值:");
  172. money = input.nextDouble();
  173. }
  174. //创建新卡对象并添加
  175. MobileCard newCard = new MobileCard(number,name,password,pack,pack.getPrice(),money-pack.getPrice());
  176. utils.addCard(newCard);
  177. }
  178. }

2、实体类

(1)、消费记录

  1. //消费记录
  2. public class ConsumInfo {
  3. private String cardNumber; //卡号
  4. private String type; //消费类型:通话、发短信、上网
  5. private int consumData; //消费数据 通话:分钟 发短信:条 上网:MB
  6. public ConsumInfo(){
  7. }
  8. public ConsumInfo(String cardNumber, String type, int consumData) {
  9. super();
  10. this.cardNumber = cardNumber;
  11. this.type = type;
  12. this.consumData = consumData;
  13. }
  14. public String getCardNumber() {
  15. return cardNumber;
  16. }
  17. public void setCardNumber(String cardNumber) {
  18. this.cardNumber = cardNumber;
  19. }
  20. public String getType() {
  21. return type;
  22. }
  23. public void setType(String type) {
  24. this.type = type;
  25. }
  26. public int getConsumData() {
  27. return consumData;
  28. }
  29. public void setConsumData(int consumData) {
  30. this.consumData = consumData;
  31. }
  32. }

(2)、嗖嗖移动卡

  1. //嗖嗖移动卡
  2. public class MobileCard {
  3. private String cardNumble;//卡号
  4. private String uesrName;//姓名
  5. private String passWord;//密码
  6. private ServicePackage setPackage;//选择的套餐
  7. private double consumAmount;//消费金额=套餐费+实际消费金额
  8. private double money;//当前余额=充值钱数-consumAmount(消费金额)
  9. private int realTalkTime;//通话时长
  10. private int realSMSCount;//短信条数
  11. private int realFlow;//流量
  12. public MobileCard(){
  13. }
  14. public MobileCard(String cardNumble, String uesrName, String passWord, ServicePackage setPackage,
  15. double consumAmount, double money) {
  16. super();
  17. this.cardNumble = cardNumble;
  18. this.uesrName = uesrName;
  19. this.passWord = passWord;
  20. this.setPackage = setPackage;
  21. this.consumAmount = consumAmount;
  22. this.money = money;
  23. this.realTalkTime = realTalkTime;
  24. this.realSMSCount = realSMSCount;
  25. this.realFlow = realFlow;
  26. }
  27. public String getCardNumble() {
  28. return cardNumble;
  29. }
  30. public void setCardNumble(String cardNumble) {
  31. this.cardNumble = cardNumble;
  32. }
  33. public String getUesrName() {
  34. return uesrName;
  35. }
  36. public void setUesrName(String uesrName) {
  37. this.uesrName = uesrName;
  38. }
  39. public String getPassWord() {
  40. return passWord;
  41. }
  42. public void setPassWord(String passWord) {
  43. this.passWord = passWord;
  44. }
  45. public ServicePackage getSetPackage() {
  46. return setPackage;
  47. }
  48. public void setSetPackage(ServicePackage setPackage) {
  49. this.setPackage = setPackage;
  50. }
  51. public double getConsumAmount() {
  52. return consumAmount;
  53. }
  54. public void setConsumAmount(double consumAmount) {
  55. this.consumAmount = consumAmount;
  56. }
  57. public double getMoney() {
  58. return money;
  59. }
  60. public void setMoney(double money) {
  61. this.money = money;
  62. }
  63. public int getRealTalkTime() {
  64. return realTalkTime;
  65. }
  66. public void setRealTalkTime(int realTalkTime) {
  67. this.realTalkTime = realTalkTime;
  68. }
  69. public int getRealSMSCount() {
  70. return realSMSCount;
  71. }
  72. public void setRealSMSCount(int realSMSCount) {
  73. this.realSMSCount = realSMSCount;
  74. }
  75. public int getRealFlow() {
  76. return realFlow;
  77. }
  78. public void setRealFlow(int realFlow) {
  79. this.realFlow = realFlow;
  80. }
  81. public void showMeg(){
  82. System.err.println("卡号:"+this.cardNumble+",用户名:"+
  83. this.uesrName+",当前余额:"+this.money+
  84. "元");
  85. }
  86. }

(3)、网虫套餐

  1. import Lianxi.GongG.Common;
  2. import Lianxi.service.NetService;
  3. //网虫套餐
  4. public class NetPackage extends ServicePackage implements NetService {
  5. private int flow;//上网流量(MB)
  6. public NetPackage(){
  7. //套餐数据初始化
  8. this.flow = 1024 * 3;
  9. this.price = 68.0;
  10. }
  11. public NetPackage(int flow) {
  12. super();
  13. this.flow = flow;
  14. }
  15. public int getFlow() {
  16. return flow;
  17. }
  18. public void setFlow(int flow) {
  19. this.flow = flow;
  20. }
  21. @Override
  22. public int netPlay(int folw, MobileCard card) {
  23. // TODO Auto-generated method stub
  24. return 0;
  25. }
  26. @Override
  27. public void showInfo() {
  28. System.out.println("网虫套餐:上网流量是"+flow/1024+
  29. "GB/月,月资费是:"+this.getPrice()+"元/月。");
  30. }
  31. //上网服务2
  32. public void netPlay2(int flow, MobileCard card)throws Exception {
  33. // int reminFlow = this.flow - card.getRealFlow(); //卡中可支付的免费流量
  34. // // 判断套餐中的上网流量是否足够支付本次上网服务
  35. // if (this.flow <= reminFlow) {
  36. // // 套餐中上网流量足够:修改该卡实际上网流量数据
  37. // card.setRealFlow(card.getRealFlow() + flow);
  38. // }else {
  39. // // 套餐中上网流量不够:额外消费需按0.1元/条付费,额外消费金额=0.1*(该卡实际消费上网流量+本次消费上网流量-套餐包含的上网流量)
  40. // double consumeMoney = 0.1 * (flow-reminFlow);
  41. // // 该卡账户余额足够支付:修改该卡实际使用的上网流量、账户余额、当月消费金额
  42. // if (card.getMoney() >= consumeMoney) {
  43. // //消耗的流量增加
  44. // card.setRealFlow(card.getRealFlow() + flow);
  45. // // 当前账户余额=当前账户余额-额外消费金额
  46. // card.setMoney(card.getMoney() - consumeMoney);
  47. // // 当月消费金额=当月消费金额+额外消费金额
  48. // card.setConsumAmount(card.getConsumAmount() + consumeMoney);
  49. // }else {
  50. // int temp = (int)(card.getMoney()/0.1); //当前余额够大
  51. // System.out.println("您的余额不足,请充值后再使用!");
  52. // }
  53. // }
  54. // return reminFlow;
  55. }
  56. //上网服务
  57. public int netPlay1(int flow, MobileCard card) throws Exception {
  58. for(int i=0;i<flow;i++){
  59. if(this.flow-card.getRealFlow()>=1){
  60. //第一种情况:套餐剩余流量可以支持使用1M流量
  61. card.setRealFlow(card.getRealFlow()+1); //实际使用流量加1MB
  62. }else if(card.getMoney()>=0.1){
  63. //第二种情况:套餐流量已用完,账户余额可以支付1M流量,使用账户余额支付
  64. card.setRealFlow(card.getRealFlow()+1); //实际使用流量加1MB
  65. card.setMoney(Common.sub(card.getMoney(),0.1)); //账户余额消费0.1元(1M流量费用)
  66. card.setConsumAmount(card.getConsumAmount() + 0.1);
  67. }else{
  68. flow=i;
  69. System.out.println("本次已使用流量"+i+"MB,您的余额不足,请充值后再使用!");
  70. }
  71. }
  72. return flow;
  73. }
  74. }

(4)、使用场景

  1. //场景
  2. public class Scene {
  3. private String type; //场景消费类型
  4. private int data; //消费数据
  5. private String description;//场景描述
  6. public Scene(){}
  7. public Scene(String type,int data,String description){
  8. this.type = type;
  9. this.data = data;
  10. this.description = description;
  11. }
  12. public String getType() {
  13. return type;
  14. }
  15. public void setType(String type) {
  16. this.type = type;
  17. }
  18. public int getData() {
  19. return data;
  20. }
  21. public void setData(int data) {
  22. this.data = data;
  23. }
  24. public String getDescription() {
  25. return description;
  26. }
  27. public void setDescription(String description) {
  28. this.description = description;
  29. }
  30. }

(5)、品牌套餐——————父类)

  1. //品牌套餐-----父类
  2. public abstract class ServicePackage {
  3. //嘟嘟卡移动套餐
  4. protected double price;
  5. public double getPrice() {
  6. return price;
  7. }
  8. public void setPrice(double price) {
  9. this.price = price;
  10. }
  11. public abstract void showInfo();
  12. }

(6)、超人套餐

  1. import Lianxi.GongG.Common;
  2. import Lianxi.service.CallService;
  3. import Lianxi.service.NetService;
  4. import Lianxi.service.SendService;
  5. //超人套餐
  6. public class SuperPackage extends ServicePackage implements CallService,SendService,NetService {
  7. private int talkTime; //通话时长(分钟)
  8. private int smsCount; //短信条数(条)
  9. private int flow; //上网流量(MB)
  10. public SuperPackage(){
  11. //套餐数据初始化
  12. this.talkTime = 200;
  13. this.smsCount = 50;
  14. this.flow = 1*1024;
  15. this.price = 78.0;
  16. }
  17. public SuperPackage(int talkTime, int smsCount, int flow) {
  18. super();
  19. this.talkTime = talkTime;
  20. this.smsCount = smsCount;
  21. this.flow = flow;
  22. }
  23. public int getTalkTime() {
  24. return talkTime;
  25. }
  26. public void setTalkTime(int talkTime) {
  27. this.talkTime = talkTime;
  28. }
  29. public int getSmsCount() {
  30. return smsCount;
  31. }
  32. public void setSmsCount(int smsCount) {
  33. this.smsCount = smsCount;
  34. }
  35. public int getFlow() {
  36. return flow;
  37. }
  38. public void setFlow(int flow) {
  39. this.flow = flow;
  40. }
  41. @Override
  42. public void showInfo() {
  43. System.out.println("超人套餐:通话时长为"+this.talkTime+"分钟/月,短信条数为"+this.smsCount+"条/月,上网流量为"+this.flow/1024+"GB/月。");
  44. }
  45. @Override
  46. public int netPlay(int folw, MobileCard card) {
  47. for(int i=0;i<flow;i++){
  48. if(this.flow-card.getRealFlow()>=1){
  49. //第一种情况:套餐剩余流量可以支持使用1M流量
  50. card.setRealFlow(card.getRealFlow()+1); //实际使用流量加1MB
  51. }else if(card.getMoney()>=0.1){
  52. //第二种情况:套餐流量已用完,账户余额可以支付1M流量,使用账户余额支付
  53. card.setRealFlow(card.getRealFlow()+1); //实际使用流量加1MB
  54. card.setMoney(Common.sub(card.getMoney(),0.1)); //账户余额消费0.1元(1M流量费用)
  55. card.setConsumAmount(card.getConsumAmount() + 0.1);
  56. } else{
  57. folw=i;
  58. System.out.println("本次已使用流量"+i+"MB,您的余额不足,请充值后再使用!");
  59. }
  60. }
  61. return folw;
  62. }
  63. @Override
  64. public int send(int count, MobileCard card) {
  65. for(int i=0;i<smsCount;i++){
  66. if(this.smsCount-card.getRealSMSCount()>=1){
  67. //第一种情况:套餐剩余短信条数可以付1条短信
  68. card.setRealSMSCount(card.getRealSMSCount()+1); //实际使用短信条数加1
  69. }else if(card.getMoney()>=0.1){
  70. //第二种情况:套餐短信条数已用完,账户余额可以支付1条短信,使用账户余额支付
  71. card.setRealSMSCount(card.getRealSMSCount()+1);
  72. card.setMoney(Common.sub(card.getMoney(),0.1)); //账户余额消费0.1元(1条短信费用)
  73. card.setConsumAmount(card.getConsumAmount() + 0.1);
  74. }else{
  75. count=i;
  76. System.out.println("本次已发送短信"+i+"条,您的余额不足,请充值后再使用!");
  77. }
  78. }
  79. return count;
  80. }
  81. @Override
  82. public int call(int minCount, MobileCard card) throws Exception {
  83. for(int i=0;i<minCount;i++){
  84. if(this.talkTime-card.getRealTalkTime()>=1){
  85. //第一种情况:套餐剩余通话时长可以付1分钟通话
  86. card.setRealTalkTime(card.getRealTalkTime()+1); //实际通话数据加1
  87. }else if(card.getMoney()>=0.2){
  88. //第二种情况:套餐通话时长已用完,账户余额可以支付1分钟通话,使用账户余额支付
  89. card.setRealTalkTime(card.getRealTalkTime()+1); //实际使用通话时长1分钟
  90. card.setMoney(Common.sub(card.getMoney(),0.2)); //账户余额消费0.2元(1分钟额外通话)
  91. card.setConsumAmount(card.getConsumAmount() + 0.2);
  92. }else{
  93. minCount=i;//记录实现通话分钟数
  94. System.out.println("本次已通话"+i+"分钟,您的余额不足,请充值后再使用!");
  95. }
  96. }
  97. return minCount;
  98. }
  99. }

(7)、话唠套餐

  1. import Lianxi.service.CallService;
  2. import Lianxi.service.SendService;
  3. //话唠套餐
  4. public class TalkPackage extends ServicePackage implements CallService,SendService {
  5. private int talkTime;// 通话时长(分钟)
  6. private int smsCount;// 短信条数(条)
  7. public TalkPackage(){
  8. //套餐数据初始化
  9. this.talkTime = 500;
  10. this.smsCount = 30;
  11. this.price = 58.0;
  12. }
  13. public TalkPackage(int talkTime, int smsCount) {
  14. super();
  15. this.talkTime = talkTime;
  16. this.smsCount = smsCount;
  17. }
  18. public int getTalkTime() {
  19. return talkTime;
  20. }
  21. public void setTalkTime(int talkTime) {
  22. this.talkTime = talkTime;
  23. }
  24. public int getSmsCount() {
  25. return smsCount;
  26. }
  27. public void setSmsCount(int smsCount) {
  28. this.smsCount = smsCount;
  29. }
  30. //显示套餐详情
  31. public void showInfo(){
  32. System.out.println("话唠套餐:通话时长为" + this.talkTime + "分钟/月,短信条数为"
  33. + this.smsCount + "条/月,资费为" + this.price + "元/月。");
  34. }
  35. @Override
  36. public int call(int minCount, MobileCard card) throws Exception {
  37. for (int i = 0; i < minCount; i++) {
  38. if(this.talkTime-card.getRealTalkTime()>=1){
  39. //第一种情况:套餐剩余通话时长可以付1分钟通话
  40. int thTime=card.getRealTalkTime()+1;
  41. card.setRealTalkTime(thTime);
  42. }else if(card.getMoney()>=0.2){
  43. //第二种情况:套餐通话时长已用完,账户余额可以支付1分钟通话,使用账户余额支付
  44. card.setRealTalkTime(card.getRealTalkTime()+1); //实际使用通话时长1分钟
  45. //账户余额增加0.2元,消费金额也增加0。2
  46. double money1=card.getMoney()-0.2;
  47. card.setMoney(money1);
  48. double amount=card.getConsumAmount()+0.2;
  49. card.setConsumAmount(amount);
  50. }else{
  51. minCount=i; //记录实现通话分钟数
  52. System.out.println("本次通话"+i+"分钟,您的余额不足,请充值后再使用");
  53. }
  54. }
  55. return minCount;
  56. }
  57. @Override
  58. public int send(int count, MobileCard card) {
  59. for (int i = 0; i < count; i++) {
  60. if(this.smsCount-card.getRealSMSCount()>=1){
  61. int sc=card.getRealSMSCount()+1;
  62. card.setRealSMSCount(sc);
  63. }else if(card.getMoney()>=0.1){
  64. int sc=card.getRealSMSCount()+1;
  65. card.setRealSMSCount(sc);
  66. double money1=card.getMoney()-0.1;
  67. card.setMoney(money1);
  68. double amount=card.getConsumAmount()+0.1;;
  69. card.setConsumAmount(amount);
  70. }else{
  71. count=i; //记录实现通话分钟数
  72. System.out.println("本次发短信"+i+"分钟,您的余额不足,请充值后再使用");
  73. }
  74. }
  75. return count;
  76. }
  77. }

3、公共类

  1. import java.text.DecimalFormat;
  2. public class Common {
  3. /**
  4. * double类型格式化
  5. * @param data
  6. * @return
  7. */
  8. public static String dataFormat(double data) {
  9. DecimalFormat formatData = new DecimalFormat("#.0");
  10. return formatData.format(data);
  11. }
  12. /**
  13. * double类型两数相减
  14. * @param num1
  15. * @param num2
  16. * @return
  17. */
  18. public static double sub(double num1,double num2){
  19. return (num1*10-num2*10)/10;
  20. }
  21. }
  1. //消费类型
  2. public enum ConsumType {
  3. TALK,SMS,NETWORK
  4. }

4、服务接口

  1. import Lianxi.entityClass.MobileCard;
  2. //通话服务接口
  3. public interface CallService {
  4. //打电话
  5. public int call(int minCount,MobileCard card) throws Exception;
  6. }
  1. import Lianxi.entityClass.MobileCard;
  2. public interface NetService {
  3. //上网服务
  4. //上网
  5. public int netPlay(int folw,MobileCard card);
  6. }
  1. import Lianxi.entityClass.MobileCard;
  2. public interface SendService {
  3. //短信服务接口
  4. //发短信
  5. public int send(int count,MobileCard card);
  6. }

5、utils运行起来

  1. import java.io.FileReader;
  2. import java.io.FileWriter;
  3. import java.io.IOException;
  4. import java.io.Reader;
  5. import java.io.Writer;
  6. import java.util.ArrayList;
  7. import java.util.HashMap;
  8. import java.util.Iterator;
  9. import java.util.List;
  10. import java.util.Map;
  11. import java.util.Random;
  12. import java.util.Set;
  13. import Lianxi.GongG.Common;
  14. import Lianxi.entityClass.ConsumInfo;
  15. import Lianxi.entityClass.MobileCard;
  16. import Lianxi.entityClass.NetPackage;
  17. import Lianxi.entityClass.Scene;
  18. import Lianxi.entityClass.ServicePackage;
  19. import Lianxi.entityClass.SuperPackage;
  20. import Lianxi.entityClass.TalkPackage;
  21. import Lianxi.service.CallService;
  22. import Lianxi.service.NetService;
  23. import Lianxi.service.SendService;
  24. public class CardUtil {
  25. Map<String, MobileCard> cards = new HashMap<String, MobileCard>(); // 所有手机卡的列表
  26. Map<String, List<ConsumInfo>> consumInfos = new HashMap<String, List<ConsumInfo>>(); // 所有手机卡消费记录的列表
  27. List<Scene> scenes = new ArrayList<Scene>();
  28. // 初始化用户
  29. public void init() {
  30. MobileCard card1 = new MobileCard("何玲玲", "123", "13965756432",
  31. new TalkPackage(), 58.0, 42.0);
  32. MobileCard card2 = new MobileCard("黄露露", "123", "13956712467",
  33. new NetPackage(), 68.0, 32.0);
  34. MobileCard card3 = new MobileCard("朱蓉蓉", "123", "13911568956",
  35. new SuperPackage(), 78.0, 22.0);
  36. MobileCard card4 = new MobileCard("桃跑跑", "123", "13924221868",
  37. new TalkPackage(), 78.0, 2.0);
  38. card4.setConsumAmount(98.0);
  39. card4.setRealTalkTime(500);
  40. card4.setRealSMSCount(100);
  41. cards.put("13965756432", card1);
  42. cards.put("13956712467", card2);
  43. cards.put("13911568956", card3);
  44. cards.put("13924221868", card4);
  45. }
  46. /**
  47. * 使用场景初始化
  48. */
  49. public void initScenes(){
  50. scenes.add(new Scene("通话",90,"问候客户,谁知其如此难缠 通话90分钟"));
  51. scenes.add(new Scene("通话",30,"询问妈妈身体状况 本地通话30分钟"));
  52. scenes.add(new Scene("短信",5,"参与环境保护实施方案问卷调查 发送短信5条"));
  53. scenes.add(new Scene("短信",50,"通知朋友手机换号,发送短信50条"));
  54. scenes.add(new Scene("上网",1*1024,"和女友微信视频聊天 使用流量1G"));
  55. scenes.add(new Scene("上网",2*1024,"晚上手机在线看韩剧,不留神睡着啦! 使用流量 2G"));
  56. }
  57. /**
  58. * 是否存在此卡用户
  59. *
  60. * @param number
  61. * @param passWord
  62. * @return
  63. */
  64. public boolean isExistCard(String number, String passWord) {
  65. Set<String> numbers = cards.keySet();
  66. Iterator<String> it = numbers.iterator();
  67. while (it.hasNext()) {
  68. String searchNum = it.next();
  69. if (searchNum.equals(number)
  70. && (cards.get(searchNum)).getPassWord().equals(passWord)) {
  71. return true;
  72. }
  73. }
  74. return false;
  75. }
  76. /**
  77. * 查找指定卡号是否已注册
  78. *
  79. * @param searchNumber
  80. * @return 未注册:false 已注册:true
  81. */
  82. public boolean isExistCard(String searchNumber) {
  83. Set<String> numbers = cards.keySet();
  84. for (String number : numbers) {
  85. if (number.equals(searchNumber)) {
  86. return true;
  87. }
  88. }
  89. return false;
  90. }
  91. /**
  92. * 创建卡号(以139开头 11位)
  93. *
  94. * @return 生成的随机手机卡号
  95. */
  96. public String createNumber() {
  97. Random random = new Random();
  98. boolean isExist = false; // 记录现有用户中是否存在此卡号用户 是:true 否:false
  99. String number = "";
  100. int temp = 0;
  101. do {
  102. isExist = false; // 标志位重置为false,用于控制外重循环,当生成了
  103. // 生成的随机数是8位 不能小于10000000,否则重新生成
  104. do {
  105. temp = random.nextInt(100000000);
  106. } while (temp < 10000000);
  107. // 生成之前,前面加“139”
  108. number = "139" + temp;
  109. // 和现有用户的卡号比较,不能是重复
  110. Set<String> cardNumbers = cards.keySet();
  111. for (String cardNumber : cardNumbers) {
  112. if (number.equals(cardNumber)) {
  113. isExist = true;
  114. break;
  115. }
  116. }
  117. } while (isExist);
  118. return number;
  119. }
  120. /**
  121. * 生成指定个数的新卡号列表
  122. *
  123. * @param count
  124. * 指定个数
  125. * @return 卡号列表
  126. */
  127. public String[] getNewNumbers(int count) {
  128. String[] numbers = new String[count];
  129. for (int i = 0; i < count; i++) {
  130. numbers[i] = createNumber();
  131. }
  132. return numbers;
  133. }
  134. /**
  135. * 添加新卡
  136. *
  137. * @param card
  138. * 新卡
  139. */
  140. public void addCard(MobileCard card) {
  141. cards.put(card.getCardNumble(), card);
  142. System.out.print("注册成功!");
  143. card.showMeg();
  144. }
  145. /**
  146. * 指定卡号办理退网
  147. *
  148. * @param card
  149. */
  150. public void delCard(String delNumber) {
  151. if (isExistCard(delNumber)) {
  152. cards.remove(delNumber);
  153. System.out.println("卡号" + delNumber + "办理退网成功!");
  154. } else {
  155. System.out.println("对不起,该卡号未注册,不能办退退网!");
  156. }
  157. }
  158. /**
  159. * 查询指定卡套餐余量
  160. *
  161. * @param number
  162. */
  163. public void showRemainDetail(String searchNumber) {
  164. MobileCard card; // 要查询的卡
  165. int remainTalkTime;
  166. int remainSmsCount;
  167. int remainFlow;
  168. StringBuffer meg = new StringBuffer();
  169. card = cards.get(searchNumber);
  170. meg.append("您的卡号是" + searchNumber + ",套餐内剩余:\n");
  171. ServicePackage pack = card.getSetPackage();
  172. if (pack instanceof TalkPackage) {
  173. //向下转型为话唠套餐对象
  174. TalkPackage cardPack = (TalkPackage) pack;
  175. // 话唠套餐,查询套餐内剩余的通话时长和短信条数
  176. remainTalkTime = cardPack.getTalkTime() > card
  177. .getRealTalkTime() ? cardPack.getTalkTime()
  178. - card.getRealTalkTime() : 0;
  179. meg.append("通话时长:" + remainTalkTime + "分钟\n");
  180. remainSmsCount = cardPack.getSmsCount() > card
  181. .getRealSMSCount() ? cardPack.getSmsCount()
  182. - card.getRealSMSCount() : 0;
  183. meg.append("短信条数:" + remainSmsCount + "条");
  184. } else if (pack instanceof NetPackage) {
  185. //向下转型为网虫套餐对象
  186. NetPackage cardPack = (NetPackage) pack;
  187. // 网虫套餐:查询套餐内剩余的上网流量
  188. remainFlow = cardPack.getFlow() > card.getRealFlow() ? cardPack
  189. .getFlow() - card.getRealFlow() : 0;
  190. meg.append("上网流量:" + Common.dataFormat(remainFlow * 1.0 / 1024)
  191. + "GB");
  192. } else if (pack instanceof SuperPackage) {
  193. //向下转型为超人套餐对象
  194. SuperPackage cardPack = (SuperPackage) 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 + "条\n");
  204. remainFlow = cardPack.getFlow() > card.getRealFlow() ? cardPack
  205. .getFlow() - card.getRealFlow() : 0;
  206. meg.append("上网流量:" + Common.dataFormat(remainFlow * 1.0 / 1024)
  207. + "GB");
  208. }
  209. System.out.println(meg);
  210. }
  211. /**
  212. * 查询指定卡当月消费详单
  213. *
  214. * @param searchNumber
  215. */
  216. public void showAmountDetail(String searchNumber) {
  217. MobileCard card; // 要查询的卡
  218. StringBuffer meg = new StringBuffer();
  219. card = cards.get(searchNumber);
  220. meg.append("您的卡号:" + card.getCardNumble() + ",当月账单:\n");
  221. meg.append("套餐资费:" + card.getSetPackage().getPrice() + "元\n");
  222. meg.append("合计:" + Common.dataFormat(card.getConsumAmount()) + "元\n");
  223. meg.append("账户余额:" + Common.dataFormat(card.getMoney()) + "元");
  224. // 显示本月消费详细信息
  225. System.out.println(meg);
  226. }
  227. /**
  228. * 指定卡号换套餐
  229. *
  230. * @param number
  231. * @param packType
  232. */
  233. public void changingPack(String number, String packNum) {
  234. MobileCard card; // 指定的手机卡
  235. ServicePackage pack; // 要换的套餐
  236. if (isExistCard(number)) {
  237. card = cards.get(number);
  238. // 获取要换的套餐对象
  239. switch (packNum) {
  240. case "1":
  241. pack = new TalkPackage();
  242. break;
  243. case "2":
  244. pack = new NetPackage();
  245. break;
  246. default:
  247. pack = new SuperPackage();
  248. break;
  249. }
  250. if (!(card.getSetPackage().getClass().getName().equals(pack.getClass().getName()))) {
  251. // 该卡余额中减去当月套餐资费
  252. if (card.getMoney() >= pack.getPrice()) {
  253. card.setMoney(card.getMoney() - pack.getPrice());
  254. // 换套餐
  255. card.setSetPackage(pack);
  256. // 当月实际使用数据清零
  257. card.setRealTalkTime(0);
  258. card.setRealFlow(0);
  259. card.setRealSMSCount(0);
  260. // 当月消费金额设置为新套餐月资费
  261. card.setConsumAmount(pack.getPrice());
  262. System.out.print("更换套餐成功!");
  263. pack.showInfo();
  264. } else {
  265. System.out.println("对不起,您的余额不足以支付新套餐本月资费,请充值后再办理更换套餐业务!");
  266. return;
  267. }
  268. } else {
  269. System.out.println("对不起,您已经是该套餐用户,无需换套餐!");
  270. }
  271. } else {
  272. System.out.println("对不起,该卡号未注册,不能换套餐!");
  273. }
  274. }
  275. /**
  276. * 为指定手机卡充值
  277. *
  278. * @param number
  279. * 指定充值的卡号
  280. * @param money
  281. * 充值金额
  282. */
  283. public void chargeMoney(String number, double money) {
  284. MobileCard card; // 指定的手机卡
  285. if (money < 50) {
  286. System.out.println("对不起,最低充值金额为50元!");
  287. return;
  288. }
  289. card = cards.get(number);
  290. card.setMoney(card.getMoney() + money);
  291. System.out.println("充值成功,当前话费余额为" + Common.dataFormat(card.getMoney()) + "元。");
  292. }
  293. /**
  294. * 添加一条指定卡的消费记录
  295. *
  296. * @param number
  297. * 要添加消费记录的卡
  298. * @param info
  299. * 要添加的消费记录
  300. */
  301. public void addConsumInfo(String number, ConsumInfo info) {
  302. Set<String> numbers = consumInfos.keySet();
  303. Iterator<String> it = numbers.iterator();
  304. List<ConsumInfo> infos = new ArrayList<ConsumInfo>();
  305. boolean isExist = false; // 现有消费列表中是否存在此卡号消费记录,是:true 否:false
  306. while (it.hasNext()) {
  307. if (it.next().equals(number)) {
  308. // 消费集合中已有该卡号消费记录,则找到该卡号的消费记录集合,添加一条即可
  309. infos = consumInfos.get(number);
  310. infos.add(info);
  311. isExist = true;
  312. System.out.println("已添加一条消费记录。");
  313. break;
  314. }
  315. }
  316. // 该集合中没有此卡号消费记录,则添加
  317. if (!isExist) {
  318. infos.add(info);
  319. consumInfos.put(number, infos);
  320. System.out.println("不存在此卡的消费记录,已添加一条消费记录。");
  321. }
  322. }
  323. //打印消费记录
  324. public void printConsumInfo(String number){
  325. Writer fileWriter = null;
  326. try {
  327. fileWriter = new FileWriter(number+"消费记录.txt");
  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. infos = consumInfos.get(number);
  335. isExist = true;
  336. break;
  337. }
  338. }
  339. if(isExist){
  340. //存在 此卡消费记录,写入文本文件
  341. StringBuffer content = new StringBuffer("******"+number+"消费记录******\n");
  342. content.append("序号\t类型\t数据(通话(条)/上网(MB)/短信(条))\n");
  343. for(int i=0;i<infos.size();i++){
  344. ConsumInfo info = infos.get(i);
  345. content.append((i+1)+".\t"+info.getType()+"\t"+info.getConsumData()+"\n");
  346. }
  347. fileWriter.write(content.toString());
  348. fileWriter.flush();
  349. System.out.println("消费记录打印完毕!");
  350. }else{
  351. System.out.println("对不起,不存在此号码的消费记录,不能打印!");
  352. }
  353. } catch (IOException e) {
  354. e.printStackTrace();
  355. }finally{
  356. if(fileWriter!=null){
  357. try {
  358. fileWriter.close();
  359. } catch (IOException e) {
  360. e.printStackTrace();
  361. }
  362. }
  363. }
  364. }
  365. /**
  366. * 使用嗖嗖
  367. * @param number 当前卡号
  368. * @throws Exception
  369. */
  370. public void userSoso(String number) {
  371. MobileCard card = cards.get(number); // 获取此卡对象
  372. ServicePackage pack = card.getSetPackage(); // 获取此卡所属套餐
  373. Random random = new Random();
  374. int ranNum = 0;
  375. int temp = 0; //记录各场景中实际消费数据
  376. do{
  377. ranNum = random.nextInt(6);// 生成一个0~5之前的随机数
  378. Scene scene = scenes.get(ranNum); //获取该序号所对应的场景
  379. switch (ranNum) {
  380. //序号为0或1为通话场景
  381. case 0:
  382. case 1:
  383. // 判断该卡所属套餐是否支持通话功能
  384. if (pack instanceof CallService) {
  385. // 执行通话方法
  386. System.out.println(scene.getDescription());
  387. CallService callService = (CallService) pack;
  388. try {
  389. temp = callService.call(scene.getData(), card);
  390. } catch (Exception e) {
  391. e.printStackTrace();
  392. }
  393. // 添加一条消费记录
  394. addConsumInfo(number, new ConsumInfo(number,
  395. scene.getType(), temp));
  396. break;
  397. } else {
  398. // 如果该卡套餐不支持通话功能,则重新生成随机数选择其他场景
  399. continue;
  400. }
  401. //序号为2或3为发短信场景
  402. case 2:
  403. case 3:
  404. // 判断该卡所属套餐是否支持短信功能
  405. if (pack instanceof SendService) {
  406. // 执行发短信方法
  407. System.out.println(scene.getDescription());
  408. SendService sendService = (SendService) pack;
  409. try {
  410. temp = sendService.send(scene.getData(), card);
  411. } catch (Exception e) {
  412. e.printStackTrace();
  413. }
  414. // 添加一条消费记录
  415. addConsumInfo(number, new ConsumInfo(number,
  416. scene.getType(), temp));
  417. break;
  418. } else {
  419. // 如果该卡套餐不支持发短信功能,则重新生成随机数选择其他场景
  420. continue;
  421. }
  422. //序号为4或5为发上网场景
  423. case 4:
  424. case 5:
  425. // 判断该卡所属套餐是否支持上网功能
  426. if (pack instanceof NetService) {
  427. System.out.println(scene.getDescription());
  428. NetService netService = (NetService) pack;
  429. // 执行上网方法
  430. try {
  431. temp = netService.netPlay(scene.getData(), card);
  432. } catch (Exception e) {
  433. e.printStackTrace();
  434. }
  435. // 添加一条消费记录
  436. addConsumInfo(number, new ConsumInfo(number,
  437. scene.getType(), temp));
  438. break;
  439. } else {
  440. // 如果该卡套餐不支持上网功能,则重新生成随机数选择其他场景
  441. continue;
  442. }
  443. }
  444. break;
  445. }while(true);
  446. }
  447. /**
  448. * 根据套餐序号返回套餐对象
  449. *
  450. * @param packNum
  451. * 套餐序号
  452. * @return 套餐对象
  453. */
  454. public ServicePackage createPack(int packId) {
  455. ServicePackage pack = null;
  456. switch (packId) {
  457. case 1:
  458. pack = new TalkPackage();
  459. break;
  460. case 2:
  461. pack = new NetPackage();
  462. break;
  463. case 3:
  464. pack = new SuperPackage();
  465. break;
  466. }
  467. return pack;
  468. }
  469. /**
  470. * 显示资费说明
  471. */
  472. public void showDescription(){
  473. Reader rd = null;
  474. try {
  475. rd = new FileReader("套餐资费说明.txt");
  476. char[] content = new char[1024];
  477. int len = 0;
  478. StringBuffer sb = new StringBuffer();
  479. while((len=rd.read(content))!=-1){
  480. sb.append(content,0,len); //拼接字符串
  481. }
  482. System.out.println(sb);
  483. } catch (IOException e) {
  484. // TODO Auto-generated catch block
  485. e.printStackTrace();
  486. }
  487. }
  488. }