机房收费系统-动态计费与强制下机

本文介绍了机房收费系统中动态计费和批量选择下机的功能实现。动态计费允许用户实时查看消费情况,避免在游戏中突然断线。批量下机功能提升了操作员的效率,能快速处理多名学生下机请求。文章详细讲解了动态计费的变量定义、余额计算理解以及选择下机中控件使用和数组概念的重点。
摘要由CSDN通过智能技术生成

前言:之前以为自己机房收费系统马上就要收官了,结果最近自己发现还少点功能:那就是动态计费功能与强制下机功能。本次博客分为两个模块:第一模块为主界面的动态计费及强制下机,第二模块为学生上机状态查询的选中下机模块。

两个难点的功能分别参考了十五期张铎和十四期李光师哥的博客,在此向两位巨人表示感谢。

动态计费:**针对来上机的学生的功能。**我们在去网吧的时候想必都查过自己的余额,因为有时候玩得昏天黑地的也不知道自己还剩几个钱了,总不能在玩得最激烈的时候被系统提醒没钱,还要离开机位去充钱吧,万一你挂机的这会时间就被翻盘了怎么办(雾)。所以这个动态计费就是给用户最直观地提供当前的消费情况,便于用户之后做下一步决定,是去充钱还是消费完后离开。

选择下机:**针对操作员的功能。**当上机人数很多,而要离开的学生也很多但又不是所有学生离开的情况下,我们肯定不能一个个地给学生下机,所以这时候我们就需要批量操作:下机具体的多名学生并结帐。

一、动态计费:
动态计费的流程图:
在这里插入图片描述
动态计费中的代码:

