简易收银台

  1 package www.hhy;
  2 
  3 import java.util.Scanner;
  4 import java.util.HashMap;
  5 import java.util.Map;
  6 import java.io.*;
  7 import java.time.LocalDate;
  8 
  9 
 10 /**
 11 * @Author: HeHaoYuan
 12 * @Date: 2019/7/25
 13 * @Description:
 14 商品类
 15 
 16 */
 17 class Goods {
 18     private String id;
 19     private String name;
 20     private double price;
 21 
 22     public Goods(String id, String name, double price) {
 23         this.id = id;
 24         this.name = name;
 25         this.price = price;
 26     }
 27 
 28     public String getId() {
 29         return id;
 30     }
 31 
 32     public String getName() {
 33         return name;
 34     }
 35 
 36     public double getPrice() {
 37         return price;
 38     }
 39 
 40     @Override
 41     public String toString() {
 42         return String.format("[%2s] %s %.2f",this.getId(),this.getName(),this.getPrice());
 43     }
 44 }
 45 
 46 
 47 
 48 
 49 /**
 50 * @Author: HeHaoYuan
 51 * @Date: 2019/7/25
 52 * @Description:
 53 订单类
 54 
 55 */
 56 class Order {
 57     //订单创建完成之后,订单编号不能修改
 58     private final String orderId;
 59 
 60     //商品信息 -> 商品标号,商品数量
 61     //订单创建完成后,goodsInfo属性实例化HashMap
 62     private final Map<String, Integer> goodsInfo = new HashMap<>();
 63 
 64     public Order(String orderId) {
 65         this.orderId = orderId;
 66     }
 67 
 68     /**
 69      * 添加商品
 70      * @param goodsId 商品编号
 71      * @param count   数量
 72      */
 73     public void add(String goodsId, Integer count) {
 74         //sum -> 改变后的商品数量
 75         Integer sum = this.goodsInfo.get(goodsId);
 76         //当前订单中不存在该商品
 77         if (sum == null) {
 78             sum = count;
 79         } else {
 80             sum += count;
 81         }
 82         //将新的商品数量与商品编号关联起来
 83         this.goodsInfo.put(goodsId, sum);
 84     }
 85 
 86     /**
 87      * 减少商品
 88      * @param goodsId
 89      * @param count
 90      */
 91     public void cancel(String goodsId, Integer count) {
 92         Integer sum = this.goodsInfo.get(goodsId);
 93         //当前订单存在该商品
 94         if (sum != null) {
 95             sum-=count;
 96             if(sum<=0){
 97                 this.goodsInfo.remove(goodsId);
 98             }else{
 99                 this.goodsInfo.put(goodsId,sum);
100             }
101         }
102     }
103 
104     /**
105      * 清空所有商品
106      */
107     public void clear() {
108         System.out.println("清空本次订单中的所有信息...");
109         this.goodsInfo.clear();
110     }
111 
112     /**
113      * 获得订单编号
114      * @return
115      */
116     public String getOrderId() {
117         return orderId;
118     }
119 
120     /**
121      * 获得订单信息
122      * @return
123      */
124     public Map<String, Integer> getOrderInfo() {
125         return this.goodsInfo;
126     }
127 }
128 
129 
130 /**
131 * @Author: HeHaoYuan
132 * @Date: 2019/7/25
133 * @Description:
134 商品管理
135 
136 */
137 interface GoodsCenter {
138     /**
139      * 添加商品
140      * @param good 商品
141      */
142     void addGoods(Goods good);
143 
144     /**
145      * 删除商品(通过商品编号)
146      * @param goodId
147      */
148     void removeGoods(String goodId);
149 
150     /**
151      * 更新商品(修改当前商品编号对应商品的名称)
152      * @param good
153      */
154     void updateGoods(Goods good);
155 
156     /**
157      * 商品是否存在(通过商品编号)
158      * @param goodId
159      * @return
160      */
161     boolean isExistGoods(String goodId);
162 
163     /**
164      * 获取商品(通过商品编号)
165      * @param goodId
166      * @return
167      */
168     Goods getGoods(String goodId);
169 
170     /**
171      * 列出商品信息
172      * @return
173      */
174     String listGoods();
175 
176     /**
177      * 存储商品信息
178      */
179     void store();
180 
181     /**
182      * 加载商品信息
183      */
184     void load();
185 }
186 
187 
188 /**
189 * @Author: HeHaoYuan
190 * @Date: 2019/7/25
191 * @Description:
192 订单管理
193 
194 */
195 interface OrderCenter {
196     /**
197      * 添加订单
198      * @param order 订单
199      */
200     void addOrder(Order order);
201 
202     /**
203      * 删除订单
204      * @param orderId
205      */
206     void removeOrder(String orderId);
207 
208     /**
209      * 列出所有订单信息
210      * @return
211      */
212     String ordersTable();
213 
214     /**
215      * 列出当前订单信息(通过订单编号)
216      * @param orderId
217      * @return
218      */
219     String orderTable(String orderId);
220 
221     /**
222      * 存储订单信息
223      */
224     void storeOrders();
225 
226 
227     /**
228      * 加载订单信息
229      */
230     String loadOrders();
231 
232     /**
233      * 清空所有订单信息
234      */
235     void cleanOrders();
236 }
237 
238 
239 
240 /**
241 * @Author: HeHaoYuan
242 * @Date: 2019/7/25
243 * @Description:
244 
245 
246 */
247 
248 class GoodsCenterImpl implements GoodsCenter {
249     //创建商品集合,key -> 商品编号,value -> 商品名称
250     private final Map<String, Goods> goodsMap = new HashMap<>();
251 
252     //将商品信息保存至goods.txt
253     private String filePath = System.getProperty("user.dir") + File.separator + "goods.txt";
254 
255     @Override
256     public void addGoods(Goods good) {
257         this.goodsMap.put(good.getId(), good);
258     }
259 
260     @Override
261     public void removeGoods(String goodId) {
262         this.goodsMap.remove(goodId);
263     }
264 
265     //修改存在商品的名称
266     @Override
267     public void updateGoods(Goods good) {
268         if (this.goodsMap.containsKey(good.getId())) {
269             this.goodsMap.put(good.getId(), good);
270         }
271     }
272 
273     @Override
274     public boolean isExistGoods(String goodId) {
275         return this.goodsMap.containsKey(goodId);
276     }
277 
278     @Override
279     public Goods getGoods(String goodId) {
280         return this.goodsMap.get(goodId);
281     }
282 
283     @Override
284     public String listGoods() {
285         StringBuilder str = new StringBuilder();
286         str.append("************** 商品信息 **************\n");
287         str.append("\t编号\t\t\t名称\t\t\t单价\n");
288         //根据商品名称获取商品信息
289         for (Goods good : this.goodsMap.values()) {
290             str.append("\t" + good.getId() + "\t\t\t" + good.getName() + "\t\t\t" + good.getPrice() + "\n");
291         }
292         str.append("*************************************\n");
293         return str.toString();
294     }
295 
296     @Override
297     public void store() {
298         System.out.println("保存所有商品信息到文件,每个商品信息 -> 编号:名称:价格");
299         //将商品信息输出到goods.txt
300         //输出格式 -> 商品编号:商品名称:商品价格
301         File file = new File(filePath);
302         //自动关闭流
303         try (BufferedWriter writer = new BufferedWriter(
304                 new FileWriter(file)
305         )) {
306             for (Goods goods : this.goodsMap.values()) {
307                 writer.write(String.format("%s:%s:%.2f\n", goods.getId(), goods.getName(), goods.getPrice()));
308             }
309         } catch (IOException e) {
310             e.printStackTrace();
311         }
312     }
313 
314     @Override
315     public void load() {
316         //读取goods.txt中的商品信息,经过处理,存入商品集合
317         File file = new File(filePath);
318         try (BufferedReader reader = new BufferedReader(
319                 new FileReader(file)
320         )) {
321             String read;
322             while((read=reader.readLine())!=null){
323                 String[] values=read.split(":");
324                 if(values.length==3){
325                     Goods good=new Goods(values[0],values[1],Double.parseDouble(values[2]));
326                     this.addGoods(good);
327                 }
328             }
329         } catch (IOException e) {
330             e.printStackTrace();
331         }
332     }
333 }
334 
335 
336 
337 
338 
339 /**
340 * @Author: HeHaoYuan
341 * @Date: 2019/7/25
342 * @Description:
343 
344 
345 */
346 class OrderCenterImpl implements OrderCenter {
347     private GoodsCenter goodsCenter;
348 
349     public OrderCenterImpl(GoodsCenter goodsCenter) {
350         this.goodsCenter = goodsCenter;
351     }
352 
353     //创建订单集合,key -> 订单编号,value -> 订单信息
354     private final Map<String, Order> orderMap = new HashMap<>();
355 
356     private String filePath = System.getProperty("user.dir") + File.separator + "order.txt";
357 
358     @Override
359     public void addOrder(Order order) {
360         this.orderMap.put(order.getOrderId(), order);
361     }
362 
363     @Override
364     public void removeOrder(String orderId) {
365         this.orderMap.remove(orderId);
366     }
367 
368     @Override
369     public String ordersTable() {
370         StringBuilder str = new StringBuilder();
371         str.append("=================所有订单=================\n");
372         str.append("\t编号\t\t\t总价\n");
373 
374         for (Order order : this.orderMap.values()) {
375             Map<String, Integer> totalOrder = order.getOrderInfo();
376             double everyPrice = 0.0;
377             //商品集合,key -> 商品编号,value -> 商品数量
378             for (Map.Entry<String, Integer> entry : totalOrder.entrySet()) {
379                 String goodId = entry.getKey();
380                 Integer goodCount = entry.getValue();
381                 Goods good = goodsCenter.getGoods(goodId);
382                 everyPrice += good.getPrice() * goodCount;
383                 str.append("\t" + goodId + "\t\t\t" + everyPrice + "\n");
384             }
385             str.append("=========================================\n");
386         }
387         return str.toString();
388     }
389 
390     @Override
391     public String orderTable(String orderId) {
392         Order order = this.orderMap.get(orderId);
393         StringBuilder str = new StringBuilder();
394         str.append("=================订单信息=================\n");
395         str.append("编号:" + order.getOrderId() + "\n");
396         str.append("打印时间:" + LocalDate.now().toString()+"\n");
397         str.append("=========================================\n");
398         str.append("编号\t\t\t名称\t\t\t数量\t\t\t单价\n");
399         double totalPrice = 0.0;
400         for (Map.Entry<String, Integer> entry : order.getOrderInfo().entrySet()) {
401             Goods good = goodsCenter.getGoods(entry.getKey());
402             str.append("" + good.getId() + "\t\t\t" + good.getName() + "\t\t\t"+entry.getValue()+"\t\t\t"+ good.getPrice() + "\n");
403             totalPrice += entry.getValue() * good.getPrice();
404         }
405         str.append("=========================================\n");
406         str.append("总价:" + totalPrice + "\n");
407         str.append("=========================================\n");
408         return str.toString();
409     }
410 
411     @Override
412     public void storeOrders() {
413         System.out.println("保存所有订单到文件,每个订单信息 -> 编号和总价");
414         //将所有订单信息保存至order.txt
415         //输出格式 -> 编号:总价
416         File file = new File(filePath);
417         try (BufferedWriter writer = new BufferedWriter(
418                 new FileWriter(file)
419         )) {
420             for(Order order:this.orderMap.values()){
421                 double totalPrice = 0.0;
422                 for (Map.Entry<String, Integer> entry : order.getOrderInfo().entrySet()) {
423                     totalPrice += entry.getValue() *goodsCenter.getGoods(entry.getKey()).getPrice();
424                 }
425                 writer.write(String.format("%s:%.2f\n",order.getOrderId(),totalPrice));
426             }
427         } catch (IOException e) {
428             e.printStackTrace();
429         }
430     }
431 
432     @Override
433     public String loadOrders() {
434         File file = new File(filePath);
435         StringBuilder str = new StringBuilder();
436         try (BufferedReader reader = new BufferedReader(
437                 new FileReader(file)
438         )) {
439             String read;
440             if ((file.length() == 0)){
441                 System.out.println("请先保存订单信息!!!");
442             }else{
443                 System.out.println("加载文件中的订单信息...");
444                 double price;
445                 str.append("=================所有订单=================\n");
446                 str.append("\t编号\t\t\t总价\n");
447                 while ((read = reader.readLine()) != null) {
448                     String[] values = read.split(":");
449                     if (values.length == 2) {
450                         Order order = new Order(values[0]);
451                         price = Double.parseDouble(values[1]);
452                         this.addOrder(order);
453                         str.append("\t" + order.getOrderId() + "\t\t\t" + price + "\n");
454                     }
455                 }
456                 str.append("=========================================\n");
457             }
458         } catch (IOException e) {
459             e.printStackTrace();
460         }
461         return str.toString();
462     }
463 
464     @Override
465     public void cleanOrders() {
466         File file = new File(filePath);
467         try (FileWriter fileWriter = new FileWriter(file)
468         ) {
469             fileWriter.write("");
470             fileWriter.flush();
471         } catch (IOException e) {
472             e.printStackTrace();
473         }
474     }
475 }
476 
477 
478 
479 
480 /**
481 * @Author: HeHaoYuan
482 * @Date: 2019/7/25
483 * @Description:
484 字符界面收银台(优化版)
485 
486 */
487 class sale {
488     private static Scanner scanner = new Scanner(System.in);
489 
490     //商品中心管理
491     private static GoodsCenter goodsCenter = new GoodsCenterImpl();
492 
493     //订单中心管理,先实例化商品中心,因为订单中心的实例化需要传一个商品中心的实例化对象
494     private static OrderCenter orderCenter = new OrderCenterImpl(goodsCenter);
495 
496     private static Integer orderId = 0;
497 
498 
499     public static void helpInfo() {
500         System.out.println("*************** 欢迎使用简易收银台 *****************");
501         System.out.println(" [U] 使用 [S] 设置 [P] 保存所有信息 [A] 关于 [Q] 退出 ");
502         System.out.println("            输入:  U S P A Q 进入操作               ");
503         System.out.println("*************************************************");
504     }
505 
506     public static void quit() {
507         System.out.println("*************************************************");
508         System.out.println("                欢迎使用,下次再见                 ");
509         System.out.println("*************************************************");
510         System.exit(0);
511     }
512 
513     public static void about() {
514         System.out.println("******************** 关于 ***********************");
515         System.out.println("        名称:简易收银台                          ");
516         System.out.println("        功能:基于字符界面的收银台操作系统          ");
517         System.out.println("        作者: qqy                               ");
518         System.out.println("        版本: v1.0.0                          ");
519         System.out.println("        意见反馈:*********@qq.com            ");
520         System.out.println("*************************************************");
521     }
522 
523     public static void usageInfo() {
524         System.out.println("******************* 买单功能 ********************");
525         System.out.println("  [S] 查看当前订单 [U] 查看所有订单 [A] 下单 [C]清空   ");
526         System.out.println("     [D] 取消 [L] 浏览商品 [P] 保存订单 [R] 返回   ");
527         System.out.println("          输入:  S U A C D L P R 进入操作              ");
528         System.out.println("*************************************************");
529     }
530 
531     public static void settingInfo() {
532         System.out.println("******************* 设置功能 ********************");
533         System.out.println("           [S] 查看 [A] 上架 [D] 下架        ");
534         System.out.println("         [U] 修改 [P] 保存商品 [R] 返回   ");
535         System.out.println("          输入:  S A D U P R 进入操作              ");
536         System.out.println("*************************************************");
537     }
538 
539     public static void usage() {
540         //创建订单,并且添加到订单管理中心
541         Order order = new Order(String.valueOf(++orderId));
542         orderCenter.addOrder(order);
543 
544         usageInfo();
545         System.out.println(orderCenter.orderTable(order.getOrderId()));
546         while (true) {
547             String line = scanner.nextLine();
548             switch (line.trim().toUpperCase()) {
549                 case "S": {
550                     System.out.println(orderCenter.orderTable(order.getOrderId()));
551                     break;
552                 }
553                 case "A": {
554                     System.out.println("请输入下单信息[编号 数量](如下格式:1  2 ):");
555                     String value = scanner.nextLine().trim();
556                     String[] infoArray = value.split(" ");
557                     if (infoArray.length == 2) {
558                         Goods goods = goodsCenter.getGoods(infoArray[0].trim());
559                         if (goods != null) {
560                             order.add(infoArray[0].trim(), Integer.parseInt(infoArray[1].trim()));
561                             System.out.println(orderCenter.orderTable(order.getOrderId()));
562                             break;
563                         }
564                     }
565                     if (!(goodsCenter.isExistGoods(infoArray[0]))) {
566                         System.out.println("!商品还未上架,请重新选择商品");
567                     }
568                     System.out.println("请按照格式要求输入信息");
569                     break;
570                 }
571                 case "D": {
572                     System.out.println("请输入取消信息[编号 数量](如下格式:1  2 ):");
573                     String value = scanner.nextLine().trim();
574                     String[] infoArray = value.split(" ");
575                     if (infoArray.length == 2) {
576                         Goods goods = goodsCenter.getGoods(infoArray[0].trim());
577                         if (goods != null) {
578                             order.cancel(infoArray[0], Integer.parseInt(infoArray[1].trim()));
579                             System.out.println(orderCenter.orderTable(order.getOrderId()));
580                             break;
581                         }
582                     }
583                     System.out.println("请按照格式要求输入信息");
584                     break;
585                 }
586                 case "U": {
587                     System.out.println(orderCenter.loadOrders());
588                     break;
589                 }
590                 case "L": {
591                     System.out.println(goodsCenter.listGoods());
592                     break;
593                 }
594                 case "C":{
595                     order.clear();
596                     break;
597                 }
598                 case "P": {
599                     //订单信息保存
600                     orderCenter.storeOrders();
601                     break;
602                 }
603                 case "R": {
604                     return;
605                 }
606                 default: {
607                     usageInfo();
608                 }
609             }
610         }
611     }
612 
613     public static void setting() {
614         settingInfo();
615         while (true) {
616             String line = scanner.nextLine();
617             switch (line.toUpperCase()) {
618                 case "S": {
619                     System.out.println(goodsCenter.listGoods());
620                     break;
621                 }
622                 case "A": {
623                     System.out.println("请输入上架商品信息(如下格式:1 餐巾纸 1.4):");
624                     Goods goods = readGoods(true);
625                     if (goods == null) {
626                         System.out.println("!请按照格式要求输入信息");
627                         break;
628                     }
629                     if (goodsCenter.isExistGoods(goods.getId())) {
630                         System.out.println("!上架商品已经存在,请重新上架");
631                     } else {
632                         goodsCenter.addGoods(goods);
633                     }
634                     System.out.println(goodsCenter.listGoods());
635                     break;
636                 }
637                 case "D": {
638                     System.out.println("请输入下架商品信息编号(如下格式:1 ):");
639                     Goods goods = readGoods(false);
640                     if (goods == null) {
641                         System.out.println("!请输入存在的商品");
642                         break;
643                     }else{
644                         goodsCenter.removeGoods(goods.getId());
645                     }
646                     System.out.println(goodsCenter.listGoods());
647                     break;
648                 }
649                 case "U": {
650                     System.out.println("请输入修改商品信息(如下格式:1 餐巾纸 1.4 )");
651                     Goods goods = readGoods(false);
652                     if (goods == null) {
653                         System.out.println("!请输入存在的商品");
654                         break;
655                     }else {settingInfo();
656                         goodsCenter.updateGoods(goods);
657                     }
658                     System.out.println(goodsCenter.listGoods());
659                     break;
660                 }
661                 case "P": {
662                     //商品信息保存
663                     goodsCenter.store();
664                     break;
665                 }
666                 case "R": {
667                     return;
668                 }
669                 default: {
670                     settingInfo();
671                 }
672             }
673         }
674     }
675 
676     public static Goods readGoods(boolean flag) {
677         String value = scanner.nextLine();
678         String[] infoArray = value.split(" ");
679         if (infoArray.length == 3 || infoArray.length == 1) {
680             if (infoArray.length == 3) {
681                 if (!(sale.isNumber(infoArray[0].trim())&& sale.isNumber(infoArray[2].trim()))){
682                     System.out.println("!商品编号或单价有误,请重新输入");
683                 }else {
684                     if (!flag) {
685                         if (goodsCenter.isExistGoods(infoArray[0])) {
686                             Goods goods = new Goods(infoArray[0], infoArray[1], Double.parseDouble(infoArray[2]));
687                             return goods;
688                         }
689                     }
690                     else{
691                         Goods goods = new Goods(infoArray[0], infoArray[1], Double.parseDouble(infoArray[2]));
692                         return goods;
693                     }
694                 }
695             }
696             //infoArray.length == 1
697             if (!(sale.isNumber(infoArray[0].trim()))){
698                 System.out.println("!商品编号有误,请重新输入");
699             }else{
700                 if(goodsCenter.isExistGoods(infoArray[0])){
701                     Goods goods = new Goods(infoArray[0], "", 0.0D);
702                     return goods;
703                 }
704             }
705         }
706         return null;
707     }
708 
709     public static boolean isNumber(String str) {
710         for (int i = str.length(); --i >= 0; ) {
711             if (!Character.isDigit(str.charAt(i))) {
712                 return false;
713             }
714         }
715         return true;
716     }
717 
718     public static void main(String[] args) {
719         helpInfo();
720         goodsCenter.load();
721         //每次打开项目,清空订单记录
722         //新下单后存储信息后,才可查看所有订单。
723         orderCenter.cleanOrders();
724         while (true) {
725             String line = scanner.nextLine();
726             switch (line.trim().toUpperCase()) {
727                 case "U":
728                     usage();
729                     helpInfo();
730                     break;
731                 case "S":
732                     setting();
733                     helpInfo();
734                     break;
735                 case "A":
736                     about();
737                     break;
738 
739                 case "P":
740                     goodsCenter.store();
741                     orderCenter.storeOrders();
742                     break;
743                 case "Q":
744                     quit();
745                     break;
746                 default:
747                     helpInfo();
748             }
749         }
750     }
751 }

 

posted @ 2019-07-25 15:05  何浩源  阅读(554)  评论(0编辑  收藏  举报
//一下两个链接最好自己保存下来,再上传到自己的博客园的“文件”选项中