实验一 需求规格说明书
1.1 需求描述
工作人员凭借用户名和密码登录管理系统,帮助用户进行登记,可以是个人旅客,也可以是团体旅客,登记完,询问旅客想要的房间类型和时间,然后把旅客登记进入相应的房间,找到空房办理入住,不是空房不可以入住。想要预订房间的旅客,首先我们先对用户进行登记,到达预订界面,选择相应的对象,点击新增,选择相应的预订天数,和房间,当顾客来的时候,进行安排房间,选择相应的顾客,并发放房卡。当旅客想要买东西,或者损坏了物品,点击消费,添加置相应的费用。
清洁人员凭登录管理系统,查看待打扫房间信息,进入待打扫房间进行清洁工作,工作完成后变更房间的入住状态。
大堂经理登录管理系统,可以查看近期的账单。
1.2 系统功能性需求分析
本酒店管理系统主要包含以下核心功能模块:
房间管理:维护房间信息(如房号、类型、状态等),支持房间状态的实时更新(空闲、入住、待打扫、维修等)。
住宿管理:处理旅客的入住、退房、续住及预订等操作。
旅客管理:记录和管理旅客的基本信息、入住历史及消费记录。
消费管理:记录旅客在店期间产生的各项费用,并关联至其账单。
1.3用例分析
1.3.1 系统参与者
系统的主要参与者包括:
旅客:接受酒店服务的对象,不直接操作系统,但其信息和行为是系统处理的核心。
前台工作人员:负责旅客登记、房间分配、预订管理及消费录入等日常业务操作。
清洁人员:负责客房清洁,并在系统中更新房间清洁状态。
大堂经理:负责监督运营情况,可查询和审核近期账单及经营数据。
1.3.2 系统用例图

图1-1 系统总用例图
1.3.3 用例描述
1.3.3.1 增加酒店商品类别用例描述
大堂经理增加酒店商品类别用例描述如表1-1所示。
表1-1 大堂经理增加酒店商品类别用例描述
|---------|-------------------------|
| 用例名 | 大堂经理增加酒店商品类别 |
| 主要业务参与者 | 大堂经理 |
| 其他参与者 | 无 |
| 描述 | 该用例描述了大堂经理增加酒店商品类别时的描述 |
| 前置条件 | 大堂经理输入用户名、密码正确成功 |
| 触发条件 | 大堂经理点击"商品设置"时触发 |
| 基本流程 | 1. 调用数据库,获得酒店商品信息 |
| 基本流程 | 2. 界面显示酒店所有商品种类和商品名称 |
| 基本流程 | 3. 大堂经理点击"新增" |
| 基本流程 | 4. 系统提示输入新增商品的信息 |
| 基本流程 | 5. 大堂经理输入商品名称、商品类别和销售价格 |
| 基本流程 | 6. 大堂经理点击"保存" |
| 替代流程 | 登录失败 |
| 结束 | 退出系统 |
1.3.3.2 查看近期酒店账单用例描述
查看近期酒店账单用例描述如表1-2所示。
表1-2 查看近期酒店账单用例描述
|---------|------------------------------------|
| 用例名 | 查看酒店近期账单 |
| 主要业务参与者 | 大堂经理 |
| 其他参与者 | 无 |
| 描述 | 该用例描述了大堂经理查看酒店近期账单 |
| 前置条件 | 大堂经理输入用户名、密码正确成功登录 |
| 触发条件 | 大堂经理点击"财务统计"按钮时触发 |
| 基本流程 | 1.调用数据库,显示所有账单记录 |
| 基本流程 | 2.大堂经理输入结账区段 |
| 基本流程 | 3.页面显示相应时间区间内的房间号、旅客姓名、结账时间、总费用等信息 |
| 替代流程 | 1.登录失败 |
| 替代流程 | 2.结账区段内无交易 |
| 结束 | 退出系统,显示登录页面 |
1.3.3.3 修改房间状态用例描述
修改房间状态用例描述如表1-3所示。
修改房间状态用例描述
|---------|----------------------------------|
| 用例名 | 修改房间状态 |
| 主要业务参与者 | 清洁员工 |
| 其他参与者 | 无 |
| 描述 | 该用例描述了清洁员工房间状态时的描述 |
| 前置条件 | 清洁员工输入用户名、密码正确成功登录 |
| 触发条件 | 清洁员工点击"客房设置"时触发 |
| 基本流程 | 1. 调用数据库显示所有房间信息 |
| 基本流程 | 2. 清洁员工选择房间状态为"待清洁"的房间 |
| 基本流程 | 3. 清洁员工将选中的房间状态修改为"正在清洁" |
| 基本流程 | 4. 清洁员工将对应房间打扫完成,将该房间的房间状态改为"空房" |
| 基本流程 | 5. 显示修改成功 |
| 替代流程 | 登录失败 |
| 结束 | 退出系统,显示登录页面 |
1.3.3.4 预定房间用例描述
预定房间用例描述如表1-4所示。
表1-4 预定房间用例描述
|---------|----------------------|
| 用例名 | 预定房间 |
| 主要业务参与者 | 前台 |
| 其他参与者 | 旅客 |
| 描述 | 该用例描述了预定房间 |
| 前置条件 | 前台输入用户名、密码正确成功登录 |
| 触发条件 | 前台点击"住宿管理-客房预定"按钮时触发 |
| 基本流程 | 1. 选择预定的对象,进行安排房间 |
| 基本流程 | 2. 调用数据库,查看房间的房态 |
| 基本流程 | 3. 页面显示相应的房态和类型供旅客选择 |
| 替代流程 | 1. 登录失败 |
| 替代流程 | 2.无空房 |
| 结束 | 退出系统,显示登录页面 |
1.3.3.5 房间登记用例描述
房间登记用例描述如表1-5所示。
表1-5 房间登记用例描述
|---------|-----------------------|
| 用例名 | 房间登记 |
| 主要业务参与者 | 前台 |
| 其他参与者 | 无 |
| 描述 | 该用例描述了房间登记 |
| 前置条件 | 前台输入用户名、密码正确成功登录 |
| 触发条件 | 前台点击"住宿管理-住宿登记"按钮时触发 |
| 基本流程 | 1. 点击"安排房间" |
| 基本流程 | 2. 调用数据库,查看房间的房态 |
| 基本流程 | 3. 点击"登记" 4. 选择旅客进行登记 |
| 替代流程 | 登录失败 |
| 结束 | 退出系统,显示登录页面 |
1.3.3.6 新增旅客用例描述
新增旅客用例描述如表1-6所示。
表1-6 新增旅客用例描述
|---------|-----------------------------|
| 用例名 | 新增旅客 |
| 主要业务参与者 | 前台 |
| 其他参与者 | 旅客 |
| 描述 | 该用例描述了新增旅客 |
| 前置条件 | 前台输入用户名、密码正确成功登录 |
| 触发条件 | 前台点击"旅客管理-旅客信息"按钮时触发 |
| 基本流程 | 1. 点击"新增" |
| 基本流程 | 2. 显示添加信息界面 |
| 基本流程 | 3. 点击"保存" |
| 替代流程 | 1. 登录失败 3. 旅客已经存在,显示"旅客已存在" |
| 结束 | 退出系统,显示登录页面 |
1.4 用例活动图描述
1.4.1大堂经理新增商品用例活动图

图1-7 大堂经理新增商品用例活动图
1.4.2 查看近期酒店账单用例活动图

图1-8 查看近期酒店账单用例活动图
1.4.3 修改房间状态活动图

图1-9 修改房间状态活动图
1.4.4 预定房间活动图

图1-10 预定房间状态活动图
1.4.5房间登记活动图

图1-11 房间登记状态活动图
1.4.6新增旅客活动图

图1-12 新增旅客状态活动图
1.5 系统非功能需求
(1)房间信息准确
(2)保护顾客个人信息
(3)预订流程简洁
1.6 本次实验小结
通过本次实验,我们对酒店管理系统的需求进行了全面梳理与分析,明确了系统的主要功能模块、参与者角色及其交互关系。借助用例图和详细的用例描述,清晰地刻画了前台工作人员、清洁人员和大堂经理在系统中的操作流程与业务逻辑,为后续的系统设计与开发奠定了坚实基础。同时,通过对非功能性需求的识别,如数据准确性、用户隐私保护和操作便捷性,进一步提升了系统的可用性与安全性。本次需求规格说明书的编写,不仅加深了我们对软件工程中需求分析阶段的理解,也锻炼了将实际业务场景转化为结构化系统需求的能力。
实验二 领域模型
2.1 新增商品用例领域模型构建
2.1.1新增商品用例概念类分析
名词:大堂经理、用户名、密码、酒店商品、数据库。
动词:点击、新增、保存。
2.1.2 新增商品用例领域模型

2.1.2新增商品用例系统顺序图

2.2 查看近期账单用例领域模型构建
2.2.1查看近期账单用例概念类分析
名词:大堂经理、用户名、密码、账单、数据库。
动词:点击、查看、输入。
2.2.2 查看近期账单用例领域模型

2.2.3 查看近期账单用例系统顺序图

2.3 修改房间用例领域模型构建
2.3.1 修改房间用例概念类分析
名词:清洁员工、用户名、密码、房间信息表、系统、数据库。
动词:点击、输入、修改、保存。
2.3.2 修改房间用例领域模型

2.3.3 修改房间用例系统顺序图

2.4 预定房间用例领域模型构建
2.4.1 预定房间用例概念类分析
名词:前台员工、用户名、密码、房间状态、房间类型、旅客、安排房间、数据库。
动词:输入、点击。
2.4.2 预定房间用例领域模型

2.4.3 预定房间用例系统顺序图

2.5 房间登记用例领域模型构建
2.5.1 房间登记用例概念类分析
名词:前台员工、用户名、密码、登记、安排房间、旅客信息。
动词:输入、点击。
2.5.2 房间登记用例领域模型

2.5.3房间登记用例系统顺序图

2.6 新增旅客用例领域模型构建
2.6.1新增旅客用例概念类分析
名词:前台员工、用户名、密码、旅客信息、新增。
动词:输入、点击。
2.6.2 新增旅客用例领域模型

2.6.3 新增旅客用例系统顺序图

2.7 本次实验小结
本次实验围绕酒店管理系统的核心业务用例,开展了详细的领域模型构建工作。通过对"新增商品""查看近期账单""修改房间状态""预定房间""房间登记"和"新增旅客"六个典型用例进行概念类识别与分析,提取了关键的名词(如大堂经理、清洁员工、前台、旅客、房间、账单、商品等)和动词(如点击、新增、保存、查看、修改等),并据此绘制了对应的领域模型图和系统顺序图。这些模型清晰地反映了各业务场景中参与者、系统边界与核心业务对象之间的交互关系和职责划分,为后续的软件架构设计和编码实现提供了坚实的语义基础。通过本实验,我们不仅掌握了领域建模的基本方法,也进一步理解了如何从需求描述中抽象出系统的核心结构,提升了面向对象分析与设计的能力。
实验三 详细设计
3.1 新增商品用例详细设计
3.1.1 新增商品用例顺序图

3.1.2 新增商品用例类图

3.2查看账单用例详细设计
3.2.1 查看账单用例顺序图

3.2.2 查看账单用例类图

3.3 修改房间状态用例详细设计
3.3.1 修改房间信息用例顺序图

3.3.2 修改房间状态用例类图

3.4 预定房间用例详细设计
3.4.1 预定房间用例顺序图

3.4.2 预定房间用例类图

3.5房间登记用例详细设计
3.5.1 房间登记用例顺序图

3.5.2 房间登记用例类图

3.6新增旅客用例详细设计
3.6.1 新增旅客用例顺序图

3.6.2 新增旅客用例类图

3.7 本次实验小结
在本次实验中,我们对酒店管理系统的多个关键用例进行了详细的系统设计,包括新增商品、查看账单、修改房间状态、预定房间、房间登记以及新增旅客。通过绘制顺序图和类图,我们详细地描述了每个用例的动态行为和静态结构,明确了各个功能模块之间的交互流程和数据传递方式。这不仅有助于深化对系统运作机制的理解,也为后续的实现阶段提供了清晰的设计蓝图。此外,本次实验还强化了我们运用UML工具进行软件设计的能力,使我们更加熟练地掌握了如何将业务需求转化为具体的系统设计方案。通过这些练习,我们不仅提升了技术技能,也增强了对复杂系统设计的逻辑思维能力和细节把控能力。这次实践为实际项目开发中的详细设计阶段奠定了坚实的基础。
实验四 系统数据库设计
4.1 数据库概念结构设计
对于数据库的概念设计结构,选用ER图进行描述,更能清晰表达系统,易被读者所接受。
4.1.1实体属性设计
具体实体属性分别如图4-1、图4-2和图4-3所示。

图4-1商品实体

图4-2房间实体

图4-3旅客实体
4.1.2 系统总ER图设计
系统总ER图如图4-4所示。

