代写 Java 用Eclipse Java编程语言编写一个控制台应用程序,名为CityLodge的管理两种类型的酒店房间的租用和维护:标准房间和套房。

用Eclipse Java编程语言编写一个控制台应用程序,名为CityLodge的管理两种类型的酒店房间的租用和维护:标准房间和套房。
每一个由CityLodge管理的酒店房间都有以下特点:
●Room id:惟一标识每个房间的字符串。如果房间是标准酒店房间,房间id必须以R_开头;如果房间是套房,id必须以S_开头。例如R_108或S_559。
●卧室数量。标准间可以有一间、两间或四间卧室。套房通常有6间卧室。
●特征总结:一个简短的字符串(最多20个单词)来总结所有的房间特征。例如“airconditioner,tv,Wifi,fridge,kettle”。
●房间类型:CityLodge目前有两种类型的出租房间:标准间和套房。为简单起见,我们对房间类型使用两个值:即标准和套房。这些类型房间的不同特点在下文各节中说明。
●房间状态:CityLodge的员工检查此属性,以确定该房间目前是否可供出租、正在出租或正在维修。为简单起见,我们使用三个值来表示房间状态:可用、租用和维护。
此外,每个房间还保存着自己的Hiring Records。关于该房间最近出租的10次的信息。Hiring Records的详情如下:
每个Hiring Records都有以下特点:
●Record id:一个字符串,唯一标识每个招聘记录。雇佣记录id由以下三个属性连接而成
roomId_ + customerId_ +租期(8位格式:ddmmyyyy)
注意:为了简单起见,每个客户都由您选择的唯一的客户id字符串表示。不需要实现一个类来存储客户信息。
●租金日Rent date:客户租用房间的日期
提供了date .java的源代码。请按此进入程式码。下面是一些如何使用date .java类的示例。
●预计归还日期Estimated return date:给定客户想要出租房间的天数和上面显示的出租日期的计算日期
例如:一位客户想在2019年7月16日租用一个房间,租期为3天,因此预计归还日期为2019年7月19日
●实际退房日期Actual return date:客户实际退房的日期
●租金Rental fee:根据房间类型、租金日、预计退房日计算的费用。
●滞纳金Late fee:实际退运日期在预计退运日期后的加收费用。
注:标准房和套房的租金和滞纳金计算公式不同,将在下一节中给出
标准房
如上所述,CityLodge有两种类型的房间出租。第一类是标准房,它具有以下特点:
一间标准间可以有一间、两间或四间卧室。
●每间标准房可租期:若租期在周一至周五之间,租期不少于2天;若租期在周六或周日,租期不少于3天;若租期在周六或周日,租期不少于10天
●标准间的租金标准如下:一间有一间卧室的房间每天租金59美元,一间有两间卧室的房间每天租金99美元,一间有四间卧室的房间每天租金199美元
●如果标准房的退房日期早于预计退房日期,则不收取额外费用,租金按租金日和标准房退房日期(实际退房日期)计算
●滞纳金:如果一间标准房的退房时间晚于预计的退房日期,则每晚一天的租金为该标准房类型正常日租金的135%。例如,如上图所示,一间有两间卧室的标准间的日房价为99美元。因此,每晚一天的租金是99 = 135/100 * 99 = 133.65美元的135%
●标准房没有固定的维护计划。CityLodge可以在没有客户租用标准间的任何时候,即标准间可用的时候,对标准间进行维护。
 
CityLodge提供的第二种房型是套房。套房具有以下特点:
●套房通常有6间卧室
●套房租金为每天999美元
●滞纳金:如果一个套房在预定的归还日期后被退回,滞纳金按每天1099美元计算
●每间套房都有严格的维护时间表,因为CityLodge希望所有套房都处于最佳状态。因此,它们规定了下列要求:
1所有套房必须有10天的维修间隔。 
2每个套件必须保持其最后的维护日期。一个套件的维护操作必须在它的最后一个维护日期之后不超过10天(如上面的维护间隔所指定)。
3客户不得在超过必须进行维护操作的日期的时间段内租用套房。
示例:有一个套件可用,最后一次进行维护是在2019年7月15日。维修必须在2019年7月25日之前完成。因此,如果客户想在2019年7月21日租用该套房5天,CityLodge系统将拒绝该请求。
实现需求:
您的Hiring Record class必须符合以下要求:
●覆写(override)public String toString()方法,返回一个包含招聘记录细节的字符串,格式如下:
recordId:rentDate:estimatedReturnDate:actualReturnDate:rentalFee:lateFee(注意冒号是如何用作分隔符的)
例1:当一个标准房间正在出租,但尚未返回时,调用该房间最新的hire Record对象的toString方法将返回一个字符串,如下所示:
R_108_CUS239_11072019:11/07/2019:16/07/2019:none:none:none(请注意如何将none字符串用于actualReturnDate、rentalFee和lateFee,因为这些值无法在房间未被归还时确定)
例2:当一个房间被归还时,该房间的最新租用记录将会更新为实际归还日期、租赁费和任何滞纳金。因此,调用该房间最新的hire Record对象的toString方法将返回如下所示的字符串:
 R_108_CUS239_11072019:11/07/2019:16/07/2019:16/07/2019:495.00:0.00

