酒店管理系统Python#qt

酒店管理系统Python#qt

文章目录

  • 酒店管理系统Python#qt
    • 需求分析
      • 流程图
      • 关系模式
        • E-R图
        • 房间表
        • 房间具体信息表
        • 入住表
        • 结算表
        • 员工表
        • 规范性检查
    • python连接SQL Sever数据库
    • python设计UI界面
        • 登陆界面
        • 主界面
        • 结果展示

需求分析

宾馆在正常运营中需要对客房资源、顾客信息、结算信息进行管理,利用宾馆管理信息系统及时了解各个环节中信息的变更,有利于提高管理的效率。

主要功能:

有关客房标准的制定、标准信息的输入,包括标准编号、标准名称、房间面积、床位数量、住房单价、是否有空调、电视机、电话及单独卫生间等。

客房标准信息的修改、查询等

客房基本信息的输入,包括客房编号、客房类型、客房单价、客房位置、备注等。

客房基本信息的修改、查询等

剩余客房信息的查询。

订房信息的输入,包括客房编号、客房种类、客房位置、客房单价、顾客姓名、顾客身份证号码、入住日期、折扣、备注信息等。

结算信息的输入,包括客房编号、客房种类、客房位置、客房单价、顾客姓名、顾客身份证号码、入住日期、折扣、结算日期、备注信息等。

结算信息的修改和查询。

即需要实现的功能:

  • 客房信息的制定及修改,查询;
  • 订房信息的输入,房间状态更新;
  • 结算信息的输入,房间状态更新;

流程图

酒店管理系统Python#qt_第1张图片

关系模式

​ 该管理系统是模拟顾客入住酒店到结算的过程,一共有五个表:房间表,房间信息表,入住表,结算表,员工表。

E-R图

1.房间与房间信息之间的关系

酒店管理系统Python#qt_第2张图片

2.完整E-R图

酒店管理系统Python#qt_第3张图片

图中各实体,属性见下面四个表。这里未考虑员工表。

房间表

创建房间表:

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

规范性检查

  • 房间表中候选码是房间号,不存在非主属性对码的部分依赖,但是存在传递依赖。当中房间价格依赖于房间类型,而房间号确定房间类型,所以房间表仅达到2NF。要想达到3NF可通过将价格属性规放到房间信息表中,或者创建视图。
  • 房间信息表中不存在非主属性对码的部份依赖与传递依赖,达到了3NF。
  • 入住表主码是房间号,入住日期,入住时间。这里在创建表时设计的有详细的入住时间,所以绕开了客户属性之间的关系,从而避免了部份依赖与传递依赖。
  • 结算表大抵与入住表相同。

python连接SQL Sever数据库

​ 安装pymssql模块。在SQL Sever数据库的配置管理中打开SQL Sever(MSSQLSEVER),启用网络配置栏的TCP/IP

具体操作:

  • 将连接方式封装到MysqlSearch类中。
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’

  • 定义方法来执行增,删,查,改等操作。
    • 定义游标来执行操作
    • execute(self, query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
    • fetchall(self):接收全部的返回结果行.
    • 在执行DML语句(及增,删,改)时要加上commit()方法,否则会导致数据无法插入进数据库表中,因为DDL语句(数据定义)是自带commit的,而执行DML命令如果没有提交,将不会被其他会话看到。

如:获取员工表信息

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

python设计UI界面

导入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_())

结果:

酒店管理系统Python#qt_第4张图片

​ 获取文本框中输入的用户名与密码,通过回车/点击登录按钮实现跳转到主界面,在打开主界面之前还需要验证输入的信息是否与员工表中信息的一致性。

 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.选房间。

酒店管理系统Python#qt_第5张图片

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

结果:

酒店管理系统Python#qt_第6张图片

3.房间306的状态由1变成0,证明306已被使用

酒店管理系统Python#qt_第7张图片

4.退房信息录入,通过上方三个搜索框输入待办理的入住信息,点击+号从入住表中找到对应的顾客。

酒店管理系统Python#qt_第8张图片

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()

酒店管理系统Python#qt_第9张图片

6.自动补全入住表中信息,改变房间表中状态。

酒店管理系统Python#qt_第10张图片

酒店管理系统Python#qt_第11张图片
参考代码(完整的未保存,这是之前编写的,细节地方都没处理,有些数据是直接定义的,未从数据库获取):

"""酒店管理系统"""
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_())

你可能感兴趣的:(python,开发语言,qt)