宾馆在正常运营中需要对客房资源、顾客信息、结算信息进行管理,利用宾馆管理信息系统及时了解各个环节中信息的变更,有利于提高管理的效率。
主要功能:
有关客房标准的制定、标准信息的输入,包括标准编号、标准名称、房间面积、床位数量、住房单价、是否有空调、电视机、电话及单独卫生间等。
客房标准信息的修改、查询等
客房基本信息的输入,包括客房编号、客房类型、客房单价、客房位置、备注等。
客房基本信息的修改、查询等
剩余客房信息的查询。
订房信息的输入,包括客房编号、客房种类、客房位置、客房单价、顾客姓名、顾客身份证号码、入住日期、折扣、备注信息等。
结算信息的输入,包括客房编号、客房种类、客房位置、客房单价、顾客姓名、顾客身份证号码、入住日期、折扣、结算日期、备注信息等。
结算信息的修改和查询。
即需要实现的功能:
该管理系统是模拟顾客入住酒店到结算的过程,一共有五个表:房间表,房间信息表,入住表,结算表,员工表。
1.房间与房间信息之间的关系
2.完整E-R图
图中各实体,属性见下面四个表。这里未考虑员工表。
创建房间表:
create table Room(
RoomNum char(10) primary key,
RoomType char(10) not null,
Roomprice float not null,
lease char(10) not null,
foreign key (RoomType) references Roomtypes(RoomType)
);
RoomNum | RoomType | price | IsFree |
---|---|---|---|
301 | 单人间 | 50 | 0 |
306 | 单人间 | 50 | 1 |
401 | 标准间 | 100 | 1 |
406 | 标准间 | 100 | 1 |
501 | 商务间 | 150 | 1 |
506 | 商务间 | 150 | 1 |
601 | 高档间 | 180 | 0 |
606 | 豪华间 | 200 | 1 |
create table Roomtypes(
RoomType char(10) primary key,
Bedsnum char(1) not null,
RomArea float not null,
SelfBathroom char(1) not null,
AC char(1) not null,
Wifi char(1) not null,
TV char(1) not null,
RoomPrice float not null,
);
RoomType | Bedsnum | RoomArea | SelfBathroom | AC | Wifi | TV |
---|---|---|---|---|---|---|
单人间 | 1 | 30.00 | 1 | 1 | 0 | 0 |
标准间 | 2 | 50.00 | 1 | 1 | 1 | 1 |
商务间 | 1 | 80.00 | 1 | 1 | 1 | 1 |
高档间 | 1 | 120.00 | 1 | 2 | 1 | 1 |
豪华间 | 2 | 120.00 | 1 | 2 | 1 | 1 |
CREATE TABLE Checkin(
roomnumber char(10) NOT NULL,
pname char(10) NOT NULL,
pid char(20) NOT NULL,
psex char(10) NOT NULL,
phone char(20) NOT NULL,
indate date NOT NULL,
intime time NOT NULL,
rent float not null,
remarks char(255) not null
)
roomnum | pname | pid | psex | phone | indate | intime | remarks |
---|---|---|---|---|---|---|---|
301 | 孙一 | 1001 | 男 | 12345678900 | 2021/11/21 | 14:25:37 | 早餐提醒 |
601 | 孙二 | 1002 | 女 | 12345678901 | 2021/11/21 | 17:31:55 | 定时打扫卫生 |
CREATE TABLE Checkout(
roomnumber char(10) NOT NULL,
pname char(10) NOT NULL,
indate date NOT NULL,
intime time NOT NULL,
outdate date NOT NULL,
outtime time NOT NULL,
discount float not null,
fine float not null
)
roomnumber | pname | indate | intime | outdate | outtime | discount | fine |
---|---|---|---|---|---|---|---|
301 | 孙一 | 2021/11/21 | 14:25:37 | 2021/11/22 | 9:25:16 | 1 | 9999 |
601 | 孙二 | 2021/11/21 | 17:31:55 | 2021/11/23 | 14:25:33 | 0.8 | 9999 |
这里员工表存储的数据是用户名与密码,作用是在登陆界面验证员工的。通过获取在登录界面的账号与密码与员工表中比对。一致则可以进入主窗口。
usernm | passwd |
---|---|
a1 | b1 |
a2 | b2 |
安装pymssql模块。在SQL Sever数据库的配置管理中打开SQL Sever(MSSQLSEVER),启用网络配置栏的TCP/IP
具体操作:
class MysqlSearch(object):
"""连接数据库及操作"""
def __init__(self):
"""数据库操作功能"""
self.get_conn()
def get_conn(self):
"""获取连接"""
self.conn = pymssql.connect(host='DESKTOP-HA83C8D',
database='wgd',
charset='GBK')
注:这里的charset='GBK’是指输出格式,因为在SQL Sever数据库中的编码格式与Python中编码格式不一致,直接获取该数据库中的数据可能会以乱码的形式呈现(如果在建表时定义为char型则不会出现乱码)。在Python中向表中插入新数据时charset=‘utf8’
如:获取员工表信息
def get_userinfo(self):
"""获取管理员登录信息"""
# 使用cursor()方法获取操作游标
cursor = self.conn.cursor()
sql = 'select * from manager'
# 执行sql语句
cursor.execute(sql)
# 使用fetchall()方法获取全部数据
result = cursor.fetchall()
# 将数据用字典模式存储
result = [dict(zip([k[0] for k in cursor.description], row)) for row in result]
# 关闭连接
cursor.close()
self.conn.close()
return result
导入Pyside2模块,或者Pyqt5,及配置QT-Designer以便于设计UI窗口
对于窗口的设计依据个人风格,可以自定义控件布局,控件样式等。这里较为简单的设计了登录窗口和主窗口。
from PySide2 import QtWidgets
from PySide2.QtUiTools import QUiLoader
from PySide2.QtWidgets import QTableWidgetItem
import sys
import pymssql
import time
import datetime
登录界面的设计在QT-Designer中可自定义设计,这里打开登录界面是通过动态加载,其好处是可随时修改界面内容。最好将设计好的ui文件与程序放在同一工程目录下。
class LoginWin:
"""登录主窗口"""
def __init__(self):
super().__init__()
self.ui = QUiLoader().load('D:/pythonProject0826/ui/sign_in.ui')
# 点击登录按钮/回车,实现跳转到主界面
self.connect = self.ui.button1.clicked.connect(self.open_main)
self.connect = self.ui.edt_password.returnPressed.connect(self.open_main)
if __name__ == '__main__':
MysqlSearch()
app = QtWidgets.QApplication(sys.argv)
wm = LoginWin()
wm.ui.show()
sys.exit(app.exec_())
结果:
获取文本框中输入的用户名与密码,通过回车/点击登录按钮实现跳转到主界面,在打开主界面之前还需要验证输入的信息是否与员工表中信息的一致性。
def open_main(self):
"""连接数据库,打开主窗口"""
# 实例化连接数据库类
obj = MysqlSearch()
result = obj.get_userinfo()
username = self.ui.edt_username.text()
password = self.ui.edt_password.text()
username_lst = list()
password_lst = list()
for item in result:
username_lst.append(item['usernm'])
password_lst.append(item['passwd'])
# 如取出用户,密码列表首位与从登录界面获取的文本内容进行比较
# 这里应该将从数据库获取的用户密码放在二维数组,或者字典中
if username == username_lst[0] and password == password_lst[0]:
global main_win
main_win = Window_Main()
main_win.ui.show()
self.ui.close()
在设计主窗口时也可以设计多个。我这里是利用了Tab标签页控件将四个画面显示在一个ui文件中,所以好处是在打开主窗口时仅加载如下一个ui文件,但是也体现了单一,不美观的弊端。
class Window_Main:
"""定义新窗口"""
def __init__(self):
# 继承父类的init方法,同样可以使用super()去继承其他方法
super().__init__()
self.ui = QUiLoader().load('D:/pythonProject0826/ui/operation.ui')
在实现功能时,无非是对按钮或其他控件定义响应函数,所以在设计界面时最好重新命名控件名称,在编写程序时能区分清楚,不至于数量多时弄混淆而出bug。
# 房间查询标签页
self.connect = self.ui.btn_select.clicked.connect(self.select_show) # ‘显示’按钮
self.connect = self.ui.btn_selectAdd.clicked.connect(self.select_add) # ‘+’按钮
self.connect = self.ui.btn_selectDel.clicked.connect(self.select_del) # ‘-’按钮
self.connect = self.ui.btn_selectSave.clicked.connect(self.select_save) # '保存'按钮
self.connect = self.ui.btn_show.clicked.connect(self.select_select) # ‘查询’按钮
# 房间具体信息标签页
self.connect = self.ui.btn_typeselect.clicked.connect(self.type_show) # ‘查询’按钮
self.connect = self.ui.btn_typeAdd.clicked.connect(self.type_add) # ‘+’按钮
self.connect = self.ui.btn_typeDel.clicked.connect(self.type_del) # ‘-’按钮
# 入住标签页
self.connect = self.ui.btn_inAdd.clicked.connect(self.in_add) # ‘+’按钮
self.connect = self.ui.btn_inDel.clicked.connect(self.in_del) # ‘-’按钮
self.connect = self.ui.btn_inSure.clicked.connect(self.in_sure) # ‘确认’按钮
# 结算标签页
self.connect = self.ui.btn_outAdd.clicked.connect(self.out_add) # ‘+’按钮
self.connect = self.ui.btn_outSure.clicked.connect(self.out_sure) # '确认'按钮
# 当天交易额初值
self.ui.edt_cost.setText('0')
以顾客孙一入住306为例
1.选房间。
2.录入入住记录,点击确定。
def in_sure(self):
"""确定入住"""
# 获取要入住的客户是表格中第几行
rowcount_in = self.ui.tableWidget_in.currentRow()
# print(rowcount_in)
# 获取登录的房间号
in_num = self.ui.tableWidget_in.item(rowcount_in, 0).text().strip()
# 房间表中的行数
all_count = self.ui.tableWidget_select.rowCount()
# 在房间表中找到这位顾客的房间号并置为'0'
for i in range(all_count):
that_num = self.ui.tableWidget_select.item(i, 0).text().strip()
room_state = self.ui.tableWidget_select.item(i, 3).text().strip()
if in_num == that_num:
if int(room_state) == 0:
self.ui.edt_result.setText('该房间已被使用,请重新选择!')
break
else:
self.ui.tableWidget_select.setItem(i, 3, QTableWidgetItem('0'))
self.ui.edt_result.setText('入住成功!')
break
结果:
3.房间306的状态由1变成0,证明306已被使用
4.退房信息录入,通过上方三个搜索框输入待办理的入住信息,点击+号从入住表中找到对应的顾客。
5.输入退房时间,点击确定,显示金额(金额计算还需要导入datetime、date模块),完成退房。
def out_sure(self):
"""结算信息确认"""
# 获取要结算的客户是结算表格中第几行(即当前光标所在行号)
rowcount_out = self.ui.tableWidget_out.currentRow()
# 获取退房客户的房间号,该房间的价格
out_num = self.ui.tableWidget_out.item(rowcount_out, 0).text().strip()
room_price = float(self.ui.tableWidget_select.item(rowcount_out, 2).text())
# 将结算表中的‘退房时间’补充到入住表
out_time = self.ui.tableWidget_out.item(rowcount_out, 5).text()
in_date = self.ui.tableWidget_out.item(rowcount_out, 2).text()
in_time = self.ui.tableWidget_out.item(rowcount_out, 3).text()
in_rowcount = self.ui.tableWidget_in.rowCount()
seq2 = [(self.ui.tableWidget_in.item(r, 0).text(),
self.ui.tableWidget_in.item(r, 1).text(),
self.ui.tableWidget_in.item(r, 2).text(),
self.ui.tableWidget_in.item(r, 3).text(),
self.ui.tableWidget_in.item(r, 4).text(),
self.ui.tableWidget_in.item(r, 5).text(),
self.ui.tableWidget_in.item(r, 6).text()) for r in range(in_rowcount)]
# 遍历列表seq,找到匹配的元组
k = 0
while k < in_rowcount:
if out_num == seq2[k][0] and in_date == seq2[k][4] and in_time == seq2[k][5]:
break
k += 1
# 补充完整‘退房时间’
self.ui.tableWidget_in.setItem(k, 7, QTableWidgetItem(out_time))
# 房间表中的行数
all_count1 = self.ui.tableWidget_select.rowCount()
# 在房间表中找到这个房间并把房间的状态置为'1'
for j in range(all_count1):
that_num1 = self.ui.tableWidget_select.item(j, 0).text().strip()
if out_num == that_num1:
self.ui.tableWidget_select.setItem(j, 3, QTableWidgetItem('1'))
# 退房顾客的入住日期,时间;退房日期,时间
in_date = self.ui.tableWidget_out.item(rowcount_out, 2).text()
in_time = self.ui.tableWidget_out.item(rowcount_out, 3).text()
out_date = self.ui.tableWidget_out.item(rowcount_out, 4).text()
out_time = self.ui.tableWidget_out.item(rowcount_out, 5).text()
# 用于将一个日期字符串转成datetime日期格式
d1 = time.strptime(in_date, "%Y/%m/%d")
t1 = time.strptime(in_time, "%H:%M:%S")
d2 = time.strptime(out_date, "%Y/%m/%d")
t2 = time.strptime(out_time, "%H:%M:%S")
# 表示日期时间
date1 = datetime.datetime(d1[0], d1[1], d1[2])
time1 = datetime.datetime(t1[0], t1[1], t1[2], t1[3], t1[4], t1[5])
date2 = datetime.datetime(d2[0], d2[1], d2[2])
time2 = datetime.datetime(t2[0], t2[1], t2[2], t2[3], t2[4], t2[5])
# 时间差
date_diff = (date2-date1).days
time_diff = round((time2-time1).seconds/3600/24, 2)
# duration = date_diff+time_diff # 精确到时分秒
duration = date_diff # 仅精确到天数
# 该顾客的折扣
discount = float(self.ui.tableWidget_out.item(rowcount_out, 6).text())
final_fee = room_price*duration*discount
final_fee = round(final_fee, 2)
# 设置结算表中该客户的金额
self.ui.tableWidget_out.setItem(rowcount_out, 7, QTableWidgetItem('{fee}'.format(fee=final_fee)))
all_money = float(self.ui.edt_cost.text())
all_money += final_fee
self.ui.edt_cost.setText('{}'.format(all_money))
# 搜索框清除
self.ui.edt_outRoom.clear()
self.ui.edt_inDate.clear()
self.ui.edt_inTime.clear()
6.自动补全入住表中信息,改变房间表中状态。
参考代码(完整的未保存,这是之前编写的,细节地方都没处理,有些数据是直接定义的,未从数据库获取):
"""酒店管理系统"""
from PySide2 import QtWidgets
from PySide2.QtUiTools import QUiLoader
from PySide2.QtWidgets import QTableWidgetItem
import sys
import pymssql
import time
import datetime
main_win = None
class MysqlSearch(object):
"""连接数据库及操作"""
def __init__(self):
"""数据库操作功能"""
self.get_conn()
def get_conn(self):
"""获取连接"""
self.conn = pymssql.connect(host='DESKTOP-HA83C8D',
database='wgd',
charset='GBK')
def get_userinfo(self):
"""获取管理员登录信息"""
# 使用cursor()方法获取操作游标
cursor = self.conn.cursor()
sql = 'select * from manager'
# 使用cursor()方法获取操作游标
cursor.execute(sql)
# 使用fetchall()方法获取全部数据
result = cursor.fetchall()
# 将数据用字典模式存储
result = [dict(zip([k[0] for k in cursor.description], row)) for row in result]
# 关闭连接
cursor.close()
self.conn.close()
return result
def get_roomInfo(self):
"""获取房间信息"""
# 使用cursor()方法获取操作游标
cursor = self.conn.cursor()
sql = 'select * from room'
# 使用cursor()方法获取操作游标
cursor.execute(sql)
# 使用fetchall()方法获取全部数据
result1 = cursor.fetchall()
# 将数据用字典模式存储
# result = [dict(zip([k[0] for k in cursor.description], row)) for row in result]
# 关闭连接
cursor.close()
self.conn.close()
return result1
def get_roomType(self):
"""房间类型具体信息"""
cursor = self.conn.cursor()
sql2 = 'select * from roomtypes'
cursor.execute(sql2)
result2 = cursor.fetchall()
cursor.close()
self.conn.close()
return result2
class LoginWin:
"""登录主窗口"""
def __init__(self):
super().__init__()
self.ui = QUiLoader().load('D:/pythonProject0826/ui/sign_in.ui')
# 点击登录按钮/回车,实现跳转到主界面
self.connect = self.ui.button1.clicked.connect(self.open_main)
self.connect = self.ui.edt_password.returnPressed.connect(self.open_main)
def open_main(self):
"""连接数据库,打开主窗口"""
# 实例化连接数据库类
obj = MysqlSearch()
result = obj.get_userinfo()
username = self.ui.edt_username.text()
password = self.ui.edt_password.text()
username_lst = list()
password_lst = list()
for item in result:
username_lst.append(item['usernm'])
password_lst.append(item['passwd'])
if username == username_lst[0] and password == password_lst[0]:
global main_win
main_win = Window_Main()
main_win.ui.show()
self.ui.close()
class Window_Main:
"""定义新窗口"""
def __init__(self):
# 继承父类的init方法,同样可以使用super()去继承其他方法
super().__init__()
self.ui = QUiLoader().load('D:/pythonProject0826/ui/operation.ui')
# 房间查询标签页
self.connect = self.ui.btn_select.clicked.connect(self.select_show) # ‘显示’按钮
self.connect = self.ui.btn_selectAdd.clicked.connect(self.select_add) # ‘+’按钮
self.connect = self.ui.btn_selectDel.clicked.connect(self.select_del) # ‘-’按钮
self.connect = self.ui.btn_selectSave.clicked.connect(self.select_save) # '保存'按钮
self.connect = self.ui.btn_show.clicked.connect(self.select_select) # ‘查询’按钮
# 房间具体信息标签页
self.connect = self.ui.btn_typeselect.clicked.connect(self.type_show) # ‘查询’按钮
self.connect = self.ui.btn_typeAdd.clicked.connect(self.type_add) # ‘+’按钮
self.connect = self.ui.btn_typeDel.clicked.connect(self.type_del) # ‘-’按钮
# 入住标签页
self.connect = self.ui.btn_inAdd.clicked.connect(self.in_add) # ‘+’按钮
self.connect = self.ui.btn_inDel.clicked.connect(self.in_del) # ‘-’按钮
self.connect = self.ui.btn_inSure.clicked.connect(self.in_sure) # ‘确认’按钮
# 结算标签页
self.connect = self.ui.btn_outAdd.clicked.connect(self.out_add) # ‘+’按钮
self.connect = self.ui.btn_outSure.clicked.connect(self.out_sure) # '确认'按钮
# 当天交易额初值
self.ui.edt_cost.setText('0')
# 房间查询窗口中按钮的功能函数
def select_show(self):
"""查询"""
# 清除房间表信息
self.ui.tableWidget_select.clearContents()
self.ui.tableWidget_select.setRowCount(0)
# 连接数据库获取数据
obj2 = MysqlSearch()
result01 = obj2.get_roomInfo()
# 插入行号
line_no = 0
for i in range(len(result01)):
self.ui.tableWidget_select.insertRow(line_no)
self.ui.tableWidget_select.setItem(line_no, 0, QTableWidgetItem(result01[i][0]))
self.ui.tableWidget_select.setItem(line_no, 1, QTableWidgetItem(result01[i][1]))
self.ui.tableWidget_select.setItem(line_no, 2, QTableWidgetItem(str(result01[i][2])))
self.ui.tableWidget_select.setItem(line_no, 3, QTableWidgetItem(result01[i][3]))
line_no += 1
def select_select(self):
"""空房间查询"""
# 获取文本框中查询条件
type_text = self.ui.edt_type.text().strip()
state_text = self.ui.edt_state.text().strip()
# 房间表中行数
select_rowcount = self.ui.tableWidget_select.rowCount()
# 将上一次操作的房间表存入列表
# 这里列表per存放的是数据库中的房间表,这里应该是从MysqlSearch()中获取的,这里直接给出属于偷懒了
per = [('301', '单人间', 50.0, '0'),
('306', '单人间', 50.0, '1'),
('401', '标准间', 100.0, '1'),
('406', '标准间', 100.0, '1'),
('501', '商务间', 150.0, '1'),
('506', '商务间', 150.0, '1'),
('601', '高档间', 180.0, '0'),
('606', '豪华间', 200.0, '1')]
# 清除房间表信息
self.ui.tableWidget_select.clearContents()
# 遍历列表per,找到匹配的元组
i = 0
j = 0
while i < select_rowcount:
if type_text == per[i][1] and state_text == per[i][3]:
self.ui.tableWidget_select.setItem(j, 0, QTableWidgetItem(per[i][0]))
self.ui.tableWidget_select.setItem(j, 1, QTableWidgetItem(per[i][1]))
self.ui.tableWidget_select.setItem(j, 2, QTableWidgetItem(str(per[i][2])))
self.ui.tableWidget_select.setItem(j, 3, QTableWidgetItem(per[i][3]))
i += 1
j += 1
del i, j
def select_add(self):
"""房间查询标签页中表格增加一行"""
# 要插入的行是当前行的下一行
rowcount = self.ui.tableWidget_select.currentRow()+1
self.ui.tableWidget_select.insertRow(rowcount)
def select_del(self):
"""房间查询标签页中表格删除一行"""
# 删除选定的行
rowcount = self.ui.tableWidget_select.currentRow()
self.ui.tableWidget_select.removeRow(rowcount)
def select_save(self):
"""房间查询标签页中表格中新增的数据保存"""
# 待保存的行
save_count = self.ui.tableWidget_select.currentRow()
res2 = [self.ui.tableWidget_select.item(save_count, 0).text(),
self.ui.tableWidget_select.item(save_count, 1).text(),
float(self.ui.tableWidget_select.item(save_count, 2).text()),
self.ui.tableWidget_select.item(save_count, 3).text()]
conn = pymssql.connect(host='DESKTOP-HA83C8D',
database='wgd',
charset='utf8')
cursor = conn.cursor()
sql2 = "insert into room values({0},{1},{2},{3})".format(res2[0], res2[1], res2[2], res2[3])
cursor.execute(sql2)
conn.commit()
cursor.close()
conn.close()
# 房间具体信息中按钮的功能函数
def type_show(self):
"""查询roomType"""
obj2 = MysqlSearch()
result02 = obj2.get_roomType()
line_no = 0
for i in range(len(result02)):
self.ui.tableWidget_roomtype.insertRow(line_no)
for j in range(7):
self.ui.tableWidget_roomtype.setItem(line_no, j, QTableWidgetItem(str(result02[i][j])))
line_no += 1
def type_add(self):
"""房间具体信息标签页中表格增加一行"""
# 要插入的行是当前行的下一行
rowcount = self.ui.tableWidget_roomtype.currentRow()+1
self.ui.tableWidget_roomtype.insertRow(rowcount)
def type_del(self):
"""房间具体信息标签页中表格删除一行"""
# 删除选定的行
rowcount = self.ui.tableWidget_roomtype.currentRow()
self.ui.tableWidget_roomtype.removeRow(rowcount)
# 入住信息窗口中按钮的功能函数
def in_add(self):
"""入住信息添加"""
rowcount = self.ui.tableWidget_in.currentRow() + 1
self.ui.tableWidget_in.insertRow(rowcount)
def in_del(self):
"""入住信息删除"""
rowcount = self.ui.tableWidget_in.currentRow()
self.ui.tableWidget_in.removeRow(rowcount)
def in_sure(self):
"""确定入住"""
# 获取要入住的客户是表格中第几行
rowcount_in = self.ui.tableWidget_in.currentRow()
# print(rowcount_in)
# 获取登录的房间号
in_num = self.ui.tableWidget_in.item(rowcount_in, 0).text().strip()
# 房间表中的行数
all_count = self.ui.tableWidget_select.rowCount()
# 在房间表中找到这位顾客的房间号并置为'0'
for i in range(all_count):
that_num = self.ui.tableWidget_select.item(i, 0).text().strip()
room_state = self.ui.tableWidget_select.item(i, 3).text().strip()
if in_num == that_num:
if int(room_state) == 0:
self.ui.edt_result.setText('该房间已被使用,请重新选择!')
break
else:
self.ui.tableWidget_select.setItem(i, 3, QTableWidgetItem('0'))
self.ui.edt_result.setText('入住成功!')
break
# 结算窗口的功能函数
def out_add(self):
"""结算信息记录添加"""
# 信息搜索
out_room = self.ui.edt_outRoom.text()
in_date = self.ui.edt_inDate.text()
in_time = self.ui.edt_inTime.text()
# 搜索入住表中客户信息, 此处也可以连接数据库用SQL语句查询,可以创建一个入住表的视图
in_rowcount = self.ui.tableWidget_in.rowCount()
# 至于此处展开而不简写是防止出错
seq = [(self.ui.tableWidget_in.item(r, 0).text(),
self.ui.tableWidget_in.item(r, 1).text(),
self.ui.tableWidget_in.item(r, 2).text(),
self.ui.tableWidget_in.item(r, 3).text(),
self.ui.tableWidget_in.item(r, 4).text(),
self.ui.tableWidget_in.item(r, 5).text(),
self.ui.tableWidget_in.item(r, 6).text()) for r in range(in_rowcount)]
# 遍历列表seq,找到匹配的元组
k = 0
while k < in_rowcount:
if out_room == seq[k][0] and in_date == seq[k][4] and in_time == seq[k][5]:
break
k += 1
# 目标信息
ans = seq[k]
# 添加一空白行
rowcount = self.ui.tableWidget_out.currentRow() + 1
self.ui.tableWidget_out.insertRow(rowcount)
# 填充数据
self.ui.tableWidget_out.setItem(rowcount, 0, QTableWidgetItem(ans[0]))
self.ui.tableWidget_out.setItem(rowcount, 1, QTableWidgetItem(ans[1]))
self.ui.tableWidget_out.setItem(rowcount, 2, QTableWidgetItem(ans[4]))
self.ui.tableWidget_out.setItem(rowcount, 3, QTableWidgetItem(ans[5]))
self.ui.tableWidget_out.setItem(rowcount, 4, QTableWidgetItem(ans[6]))
def out_sure(self):
"""结算信息确认"""
# 获取要结算的客户是结算表格中第几行(即当前光标所在行号)
rowcount_out = self.ui.tableWidget_out.currentRow()
# 获取退房客户的房间号,该房间的价格
out_num = self.ui.tableWidget_out.item(rowcount_out, 0).text().strip()
room_price = float(self.ui.tableWidget_select.item(rowcount_out, 2).text())
# 将结算表中的‘退房时间’补充到入住表
out_time = self.ui.tableWidget_out.item(rowcount_out, 5).text()
in_date = self.ui.tableWidget_out.item(rowcount_out, 2).text()
in_time = self.ui.tableWidget_out.item(rowcount_out, 3).text()
in_rowcount = self.ui.tableWidget_in.rowCount()
seq2 = [(self.ui.tableWidget_in.item(r, 0).text(),
self.ui.tableWidget_in.item(r, 1).text(),
self.ui.tableWidget_in.item(r, 2).text(),
self.ui.tableWidget_in.item(r, 3).text(),
self.ui.tableWidget_in.item(r, 4).text(),
self.ui.tableWidget_in.item(r, 5).text(),
self.ui.tableWidget_in.item(r, 6).text()) for r in range(in_rowcount)]
# 遍历列表seq,找到匹配的元组
k = 0
while k < in_rowcount:
if out_num == seq2[k][0] and in_date == seq2[k][4] and in_time == seq2[k][5]:
break
k += 1
# 补充完整‘退房时间’
self.ui.tableWidget_in.setItem(k, 7, QTableWidgetItem(out_time))
# 房间表中的行数
all_count1 = self.ui.tableWidget_select.rowCount()
# 在房间表中找到这个房间并把房间的状态置为'1'
for j in range(all_count1):
that_num1 = self.ui.tableWidget_select.item(j, 0).text().strip()
if out_num == that_num1:
self.ui.tableWidget_select.setItem(j, 3, QTableWidgetItem('1'))
# 退房顾客的入住日期,时间;退房日期,时间
in_date = self.ui.tableWidget_out.item(rowcount_out, 2).text()
in_time = self.ui.tableWidget_out.item(rowcount_out, 3).text()
out_date = self.ui.tableWidget_out.item(rowcount_out, 4).text()
out_time = self.ui.tableWidget_out.item(rowcount_out, 5).text()
# 用于将一个日期字符串转成datetime日期格式
d1 = time.strptime(in_date, "%Y/%m/%d")
t1 = time.strptime(in_time, "%H:%M:%S")
d2 = time.strptime(out_date, "%Y/%m/%d")
t2 = time.strptime(out_time, "%H:%M:%S")
# 表示日期时间
date1 = datetime.datetime(d1[0], d1[1], d1[2])
time1 = datetime.datetime(t1[0], t1[1], t1[2], t1[3], t1[4], t1[5])
date2 = datetime.datetime(d2[0], d2[1], d2[2])
time2 = datetime.datetime(t2[0], t2[1], t2[2], t2[3], t2[4], t2[5])
# 时间差
date_diff = (date2-date1).days
time_diff = round((time2-time1).seconds/3600/24, 2)
# duration = date_diff+time_diff # 精确到时分秒
duration = date_diff # 仅精确到
# 该顾客的折扣
discount = float(self.ui.tableWidget_out.item(rowcount_out, 6).text())
final_fee = room_price*duration*discount
final_fee = round(final_fee, 2)
# 设置结算表中该客户的金额
self.ui.tableWidget_out.setItem(rowcount_out, 7, QTableWidgetItem('{fee}'.format(fee=final_fee)))
all_money = float(self.ui.edt_cost.text())
all_money += final_fee
self.ui.edt_cost.setText('{}'.format(all_money))
# 搜索框清除
self.ui.edt_outRoom.clear()
self.ui.edt_inDate.clear()
self.ui.edt_inTime.clear()
if __name__ == '__main__':
MysqlSearch()
app = QtWidgets.QApplication(sys.argv)
wm = LoginWin()
wm.ui.show()
sys.exit(app.exec_())