实现一个公共字符串getDetails()方法。这个方法应该构建一个字符串并返回该字符串。返回的字符串应该以人类可读的形式格式化,如下所示。此方法不能实际打印到控制台。请参考以下例子:
示例1:当一个房间正在出租,但尚未返回时,调用该房间的最新的hire Record对象的getDetails方法将返回一个字符串,如下所示:
 Record ID: R_108_CUS239_11072019
例2:当一个房间被归还时,该房间的最新租用记录将会更新为实际归还日期、租赁费和任何滞纳金。因此,调用该房间最新的hire record对象的getDetails方法将返回如下所示的字符串:

(请注意,租金和滞纳金以小数点后2位打印)

所有房间类别(标准间和套房)的实施要求
 
每个房间都必须保存自己的租用记录。这些记录存储了该房间最近10次出租的信息。 
以下方法可以调用任何类型的对象标准房间或套房:
(提示:实现这些方法是在代码中应用继承和多态性)
以下为需要实现的方法:
public boolean rent (String customerId, DateTime rentDate, int numOfRentDay) 
此方法在房间对象(标准房间或套房)上调用,以执行租用房间所需的操作。 
这种方法应该检查预置条件,以确定房间是否可以出租。例如,当房间当前正在出租或正在维护时,此方法返回false。您应该检查任何其他可能使此方法返回false的条件。
如果房间可供出租,该方法将执行所有必要的操作,根据输入参数更新存储在房间对象中的信息。例如,更新房间状态、创建新的雇佣记录、更新房间的雇佣记录集合,以及您认为必要的任何其他操作。 
此方法返回true,表示房间已成功租用。

public boolean returnRoom(DateTime returnDate) 
此方法在房间对象(标准房间或套件)上调用,以执行返回房间所需的操作。
这种方法应该检查预置条件,以确定是否可以退还房间。例如,当给定的returnDate位于存储在hire记录中的rentDate之前时,此方法返回false。您应该检查任何其他可能使此方法返回false的条件。
如果可以退还房间,该方法将执行所有必要的操作,根据输入参数更新存储在房间对象中的信息。例如,更新房间状态,用租金、滞纳金和您认为必要的任何其他操作更新相应的租用记录。5
此方法返回true,表示房间已成功归还
public boolean performMaintenance() 
此方法在房间对象(标准房间或套房)上调用,以执行房间维护所需的操作。
这种方法应该检查预置条件,以确定是否可以在该房间中执行维护操作。例如,当房间当前正在出租时,此方法返回false,因为当有客户租用该房间时,无法执行维护操作。您应该检查任何其他可能使此方法返回false的条件。
如果房间已准备好进行维护,此方法将执行所有必要的操作,以便在维护发生时更新存储在此房间对象中的信息。此方法返回true,表示房间正在维护中。
public boolean completeMaintenance(DateTime completionDate)
在房间对象(标准房间或套房)上调用此方法,以便在房间维护完成时执行所需的操作。
这种方法应该检查先决条件。例如,当当前正在租用房间时,在这个房间对象上调用completeMaintenance方法是没有意义的,因此这个方法应该返回false。您应该检查任何其他可能使此方法返回false的条件。
如果可以完成维护,此方法将执行所有必要的操作,以便在维护完成时更新存储在此room对象中的信息。最后,该方法返回true,表示房间维护已经成功完成

public String toString()
该方法应该构建一个字符串并将其返回给调用方法。返回的字符串应该按照预定义的格式格式化,如下所示:
roomId:numberOfBedrooms:roomtype:status:featureSummary
如果对象是一个套房,返回的字符串应该包含格式为DD/MM/YYYY的最后维护日期。套件的字符串表示格式如下
roomId:numberOfBedrooms:roomtype:status:lastMaintenanceDate:featureSummary
●冒号(:)用作分隔符。●如果该房间是套房,则包含lastMaintenanceDate属性,如上所示。●您可以创建自己的功能总结字符串,最多20个单词,如上面所有酒店客房的通用功能部分所示。
 