Private Sub Timer2_Timer()
Dim mrcol As ADODB.Recordset
Dim mrcs As ADODB.Recordset
Dim mrcl As ADODB.Recordset
Dim mrcoloff As ADODB.Recordset
Dim mrcbd As ADODB.RecordsetDim alltime As Integer
Dim unitTime As Integer
Dim costmoney As Integer
Dim balance As Integer
Dim unitmoney As Integer
Dim i As IntegerDim cardno As String
    
    txtSQL = "select cash from student_info,online_info where student_info.cardno=online_info.cardno"
    Set mrcs = ExecuteSQL(txtSQL, MsgText)
    
    txtSQL = "select * from online_info"
    Set mrcol = ExecuteSQL(txtSQL, MsgText)
    
    '判断是否有卡号上机
    If mrcol.EOF Then
        Timer2.Enabled = False
        Exit Sub
    Else
        mrcol.MoveFirst
    End If
    
    '将上机卡号定义为一个数组
    ReDim a(mrcol.RecordCount) As String
    For i = 0 To mrcol.RecordCount - 1
        a(i) = Trim(mrcol!cardno)
        cardno = a(i)
        
    '查询表
    txtSQL = "select * from online_info where cardno='" & Trim(cardno) & "'"
    Set mrcl = ExecuteSQL(txtSQL, MsgText)
    
    txtSQL = "select * from basicdata_info"
    Set mrcbd = ExecuteSQL(txtSQL, MsgText)
    
    '计算上机时长
    alltime = (Date - DateValue(mrcol!ondate)) * 1440 + (Hour(Time) - Hour(TimeValue(mrcol!OnTime))) * 60 + (Minute(Time) - Minute(TimeValue(mrcol!OnTime)))
    
    '根据用户类型计算每分钟收费,用于后面的动态余额计算
    If Trim(mrcol!cardtype) = "固定用户" Then
        unitmoney = Format(1 / 60 * mrcbd!Rate, "0.0")
    Else
        unitmoney = Format(1 / 60 * mrcbd!tmprate, "0.0")
    End If
        
    '判断用户类型从而计费''''''''''''''''''''''''''''''''''''''''''
    If Trim(mrcol!cardtype) = "固定用户" Then
        costmoney = Format(alltime / 60 * mrcbd!Rate, "0.0")
    Else
        costmoney = Format(alltime / 60 * mrcbd!tmprate, "0.0")
    End If
    
    '判断是否超过准备时间
    If alltime < mrcbd!leastTime Then
        txtCostMoney = 0
    End If
    
    '动态计算余额'''''''''''''''''''''''''''''''''''''''''''''''''''
    balance = Format(mrcs!cash - unitmoney, "0.0")
    txtBalance.Text = Format(balance, "0.0")            '动态显示桌面的余额
    txtCostMoney.Text = Format(costmoney, "0.0")        '动态显示桌面的计费
    mrcs!cash = Format(mrcs!cash - unitmoney, "0.0")    '向数据库内写入数据
    mrcs.Update
    
    '判断余额是否低于最低充值要求''''''''''''''''''''''''''''''''''''''''''''''''''''
    If Val(mrcs!cash) > 0 And Val(mrcs!cash) <= Val(mrcbd!limitcash) Then
        MsgBox a(i) & ",您的卡内余额已经不足" & Val(mrcbd!limitcash) & "元,请尽快充值!", 0 + 48, "提示"
    End If
    
    '判断用户余额是否已经用光,更新学生和下机表
    If Val(mrcs!cash) <= 0 Then
        MsgBox "卡号:" & a(i) & ",余额不足,即将下机!", 0 + 48, "提示"
        txtCardID.Text = mrcol!cardno
        
        frmMain.cmdOffline = True
    End If
    mrcol.MoveNext
    mrcs.MoveNext
    
  Next
End Sub

动态计费中的难点:

1.定义变量。在之前的代码中,我只有在一些数组上会定义变量,但是在本模块中因为我不经常定义变量的习惯吃了大亏:我平常更习惯于用某一控件直接承载某个值,这样就会导致很大程度的混乱。所以,在这里我以balance和costmoney分别承载余额和消费金额,而不是用txt控件直接承载余额和消费余额。

2.对余额计算的理解。
在代码balance = Format(mrcs!cash - unitmoney, “0.0”)中,很明确地表示了计算余额的方法:用学生表中的金额减去单位时间所走的金额,但在这段代码被我意识到之前,我却遇到了bug:余额控件中的计算和下机时的余额计算结果完全不一样,而且中间上机时间越长,差距越大。后来我发现了问题所在并加入了这行代码:

 '根据用户类型计算每分钟收费,用于后面的动态余额计算
    If Trim(mrcol!cardtype) = "固定用户" Then
        unitmoney = Format(1 / 60 * mrcbd!Rate, "0.0")
    Else
        unitmoney = Format(1 / 60 * mrcbd!tmprate, "0.0")
    End If

这行代码的意思就是每分钟所花费的金额。在动态计费中,timer控件是每分钟循环一次,所以公式减法理应是每单位时间减去固定的值。而在我之前的代码中,因为参照之前下机代码中的总计费时间来当作减数的,而这个减数值在timer循环里是会不断增大的,所以就导致了以上的错误。

3.数组概念
自己之前对数组的定义了解不足,所以在看其他人博客的时候很是迷惑,所以为了了解它自己又花了一段时间去解读。

二、选择下机
选择下机主要流程不难,主要难点是对MSHFlexGrid控件的一些知识点和定义变量、数组的理解。(李光师哥的博客

Private Sub mnuDown_Click()
Dim sz(9999) As String
Dim xh(9999) As String
Dim txtCash As String
Dim consumetime As String
Dim costmoney As String
Dim alltime As Integer
Dim z As Integer
Dim i As Integer
Dim s As Integer
Dim j As IntegerDim balance As Integer    With MyFlexGrid
    '记录选中下机用户
    i = 0
    For j = 1 To .Rows - 1
        If .TextMatrix(j, 5) = "√" Then
            sz(i) = .TextMatrix(j, 0)
            xh(i) = Val(j)
            i = i + 1
        End If
    Next j
    
    For z = 0 To i - 1
    
        '更新表
        txtSQL = "select * from basicdata_info"
        Set mrcbd = ExecuteSQL(txtSQL, MsgText)
        
        txtSQL = "select * from student_info where cardno='" & sz(z) & "'"
        Set mrcs = ExecuteSQL(txtSQL, MsgText)
        
        txtSQL = "select * from online_info where cardno='" & sz(z) & "'"
        Set mrol = ExecuteSQL(txtSQL, MsgText)
        
        txtSQL = "select * from line_info where cardno='" & sz(z) & "'"
        Set mrl = ExecuteSQL(txtSQL, MsgText)
        
        '计算消费时间
        alltime = (Date - DateValue(mrol!ondate)) * 1440 + (Hour(Time) - Hour(TimeValue(mrol!OnTime))) * 60 + (Minute(Time) - Minute(TimeValue(mrol!OnTime)))
        
        '判断是什么类型用户,从而进行计费
        If Trim(mrol!cardtype) = "固定用户" Then
            costmoney = Val(alltime / 60 * mrcbd!Rate)
        Else
            costmoney = Val(alltime / 60 * mrcbd!tmprate)
        End If
            
        '判断是否超过准备时间
        If alltime < mrcbd!leastTime Then
            costmoney = 0
        End If
        
        '计算余额
        balance = Val(mrcs!cash) - Val(costmoney)
        
        '更新学生表中的资金
        txtSQL = "update student_info set cash=" & balance & " where cardno='" & sz(z) & "'"
        Set mrcsu = ExecuteSQL(txtSQL, MsgText)
            
        txtSQL = "select * from line_info where cardno='" & mrol!cardno & "'"
        Set mrl = ExecuteSQL(txtSQL, MsgText)
        
        mrl.AddNew
            mrl!cardno = mrol!cardno
            mrl!studentno = mrol!studentno
            mrl!studentname = mrol!studentname
            mrl!department = mrol!department
            mrl!sex = mrol!sex
            mrl!ondate = mrol!ondate
            mrl!OnTime = mrol!OnTime
            mrl!offdate = Date
            mrl!offtime = Time
            mrl!consumetime = alltime
            mrl!consume = costmoney
            mrl!cash = Trim(mrcs!cash) - costmoney
            mrl!Status = "未结账"
            mrl!computer = Trim(VBA.Environ("computername"))
        mrl.Update
            
        '清空online表中的上机数据
        txtSQL = "delete from online_info where cardno='" & sz(z) & "'"
        Set mrad = ExecuteSQL(txtSQL, MsgText)
    Next z
    
    '更新Myflexgrid的界面
    For s = 0 To i - 1
        .RemoveItem xh(s)
    Next s
    End With
    End Sub

总结:机房收费系统的下机和动态计费之间虽然有一些逻辑联系,但尽量代码不要无脑粘过来,需要自己好好准备才能完成动态计费的完整功能;选中下机则需要自己研究变量、数组的概念。

机房收费管理系统 问题描述 结合我校计算机机房的运作模式,设计一种适合的收费管理系统,能够实现相关的人员检索,计时收费,管理汇总等功能模块。 开发环境 采用C或C++实现,VC++6.0 基本要求 主要功能模块: (1) 登录模块 (2) 上机管理模块 说明:上机登记时,余额不足3元或卡处于挂失状态,则拒绝登记。 每位同学的一次上机形成一条记录,每30秒遍历一次上机记录表,对表中所有正上机字段为TRUE的记录的上机用时增加30秒,同时减少上机卡表中的余额。 (3) 上机卡管理模块 (4) 充值挂失模块 (5) 查找统计模块:统计某天上机的总时数、每次上机的平均时数和机房的收入;某学生上机的次数、上机总时数、每次上机平均时间;挂失和查询余额。 参考的数据结构: 上机卡(卡号,姓名,专业班级,余额,状态),状态有:正常和挂失。 上机记录(卡号,上机日期,开始时间,上机用时,正上机,管理号代码) 上机记录表永久保存,用于事后查询和统计。 设计要求 1) 界面友好,输入信息符合逻辑:如上机时间设定在合理的时间范围。 2) 能从实践生活出发,设计合理的功能模块 3) 各类信息的数据结构明晰 4) 可根据自身生活体验添加相关功能模块。 拓展功能要求 鼓励采用Turbo C/C++、MFC等开发工具,实现彩色或图形操作界面。鼓励引入小型数据作为处理数据的来源,拓展知识面。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值