Make it right, Make it work, Make it better, Make it best
继续提炼、完善,据说到了企业级代码的门前
▼/**复制代码* 1、常量 * 1.1 菜单 * 1.1.1 菜单编号 * 1.1.2 菜单描述 * 1.1.3 装修套餐单价 * <p> * 1.2 正则 * 1.2.1 面积:拦截负数,非数字 * 1.2.2 菜单:只放行 0-3 * <p> * 1.3 提示词 * 1.3.1 面积输入 * 1.3.2 菜单输入 * 1.3.3 退出 * 1.3.4 空输入(面积和菜单) * 1.3.5 面积无效: * 1.3.6 面积 0 * 1.3.7 菜单无效 * 1.3.8 返回上一层 * <p> * 1.4 哨兵码表 * 1.4.1 -1:退出 * 1.4.2 -2:空输入 * 1.4.3 -3:无效输入 * 1.4.4 0:面积 0,输入合法,业务不合法,业务层拦截 * 1.4.5 0:菜单 0,返回面积层 * <p> * 1.5 格式 * 1.5.1 报价单编号 -0001 * 1.5.2 报价单前缀 BJ2026 * 1.5.3 报价单日期 * 1.5.4 材料费占比 * <p> * 1.6 报价单文本块 * <p> * 1.7 报价单字段 * <p> * 2、main()步骤 * 2.1 面积输入 * <p> * 2.2 菜单输入 * <p> * 3 报价单 * 3.1 报价单快照(获取报价单字段) * 3.1.1 获取报价单编号 * 3.1.2 获取报价单日期 * 3.1.3 获取房屋面积 * 3.1.4 获取装修套餐的编号 * 3.1.5 获取装修套餐编号对应的描述 * 3.1.6 获取装修套餐编号对应的单价 * 3.1.7 计算装修套餐的金额 * 3.1.8 计算材料费用 * 3.1.9 计算人工费用 * <p> * 3.2 报价单输出 * <p> * 4、方法 * 4.1 getHouseArea() * 4.2 judgeHouseArea() * 4.3 getMenuItemNumber() * 4.4 judgeMenuItemNumber() * 4.5 getMenuItemDesc() * 4.6 getMenuItemUnitPrice() * 4.7 getQuotationNumber() * 4.8 calcTotalAmount() * 4.9 getQuotationCreateDateTime() * 4.10 snapshotQuotation() * 4.11 printQuotation() * */ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Scanner; public class Day27RewriteQuoteTextBlock { private static final String APP_EXIT_WORD = "EXIT"; // 退出程序的关键词 // 装修套餐菜单编号、描述、单价 private static final int MENU_NUMBER_ECONOMY = 1; private static final int MENU_NUMBER_COMFORT = 2; private static final int MENU_NUMBER_LUXURY = 3; private static final String MENU_ITEM_DESC_ECONOMY = "经济套餐"; private static final String MENU_ITEM_DESC_COMFORT = "舒适套餐"; private static final String MENU_ITEM_DESC_LUXURY = "豪华套餐"; private static final double MENU_ITEM_UNIT_PRICE_ECONOMY = 800; private static final double MENU_ITEM_UNIT_PRICE_COMFORT = 1200; private static final double MENU_ITEM_UNIT_PRICE_LUXURY = 1800; // 面积和菜单编号输入的正则表达式 private static final String AREA_REGEX = "^[0-9]+(\\.[0-9]+)?$"; private static final String MENU_NUMBER_REGEX = "^[0-3]$"; // 程序的提示词 private static final String APP_TITLE = "装修报价管理系统(QMS)"; private static final String INPUT_AREA_TIP = "请输入面积(m²)【exit-退出】:"; private static final String INPUT_MENU_TIP = "请选择装修套餐(1-经济套餐|2-舒适套餐|3-豪华套餐)【0-返回上一层】:"; // 面积输入、菜单输入的提示词 private static final String INPUT_IS_BLANK_TIP = "没有输入,请重新输入!"; private static final String INPUT_EXIT_TIP = "Goodbye,See you next time."; private static final String INPUT_INVALID_TIP = "无效的输入,请重新输入!"; private static final String INPUT_AREA_ZERO_TIP = "面积必须大于 0 ,请重新输入!"; private static final String INPUT_MENU_ZERO_TIP = "返回上一层,请重新输入面积!"; private static final int SENTINEL_EXIT = -1; // 退出 private static final int SENTINEL_IS_BLANK = -2; // 空输入 private static final int SENTINEL_INVALID = -3; // 无效的输入 private static final int SENTINEL_AREA_ZERO = 0; // 面积0 private static final int SENTINEL_MENU_ZERO = 0; // 菜单0 // 报价单前缀、后缀格式、日期格式 private static final String PREFIX_QUOTATION_NUMBER = "BJ2026"; private static final String SUFFIX_QUOTATION_NUMBER_FORMATTER = "-%04d"; private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 报价单字段 private static double houseArea = 0; private static final double RENOVATION_MATERIAL_COST_RATIO = 0.6; private static int renovationPackageLevel = 0; private static String renovationPackageDesc = ""; private static double renovationPackageUnitPrice = 0; private static double renovationTotalAmount = 0; private static String quotationNumber = ""; private static String quotationCreateDateTime = ""; private static double quotationHouseArea = 0; private static double renovationMaterialCost = 0; private static double renovationLaborCost = 0; private static double renovationOtherCost = 0; private static final String PRINT_BILL_TEXT = """ ==============================================装修套餐报价单============================================== 报价编号:%s 报价日期:%s ------------------------------------------------------------------------------------------------------- 房屋面积:%,.2f m² 装修套餐:%s ------------------------------------------------------------------------------------------------------- 套餐单价:%,.2f 元/m² 装修总价:%,.2f 元 其中: 材料费用:%,.2f 元 人工费用:%,.2f 元 其它费用:%,.2f 元 ------------------------------------------------------------------------------------------------------- """; private static int quotationCount = 0; // 报价单编号计数器 public static void main(String[] args) { // 面积输入 Scanner in = new Scanner(System.in); while (true) { System.out.println(APP_TITLE); System.out.print(INPUT_AREA_TIP); String area = in.nextLine().strip(); houseArea = getHouseArea(area); // 是否退出 if (houseArea == SENTINEL_EXIT) { System.out.println(INPUT_EXIT_TIP); break; } if (!judgeHouseArea(houseArea)) { continue; } // System.out.println("获取到的房屋面积是:" + houseArea + " m²"); // 菜单输入 int menuNumber; while (true) { System.out.print(INPUT_MENU_TIP); String selected = in.nextLine(); menuNumber = getMenuItemNumber(selected); // 是否返回上一层 if (menuNumber == SENTINEL_MENU_ZERO) { System.out.println(INPUT_MENU_ZERO_TIP); break; } if (judgeMenuItemNumber(menuNumber)) { renovationPackageLevel = menuNumber; // 报价单 // 报价单快照 snapshotQuotation(houseArea, renovationPackageLevel); // 报价单输出 printQuotation(); break; } } } } // 方法 /** * 按格式输出报价单 */ private static void printQuotation() { String quoteText = String.format(PRINT_BILL_TEXT, quotationNumber, quotationCreateDateTime, quotationHouseArea, renovationPackageDesc, renovationPackageUnitPrice, renovationTotalAmount, renovationMaterialCost, renovationLaborCost, renovationOtherCost); System.out.println(quoteText); } /** * 报价单快照 * * @param houseArea * @param renovationPackageLevel */ private static void snapshotQuotation(double houseArea, int renovationPackageLevel) { quotationNumber = getQuotationNumber(); quotationCreateDateTime = getQuotationCreateDateTime(); quotationHouseArea = houseArea; renovationPackageDesc = getMenuItemDesc(renovationPackageLevel); renovationPackageUnitPrice = getMenuItemUnitPrice(renovationPackageLevel); renovationTotalAmount = calcTotalAmount(quotationHouseArea, renovationPackageUnitPrice); renovationMaterialCost = renovationTotalAmount * RENOVATION_MATERIAL_COST_RATIO; renovationLaborCost = renovationTotalAmount - renovationMaterialCost; renovationOtherCost = 0; } /** * 计算装修套餐的总金额(总金额 = 房屋面积 * 装修套餐对应的单价) * * @param houseArea * @param renovationPackageUnitPrice * @return */ public static double calcTotalAmount(double houseArea, double renovationPackageUnitPrice) { return houseArea * renovationPackageUnitPrice; } /** * 获取报价单创建日期时间 * * @return */ public static String getQuotationCreateDateTime() { return LocalDateTime.now().format(DATE_TIME_FORMATTER); } /** * 获取报价单编号 * * @return */ public static String getQuotationNumber() { quotationCount++; String suffixQuotation = String.format(SUFFIX_QUOTATION_NUMBER_FORMATTER, quotationCount); return (PREFIX_QUOTATION_NUMBER + suffixQuotation); } /** * 获取装修套餐菜单编号对应的单价 * * @param menuNumber * @return */ public static double getMenuItemUnitPrice(int menuNumber) { return switch (menuNumber) { case MENU_NUMBER_ECONOMY -> MENU_ITEM_UNIT_PRICE_ECONOMY; case MENU_NUMBER_COMFORT -> MENU_ITEM_UNIT_PRICE_COMFORT; case MENU_NUMBER_LUXURY -> MENU_ITEM_UNIT_PRICE_LUXURY; default -> 0; }; } /** * 获取装修套餐菜单编号对应的描述 * * @param menuNumber * @return */ public static String getMenuItemDesc(int menuNumber) { return switch (menuNumber) { case MENU_NUMBER_ECONOMY -> MENU_ITEM_DESC_ECONOMY; case MENU_NUMBER_COMFORT -> MENU_ITEM_DESC_COMFORT; case MENU_NUMBER_LUXURY -> MENU_ITEM_DESC_LUXURY; default -> "返回上一层"; }; } /** * 判断装修套餐菜单编码的输入是否合法,true=合法放行,false=提示应重输 * * @param menuNumber * @return */ public static boolean judgeMenuItemNumber(int menuNumber) { // 是否重新输入,空输入 if (menuNumber == SENTINEL_IS_BLANK) { System.out.println(INPUT_IS_BLANK_TIP); return false; } // 是否重新输入,无效的输入 if (menuNumber == SENTINEL_INVALID) { System.out.println(INPUT_INVALID_TIP); return false; } return true; } /** * 获取装修套餐的菜单编号,通过菜单编号获取对应套餐的描述和单价 * * @param menuSelected * @return */ public static int getMenuItemNumber(String menuSelected) { int menuNumber; // 空输入判断 if (menuSelected.strip().isBlank()) { return SENTINEL_IS_BLANK; } if (menuSelected.strip().matches(MENU_NUMBER_REGEX)) { menuNumber = Integer.parseInt(menuSelected); } else { return SENTINEL_INVALID; } return menuNumber; } /** * 判断房屋面积的内容是否合法,true=合法放行,false=提示应重输 * * @param houseArea * @return */ public static boolean judgeHouseArea(double houseArea) { // 是否重新输入,空输入 if (houseArea == SENTINEL_IS_BLANK) { System.out.println(INPUT_IS_BLANK_TIP); return false; } // 是否重新输入,无效的输入 if (houseArea == SENTINEL_INVALID) { System.out.println(INPUT_INVALID_TIP); return false; } // 是否0输入,特殊提示 if (houseArea == SENTINEL_AREA_ZERO) { System.out.println(INPUT_AREA_ZERO_TIP); return false; } return true; } /** * 获取房屋面积,返回哨兵码值或房屋面积 * * @param area * @return */ public static double getHouseArea(String area) { // 空输入判断 if (area.strip().isBlank()) { return SENTINEL_IS_BLANK; } // "exit"判断 if (APP_EXIT_WORD.equalsIgnoreCase(area)) { // APP_EXIT_WORD = "EXIT" return SENTINEL_EXIT; } // 正则判断 if (!area.strip().matches(AREA_REGEX)) { return SENTINEL_INVALID; } houseArea = Double.parseDouble(area); return houseArea; } }
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