更多的例子如下:
例1:CityLodge酒店有一间标准房,id R_108,有两间卧室,现在可以出租。房间配有空调、有线电视、Wifi、冰箱、电热水壶等设施。调用该房间对象的toString方法返回以下字符串:
R_108:2:Standard:Available:air conditioning, cable TV, Wifi, fridge, electric kettle

示例2:当前正在租用id S_559的套房。它有6间卧室,功能突出,如一个大的座位区,一个平板电视和户外阳台。该套件的最后维护日期是2019年7月22日。调用suite对象的toString方法返回以下字符串:
S_559:6:Suite:Rented:22/07/2019:large seating area, flat screen TV, outdoor balconies

public String getDetails()
该方法应该构建一个字符串并将其返回给调用方法。此方法不应执行实际打印。返回的字符串包含关于该房间的所有信息,包括关于该房间最近10条hire record记录的详细信息。返回的字符串应该采用预定义的人类可读格式。请看下面的例子:
 
例1:首次提供标准房出租(无租用记录)。调用该房间对象的getDetails方法返回如下内容:

(无需记录标准房的维修日期)
例2:目前第一次租用一个套房。调用该套件对象的getDetails方法返回如下内容:

(注意,显示的是最后的维护日期,因为这是一个套间,而显示的是第一次租用记录的一部分,因为套间是第一次租用)
例3:一个套间当前正在租用。它在过去被租和归还过

(请注意,最新的hiring record是先显示的,尽管在房间归还之前还没有完成。第一个租赁记录显示在当前租赁记录下面,用行分隔——)

实现CityLodge应用程序类
 
需要实现一个名为CityLodge的类,它包含一个集合,最多可以存储50个标准房间和套房两种类型的对象。运行时,程序的用户将使用下面描述的菜单系统通过控制台输入添加standard room和suite类型的对象。
您的CityLodge class必须提供以下菜单,以便CityLodge公司的员工管理出租房间。菜单如下:

用户应该能够从上面的菜单中输入一个数字来选择一个选项。如果输入超出该范围,则应显示错误消息并重新显示菜单。当输入一个有效的数字时,程序应该执行相应的方法,然后返回到菜单。如果用户选择退出程序选项,则程序应该退出。您可以在某个选项下使用子菜单。
所有输出数据都应打印到标准输出。
以下是上述菜单提供的每个功能的描述:
添加房间Add Room
用户(CityLodge的雇员)选择此选项创建一个新的标准房间或套房。如果是套房,用户可以输入新房间的所有相关细节,如房间id、房间类型、卧室数量和最后维护日期。当第一次创建一个房间时,它的状态是可用的。
您应该执行所有必要的数据验证,例如,无效的房间id或已经存在的房间id。如果出现错误,程序应向控制台打印适当的错误消息,并应立即返回菜单,而无需创建或存储新房间。
租房间Rent Room
 通过选择此选项,CityLodge的员工可以输入标准房间ID或套房ID,并输入相关信息,以便客户租用该房间。你的实现应该类似于下面的例子:
例1:租一间可以出租的标准间
(主菜单再次出现)
示例2:尝试租用一个不能出租的房间

(没有出现例子1中的询问细节部分 因为房间不可用 直接返回主菜单)

退还房间Return Room
通过选择此选项,CityLodge的员工可以输入房间或套房ID和返回日期来返回该房间。如果成功,您的程序应该打印关于该房间的所有相关信息,包括最新的hiring recording。您应该执行所有必要的数据验证,例如,如果该房间当前正在维护,则退还该房间是不合理的。 
 
房间维修Room Maintence
 通过选择此选项,CityLodge的员工可以输入一个房间或套房ID来维护该房间。您应该执行所有必要的数据验证,以避免任何不合理的情况。 
示例:维护当前未租用的套

(完成后也自动返回主菜单)
完成维修CompleteMaintence
通过选择此选项,CityLodge的员工可以输入房间或套房ID来完成该房间的维护。从ID中,如果房间是套房,那么系统将提示员工输入维护完成日期。如果是标准房,则无需输入维修完成日期。 
示例:完成套件的维护

(自动返回主菜单)
显示所有房间DisplayAllRooms
通过选择此选项,CityLodge的员工可以在控制台上查看系统中存储的所有租赁房间的所有信息,包括每个房间最新的10条租赁记录(hiring records)的详细信息。(提示:在每个房间对象上调用getDetails方法)。
启动类。Start-up Class
您应该创建一个startup类,其中包含一个主方法,其中创建CityLodge类的一个对象,并对该对象调用一个方法来运行整个CityLodge应用程序。

要求正确地模块化类。任何方法都不应该超过50行。您的设计可能需要提供更多的功能,例如访问器和修改器,而不仅仅是在上面的小节中指定的功能,这样设计的机制才能正常工作。