图4-4 系统ER图
4.2 数据库逻辑结构的设计
根据系统需求,在实现系统所有功能的基础上,为此设计两张数据表,依次为:
1、用户表:用于保存登录信息
2、房间信息表:用于保存房间基本信息,其中房间号为唯一标识。
3、旅客信息表:用于保存客户个人信息,其中id为唯一标识。
4、账单表:用于保存交易账单信息,其中id为唯一标识。
5、属性表:用于记录酒店需要的所有属性,其中id为唯一标识
6、属性细节表:用于记录属性的细节,其中id为唯一标识。
7、商品表:用于保存酒店所有商品信息,其中id为唯一标识。
8、商品消费表:用于保存商品消费信息,其中id为唯一标识。
9、押金表:用于保存住宿旅客支付押金情况,其中id为唯一标识。
10、预定表:用于保存预定房间信息和相应的旅客信息,其中id为唯一标识。
11、团队表:用于保存团队的信息,其中id为唯一标识。
12、入住细节表:用于入住信息和旅客关系的,其中id为唯一标识。
用户表的详细描述如表4-1所示。
表4-1 用户表
|----------|------|---------|----|-------|------|
| 字段名称 | 字段描述 | 类型 | 长度 | 能否为空 | 是否主键 |
| id | id | int | 11 | FALSE | 否 |
| userName | 用户账号 | varchar | 20 | FALSE | 是 |
| password | 登录密码 | varchar | 20 | FALSE | 否 |
旅客信息表的详细描述如表4-2所示。
表4-2 旅客信息表
|--------------------------|---|--------|---------|-----|-------|------|
| 字段名称 || 字段描述 | 类型 | 长度 | 能否为空 | 是否主键 |
| id || 旅客id | int | 11 | FALSE | 是 |
| name || 客户姓名 | varchar | 20 | YES | 否 |
| papersid || 身份证号 | int | 11 | YES | 否 |
| passengerLevelID || 旅客级别ID | int | 11 | YES | 否 |
| genderID || 客户性别 | int | 11 | YES | 否 |
| nationID || 民族 | int | 11 | YES | 否 |
| thingReasonID || 事由 | int | 11 | YES | 否 |
| brithDate | 出生日期 || varcher | 30 | YES | 否 |
| `licenceIssuingAuthorty | 发证机关 || varchar | 50 | YES | 否 |
| educationDegreeID | 文化程度ID || int | 11 | YES | 否 |
| unitsOrAddress | 单位或住址 || varchar | 50 | YES | 否 |
| papersValidity | 证件有效期 || varchar | 50 | YES | 否 |
| profession | 职业 || varchar | 20 | YES | 否 |
| whereAreFrom | 从何处来 || varchar | 100 | YES | 否 |
| whereToGo | 到哪里去 || varchar | 100 | YES | 否 |
| contactPhoneNumber | 联系电话 || varchar | 20 | YES | 否 |
| remarks | 备注 || varchar | 100 | YES | 否 |
房间信息表的详细描述如表4-3所示。
表4-3房间信息表
|------------------|----------|---------|-----|-------|------|
| 字段名称 | 字段描述 | 类型 | 长度 | 能否为空 | 是否主键 |
| id | 房间号 | int | 11 | FALSE | 是 |
| guestRoomLevelID | '客房等级ID | int | 11 | YES | 否 |
| roomStateID | 房态ID | bigint | 20 | YES | 否 |
| roomNumber | 房间号 | bigint | 16 | YES | 否 |
| roomAmount | 床位数 | varchar | 10 | YES | 否 |
| standardPriceDay | 标准房价/天 | decimal | 8,2 | YES | 否 |
| standardPrice | 标准房价/小时 | decimal | 8,2 | YES | 否 |
| maxDuration | 时长限制(小时) | varchar | 10 | YES | 否 |
| firstDuration | 首段时长(小时) | varchar | 10 | YES | 否 |
| firstPrice | 首段价格 | decimal | 8,2 | YES | 否 |
房间信息表的详细描述如表4-4所示。
表4-4 账单信息表
|--------------------|---------|-----------|-----|-------|------|
| 字段名称 | 字段描述 | 类型 | 长度 | 能否为空 | 是否主键 |
| id | 住宿登记id | int | 11 | FALSE | 是 |
| predetermineID | 预定ID号 | int | 11 | YES | 否 |
| rentOutTypeID | 出租方式ID | int | 11 | YES | 否 |
| roomID | 房间ID | int | 11 | YES | 否 |
| payWayID | 结账方式ID | int | 11 | YES | 否 |
| billUnitID | 结账单位ID | int | 11 | YES | 否 |
| passengerTypeID | 旅客类别ID | int | 11 | YES | 否 |
| receiveTargetID | 接待对象ID | int | 11 | YES | 否 |
| deputyID | 副ID | int | 11 | YES | 否 |
| isBillID | 结账否 | int | 11 | YES | 否 |
| registerTime | 登记时间 | timestamp | | YES | 否 |
| stayNumber | 住店天数/小时 | varchar | 20 | YES | 否 |
| sumConst | 总费用 | decimal | 8,2 | YES | 否 |
| ChangingRoomNumber | 换房次数 | varchar | 20 | YES | 否 |
| changRoomMoney | 换房费 | decimal | 8,2 | YES | 否 |
| remarks | 备注 | varchar | 200 | YES | 否 |
| payTime | 结账时间 | timestamp | | YES | 否 |
| changRoomTime | 换房时间 | timestamp | | YES | 否 |
| remind | 提醒结账 | int | 11 | YES | 否 |
属性表的详细描述如表4-5所示。
表4-5 属性表
|------------------|------|---------|----|-------|------|
| 字段名称 | 字段描述 | 类型 | 长度 | 能否为空 | 是否主键 |
| id | 属性ID | int | 11 | FALSE | 是 |
| attributeName_id | 属性名称 | varchar | 30 | FALSE | 否 |
属性细节表的详细描述如表4-6所示。
表4-6属性细节表
|----------------------|--------|---------|----|-------|------|
| 字段名称 | 字段描述 | 类型 | 长度 | 能否为空 | 是否主键 |
| id | 属性细节ID | int | 11 | FALSE | 是 |
| attributeID | 属性ID | int | 11 | FALSE | 否 |
| attributeDetailsName | 属性细节名称 | varchar | 30 | FALSE | 否 |
商品表的详细描述如表4-7所示。
表4-7商品表
|--------------------|--------|---------|-----|-------|------|
| 字段名称 | 字段描述 | 类型 | 长度 | 能否为空 | 是否主键 |
| id | 商品ID | int | 11 | FALSE | 是 |
| commodityTypeID_id | 商品类别ID | varchar | 30 | FALSE | 否 |
| uOMID | 计量单位ID | int | 11 | FALSE | 否 |
| commodityName | 商品名称 | varchar | 50 | FALSE | 否 |
| salePrice | 销售价格 | decimal | 8,2 | FALSE | 否 |
商品消费表的详细描述如表4-8所示。
表4-8 商品消费表
|-------------------|--------|-----------|-----|-------|------|
| 字段名称 | 字段描述 | 类型 | 长度 | 能否为空 | 是否主键 |
| id | 消费ID | int | 11 | FALSE | 是 |
| stayRegisterID | 住宿登记ID | varchar | 30 | YES | 否 |
| commodityID | 商品ID | int | 11 | YES | 否 |
| consumptionNumber | 消费数量 | varchar | 10 | YES | 否 |
| consumptionMoney | 消费金额 | decima | 8,2 | YES | 否 |
| consumptionTime | 消费时间 | timestamp | | YES | 否 |
押金表的详细描述如表4-9所示。
表4-9押金表
|--------------------|--------|-----------|-----|-------|------|
| 字段名称 | 字段描述 | 类型 | 长度 | 能否为空 | 是否主键 |
| id | ID | int | 11 | FALSE | 是 |
| stayRegisterID _id | 住宿登记ID | int | 30 | YES | 否 |
| payWayID | 支付方式ID | int | 11 | YES | 否 |
| registerTime | 登记时间 | timestamp | | YES | 否 |
| deposit | 押金 | decimal | 8,2 | YES | 否 |
预定表的详细描述如表4-10所示。
表4-10 预定表
|----------------------|---------|-----------|-----|-------|------|
| 字段名称 | 字段描述 | 类型 | 长度 | 能否为空 | 是否主键 |
| id | 预定ID | int | 11 | FALSE | 是 |
| roomID _id | 房间ID | int | 11 | YES | 否 |
| predetermineTargetID | 预定对象ID | int | 11 | YES | 否 |
| passengerID | 旅客ID | Int | 11 | YES | 否 |
| payWayID | 支付方式 ID | int | 11 | YES | 否 |
| predetermineStateID | 预定状态ID | int | 11 | YES | 否 |
| arriveTime | 抵达时间 | timestamp | | YES | 否 |
| deposit | 押金 | decimal | 8,2 | YES | 否 |
| predetermineDay | 预定天数 | varchar | 10 | YES | 否 |
| remind | 到时提示 | int | 11 | YES | 否 |
入住细节表的详细描述如表4-11所示。
表4-11入住细节表
|----------------|----------|-----|----|-------|------|
| 字段名称 | 字段描述 | 类型 | 长度 | 能否为空 | 是否主键 |
| id | 住宿登记明细id | int | 11 | FALSE | 是 |
| stayRegisterID | 住宿登记id | int | 11 | YES | 否 |
| passengerID | 旅客id | int | 11 | YES | 否 |
团队表的详细描述如表4-12所示。
表4-12团队表
|--------------|--------|-----------|----|-------|------|
| 字段名称 | 字段描述 | 类型 | 长度 | 能否为空 | 是否主键 |
| id | 接待对象ID | int | 11 | FALSE | 是 |
| targetTypeID | 对象类别ID | int | 11 | YES | 否 |
| principal | 负责人 | int | 11 | YES | 否 |
| teamName | 团队名称 | | | | |
| teamCode | 团队编号 | | | | |
| registerTime | 登记时间 | timestamp | | YES | 否 |
4.3 数据库物理结构的设计
4.3.1 用户表的建立
sql
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userName` varchar(20) DEFAULT NULL,
`password` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
4.3.2 房间信息表的建立
sql
DROP TABLE IF EXISTS `room`;
CREATE TABLE `room` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '房间id',
`guestRoomLevelID` int(11) DEFAULT NULL COMMENT '客房等级ID',
`roomStateID` int(11) DEFAULT NULL COMMENT '房态ID',
`roomNumber` varchar(10) DEFAULT NULL COMMENT '房间号',
`roomAmount` varchar(10) DEFAULT NULL COMMENT '床位数',
`standardPriceDay` decimal(8,2) DEFAULT NULL COMMENT '标准房价/天',
`standardPrice` decimal(8,2) DEFAULT NULL COMMENT '标准房价/小时',
`maxDuration` varchar(10) DEFAULT NULL COMMENT '时长限制(小时)',
`firstDuration` varchar(10) DEFAULT NULL COMMENT '首段时长(小时)',
`firstPrice` decimal(8,2) DEFAULT NULL COMMENT '首段价格',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8;
4.3.3 旅客信息表的建立
sql
DROP TABLE IF EXISTS `passenger`;
CREATE TABLE `passenger` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '旅客ID',
`papersID` int(11) DEFAULT NULL COMMENT '证件ID',
`educationDegreeID` int(11) DEFAULT NULL COMMENT '文化程度ID',
`genderID` int(11) DEFAULT NULL COMMENT '性别ID',
`passengerLevelID` int(11) DEFAULT NULL COMMENT '旅客级别ID',
`nationID` int(11) DEFAULT NULL COMMENT '民族ID',
`thingReasonID` int(11) DEFAULT NULL COMMENT '事由',
`name` varchar(20) DEFAULT NULL COMMENT '姓名',
`papersNumber` varchar(30) DEFAULT NULL COMMENT '证件号码',
`birthDate` varchar(30) DEFAULT NULL COMMENT '出生日期',
`licenceIssuingAuthorty` varchar(50) DEFAULT NULL COMMENT '发证机关',
`unitsOrAddress` varchar(50) DEFAULT NULL COMMENT '单位或住址',
`papersValidity` varchar(50) DEFAULT NULL COMMENT '证件有效期',
`profession` varchar(20) DEFAULT NULL COMMENT '职业',
`whereAreFrom` varchar(100) DEFAULT NULL COMMENT '从何处来',
`whereToGo` varchar(100) DEFAULT NULL COMMENT '到哪里去',
`contactPhoneNumber` varchar(20) DEFAULT NULL COMMENT '联系电话',
`remarks` varchar(100) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8;
4.3.4 账单表的建立
sql
DROP TABLE IF EXISTS `stayregister`;
CREATE TABLE `stayregister` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '住宿登记ID',
`predetermineID` int(11) DEFAULT NULL COMMENT '预定ID',
`rentOutTypeID` int(11) DEFAULT NULL COMMENT '出租方式ID',
`roomID` int(11) DEFAULT NULL COMMENT '房间ID',
`payWayID` int(11) DEFAULT NULL COMMENT '结账方式ID',
`billUnitID` int(11) DEFAULT NULL COMMENT '结账单位ID',
`passengerTypeID` int(11) DEFAULT NULL COMMENT '旅客类别ID',
`receiveTargetID` int(11) DEFAULT NULL COMMENT '接待对象ID',
`deputyID` int(11) DEFAULT NULL COMMENT '副ID',
`isBillID` int(11) DEFAULT NULL COMMENT '结账否',
`registerTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '登记时间',
`stayNumber` varchar(20) DEFAULT NULL COMMENT '住店天数/小时',
`sumConst` decimal(8,2) DEFAULT NULL COMMENT '总费用',
`ChangingRoomNumber` varchar(10) DEFAULT NULL COMMENT '换房次数',
`changRoomMoney` decimal(8,2) DEFAULT NULL COMMENT '换房费',
`remarks` varchar(200) DEFAULT NULL COMMENT '备注',
`payTime` timestamp NULL DEFAULT NULL COMMENT '结账时间',
`changRoomTime` timestamp NULL DEFAULT NULL COMMENT '换房时间',
`remind` int(11) DEFAULT '0' COMMENT '提醒结账',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8;
4.3.5 属性表的建立
sql
DROP TABLE IF EXISTS `attribute`;
CREATE TABLE `attribute` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '属性ID',
`attributeName` varchar(30) DEFAULT NULL COMMENT '属性名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;
4.3.6属性细节表的建立
sql
DROP TABLE IF EXISTS `attributedetails`;
CREATE TABLE `attributedetails` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '属性明细ID',
`attributeID` int(11) DEFAULT NULL COMMENT '属性ID',
`attributeDetailsName` varchar(30) DEFAULT NULL COMMENT '属性明细名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=73 DEFAULT CHARSET=utf8;
4.3.7商品表的建立
sql
DROP TABLE IF EXISTS `commodity`;
CREATE TABLE `commodity` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品ID',
`commodityTypeID` int(11) DEFAULT NULL COMMENT '商品类别ID',
`uOMID` int(11) DEFAULT NULL COMMENT '计量单位ID',
`commodityName` varchar(50) DEFAULT NULL COMMENT '商品名称',
`salePrice` decimal(8,2) DEFAULT NULL COMMENT '销售价格',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;
4.3.8 商品消费表的建立
sql
DROP TABLE IF EXISTS `consumptiondetails`;
CREATE TABLE `consumptiondetails` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '消费明细ID',
`stayRegisterID` int(11) DEFAULT NULL COMMENT '住宿登记ID',
`commodityID` int(11) DEFAULT NULL COMMENT '商品ID',
`consumptionNumber` varchar(10) DEFAULT NULL COMMENT '消费数量',
`consumptionMoney` decimal(8,2) DEFAULT NULL COMMENT '消费金额',
`consumptionTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '消费时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8;
4.3.9 押金表的建立
sql
DROP TABLE IF EXISTS `depoit`;
CREATE TABLE `depoit` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`stayRegisterID` int(11) DEFAULT NULL COMMENT '住宿登记ID',
`payWayID` int(11) DEFAULT NULL COMMENT '支付方式ID',
`registerTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '登记时间',
`deposit` decimal(8,2) DEFAULT NULL COMMENT '押金',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=84 DEFAULT CHARSET=utf8;
4.3.10 预定表的建立
sql
DROP TABLE IF EXISTS `predetermine`;
CREATE TABLE `predetermine` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '预定ID',
`roomID` int(11) DEFAULT NULL COMMENT '房间ID',
`predetermineTargetID` int(11) DEFAULT NULL COMMENT '预定对象ID',
`passengerID` int(11) DEFAULT NULL COMMENT '旅客ID',
`payWayID` int(11) DEFAULT NULL COMMENT '支付方式 ID',
`predetermineStateID` int(11) DEFAULT NULL COMMENT '预定状态ID',
`arriveTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '抵达时间',
`deposit` decimal(8,2) DEFAULT NULL COMMENT '押金',
`predetermineDay` varchar(10) DEFAULT NULL COMMENT '预定天数',
`remind` int(11) DEFAULT '0' COMMENT '到时提示',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8;
4.3.11 团队表的建立
sql
DROP TABLE IF EXISTS `receivetarget`;
CREATE TABLE `receivetarget` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '接待对象ID',
`targetTypeID` int(11) DEFAULT NULL COMMENT '对象类别ID',
`principal` varchar(20) DEFAULT NULL COMMENT '负责人',
`teamName` varchar(30) DEFAULT NULL COMMENT '团队名称',
`teamCode` varchar(30) DEFAULT NULL COMMENT '团队编号',
`registerTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '登记时间',
`contactPhoneNUmber` varchar(20) DEFAULT NULL COMMENT '联系电话',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;
4.3.12 入住细节表的建立
sql
DROP TABLE IF EXISTS `stayregisterdetails`;
CREATE TABLE `stayregisterdetails` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '住宿登记明细id',
`stayRegisterID` int(11) DEFAULT NULL COMMENT '住宿登记id',
`passengerID` int(11) DEFAULT NULL COMMENT '旅客id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=56 DEFAULT CHARSET=utf8;
4.4 本次实验小结
通过本次实验,我们完成了酒店管理系统的数据库设计工作,从概念结构设计(ER图)到逻辑结构设计(数据表定义),再到物理结构实现(SQL建表语句),系统地构建了支撑整个业务流程的数据模型。在设计过程中,我们充分考虑了系统功能需求,如旅客登记、房间分配、预订管理、消费记录与账单生成等,合理划分了12张核心数据表,并通过主外键关系实现了各实体间的有效关联。同时,在字段类型、长度及约束设置上注重数据完整性与一致性,为后续系统开发提供了可靠的数据基础。本次实验不仅加深了我们对数据库设计方法的理解,也提升了将实际业务需求转化为规范化数据库结构的能力。
实验五 系统实现与测试
5.1 房间管理用例实现描述
房间管理分为客房设置和商品设置。客房设置分为查询房间、新增房间、修改房间、删除房间四个功能,其中查询房间和修改房间为通用功能,查询房间通过输入房间号实现,可查询相应的客房等级、房间状态、床位数、标准价格等信息;酒店前台和清洁人员可以对房间状态进行修改。新增、删除房间为大堂经理的私有功能。可使用商品设置功能对房间内的商品的种类和价格等进行调整。
5.1.1 客房设置实现界面
1、查询功能实现


2、新增功能实现



3、修改功能实现


4、删除功能实现



5.1.2商品设置实现界面
1、商品种类查询

2、商品设置实现


5.1.3 房间管理用例代码
1、房间设置
java
package com.gx.web;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.google.gson.Gson;
import com.gx.page.Page;
import com.gx.po.AttributePo;
import com.gx.po.RoomSetPo;
import com.gx.service.AttributeService;
import com.gx.service.RoomSetService;
@Controller
@RequestMapping("/RoomSet")
public class RoomSet {
@Autowired
private AttributeService attributeService;
@Autowired
private RoomSetService roomSetService;
/* @RequestMapping("/tolist")
public ModelAndView tolist(){
ModelAndView mv=null;
List<RoomSetPo> list=roomSetService.selectAll();
mv=new ModelAndView("/roomset/roomset");
mv.addObject("list",list);
return mv;
}*/
@RequestMapping("/tolist")
public ModelAndView list(HttpServletRequest request,Integer currentPage,String txtname){
ModelAndView mv=null;
mv=new ModelAndView("/roomset/roomset");
Page<RoomSetPo> vo=new Page<RoomSetPo>();
if (currentPage==null) {
currentPage=1;
}else if (currentPage==0) {
currentPage=1;
}
if(txtname==null)
{
txtname="";
}
vo.setCurrentPage(currentPage);
vo=this.roomSetService.pageFuzzyselect(txtname, vo);
mv.addObject("list",vo);
mv.addObject("txtname",txtname);
return mv;
}
@RequestMapping("/toadd")
public ModelAndView toadd(){
ModelAndView mv=null;
List<AttributePo> listOne=attributeService.selectGuestRoomLevel();
List<AttributePo> listTwo=attributeService.selectRoomState();
mv=new ModelAndView("/roomset/add");
mv.addObject("listOne",listOne);
mv.addObject("listTwo",listTwo);
return mv;
}
@RequestMapping("/add")
public ModelAndView add(RoomSetPo roomSetPo){
ModelAndView mv=null;
roomSetService.insertAll(roomSetPo);
mv=new ModelAndView("redirect:/RoomSet/tolist.do");
return mv;
}
@RequestMapping("/toupdate")
public ModelAndView toupdate(int id){
ModelAndView mv=null;
List<AttributePo> listOne=attributeService.selectGuestRoomLevel();
List<AttributePo> listTwo=attributeService.selectRoomState();
RoomSetPo listPo=roomSetService.selectById(id);
mv=new ModelAndView("/roomset/update");
mv.addObject("listOne",listOne);
mv.addObject("listTwo",listTwo);
mv.addObject("listPo",listPo);
return mv;
}
@RequestMapping("/update")
public ModelAndView update(RoomSetPo roomSetPo){
ModelAndView mv=null;
roomSetService.updateById(roomSetPo);
mv=new ModelAndView("redirect:/RoomSet/tolist.do");
return mv;
}
@RequestMapping("/delete")
public ModelAndView delete(String id){
ModelAndView mv=null;
String[] FenGe=id.split(",");
for (int i = 0; i < FenGe.length; i++) {
roomSetService.deleteById(Integer.parseInt(FenGe[i]));
}
mv=new ModelAndView("redirect:/RoomSet/tolist.do");
return mv;
}
@ResponseBody
@RequestMapping(value="/YZ")
public Object YZ(String roomNumber){
int YorN=roomSetService.selectYZ(roomNumber);
Gson gson =new Gson();
return gson.toJson(YorN);
}
}
2、商品设置代码
java
package com.gx.web;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.google.gson.Gson;
import com.gx.page.Page;
import com.gx.po.AttributePo;
import com.gx.po.CommodityPo;
import com.gx.po.RoomSetPo;
import com.gx.service.AttributeService;
import com.gx.service.CommodityService;
@Controller
@RequestMapping("/Commodity")
public class Commodity {
@Autowired
private CommodityService commodityService;
@Autowired
private AttributeService attributeService;
//分页和模糊查询
@RequestMapping("/tolist")
public ModelAndView list(HttpServletRequest request, Integer currentPage, String txtname,Integer commodityTypeID){
ModelAndView mv=null;
List<AttributePo> listOne=attributeService.selectCommodityType();
mv=new ModelAndView("/commodity/list");
Page<CommodityPo> vo=new Page<CommodityPo>();
if (commodityTypeID==null) {
commodityTypeID=16;
}
if (currentPage==null) {
currentPage=1;
}else if (currentPage==0) {
currentPage=1;
}
if(txtname==null)
{
txtname="";
}
vo.setCurrentPage(currentPage);
vo=this.commodityService.pageFuzzyselect(txtname,commodityTypeID, vo);
mv.addObject("list",vo);
mv.addObject("txtname",txtname);
mv.addObject("listOne",listOne);
mv.addObject("commodityType",commodityTypeID);
return mv;
}
@RequestMapping("/toadd")
public ModelAndView toadd(){
ModelAndView mv=null;
List<AttributePo> listOne=attributeService.selectUOM();
List<AttributePo> listTwo=attributeService.selectCommodityType();
mv=new ModelAndView("/commodity/add");
mv.addObject("listOne",listOne);
mv.addObject("listTwo",listTwo);
return mv;
}
@RequestMapping("/add")
public ModelAndView add(CommodityPo commodityPo){
ModelAndView mv=null;
commodityService.insertAll(commodityPo);
mv=new ModelAndView("redirect:/Commodity/tolist.do");
return mv;
}
@RequestMapping("/toupdate")
public ModelAndView toupdate(int id){
ModelAndView mv=null;
List<AttributePo> listOne=attributeService.selectUOM();
List<AttributePo> listTwo=attributeService.selectCommodityType();
CommodityPo commodityPo=commodityService.selectById(id);
mv=new ModelAndView("/commodity/update");
mv.addObject("listOne",listOne);
mv.addObject("listTwo",listTwo);
mv.addObject("listPo",commodityPo);
return mv;
}
@RequestMapping("/update")
public ModelAndView update(CommodityPo commodityPo){
ModelAndView mv=null;
commodityService.updateById(commodityPo);
mv=new ModelAndView("redirect:/Commodity/tolist.do");
return mv;
}
@RequestMapping("/delete")
public ModelAndView delete(String id){
ModelAndView mv=null;
String[] FenGe=id.split(",");
for (int i = 0; i < FenGe.length; i++) {
commodityService.deleteById(Integer.parseInt(FenGe[i]));
}
mv=new ModelAndView("redirect:/Commodity/tolist.do");
return mv;
}
@RequestMapping("/openwindow")
public ModelAndView openwindow(){
ModelAndView mv=null;
mv=new ModelAndView("/commodity/commoditytype");
return mv;
}
@RequestMapping("/newadd")
public ModelAndView newadd(String txtname){
ModelAndView mv=null;
int newid=3;
attributeService.insertAll(newid,txtname);
mv=new ModelAndView("redirect:/Commodity/tolist.do");
return mv;
}
@RequestMapping("/newdelete")
public ModelAndView newdelete(String id){
ModelAndView mv=null;
String[] FenGe=id.split(",");
for (int i = 0; i < FenGe.length; i++) {
attributeService.deleteById(Integer.parseInt(FenGe[i]));
}
mv=new ModelAndView("redirect:/Commodity/tolist.do");
return mv;
}
@ResponseBody
@RequestMapping(value="/YZ")
public Object YZ(String commodityName){
int YorN=commodityService.selectYZ(commodityName);
Gson gson =new Gson();
return gson.toJson(YorN);
}
}
5.2 住宿管理用例实现描述
房间管理是对旅客进行客房预订和客房登记的操作,所以需要同时对旅客和房间的信息进行更改。客房预定首先要选择相应的旅客,再对旅客的要求进行房间选择,如果时间超过预定时间的话,就会变红。房间登记直接对空房进行登记。
5.2.1 住宿管理-客房预订用例实现界面

5.2.2 住宿管理-客房预订用例测试用例





5.2.3 住宿管理-客房预订用例实现主要代码
java
package com.gx.web;
import java.io.UnsupportedEncodingException;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.google.gson.Gson;
import com.gx.dao.PredetermineDao;
import com.gx.page.Page;
import com.gx.po.AttributePo;
import com.gx.po.PassengerPo;
import com.gx.po.PredeterminePo;
import com.gx.po.ReceiveTargetPo;
import com.gx.po.RoomSetPo;
import com.gx.po.StayRegisterPo;
import com.gx.service.AttributeService;
import com.gx.service.PassengerService;
import com.gx.service.PredetermineService;
import com.gx.service.ReceiveTargetService;
import com.gx.service.RoomSetService;
import com.gx.service.StayRegisterService;
@Controller
@RequestMapping("/Predetermine")
public class Predetermine {
@Autowired
private PassengerService passengerService;
@Autowired
private ReceiveTargetService receiveTargetService;
@Autowired
private AttributeService attributeService;
@Autowired
private RoomSetService roomSetService;
@Autowired
private PredetermineService predetermineService;
@Autowired
private StayRegisterService stayRegisterService;
int idP[]; //预订id
int fangJianId[];
@RequestMapping("/tolist")
public ModelAndView tolist(HttpServletRequest request, Integer currentPage,
String txtname,Integer state){
ModelAndView mv=null;
Date date=new Date();
DateFormat dformat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置日期格式
Timestamp timestamp=Timestamp.valueOf(dformat.format(date)) ; //将当前时间转为字符串
List<PredeterminePo> list=this.predetermineService.selectAll();
long shiJianCha;
for (int i = 0; i < list.size(); i++) {
Timestamp huoQuShiJian=list.get(i).getArriveTime(); //获取到达时间
shiJianCha=timestamp.getTime()-huoQuShiJian.getTime(); //计算时间差
if (shiJianCha>=0) {
Integer huoQuId=list.get(i).getId();
this.predetermineService.updateRemind(huoQuId);
}
}
if (currentPage==null) {
currentPage=1;
}else if (currentPage==0) {
currentPage=1;
}
if (state==null) {
state=66;
}
if(txtname==null)
{
txtname="";
}
List<AttributePo> listOne=attributeService.selectPredetermineState();
Page<PredeterminePo> vo=new Page<PredeterminePo>();
vo.setCurrentPage(currentPage);
vo=this.predetermineService.pageFuzzyselect(txtname, txtname, state, vo);
mv=new ModelAndView("/predetermine/list");
mv.addObject("listOne",listOne);
mv.addObject("txtname",txtname);
mv.addObject("state",state);
mv.addObject("list",vo);
return mv;
}
//ajax旅客
@ResponseBody
@RequestMapping(value="/selectPassenger")
public Object selectPassenger(String txtname){
if(txtname==null){
txtname="";
}
List<PassengerPo> list=passengerService.selectAjaxList(txtname);
Gson gson=new Gson();
return gson.toJson(list);
}
@ResponseBody
@RequestMapping(value="/selectTarget")
public Object selectTarget(String txtname){
if (txtname==null) {
txtname="";
}
List<ReceiveTargetPo> list=receiveTargetService.ajaxSelect(txtname);
Gson gson=new Gson();
return gson.toJson(list);
}
@ResponseBody
@RequestMapping(value="/confirmPassenger")
public Object confirmPassenger(Integer id){
PassengerPo list=passengerService.selectById(id);
Gson gson=new Gson();
return gson.toJson(list.getContactPhoneNumber());
}
//去新增界面
@RequestMapping("/toadd")
public ModelAndView toadd(Integer id,String name,Integer type) throws UnsupportedEncodingException{
ModelAndView mv=null;
List<AttributePo> listOne=attributeService.selectPayWay();
mv=new ModelAndView("/predetermine/add");
mv.addObject("id",id);
name = new String(name.getBytes("ISO8859-1"),"utf-8");
mv.addObject("name",name);
mv.addObject("type",type);
mv.addObject("listOne",listOne);
return mv;
}
//新增
@RequestMapping("/add")
public ModelAndView add(Integer id,Integer type, String roomIdShuZu,PredeterminePo po,Integer pangduan){
ModelAndView mv=null;
if(pangduan!=null){
for (int i = 0; i < idP.length; i++) {
predetermineService.deleteById(idP[i]);
}
RoomSetPo roomSetPo=new RoomSetPo();
roomSetPo.setRoomStateID(1); //将此房态设置为空房
for (int i = 0; i < fangJianId.length; i++) {
roomSetPo.setId(fangJianId[i]);
roomSetService.updateByIdToRoomState(roomSetPo); //修改此房态
}
}
String[] FenGe=roomIdShuZu.split(","); //分割为数组
int changDu=FenGe.length; //获取数组长度
double yaJin=po.getDeposit(); //获取押金
double yaJinFenGe=yaJin/changDu; //得到平均押金
po.setDeposit(yaJinFenGe); //设po的押金
po.setPredetermineStateID(66); //设置预订状态为未按排
if(type==1){ //如果为团队
po.setPassengerID(0); //设置预订旅客id为0
po.setPredetermineTargetID(id); //设置团队id
}else if(type==2){ //判断是否为旅客
po.setPassengerID(id); //给预订赋值旅客id
po.setPredetermineTargetID(2); //设置团队id
}
RoomSetPo roomSetPo=new RoomSetPo();
roomSetPo.setRoomStateID(4); //设置此房态为预订
for(int i=0;i<changDu;i++){
po.setRoomID(Integer.parseInt(FenGe[i])); //给预订设置房间id
predetermineService.insertAll(po); //新增预订单
roomSetPo.setId(Integer.parseInt(FenGe[i])); //更改房态的 获取房间id
roomSetService.updateByIdToRoomState(roomSetPo);//修改房态为预订
}
mv=new ModelAndView("redirect:/Predetermine/tolist.do");
return mv;
}
@ResponseBody
@RequestMapping(value="/selectRoom")
public Object selectRoom(String roomNumber){
if(roomNumber==null){
roomNumber="";
}
List<RoomSetPo> list=roomSetService.selectInformation(roomNumber);
Gson gson=new Gson();
return gson.toJson(list);
}
//去修改界面
@RequestMapping("/toupdate")
public ModelAndView toupdate(Integer id){
idP=null;
fangJianId=null;
ModelAndView mv=null;
int idid=0;
PredeterminePo zuwenPo=predetermineService.findById(id); //根据预订id来查询预订数据
int lvKeId=zuwenPo.getPassengerID(); //获取预订旅客id
int teamId=zuwenPo.getPredetermineTargetID(); //获取预订团队id
List<PredeterminePo> teamList=null;
List<PredeterminePo> lvKeList=null;
List<AttributePo> listOne=attributeService.selectPayWay();
double yaJin=0;
int zhengShu=0;
String nameString="";
List<RoomSetPo> roomSetPolist=new ArrayList<RoomSetPo>();
RoomSetPo roomSetPo=null;
int type=0;
mv=new ModelAndView("/predetermine/update");
if (lvKeId==0) {
idid=teamId;
teamList=predetermineService.findTeamId(teamId);
idP=new int[teamList.size()];
fangJianId=new int[teamList.size()];
for (int i = 0; i < teamList.size(); i++) {
yaJin+=teamList.get(i).getDeposit();
roomSetPo=roomSetService.selectById(teamList.get(i).getRoomID());
roomSetPolist.add(roomSetPo);
idP[i]=teamList.get(i).getId();
fangJianId[i]=teamList.get(i).getRoomID();
}
zhengShu=(int)yaJin;
mv.addObject("listList",teamList);
nameString=teamList.get(0).getReceiveTeamName();
type=1;
}else {
idid=lvKeId;
lvKeList=predetermineService.findLvKeId(lvKeId);
idP=new int[lvKeList.size()];
fangJianId=new int[lvKeList.size()];
for (int i = 0; i < lvKeList.size(); i++) {
yaJin+=lvKeList.get(i).getDeposit();
roomSetPo=roomSetService.selectById(lvKeList.get(i).getRoomID());
roomSetPolist.add(roomSetPo);
idP[i]=lvKeList.get(i).getId();
fangJianId[i]=lvKeList.get(i).getRoomID();
}
zhengShu=(int)yaJin;
mv.addObject("listList",lvKeList);
nameString=lvKeList.get(0).getPassengerName();
type=2;
}
mv.addObject("id",idid);
mv.addObject("listOne",listOne);
mv.addObject("roomSetPolist",roomSetPolist);
mv.addObject("zhengShu",zhengShu);
mv.addObject("name",nameString);
mv.addObject("type",type);
mv.addObject("pangduan",1);
return mv;
}
//修改房间,移除房间时更改房态
/*@RequestMapping("/changRoomState")
public ModelAndView changRoomState(){
ModelAndView mv=null;
return mv;
}*/
//修改房间,移除房间时更改房态
@RequestMapping("/delete")
public ModelAndView delete(String id){
ModelAndView mv=null;
String[] FenGe=id.split(",");
for (int i = 0; i < FenGe.length; i++) {
this.predetermineService.deleteById(Integer.parseInt(FenGe[i]));
}
mv=new ModelAndView("redirect:/Predetermine/tolist.do");
return mv;
}
//修改房间,移除房间时更改房态
@RequestMapping("/arrangeRoom")
public ModelAndView arrangeRoom(String id,Integer tiaoZhuang){
ModelAndView mv=null;
Date date=new Date();
DateFormat dformat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置日期格式
Timestamp timestamp=Timestamp.valueOf(dformat.format(date)) ; //将当前时间转为字符串
String[] FenGe=id.split(","); //分割到数组
StayRegisterPo stayRegisterPo=new StayRegisterPo();
RoomSetPo roomSetPoToRoomState=new RoomSetPo();
for (int i = 0; i < FenGe.length; i++) {
this.predetermineService.updatePredetermineStateID(Integer.parseInt(FenGe[i])); //修改预订状态
PredeterminePo predeterminePo=this.predetermineService.findById(Integer.parseInt(FenGe[i])); //查询预订信息
RoomSetPo roomSetPo=this.roomSetService.selectById(predeterminePo.getRoomID()); //查询房间信息
stayRegisterPo.setRoomID(predeterminePo.getRoomID()); //设置房间id
stayRegisterPo.setRentOutTypeID(26);
stayRegisterPo.setPassengerTypeID(29);
if (predeterminePo.getPassengerID()==0) { //判断是否为团队还是散客
stayRegisterPo.setBillUnitID(28);
}else {
stayRegisterPo.setBillUnitID(27);
}
stayRegisterPo.setReceiveTargetID(predeterminePo.getPredetermineTargetID());
stayRegisterPo.setIsBillID(68);
stayRegisterPo.setRegisterTime(timestamp);
stayRegisterPo.setStayNumber(predeterminePo.getPredetermineDay());
stayRegisterPo.setSumConst(roomSetPo.getStandardPriceDay()
*Integer.parseInt(predeterminePo.getPredetermineDay())); //获取房价 乘以 住宿天数
stayRegisterService.insertAll(stayRegisterPo); //新增成功时,获取刚新增的id。
Integer stayId=stayRegisterPo.getId();
stayRegisterService.updateStayRegisterPredetermineID(Integer.parseInt(FenGe[i]), stayId);
stayRegisterPo.setDepositStayRegisterID(stayId);
stayRegisterPo.setDepositRegisterTime(timestamp);
stayRegisterPo.setDepositPayWayID(predeterminePo.getPayWayID());
stayRegisterPo.setDeposit(predeterminePo.getDeposit());
stayRegisterService.insertDeposit(stayRegisterPo);
roomSetPoToRoomState.setId(predeterminePo.getRoomID()); //给新的 Po 赋房间ID的值
roomSetPoToRoomState.setRoomStateID(65); //给新的 Po 赋房态的值
roomSetService.updateByIdToRoomState(roomSetPoToRoomState); //根据 房间ID 来修改 当前被选中的房间的房态
}
if (tiaoZhuang==1) {
mv=new ModelAndView("redirect:/StayRegister/tolist.do");
}else if (tiaoZhuang==2){
mv=new ModelAndView("redirect:/Predetermine/tolist.do");
}
return mv;
}
}
5.2.4 住宿管理-客房登记用例实现用例

5.2.5 住宿管理-客房登记用例测试用例





5.2.6 住宿管理-客房登记用例主要实现代码
java
package com.gx.web;
import java.io.UnsupportedEncodingException;
import java.sql.Time;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.omg.PortableServer.POA;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.google.gson.Gson;
import com.gx.page.Page;
import com.gx.po.AttributePo;
import com.gx.po.CommodityPo;
import com.gx.po.PassengerPo;
import com.gx.po.ReceiveTargetPo;
import com.gx.po.RoomSetPo;
import com.gx.po.StayRegisterPo;
import com.gx.service.AttributeService;
import com.gx.service.CommodityService;
import com.gx.service.PassengerService;
import com.gx.service.ReceiveTargetService;
import com.gx.service.RoomSetService;
import com.gx.service.StayRegisterService;
import com.gx.vo.TeamPayVo;
@Controller
@RequestMapping("/StayRegister")
public class StayRegister {
@Autowired
private AttributeService attributeService;
@Autowired
private RoomSetService roomSetService;
@Autowired
private StayRegisterService stayRegisterService;
@Autowired
private PassengerService passengerService;
@Autowired
private CommodityService commodityService;
@Autowired
private ReceiveTargetService receiveTargetService;
int fangjianId=0;
String lvkeName="";
double zhuDianTianShu=0; //住店天数
double shengZhuDianTianShu=0; //剩住店天数
double zhuDianTianShuOne=0; //住店天数
//散客的list查询
@RequestMapping("/tolist")
public ModelAndView tolist(HttpServletRequest request, Integer currentPage,
String txtname,Integer LvKeLeiXingId,Integer isBillID){
ModelAndView mv=null;
List<StayRegisterPo> listAll=stayRegisterService.selectAll();
Date date=new Date();
DateFormat dformat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置日期格式
Timestamp timestamp=Timestamp.valueOf(dformat.format(date)) ; //将当前时间转为字符串
int id=0;
long xiangChaTianShu;
long days;
long hours;
String zhuSu="";
for (int i = 0; i < listAll.size(); i++) {
id=listAll.get(i).getId(); //获取ID
Timestamp registerTime=listAll.get(i).getRegisterTime(); //获取登记时间
zhuSu=listAll.get(i).getStayNumber(); //获取登记时间
xiangChaTianShu=timestamp.getTime()-registerTime.getTime(); //当前时间-登记时间
days=xiangChaTianShu/(1000 * 60 * 60 * 24); //转化为天
hours=xiangChaTianShu/(1000 * 60 * 60 )-days*24; //转化为小时
if (Long.parseLong(zhuSu)<=days) {
if (hours>0) {
stayRegisterService.updateRemind(id, 1);
}
}
}
List<AttributePo> listOne=attributeService.selectIsPay();
mv=new ModelAndView("/stayregister/list");
if (isBillID==null) {
isBillID=68;
}
if (LvKeLeiXingId==null) {
LvKeLeiXingId=55;
}
if (currentPage==null) {
currentPage=1;
}else if (currentPage==0) {
currentPage=1;
}
Page<StayRegisterPo> vo=new Page<StayRegisterPo>();
vo.setCurrentPage(currentPage);
if(txtname==null)
{
txtname="";
}
vo=this.stayRegisterService.pageFuzzyselectOne(LvKeLeiXingId, isBillID, txtname, vo);
mv.addObject("list",vo);
mv.addObject("listOne",listOne);
mv.addObject("LvKeLeiXingId",LvKeLeiXingId);
mv.addObject("isBillID",isBillID);
mv.addObject("txtname",txtname);
return mv;
}
//团队的list查询
@RequestMapping("/toteamlist")
public ModelAndView toteamlist(HttpServletRequest request, Integer currentPage,
String txtname,Integer LvKeLeiXingId,Integer isBillID,Integer tuanDuiID,
String teamNameId, String teamCodeId, String principalId,
String contactPhoneNUmberId, String registerTimeId){
ModelAndView mv=null;
List<StayRegisterPo> listTeam=null;
List<StayRegisterPo> listAll=stayRegisterService.selectAll();
Date date=new Date();
DateFormat dformat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置日期格式
Timestamp timestamp=Timestamp.valueOf(dformat.format(date)) ; //将当前时间转为字符串
int id=0;
long xiangChaTianShu;
long days;
long hours;
String zhuSu="";
double teamSumConst=0;
for (int i = 0; i < listAll.size(); i++) {
id=listAll.get(i).getId(); //获取ID
Timestamp registerTime=listAll.get(i).getRegisterTime(); //获取登记时间
zhuSu=listAll.get(i).getStayNumber(); //获取登记时间
xiangChaTianShu=timestamp.getTime()-registerTime.getTime(); //当前时间-登记时间
days=xiangChaTianShu/(1000 * 60 * 60 * 24); //转化为天
hours=xiangChaTianShu/(1000 * 60 * 60 )-days*24; //转化为小时
if (Long.parseLong(zhuSu)<=days) {
if (hours>0) {
stayRegisterService.updateRemind(id, 1);
}
}
}
List<AttributePo> listOne=attributeService.selectIsPay();
mv=new ModelAndView("/stayregister/list");
if (isBillID==null) {
isBillID=68;
}
if (LvKeLeiXingId==null) {
LvKeLeiXingId=56;
}
if (tuanDuiID==null) {
listTeam=this.stayRegisterService.selectFormTeamIdTwo(isBillID);
}else {
listTeam=this.stayRegisterService.selectFormTeamId(tuanDuiID, isBillID);
}
if (currentPage==null) {
currentPage=1;
}else if (currentPage==0) {
currentPage=1;
}
for (int i = 0; i < listTeam.size(); i++) {
teamSumConst+=listTeam.get(i).getSumConst();
}
Page<StayRegisterPo> vo=new Page<StayRegisterPo>();
vo.setCurrentPage(currentPage);
if(txtname==null)
{
txtname="";
}
if (tuanDuiID==null) {
vo=this.stayRegisterService.pageFuzzyselectThree(isBillID, txtname, vo);
}else {
vo=this.stayRegisterService.pageFuzzyselectTwo(tuanDuiID, isBillID, txtname, vo);
}
mv.addObject("list",vo);
mv.addObject("listOne",listOne);
mv.addObject("LvKeLeiXingId",LvKeLeiXingId);
mv.addObject("isBillID",isBillID);
mv.addObject("txtname",txtname);
mv.addObject("tuanDui",tuanDuiID);
mv.addObject("teamNameId",teamNameId);
mv.addObject("teamCodeId",teamCodeId);
mv.addObject("principalId",principalId);
mv.addObject("contactPhoneNUmberId",contactPhoneNUmberId);
mv.addObject("registerTimeId",registerTimeId);
mv.addObject("teamSumConst",teamSumConst);
return mv;
}
@ResponseBody
@RequestMapping(value="/ajaxSelectTeamSumcont")
public Object ajaxSelectTeamSumcont(Integer tuanDuiID, Integer isBillID){
double teamSumConst=0;
List<StayRegisterPo> listTeam=this.stayRegisterService.selectFormTeamId(tuanDuiID, isBillID);
for (int i = 0; i < listTeam.size(); i++) {
teamSumConst+=listTeam.get(i).getSumConst();
}
Gson gson=new Gson();
return gson.toJson(teamSumConst);
}
@RequestMapping("/toadd")
public ModelAndView toadd(){
ModelAndView mv=null;
mv=new ModelAndView("/stayregister/add");
return mv;
}
//登记
@RequestMapping("/toregister")
public ModelAndView toregister(int id,String roomNumber,Integer LvKeLeiXingId){
ModelAndView mv=null;
List<AttributePo> listGender=attributeService.selectGender(); //性别
List<AttributePo> listNation=attributeService.selectNation(); //民族
List<AttributePo> listPassengerLevel=attributeService.selectPassengerLevel(); //旅客级别
List<AttributePo> listEducationDegree=attributeService.selectEducationDegree(); //文化程度
List<AttributePo> listPapers=attributeService.selectPapers(); //证件类型
List<AttributePo> listThingReason=attributeService.selectThingReason(); //事由
mv=new ModelAndView("/stayregister/register");
mv.addObject("roomNumber",roomNumber);
mv.addObject("stayRegisterId",id);
mv.addObject("listGender",listGender);
mv.addObject("listNation",listNation);
mv.addObject("listPassengerLevel",listPassengerLevel);
mv.addObject("listEducationDegree",listEducationDegree);
mv.addObject("listPapers",listPapers);
mv.addObject("listThingReason",listThingReason);
mv.addObject("LvKeLeiXingId",LvKeLeiXingId);
return mv;
}
@RequestMapping("/register")
public ModelAndView register(PassengerPo passengerPo,Integer LvKeLeiXingId){
Integer lvkeid=passengerPo.getLvKeID();
if (lvkeid==null) {
passengerService.insertAll(passengerPo);
lvkeid=passengerPo.getId();
}else {
passengerPo.setId(passengerPo.getStayRegisterID());
passengerService.updateById(passengerPo);
}
stayRegisterService.insertStayregisterdetails(passengerPo.getStayRegisterID(), lvkeid);
ModelAndView mv=null;
mv=new ModelAndView("redirect:/StayRegister/tolist.do?LvKeLeiXingId="+LvKeLeiXingId);
return mv;
}
@ResponseBody
@RequestMapping(value="/selectPassenger")
public Object selectPassenger(String txtname){
if(txtname==null){
txtname="";
}
List<PassengerPo> list=passengerService.selectAjaxList(txtname);
Gson gson=new Gson();
return gson.toJson(list);
}
@ResponseBody
@RequestMapping(value="/confirmPassenger")
public Object confirmPassenger(Integer id){
PassengerPo list=passengerService.selectById(id);
Gson gson=new Gson();
return gson.toJson(list);
}
//安排房间
@RequestMapping("/toarrangeroom")
public ModelAndView toarrangeroom(Integer tuanDuiID,Integer LvKeLeiXingId){
ModelAndView mv=null;
List<RoomSetPo> list=roomSetService.selectAll();
List<AttributePo> listPassengerType=attributeService.selectPassengerType(); //旅客类别
List<AttributePo> listBillUnit=attributeService.selectBillUnit(); //结账单位
List<AttributePo> listPayWay=attributeService.selectPayWay(); //结账方式
List<AttributePo> listRentOutType=attributeService.selectRentOutType(); //出租方式
mv=new ModelAndView("/stayregister/arrangeroom");
mv.addObject("listPassengerType",listPassengerType);
mv.addObject("listBillUnit",listBillUnit);
mv.addObject("listPayWay",listPayWay);
mv.addObject("listRentOutType",listRentOutType);
mv.addObject("list",list);
mv.addObject("tuanDuiID",tuanDuiID);
mv.addObject("LvKeLeiXingId",LvKeLeiXingId);
return mv;
}
@RequestMapping("/arrangeroom")
public ModelAndView arrangeroom(StayRegisterPo stayRegisterPo,Integer LvKeLeiXingId){
ModelAndView mv=null;
stayRegisterPo.setIsBillID(68);
if (stayRegisterPo.getReceiveTargetID()==null) {
stayRegisterPo.setReceiveTargetID(2);
}
int fangJianId=stayRegisterPo.getRoomID();
RoomSetPo roomSetPo=roomSetService.selectById(fangJianId); //根据 房间ID 查询出唯一的数据
int chuZuFangShiId=stayRegisterPo.getRentOutTypeID(); //获取 出租方式
int tianShuOrZhongDian=Integer.parseInt(stayRegisterPo.getStayNumber()); //获取 住店天数/小时
if(chuZuFangShiId==26){
double fagnJia=roomSetPo.getStandardPriceDay(); //获取房价/天
double sumConst=fagnJia*(tianShuOrZhongDian); //房价乘以天数得总费
stayRegisterPo.setSumConst(sumConst);
}else if(chuZuFangShiId==25){
double fagnJia=roomSetPo.getStandardPrice(); //获取房价/小时
int zuiDaShiChang=Integer.parseInt(roomSetPo.getMaxDuration()); //获取最大时长
int shouDuanShiChang=Integer.parseInt(roomSetPo.getFirstDuration()); //获取首段时长
double shouDuanJiGe=roomSetPo.getFirstPrice(); //获取首段价格
if (shouDuanShiChang >= tianShuOrZhongDian) {
double sumConst=shouDuanJiGe; //首时段时长大于 他输入的钟点数
stayRegisterPo.setSumConst(sumConst); //那么按 首段价格计算
}else if (shouDuanShiChang <= tianShuOrZhongDian && tianShuOrZhongDian <= zuiDaShiChang) {
int xiaoShi=tianShuOrZhongDian-shouDuanShiChang; //如果输入的钟点数 在 最大时长的范围之内
double sumConst= shouDuanJiGe+xiaoShi*fagnJia; // 且大于等于首段时长 ,那么 计算出
stayRegisterPo.setSumConst(sumConst); // 首段价格 加上 钟点数乘以 多出的每小时价格
}else if(tianShuOrZhongDian>zuiDaShiChang){
stayRegisterPo.setSumConst(roomSetPo.getStandardPriceDay()); //假如 输入的钟点数大于最大时长那么 按一天的价格计算
}
}
stayRegisterService.insertAll(stayRegisterPo);
int id=stayRegisterPo.getId();
stayRegisterPo.setDepositStayRegisterID(id);
stayRegisterPo.setDepositRegisterTime(stayRegisterPo.getRegisterTime());
stayRegisterService.insertDeposit(stayRegisterPo);
RoomSetPo roomSetPoToRoomState=new RoomSetPo();
roomSetPoToRoomState.setId(fangJianId); //给新的 Po 赋房间ID的值
roomSetPoToRoomState.setRoomStateID(65); //给新的 Po 赋房态的值
roomSetService.updateByIdToRoomState(roomSetPoToRoomState); //根据 房间ID 来修改 当前被选中的房间的房态
mv=new ModelAndView("redirect:/StayRegister/tolist.do?LvKeLeiXingId="+LvKeLeiXingId);
return mv;
}
//换房
@RequestMapping("/tochangroom")
public ModelAndView tochangroom(Integer id,String lvKeName,Integer LvKeLeiXingId){
ModelAndView mv=null;
fangjianId=id;
lvkeName=lvKeName;
Date date=new Date();
DateFormat dformat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置日期格式
Timestamp timestamp=Timestamp.valueOf(dformat.format(date)) ; //将当前时间转为字符串
long xiangChaTianShu; //相差时间:毫秒
long days=0; //相差天数
long hours=0; //相差小时
long daysOne=0;
long hourOne=0;
String zhuSu=""; //住宿天数或小时
Timestamp registerTime; //登记时间
double yaJin=0; //押金
double shangPinXiaoFei=0; //商品消费
double zhuSuFei=0; //住宿费
double fangJia=0; //房价
int chuZuFangShi=0; //出租方式
String huanFangShiJian; //换房时间
List<StayRegisterPo> list=stayRegisterService.selectChangRoom(id);
List<StayRegisterPo> listSource=stayRegisterService.selectMoney(id);
registerTime=list.get(0).getRegisterTime(); //获取登记时间
zhuSu=list.get(0).getStayNumber(); //获取住宿天数或小时
fangJia=list.get(0).getRoomStandardPriceDay(); //获取房价/天
chuZuFangShi=list.get(0).getRentOutTypeID(); //获取出租方式
huanFangShiJian=String.valueOf(list.get(0).getChangRoomTime()); //获取换房时间
if (huanFangShiJian=="" || huanFangShiJian=="null") {
xiangChaTianShu=timestamp.getTime()-registerTime.getTime(); //当前时间-登记时间
days=xiangChaTianShu/(1000 * 60 * 60 * 24); //转化为天
hours=xiangChaTianShu/(1000 * 60 * 60 )-days*24; //转化为24小时之内
if(chuZuFangShi==26){
if(hours<6){
zhuSuFei=days*fangJia;
zhuDianTianShu=days;
}
if (hours>=6 & hours<=15) {
zhuSuFei=days*fangJia+(0.5*fangJia);
zhuDianTianShu=days+0.5;
}else if(hours>15){
zhuSuFei=(days+1)*fangJia;
zhuDianTianShu=days+1;
}
}else if(chuZuFangShi==25){
}
shengZhuDianTianShu=Integer.parseInt(zhuSu)-zhuDianTianShu;
}else {
xiangChaTianShu=timestamp.getTime()-registerTime.getTime(); //当前时间-登记时间
days=xiangChaTianShu/(1000 * 60 * 60 * 24); //转化为天
hours=xiangChaTianShu/(1000 * 60 * 60 )-days*24; //转化为24小时之内
xiangChaTianShu=timestamp.getTime()-Timestamp.valueOf(huanFangShiJian).getTime();//当前时间-上一次换房时间
daysOne=xiangChaTianShu/(1000 * 60 * 60 * 24); //转化为天
hourOne=xiangChaTianShu/(1000 * 60 * 60 )-days*24; //转化为24小时之内
if(chuZuFangShi==26){
if(hourOne<6){
zhuSuFei=daysOne*fangJia;
zhuDianTianShuOne=daysOne;
}
if (hourOne>=6 & hourOne<=15) {
zhuSuFei=daysOne*fangJia+(0.5*fangJia);
zhuDianTianShuOne=daysOne+0.5;
}else if(hourOne>15){
zhuSuFei=(daysOne+1)*fangJia;
zhuDianTianShuOne=daysOne+1;
}
if(hours<6){
zhuDianTianShu=days;
}
if (hours>=6 & hours<=15) {
zhuDianTianShu=days+0.5;
}else if(hours>15){
zhuDianTianShu=days+1;
}
}else if(chuZuFangShi==25){
}
shengZhuDianTianShu=Integer.parseInt(zhuSu)-zhuDianTianShuOne-zhuDianTianShu;
}
for (int i = 0; i < list.size(); i++) {
yaJin+=list.get(i).getDeposit();
}
for (int i = 0; i < listSource.size(); i++) {
shangPinXiaoFei+=listSource.get(i).getConsumptionMoney();
}
mv=new ModelAndView("/stayregister/changroom");
mv.addObject("lvKeName",lvKeName);
mv.addObject("list",list);
mv.addObject("yaJin",yaJin);
mv.addObject("shangPinXiaoFei",shangPinXiaoFei);
mv.addObject("zhuSuFei",zhuSuFei);
mv.addObject("stayId",id);
mv.addObject("zhuDianTianShu",zhuDianTianShu);
mv.addObject("timestamp",timestamp);
mv.addObject("LvKeLeiXingId",LvKeLeiXingId);
return mv;
}
@RequestMapping("/confirmChangRoom")
public ModelAndView confirmChangRoom(Integer id, Integer roomId, Double changRoomMoney,
Timestamp changRoomTime,Integer LvKeLeiXingId){
ModelAndView mv=null;
int chuZuFangShi=0; //出租方式
String huanFangCiShu=""; //换房次数
double fangJiaDay=0; //房价/天
double fangJiaHour=0; //房价/小时
double zongFeiYong=0; //总费用
int zhuDianShiJian; //住店时间
int jiuFangJianId=0; //旧房间id
double JiuHuanFanFei; //旧换房费
double shangPinXiaoFei=0; //商品消费
int zuiDaShiChang=0; //新最大时长限制
int shouDuanShiChang=0; //新首段时长
double shouDuanJiaGe=0; //新首段价格
List<StayRegisterPo> list=stayRegisterService.selectChangRoom(id);
RoomSetPo roomSetPo=roomSetService.selectById(roomId);
List<StayRegisterPo> listShangPin=stayRegisterService.selectMoney(id);
chuZuFangShi=list.get(0).getRentOutTypeID(); //获取出租方式
zhuDianShiJian=Integer.parseInt(list.get(0).getStayNumber()); //获取住店时间
huanFangCiShu=list.get(0).getChangingRoomNumber(); //获取换房次数
jiuFangJianId=list.get(0).getRoomID(); //获取旧房间id
JiuHuanFanFei=list.get(0).getChangRoomMoney(); //获取旧换房费
fangJiaDay=roomSetPo.getStandardPriceDay(); //获取新房价/天
fangJiaHour=roomSetPo.getStandardPrice(); //获取新房价/小时
zuiDaShiChang=Integer.parseInt(roomSetPo.getMaxDuration()); //获取新最大时长
shouDuanShiChang=Integer.parseInt(roomSetPo.getFirstDuration()); //获取新首段时长
shouDuanJiaGe=roomSetPo.getFirstPrice(); //获取新首段价格
for (int i = 0; i < listShangPin.size(); i++) {
shangPinXiaoFei+=listShangPin.get(i).getConsumptionMoney();
}
if (chuZuFangShi==26) {
zongFeiYong=JiuHuanFanFei+changRoomMoney+shangPinXiaoFei+shengZhuDianTianShu*fangJiaDay;
}else if(chuZuFangShi==25){
if (shouDuanShiChang>zhuDianShiJian) {
zongFeiYong=JiuHuanFanFei+changRoomMoney+shangPinXiaoFei+shouDuanJiaGe;
}else if(zhuDianShiJian>=shouDuanShiChang & zhuDianShiJian<=zuiDaShiChang){
double jiSuan=(zhuDianShiJian-shouDuanShiChang)*fangJiaHour;
zongFeiYong=JiuHuanFanFei+changRoomMoney+shangPinXiaoFei+shouDuanJiaGe+jiSuan;
}else {
zongFeiYong=JiuHuanFanFei+changRoomMoney+shangPinXiaoFei+fangJiaDay;
}
}
if (huanFangCiShu==null || huanFangCiShu=="") {
huanFangCiShu="1";
}else{
huanFangCiShu=String.valueOf(Integer.parseInt(huanFangCiShu)+1);
}
StayRegisterPo stayRegisterPo=new StayRegisterPo();
RoomSetPo roomOne=new RoomSetPo();
RoomSetPo roomTwo=new RoomSetPo();
stayRegisterPo.setId(id);
stayRegisterPo.setRoomID(roomId);
stayRegisterPo.setSumConst(zongFeiYong);
stayRegisterPo.setChangingRoomNumber(huanFangCiShu);
stayRegisterPo.setChangRoomMoney(changRoomMoney+JiuHuanFanFei);
stayRegisterPo.setChangRoomTime(changRoomTime);
roomOne.setId(jiuFangJianId);
roomOne.setRoomStateID(1);
roomTwo.setId(roomId);
roomTwo.setRoomStateID(65);
roomSetService.updateByIdToRoomState(roomOne);
roomSetService.updateByIdToRoomState(roomTwo);
stayRegisterService.updateChangRoom(stayRegisterPo);
mv=new ModelAndView("redirect:/StayRegister/tolist.do?LvKeLeiXingId="+LvKeLeiXingId);
return mv;
}
@ResponseBody
@RequestMapping(value="/changRoomSelectPassenger")
public Object changRoomSelectPassenger(String roomNumber){
if(roomNumber==null){
roomNumber="";
}
List<RoomSetPo> list=roomSetService.selectInformation(roomNumber);
Gson gson=new Gson();
return gson.toJson(list);
}
@RequestMapping("/todeposit")
public ModelAndView todeposit(Integer id,String lvKeName,Integer LvKeLeiXingId){
ModelAndView mv=null;
fangjianId=id;
lvkeName=lvKeName;
List<StayRegisterPo> list=stayRegisterService.selectDepositById(id);
List<AttributePo> list2=attributeService.selectPayWay();
mv=new ModelAndView("/stayregister/deposit");
mv.addObject("list",list);
mv.addObject("listTwo",list2);
mv.addObject("lvKeName",lvKeName);
mv.addObject("stayId",id);
mv.addObject("LvKeLeiXingId",LvKeLeiXingId);
return mv;
}
@RequestMapping("/deposit")
public ModelAndView deposit(StayRegisterPo stayRegisterPo,Integer LvKeLeiXingId){
ModelAndView mv=null;
Date date=new Date();
DateFormat dformat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置日期格式
Timestamp timestamp=Timestamp.valueOf(dformat.format(date)) ; //将当前时间转为字符串
stayRegisterPo.setDepositRegisterTime(timestamp);
mv=new ModelAndView("redirect:/StayRegister/todeposit.do?id="+fangjianId);
mv.addObject("lvKeName", lvkeName);
mv.addObject("LvKeLeiXingId",LvKeLeiXingId);
stayRegisterService.insertDeposit(stayRegisterPo);
return mv;
}
@RequestMapping("/toconsumption")
public ModelAndView toconsumption(Integer id,String lvKeName,Integer currentPage,
Integer LvKeLeiXingId,Integer isBillID){
ModelAndView mv=null;
fangjianId=id;
lvkeName=lvKeName;
Page<StayRegisterPo> vo=new Page<StayRegisterPo>();
if (currentPage==null) {
currentPage=1;
}else if (currentPage==0) {
currentPage=1;
}
vo.setCurrentPage(currentPage);
List<AttributePo> listOne=attributeService.selectCommodityType();
vo=this.stayRegisterService.pageConsumption(id, vo);
mv=new ModelAndView("/stayregister/consumption");
mv.addObject("listOne",listOne);
mv.addObject("stayId",id);
mv.addObject("lvKeName",lvKeName);
mv.addObject("list",vo);
mv.addObject("LvKeLeiXingId",LvKeLeiXingId);
mv.addObject("isBillID",isBillID);
return mv;
}
//新增
@RequestMapping("/consumption")
public ModelAndView consumption(String id,String Number,
int consumptionStayRegisterID,Integer LvKeLeiXingId){
ModelAndView mv=null;
Date date=new Date();
DateFormat dformat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置日期格式
Timestamp timestamp=Timestamp.valueOf(dformat.format(date)) ; //将当前时间转为字符串
String[] FenGeId=id.split(",");
String[] FenGeNumber=Number.split(",");
StayRegisterPo stayRegisterPo=new StayRegisterPo();
for (int i = 0; i < FenGeId.length; i++) {
CommodityPo commodityPo=commodityService.selectById(Integer.parseInt(FenGeId[i]));
stayRegisterPo.setConsumptionCommodityID(Integer.parseInt(FenGeId[i]));
stayRegisterPo.setConsumptionStayRegisterID(consumptionStayRegisterID);
stayRegisterPo.setConsumptionNumber(FenGeNumber[i]);
stayRegisterPo.setConsumptionTime(timestamp);
double money=Integer.parseInt(FenGeNumber[i])*(Double.parseDouble(commodityPo.getSalePrice()));
stayRegisterPo.setConsumptionMoney(money);
stayRegisterService.insertConsumptiondetails(stayRegisterPo);
}
List<StayRegisterPo> listSource=stayRegisterService.selectMoney(consumptionStayRegisterID);
int chuZuFangShiId=listSource.get(0).getRentOutTypeID(); //出租方式ID
int zhuDianShiChang=Integer.parseInt(listSource.get(0).getStayNumber()); //住店时长
double fangJiaTian=listSource.get(0).getRoomStandardPriceDay(); //房价/天
double fangJia=listSource.get(0).getRoomStandardPrice(); //房价/小时
int zuiDaShiChang=Integer.parseInt(listSource.get(0).getRoomMaxDuration()); //最大时长
int shouDuanShiChang=Integer.parseInt(listSource.get(0).getRoomFirstDuration()); //首段时长
double shouDuanJiaGe=listSource.get(0).getRoomFirstPrice(); //首段价格
double xiaoFeiJiaGe=0;
double zhuSuFei=0;
if(chuZuFangShiId==26){
zhuSuFei=fangJiaTian*zhuDianShiChang; //房价乘以天数得总费
}else if(chuZuFangShiId==25){
if (shouDuanShiChang >= zhuDianShiChang) {
zhuSuFei=shouDuanJiaGe; //首时段时长大于 他输入的钟点数 那么按 首段价格计算
}else if (shouDuanShiChang <= zhuDianShiChang && zhuDianShiChang <= zuiDaShiChang) {
int xiaoShi=zhuDianShiChang-shouDuanShiChang; //如果输入的钟点数 在 最大时长的范围之内
zhuSuFei= shouDuanJiaGe+xiaoShi*fangJia; // 且大于等于首段时长 ,那么 计算出
}else if(zhuDianShiChang>zuiDaShiChang){
zhuSuFei=fangJiaTian; //假如 输入的钟点数大于最大时长那么 按一天的价格计算
}
}
for (int i = 0; i < listSource.size(); i++) {
xiaoFeiJiaGe+=listSource.get(i).getConsumptionMoney();
}
double zongFeiYong=xiaoFeiJiaGe+zhuSuFei;
stayRegisterService.updateSumConst(consumptionStayRegisterID, zongFeiYong);
mv=new ModelAndView("redirect:/StayRegister/toconsumption.do?id="+fangjianId);
mv.addObject("lvKeName",lvkeName);
mv.addObject("LvKeLeiXingId",LvKeLeiXingId);
return mv;
}
//删除
@RequestMapping("/consumptionDelete")
public ModelAndView consumptionDelete(String id,int consumptionStayRegisterID){
ModelAndView mv=null;
String[] FenGeId=id.split(",");
for (int i = 0; i < FenGeId.length; i++) {
stayRegisterService.deleteConsumption(Integer.parseInt(FenGeId[i]));
}
mv=new ModelAndView("redirect:/StayRegister/toconsumption.do?id="+fangjianId);
mv.addObject("lvKeName",lvkeName);
List<StayRegisterPo> listSource=stayRegisterService.selectMoney(consumptionStayRegisterID);
int chuZuFangShiId=listSource.get(0).getRentOutTypeID(); //出租方式ID
int zhuDianShiChang=Integer.parseInt(listSource.get(0).getStayNumber()); //住店时长
double fangJiaTian=listSource.get(0).getRoomStandardPriceDay(); //房价/天
double fangJia=listSource.get(0).getRoomStandardPrice(); //房价/小时
int zuiDaShiChang=Integer.parseInt(listSource.get(0).getRoomMaxDuration()); //最大时长
int shouDuanShiChang=Integer.parseInt(listSource.get(0).getRoomFirstDuration()); //首段时长
double shouDuanJiaGe=listSource.get(0).getRoomFirstPrice(); //首段价格
double xiaoFeiJiaGe=0;
double zhuSuFei=0;
if(chuZuFangShiId==26){
zhuSuFei=fangJiaTian*zhuDianShiChang; //房价乘以天数得总费
}else if(chuZuFangShiId==25){
if (shouDuanShiChang >= zhuDianShiChang) {
zhuSuFei=shouDuanJiaGe; //首时段时长大于 他输入的钟点数 那么按 首段价格计算
}else if (shouDuanShiChang <= zhuDianShiChang && zhuDianShiChang <= zuiDaShiChang) {
int xiaoShi=zhuDianShiChang-shouDuanShiChang; //如果输入的钟点数 在 最大时长的范围之内
zhuSuFei= shouDuanJiaGe+xiaoShi*fangJia; // 且大于等于首段时长 ,那么 计算出
}else if(zhuDianShiChang>zuiDaShiChang){
zhuSuFei=fangJiaTian; //假如 输入的钟点数大于最大时长那么 按一天的价格计算
}
}
for (int i = 0; i < listSource.size(); i++) {
xiaoFeiJiaGe+=listSource.get(i).getConsumptionMoney();
}
double zongFeiYong=xiaoFeiJiaGe+zhuSuFei;
stayRegisterService.updateSumConst(consumptionStayRegisterID, zongFeiYong);
return mv;
}
@ResponseBody
@RequestMapping(value="/tianJiaShangPin")
public Object tianJiaShangPin(String name,int cboid){
if(name==null){
name="";
}
List<CommodityPo> listAjax=commodityService.fuzzySelect(name, cboid);
Gson gson=new Gson();
return gson.toJson(listAjax);
}
@RequestMapping("/topay")
public ModelAndView topay(Integer id,String lvKeName) throws UnsupportedEncodingException{
ModelAndView mv=null;
fangjianId=id;
lvKeName=new String(lvKeName.getBytes("ISO8859-1"),"utf-8");
Date date=new Date();
DateFormat dformat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置日期格式
Timestamp timestamp=Timestamp.valueOf(dformat.format(date)) ; //将当前时间转为字符串
double shangPinXiaoFei=0;
double yaJin=0;
double huanFanFei=0;
double zongFeiYong=0;
double zhuSuFei=0;
double yingBuJinE=0;
List<StayRegisterPo> listDeposit=stayRegisterService.selectDepositById(id);
List<StayRegisterPo> listShangPin=stayRegisterService.selectMoney(id);
List<AttributePo> listOne=attributeService.selectPayWay();
for (int i = 0; i < listDeposit.size(); i++) {
yaJin+=listDeposit.get(i).getDeposit();
}
for (int i = 0; i < listShangPin.size(); i++) {
shangPinXiaoFei+=listShangPin.get(i).getConsumptionMoney();
}
huanFanFei=listDeposit.get(0).getChangRoomMoney();
zongFeiYong=listDeposit.get(0).getSumConst();
zhuSuFei=zongFeiYong-shangPinXiaoFei-huanFanFei;
yingBuJinE=zongFeiYong-yaJin;
mv=new ModelAndView("/stayregister/pay");
mv.addObject("stayId",id);
mv.addObject("lvKeName",lvKeName);
mv.addObject("listDeposit",listDeposit);
mv.addObject("listShangPin",listShangPin);
mv.addObject("zhuSuFei",zhuSuFei);
mv.addObject("yaJin",yaJin);
mv.addObject("shangPinXiaoFei",shangPinXiaoFei);
mv.addObject("yingBuJinE",yingBuJinE);
mv.addObject("timestamp",timestamp);
mv.addObject("listOne",listOne);
return mv;
}
//结账
@RequestMapping("/pay")
public ModelAndView pay(Integer id,String remarks,Timestamp payTime,Integer payWay,Integer roomId){
ModelAndView mv=null;
stayRegisterService.pay(id, remarks, payTime, payWay);
RoomSetPo roomSetPo=new RoomSetPo();
roomSetPo.setId(roomId);
roomSetPo.setRoomStateID(1);
roomSetService.updateByIdToRoomState(roomSetPo);
mv=new ModelAndView("redirect:/StayRegister/tolist.do?");
return mv;
}
//批量安排房间
@RequestMapping("/tovolumeroom")
public ModelAndView tovolumeroom(Integer tuanDuiID, String teamName){
ModelAndView mv=null;
List<AttributePo> listPassengerType=attributeService.selectPassengerType(); //旅客类别
List<AttributePo> listBillUnit=attributeService.selectBillUnit(); //结账单位
List<AttributePo> listPayWay=attributeService.selectPayWay(); //结账方式
List<AttributePo> listRentOutType=attributeService.selectRentOutType(); //出租方式
mv=new ModelAndView("/stayregister/volumeroom");
mv.addObject("listPassengerType",listPassengerType);
mv.addObject("listBillUnit",listBillUnit);
mv.addObject("listPayWay",listPayWay);
mv.addObject("listRentOutType",listRentOutType);
mv.addObject("tuanDuiID",tuanDuiID);
mv.addObject("teamName",teamName);
return mv;
}
//批量安排房间
@RequestMapping("/volumeroom")
public ModelAndView volumeroom(String roomId,StayRegisterPo stayRegisterPo){
ModelAndView mv=null;
String[] FenGen=roomId.split(",");
stayRegisterPo.setIsBillID(68);
int chuZuFangShiId=stayRegisterPo.getRentOutTypeID(); //获取 出租方式
int tianShuOrZhongDian=Integer.parseInt(stayRegisterPo.getStayNumber()); //获取 住店天数/小时
double yaJin=stayRegisterPo.getDeposit()/FenGen.length;
stayRegisterPo.setDeposit(yaJin);
RoomSetPo roomSetPoToRoomState=new RoomSetPo();
roomSetPoToRoomState.setRoomStateID(65); //给新的 Po 赋房态的值
for (int i = 0; i < FenGen.length; i++) {
RoomSetPo roomSetPo=roomSetService.selectById(Integer.parseInt(FenGen[i])); //根据 房间ID 查询出唯一的数据
if(chuZuFangShiId==26){
double fagnJia=roomSetPo.getStandardPriceDay(); //获取房价/天
double sumConst=fagnJia*(tianShuOrZhongDian); //房价乘以天数得总费
stayRegisterPo.setSumConst(sumConst);
}else if(chuZuFangShiId==25){
double fagnJia=roomSetPo.getStandardPrice(); //获取房价/小时
int zuiDaShiChang=Integer.parseInt(roomSetPo.getMaxDuration()); //获取最大时长
int shouDuanShiChang=Integer.parseInt(roomSetPo.getFirstDuration()); //获取首段时长
double shouDuanJiGe=roomSetPo.getFirstPrice(); //获取首段价格
if (shouDuanShiChang >= tianShuOrZhongDian) {
double sumConst=shouDuanJiGe; //首时段时长大于 他输入的钟点数
stayRegisterPo.setSumConst(sumConst); //那么按 首段价格计算
}else if (shouDuanShiChang <= tianShuOrZhongDian && tianShuOrZhongDian <= zuiDaShiChang) {
int xiaoShi=tianShuOrZhongDian-shouDuanShiChang; //如果输入的钟点数 在 最大时长的范围之内
double sumConst= shouDuanJiGe+xiaoShi*fagnJia; // 且大于等于首段时长 ,那么 计算出
stayRegisterPo.setSumConst(sumConst); // 首段价格 加上 钟点数乘以 多出的每小时价格
}else if(tianShuOrZhongDian>zuiDaShiChang){
stayRegisterPo.setSumConst(roomSetPo.getStandardPriceDay()); //假如 输入的钟点数大于最大时长那么 按一天的价格计算
}
}
stayRegisterPo.setRoomID(Integer.parseInt(FenGen[i]));
stayRegisterService.insertAll(stayRegisterPo);
int id=stayRegisterPo.getId();
stayRegisterPo.setDepositStayRegisterID(id);
stayRegisterPo.setDepositRegisterTime(stayRegisterPo.getRegisterTime());
stayRegisterService.insertDeposit(stayRegisterPo);
roomSetPoToRoomState.setId(Integer.parseInt(FenGen[i])); //给新的 Po 赋房间ID的值
roomSetService.updateByIdToRoomState(roomSetPoToRoomState); //根据 房间ID 来修改 当前被选中的房间的房态
}
mv=new ModelAndView("redirect:/StayRegister/tolist.do?LvKeLeiXingId="+56);
return mv;
}
//ajax查询房间信息
@ResponseBody
@RequestMapping(value="/ajaxSelectRoom")
public Object ajaxSelectRoom(String id){
List<RoomSetPo> list=new ArrayList<RoomSetPo>();
String[] fenGe=id.split(",");
for (int i = 0; i < fenGe.length; i++) {
RoomSetPo roomSetPo=roomSetService.selectById(Integer.parseInt(fenGe[i]));
list.add(roomSetPo);
}
Gson gson=new Gson();
return gson.toJson(list);
}
//团队押金
@RequestMapping("/toteamdeposit")
public ModelAndView toteamdeposit(){
ModelAndView mv=null;
mv=new ModelAndView("/stayregister/teamdeposit");
return mv;
}
//团队结账
@RequestMapping("/toteampay")
public ModelAndView toteampay(Integer tuanDuiID){
ModelAndView mv=null;
TeamPayVo teamPayVo=new TeamPayVo();
double yaJin=0;
double xiaoFei=0;
double huanFangFei=0;
double zongFeiYong=0;
double zhuSuFei=0;
double yingBuJinE=0;
int fangJianShu=0;
Date date=new Date();
DateFormat dformat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置日期格式
Timestamp timestamp=Timestamp.valueOf(dformat.format(date)) ; //将当前时间转为字符串
List<AttributePo> listPayWay=attributeService.selectPayWay(); //结账方式
List<StayRegisterPo> listDeposit=stayRegisterService.selectTeamDeposit(tuanDuiID);
List<StayRegisterPo> listConsumption=stayRegisterService.selectTeamConsumption(tuanDuiID);
List<StayRegisterPo> list=stayRegisterService.selectFormTeamId(tuanDuiID, 68);
for (int i = 0; i < listDeposit.size(); i++) {
yaJin+=listDeposit.get(i).getDeposit();
}
for (int i = 0; i < list.size(); i++) {
zongFeiYong+=list.get(i).getSumConst();
huanFangFei+=list.get(i).getChangRoomMoney();
}
for (int i = 0; i < listConsumption.size(); i++) {
xiaoFei+=listConsumption.get(i).getConsumptionMoney();
}
fangJianShu=list.size();
zhuSuFei=zongFeiYong-huanFangFei-xiaoFei;
yingBuJinE=zongFeiYong-yaJin;
teamPayVo.setStayMoney(zhuSuFei);
teamPayVo.setChangRoomMoney(huanFangFei);
teamPayVo.setOtherMoney(xiaoFei);
teamPayVo.setPayMoney(zongFeiYong);
teamPayVo.setDepositMoney(yaJin);
teamPayVo.setPayRepairMoney(yingBuJinE);
mv=new ModelAndView("/stayregister/teampay");
mv.addObject("listPayWay",listPayWay);
mv.addObject("listConsumption",listConsumption);
mv.addObject("teamPayVo",teamPayVo);
mv.addObject("fangJianShu",fangJianShu);
mv.addObject("timestamp",timestamp);
mv.addObject("list",list);
mv.addObject("tuanDuiID",tuanDuiID);
return mv;
}
@RequestMapping("teamPay")
public ModelAndView teamPay( String id, String remarks, Integer payWay, Timestamp payTime){
ModelAndView mv=null;
RoomSetPo roomSetPo=new RoomSetPo();
roomSetPo.setRoomStateID(1);
String[] FenGe=id.split(",");
for (int i = 0; i < FenGe.length; i++) {
stayRegisterService.pay(Integer.parseInt(FenGe[i]), remarks, payTime, payWay);
StayRegisterPo stayRegisterPo=stayRegisterService.selectById(Integer.parseInt(FenGe[i]));
roomSetPo.setId(stayRegisterPo.getRoomID());
roomSetService.updateByIdToRoomState(roomSetPo);
}
mv=new ModelAndView("redirect:/StayRegister/tolist.do?LvKeLeiXingId="+56);
return mv;
}
//ajax查询房间信息
@ResponseBody
@RequestMapping(value="/ajaxTeamSelectRoom")
public Object ajaxTeamSelectRoom(String roomNumber,Integer receiveTargetID){
List<StayRegisterPo> list=new ArrayList<StayRegisterPo>();
list=stayRegisterService.ajaxSelectTeamRoom(receiveTargetID, roomNumber);
Gson gson=new Gson();
return gson.toJson(list);
}
//ajax查询房间信息
@ResponseBody
@RequestMapping(value="/timeAjaxSelectRoomOne")
public Object timeAjaxSelectRoomOne(Integer receiveTargetID,String datemin,String datemax){
datemin=datemin+" 00:00:00";
datemax=datemax+" 23:59:59";
Timestamp min=Timestamp.valueOf(datemin);
Timestamp max=Timestamp.valueOf(datemax);
List<StayRegisterPo> list=new ArrayList<StayRegisterPo>();
list=stayRegisterService.ajaxSelectTeamFormTime(receiveTargetID, min, max);
Gson gson=new Gson();
return gson.toJson(list);
}
//ajax查询房间信息
@ResponseBody
@RequestMapping(value="/timeAjaxSelectRoomTwo")
public Object timeAjaxSelectRoomTwo(Integer receiveTargetID,String datemin,String datemax){
TeamPayVo teamPayVo=new TeamPayVo();
double yaJin=0;
double xiaoFei=0;
double huanFangFei=0;
double zongFeiYong=0;
double zhuSuFei=0;
double yingBuJinE=0;
int fangJianShu=0;
datemin=datemin+" 00:00:00";
datemax=datemax+" 23:59:59";
Timestamp min=Timestamp.valueOf(datemin);
Timestamp max=Timestamp.valueOf(datemax);
List<StayRegisterPo> listDeposit=stayRegisterService.ajaxSelectTeamDeposit(receiveTargetID, min, max);
List<StayRegisterPo> listConsumption=stayRegisterService.ajaxSelectTeamConsumption(receiveTargetID, min, max);
List<StayRegisterPo> list=stayRegisterService.ajaxSelectTeamFormTime(receiveTargetID, min, max);
for (int i = 0; i < listDeposit.size(); i++) {
yaJin+=listDeposit.get(i).getDeposit();
huanFangFei+=listDeposit.get(i).getChangRoomMoney();
}
for (int i = 0; i < list.size(); i++) {
zongFeiYong+=list.get(i).getSumConst();
}
for (int i = 0; i < listConsumption.size(); i++) {
xiaoFei+=listConsumption.get(i).getConsumptionMoney();
}
fangJianShu=listConsumption.size();
zhuSuFei=zongFeiYong-huanFangFei-xiaoFei;
yingBuJinE=zongFeiYong-yaJin;
teamPayVo.setStayMoney(zhuSuFei);
teamPayVo.setChangRoomMoney(huanFangFei);
teamPayVo.setOtherMoney(xiaoFei);
teamPayVo.setPayMoney(zongFeiYong);
teamPayVo.setDepositMoney(yaJin);
teamPayVo.setPayRepairMoney(yingBuJinE);
Gson gson=new Gson();
/*List<Map<String, Object>> list=new ArrayList<Map<String,Object>>();
Map<String, Object> map=new HashMap<String, Object>();
map.put("canshu", "zhr");
map.put("teamPayVo", teamPayVo);
list.add(map);*/
return gson.toJson(teamPayVo);
}
//ajax查询房间信息
@ResponseBody
@RequestMapping(value="/timeAjaxSelectRoomThree")
public Object timeAjaxSelectRoomThree(String id,Double zhuSuFei,Double huanFangFei,
Double qiTaXiaoFei,Double jieZhangJinE,Double yaJin,Double yingBuJinE){
double ByaJin=0;
double BxiaoFei=0;
double BhuanFangFei=0;
double BzongFeiYong=0;
double BzhuSuFei=0;
TeamPayVo teamPayVo=new TeamPayVo();
String[] FenGeId=id.split(",");
for (int i = 0; i < FenGeId.length; i++) {
StayRegisterPo xiangQing=stayRegisterService.selectSumconst(Integer.parseInt(FenGeId[i]));
List<StayRegisterPo> yaJinList=stayRegisterService.selectDepositJinJianBan(Integer.parseInt(FenGeId[i]));
List<StayRegisterPo> xiaoFeiList=stayRegisterService.selectConsumptionJinJianBan(Integer.parseInt(FenGeId[i]));
for (int j = 0; j < yaJinList.size(); j++) {
ByaJin+=yaJinList.get(j).getDeposit();
}
for (int j = 0; j < xiaoFeiList.size(); j++) {
BxiaoFei+=xiaoFeiList.get(j).getConsumptionMoney();
}
if(i==0){
BhuanFangFei+=xiangQing.getChangRoomMoney();
BzongFeiYong+=xiangQing.getSumConst();
}
}
BzhuSuFei=BzongFeiYong-BhuanFangFei-BxiaoFei;
double JzhuSuFei=zhuSuFei-BzhuSuFei;
double JhuanFangFei=huanFangFei-BhuanFangFei;
double JqiTaXiaoFei=qiTaXiaoFei-BxiaoFei;
double JjieZhangJinE=jieZhangJinE-BzongFeiYong;
double JyaJin=yaJin-ByaJin;
double JyingBuJinE=yingBuJinE-(BzongFeiYong-ByaJin);
teamPayVo.setStayMoney(JzhuSuFei);
teamPayVo.setChangRoomMoney(JhuanFangFei);
teamPayVo.setOtherMoney(JqiTaXiaoFei);
teamPayVo.setPayMoney(JjieZhangJinE);
teamPayVo.setDepositMoney(JyaJin);
teamPayVo.setPayRepairMoney(JyingBuJinE);
Gson gson=new Gson();
return gson.toJson(teamPayVo);
}
//转为散客
@RequestMapping("/toshiftpersonage")
public ModelAndView toshiftpersonage(Integer id,Integer stayregisterdetailsId){
ModelAndView mv=null;
double zhuSuFei=0;
double huanFangFei=0;
double qiTaXiaoFei=0;
double yaJin=0;
double zongFeiYong=0;
String txtname="";
List<StayRegisterPo> listDeposit=stayRegisterService.selectDepositJinJianBan(id);
List<StayRegisterPo> listXiaoFei=stayRegisterService.selectConsumptionJinJianBan(id);
StayRegisterPo list=stayRegisterService.selectInformationXiangQingBan(stayregisterdetailsId);
for (int i = 0; i < listDeposit.size(); i++) {
yaJin+=listDeposit.get(i).getDeposit();
}
for (int i = 0; i < listXiaoFei.size(); i++) {
qiTaXiaoFei+=listXiaoFei.get(i).getConsumptionMoney();
}
zongFeiYong=list.getSumConst();
huanFangFei=list.getChangRoomMoney();
zhuSuFei=zongFeiYong-huanFangFei-qiTaXiaoFei;
mv=new ModelAndView("/stayregister/shiftpersonage");
mv.addObject("zhuSuFei",zhuSuFei);
mv.addObject("qiTaXiaoFei",qiTaXiaoFei);
mv.addObject("yaJin",yaJin);
mv.addObject("list",list);
mv.addObject("id",id);
return mv;
}
//转入团队
@RequestMapping("/toshiftteam")
public ModelAndView toshiftteam(Integer id,Integer stayregisterdetailsId){
ModelAndView mv=null;
double zhuSuFei=0;
double huanFangFei=0;
double qiTaXiaoFei=0;
double yaJin=0;
double zongFeiYong=0;
String txtname="";
List<StayRegisterPo> listDeposit=stayRegisterService.selectDepositJinJianBan(id);
List<StayRegisterPo> listXiaoFei=stayRegisterService.selectConsumptionJinJianBan(id);
StayRegisterPo list=stayRegisterService.selectInformationXiangQingBan(stayregisterdetailsId);
List<ReceiveTargetPo> listRT=receiveTargetService.ajaxSelect(txtname);
for (int i = 0; i < listDeposit.size(); i++) {
yaJin+=listDeposit.get(i).getDeposit();
}
for (int i = 0; i < listXiaoFei.size(); i++) {
qiTaXiaoFei+=listXiaoFei.get(i).getConsumptionMoney();
}
zongFeiYong=list.getSumConst();
huanFangFei=list.getChangRoomMoney();
zhuSuFei=zongFeiYong-huanFangFei-qiTaXiaoFei;
mv=new ModelAndView("/stayregister/shiftteam");
mv.addObject("zhuSuFei",zhuSuFei);
mv.addObject("qiTaXiaoFei",qiTaXiaoFei);
mv.addObject("yaJin",yaJin);
mv.addObject("list",list);
mv.addObject("listRT",listRT);
mv.addObject("id",id);
return mv;
}
//转为散客或转入团队
@RequestMapping("/changOver")
public ModelAndView changOver(Integer id,Integer receiveTargetID,Integer LvKeLeiXingId){
ModelAndView mv=null;
if (receiveTargetID==null) {
receiveTargetID=2;
}
stayRegisterService.changOverTeam(id, receiveTargetID);
mv=new ModelAndView("redirect:/StayRegister/tolist.do?LvKeLeiXingId="+LvKeLeiXingId);
return mv;
}
//ajax 安排房间的房间
@ResponseBody
@RequestMapping(value="/guestRoomLevelSelectRoom")
public Object guestRoomLevelSelectRoom(Integer guestRoomLevelID){
List<RoomSetPo> list=null;
if (guestRoomLevelID==0) {
list=roomSetService.selectAll();
}else {
list=roomSetService.levelSelectInformation(guestRoomLevelID);
}
Gson gson=new Gson();
return gson.toJson(list);
}
}
5.3 财务管理用例实现描述
5.3.1 财务统计实现界面

5.3.2 财务统计主要代码
java
package com.gx.web;
import java.sql.Timestamp;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.gx.page.Page;
import com.gx.po.ReceiveTargetPo;
import com.gx.po.StayRegisterPo;
import com.gx.service.StayRegisterService;
@Controller
@RequestMapping("/FinancialStatistics")
public class FinancialStatistics {
@Autowired
private StayRegisterService stayRegisterService;
@RequestMapping("/tolist")
public ModelAndView tolist(String datemin, String datemax,Integer currentPage){
ModelAndView mv=null;
int chuZuFangJianShu=0;
int zhuSuRenShu=0;
double xiaoFeiJinE=0;
double JieZhangJinE=0;
if (currentPage==null) {
currentPage=1;
}else if (currentPage==0) {
currentPage=1;
}
mv=new ModelAndView("/financialstatistics/financialstatistics");
Page<StayRegisterPo> vo=new Page<StayRegisterPo>();
vo.setCurrentPage(currentPage);
if (datemin=="" || datemax=="" || datemin==null || datemax==null) {
List<StayRegisterPo> listJinE=this.stayRegisterService.selectPayJingJianBanNot();
for (int i = 0; i < listJinE.size(); i++) {
chuZuFangJianShu++;
JieZhangJinE+=listJinE.get(i).getSumConst();
}
List<StayRegisterPo> listRenShu=this.stayRegisterService.selectPayStayNumberNot();
for (int i = 0; i < listRenShu.size(); i++) {
zhuSuRenShu++;
}
List<StayRegisterPo> listXiaoFei=this.stayRegisterService.selectPayXiaoFeiNot();
for (int i = 0; i < listXiaoFei.size(); i++) {
xiaoFeiJinE+=listXiaoFei.get(i).getConsumptionMoney();
}
vo=this.stayRegisterService.pageFuzzyselectFour(vo);
}else {
String dateminString=datemin+" 00:00:00";
String datemaxString=datemax+" 23:59:59";
Timestamp min=Timestamp.valueOf(dateminString);
Timestamp max=Timestamp.valueOf(datemaxString);
List<StayRegisterPo> listJinE=this.stayRegisterService.selectPayJingJianBan(min,max);
for (int i = 0; i < listJinE.size(); i++) {
chuZuFangJianShu++;
JieZhangJinE+=listJinE.get(i).getSumConst();
}
List<StayRegisterPo> listRenShu=this.stayRegisterService.selectPayStayNumber(min,max);
for (int i = 0; i < listRenShu.size(); i++) {
zhuSuRenShu++;
}
List<StayRegisterPo> listXiaoFei=this.stayRegisterService.selectPayXiaoFei(min,max);
for (int i = 0; i < listXiaoFei.size(); i++) {
xiaoFeiJinE+=listXiaoFei.get(i).getConsumptionMoney();
}
vo=this.stayRegisterService.pageFuzzyselectFive(min, max, vo);
}
mv.addObject("list",vo);
mv.addObject("chuZuFangJianShu",chuZuFangJianShu);
mv.addObject("zhuSuRenShu",zhuSuRenShu);
mv.addObject("xiaoFeiJinE",xiaoFeiJinE);
mv.addObject("JieZhangJinE",JieZhangJinE);
mv.addObject("min",datemin);
mv.addObject("max",datemax);
return mv;
}
@RequestMapping("/toinformation")
public ModelAndView toinformation(Integer id,Integer stayregisterdetailsId,String min, String max){
ModelAndView mv=null;
double zhuSuFei=0;
double huanFangFei=0;
double qiTaXiaoFei=0;
double yaJin=0;
double zongFeiYong=0;
List<StayRegisterPo> listDeposit=stayRegisterService.selectDepositById(id);
List<StayRegisterPo> listXiaoFei=stayRegisterService.selectXiaoFeiMingXi(id);
List<StayRegisterPo> list=stayRegisterService.selectAllInformation(stayregisterdetailsId);
for (int i = 0; i < listDeposit.size(); i++) {
yaJin+=listDeposit.get(i).getDeposit();
}
for (int i = 0; i < listXiaoFei.size(); i++) {
qiTaXiaoFei+=listXiaoFei.get(i).getConsumptionMoney();
}
zongFeiYong=list.get(0).getSumConst();
huanFangFei=list.get(0).getChangRoomMoney();
zhuSuFei=zongFeiYong-huanFangFei-qiTaXiaoFei;
mv=new ModelAndView("/financialstatistics/particulars");
mv.addObject("zhuSuFei",zhuSuFei);
mv.addObject("qiTaXiaoFei",qiTaXiaoFei);
mv.addObject("yaJin",yaJin);
mv.addObject("list",list);
mv.addObject("id",id);
mv.addObject("listDeposit",listDeposit);
mv.addObject("listXiaoFei",listXiaoFei);
mv.addObject("min",min);
mv.addObject("max",max);
return mv;
}
}
5.4 旅客管理用例实现描述
旅客管理分为两部分,一部分是散户管理和团队管理,因为有的可能是团队进行旅游,所以设置两种类型。
5.4.1 旅客管理-旅客信息用例实现界面

5.4.2 旅客管理-旅客信息用例测试用例




5.4.4 旅客管理-接待对象用例实现界面

5.4.5 旅客管理-接待对象用例测试用例



5.4.6 旅客管理用例实现主要代码
java
package com.gx.web;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.google.gson.Gson;
import com.gx.page.Page;
import com.gx.po.AttributePo;
import com.gx.po.PassengerPo;
import com.gx.service.AttributeService;
import com.gx.service.PassengerService;
@Controller
@RequestMapping("/Passenger")
public class Passenger {
@Autowired
private AttributeService attributeService;
@Autowired
private PassengerService passengerService;
@RequestMapping("/tolist")
public ModelAndView tolist(HttpServletRequest request,Integer currentPage,String txtname){
ModelAndView mv=null;
mv=new ModelAndView("/passenger/list");
Page<PassengerPo> vo=new Page<PassengerPo>();
if (currentPage==null) {
currentPage=1;
}else if (currentPage==0) {
currentPage=1;
}
if(txtname==null)
{
txtname="";
}
vo.setCurrentPage(currentPage);
vo=this.passengerService.pageFuzzyselect(txtname, vo);
mv.addObject("list",vo);
mv.addObject("txtname",txtname);
return mv;
}
@RequestMapping("/toadd")
public ModelAndView toadd(){
ModelAndView mv=null;
List<AttributePo> listGender=attributeService.selectGender(); //性别
List<AttributePo> listNation=attributeService.selectNation(); //民族
List<AttributePo> listPassengerLevel=attributeService.selectPassengerLevel(); //旅客级别
List<AttributePo> listEducationDegree=attributeService.selectEducationDegree(); //文化程度
List<AttributePo> listPapers=attributeService.selectPapers(); //证件类型
List<AttributePo> listThingReason=attributeService.selectThingReason(); //事由
mv=new ModelAndView("/passenger/add");
mv.addObject("listGender",listGender);
mv.addObject("listNation",listNation);
mv.addObject("listPassengerLevel",listPassengerLevel);
mv.addObject("listEducationDegree",listEducationDegree);
mv.addObject("listPapers",listPapers);
mv.addObject("listThingReason",listThingReason);
return mv;
}
@RequestMapping("/toupdate")
public ModelAndView toupdate(int id){
ModelAndView mv=null;
List<AttributePo> listGender=attributeService.selectGender(); //性别
List<AttributePo> listNation=attributeService.selectNation(); //民族
List<AttributePo> listPassengerLevel=attributeService.selectPassengerLevel(); //旅客级别
List<AttributePo> listEducationDegree=attributeService.selectEducationDegree(); //文化程度
List<AttributePo> listPapers=attributeService.selectPapers(); //证件类型
List<AttributePo> listThingReason=attributeService.selectThingReason(); //事由
PassengerPo list=passengerService.selectById(id);
mv=new ModelAndView("/passenger/update");
mv.addObject("listGender",listGender);
mv.addObject("listNation",listNation);
mv.addObject("listPassengerLevel",listPassengerLevel);
mv.addObject("listEducationDegree",listEducationDegree);
mv.addObject("listPapers",listPapers);
mv.addObject("listThingReason",listThingReason);
mv.addObject("list",list);
return mv;
}
@RequestMapping("/add")
public ModelAndView add(PassengerPo passengerPo){
ModelAndView mv=null;
passengerService.insertAll(passengerPo);
mv=new ModelAndView("redirect:/Passenger/tolist.do");
return mv;
}
@RequestMapping("/update")
public ModelAndView update(PassengerPo passengerPo){
ModelAndView mv=null;
passengerService.updateById(passengerPo);
mv=new ModelAndView("redirect:/Passenger/tolist.do");
return mv;
}
@RequestMapping("/delete")
public ModelAndView delete(String id){
ModelAndView mv=null;
String[] FenGe=id.split(",");
for (int i = 0; i < FenGe.length; i++) {
passengerService.deleteById(Integer.parseInt(FenGe[i]));
}
mv=new ModelAndView("redirect:/Passenger/tolist.do");
return mv;
}
@ResponseBody
@RequestMapping(value="/YZ")
public Object YZ(String papersNumber){
int YorN=passengerService.selectYZ(papersNumber);
Gson gson =new Gson();
return gson.toJson(YorN);
}
}
5.5 本次实验小结
本次实验围绕酒店管理系统的功能实现与测试展开,重点完成了房间管理、住宿管理(包括客房预订与登记)、旅客管理及财务管理等核心模块的编码与界面集成。通过基于Spring MVC框架的分层开发,实现了对房间状态、商品信息、旅客数据和账单记录的增删改查操作,并结合业务逻辑处理了如预订超时提醒、换房费用计算、团队与散客区分登记等复杂场景。同时,系统通过Ajax异步交互提升了用户体验,确保了前后端数据的高效同步。测试结果表明,各功能模块运行稳定,业务流程符合需求规格说明书的要求,为系统后续部署与优化奠定了坚实基础。
实验总结
通过本次《酒店管理系统》系列实验,我们系统地完成了从需求分析、领域建模、详细设计、数据库构建到系统实现与测试的完整软件开发流程。这一过程不仅加深了我们对软件工程各阶段任务的理解,也有效提升了将实际业务问题转化为可运行软件系统的能力。
在实验一(需求规格说明)中,我们通过对酒店业务场景的深入调研,明确了系统的主要功能模块和非功能性需求,识别出前台员工、清洁人员、大堂经理等关键参与者,并借助用例图与用例描述清晰刻画了各类用户与系统的交互逻辑,为整个项目奠定了坚实的需求基础。
在实验二(领域模型)中,我们聚焦核心业务用例,采用面向对象分析方法,提取概念类与关键行为,构建了反映业务本质的领域模型和系统顺序图。这一阶段帮助我们从纷繁的业务细节中抽象出稳定的业务对象及其关系,为后续架构设计提供了语义支撑。
实验三(详细设计)则进一步将领域模型转化为具体的软件结构。通过绘制类图和顺序图,我们明确了各模块的职责划分、接口定义及交互时序,实现了从"做什么"到"怎么做"的关键跨越,为编码工作提供了清晰、可执行的设计蓝图。
实验四(系统数据库设计)围绕数据持久化需求,完成了从ER概念模型到逻辑表结构再到物理SQL脚本的全过程设计。12张规范化数据表及其关联关系有效支撑了旅客、房间、账单、商品等核心业务实体的存储与管理,确保了数据的一致性与完整性。
最后,在实验五(系统实现与测试)中,我们基于Spring MVC框架完成了主要功能模块的编码实现,涵盖了房间管理、住宿登记、预订处理、旅客信息维护及消费记录等核心业务。通过前后端集成与功能测试,验证了系统符合需求规格,运行稳定,具备良好的用户体验。
综上所述,本次系列实验不仅锻炼了我们在软件开发生命周期各阶段的专业技能,更培养了系统化思维、团队协作与工程实践能力。所构建的酒店管理系统结构清晰、功能完整,为未来进一步扩展(如移动端支持、智能推荐、报表分析等)打下了良好基础。
若觉得有帮助,欢迎点赞关注,一起成长进步~
声明:本文仅供学习交流,禁作商用;禁篡改、歪曲及有偿传播,引用需标明来源。侵权必究。