机房收费系统之纵观全局

  验收项目的时候,师父们从四方面进行了审核:界面、功能、代码、业务。之后师父布置了三项任务:用自己的理解将一般用户、操作员还有管理员的主要职能搞清楚;将本系统的主要功能化成流程图;“谈钱不伤系统”,但是也要搞清算法~~~

  我是这样理解机房收费系统的消费本质的:机房收费系统,名曰“收费”,实则“消费”,消费的并不是金钱,而是由金钱兑换的时间——上网时间。

机房收费系统之纵观全局_第1张图片

  首先说自己对一般用户、操作员还有管理员的认识:

   一般用户就相当于我们去图书馆进行新视野大学英语视听说自主学习,负责签到的那个老师,她相当于是连接我们需要上机才能完成的学习任务接口。机房收费系统给我的感觉就是:这个负责上机的一般用户坐在那里,看着机房里边的所有电脑,而需要消费上网的同学排队来这消费,报上自己的卡号,卡号存在且余额充足就“过关”了,随便找台电脑上机。在上机的过程中,如果某一个学生的余额不足,老师还需要根据提示将相应的学生“请出去”,所以,管理起来很费时,也很费力,期初我是这样理解的。师傅说,理解无对错,但是没有必要让老师一直坐在那里,完全可以装个监控,让来上机的同学们自己去输入,可是,如果学生胆子大,也许在下机的时候还会改一下本地时间也不一定,那样的话,机房亏大发了……

  (PS:一般用户、操作员还有管理员各司其职,只有一般用户负责上下机,其余等级的用户登录的时候,无上机界面——验收项目的时候,师傅表明的一点

  再来说操作员,进行的是钱的操作:收+退,以及学生信息的增删改查,好比图书馆那个负责充值的老师……

  至于管理员,在我看来,就是一个会计,在这个系统中,他的权限最高,但是,他在结账后还需要将钱上交给更高一级,所以,周结账单就是他工作的凭证,同样,日结账单显示的结果是操作员工作的凭证。

  综上所述:机房收费系统本身存在漏洞,需要我们立足现实情况去考虑,如今的理解无对错~~~

机房收费系统之纵观全局_第2张图片

  以下是主要功能块的思维导图:上机+下机,结账部分请见:机房收费系统之结账

机房收费系统之纵观全局_第3张图片

<span style="font-size:18px;"><span style="font-size:18px;">Private Sub cmdOnLine_Click()
    Dim mrc As ADODB.Recordset   'student_Info表
    Dim mrcO As ADODB.Recordset   'OnLine_Info表
    Dim mrcB As ADODB.Recordset   'BasicData_Info表
    Dim mrcU As ADODB.Recordset    'user_Info表
 
    Dim txtSQL As String
    Dim MsgText As String
    
    Dim A As Integer    '用做msgbox的返回值
    Dim Cancel As Integer
    
    txtSQL = "select * from Student_Info where cardno='" & Trim(txtCardNo.Text) & "'and status='" & Trim("不使用") & "'"
    Set mrcS = ExecuteSQL(txtSQL, MsgText)
        If mrcS.EOF = False Then
                A = MsgBox("此卡已注销,是否激活?", vbOKCancel + vbExclamation, "提示")            '如果已退卡,询问是否要激活
                If A = vbOK Then
                    mrcS.Fields(7) = 0
                    mrcS.Fields(10) = "使用"
                    mrcS.Fields(11) = "未结账"
                    mrcS.Update
                    mrcS.Close
                    
                    B = MsgBox("激活成功!是否立即充值?", vbOKCancel + vbExclamation, "提示")
                    If B = vbOK Then
                        txtCardNo.Text = ""                    '不清空的话会弹出暂时不需要弹出的信息
                        txtSQL = "select * from User_Info where UserID='" & UserName & "' and Level<>'" & "一般用户" & "'"
                        Set mrc = ExecuteSQL(txtSQL, MsgText)
                        If mrc.EOF = False Then
                            SetParent frmRecharge.hWnd, frmMain.hWnd
                        Else
                            MsgBox "一般用户无权注册,抱歉~", vbOKOnly + vbExclamation, "提示"
                            txtCardNo.SetFocus
                            txtCardNo = ""
                            Exit Sub
                        End If
                    Else
                        Cancel = True
                        Exit Sub
                    End If
                Else
                    Cancel = True
                    Exit Sub
                End If
         End If 
        
    If Trim(txtCardNo.Text = "") Then
        MsgBox "请输入卡号!"
        txtCardNo.SetFocus
    Else
        
    '通过卡号,显示其其它内容
        txtSQL = "select * from student_Info where cardno='" & txtCardNo.Text & "'"
        Set mrc = ExecuteSQL(txtSQL, MsgText)
    
        If mrc.EOF = True Then
            A = MsgBox("此卡尚未注册!是否立即注册?", vbOKCancel + vbExclamation, "提示")
                If A = vbOK Then
                    txtSQL = "select * from User_Info where UserID='" & UserName & "' and Level<>'" & "一般用户" & "'"
                    Set mrc = ExecuteSQL(txtSQL, MsgText)
                        If mrc.EOF = False Then
                            SetParent frmRegister.hWnd, frmMain.hWnd
                            txtCardNo.SetFocus
                            txtCardNo = ""
                        Else
                            MsgBox "一般用户无权注册,抱歉~", vbOKOnly + vbExclamation, "提示"
                            txtCardNo.SetFocus
                            txtCardNo = ""
                        End If
                Else
                    Cancel = True
                    txtCardNo.SetFocus
                    txtCardNo = ""
                End If                
           
        Else
            txtSQL = "select * from OnLine_Info where cardno='" & Trim(txtCardNo.Text) & "'"
            Set mrcO = ExecuteSQL(txtSQL, MsgText)
            
            If Not (mrcO.BOF And mrcO.EOF) Then
                MsgBox "此卡号正在上机!"
                txtCardNo.SetFocus
                txtCardNo = ""
                Exit Sub
            Else
                txtSQL = "select * from BasicData_Info"
                Set mrcB = ExecuteSQL(txtSQL, MsgText)

                If mrc.Fields(7) <= mrcB.Fields(5) Then
                    A = MsgBox("余额小于最低标准" & mrcB.Fields(5) & ",是否充值?", vbOKCancel + vbExclamation, "提示")
                    If A = vbOK Then
                        txtSQL = "select * from User_Info where UserID='" & UserName & "' and Level<>'" & "一般用户" & "'"
                        Set mrc = ExecuteSQL(txtSQL, MsgText)
                        If mrc.EOF = False Then
                            SetParent frmRecharge.hWnd, frmMain.hWnd
                            txtCardNo.SetFocus
                            txtCardNo = ""
                        Else
                            MsgBox "一般用户无权充值,抱歉~", vbOKOnly + vbExclamation, "提示"
                            txtCardNo.SetFocus
                            txtCardNo = ""                        

                        End If
                    Else
                        Cancel = True
                    End If
                
                 Else
                    '显示与上机卡号相关的信息
                    txtSQL = "select * from student_Info where cardno='" & txtCardNo.Text & "'"
                    Set mrc = ExecuteSQL(txtSQL, MsgText)
                    
                    lblType.Caption = mrc!Type
                    lblSID.Caption = mrc!studentno
                    lblName.Caption = mrc!studentName
                    lblDept.Caption = mrc!department
                    lblSex.Caption = mrc!sex
                    lblOnDate.Caption = Date
                    lblOnTime.Caption = Time
                    lblBalance.Caption = mrc!cash  '显示余额
    
                    '将上机记录保留到OnLine表中,便于显示当前上机人数
                    txtSQL = "select * from OnLine_Info"
                    Set mrcO = ExecuteSQL(txtSQL, MsgText)
                    mrcO.AddNew
                    mrcO.Fields(0) = Trim(txtCardNo.Text)
                    mrcO.Fields(1) = mrc!Type
                    mrcO.Fields(2) = mrc!studentno
                    mrcO.Fields(3) = mrc!studentName
                    mrcO.Fields(4) = mrc!department
                    mrcO.Fields(5) = mrc!sex
                    mrcO.Fields(6) = Date
                    mrcO.Fields(7) = Time
                    mrcO.Fields(8) = VBA.Environ("computerName")
                    mrcO.Fields(9) = Date  '不知表中给出的date和上边出现的date是否一样
                    mrcO.Fields(10) = Now
                    mrcO.Update
                    '查询此时正在上机的人数(PS:可以用Timer事件,实时更新当前上机人数)
                    lblPeople.Caption = mrcO.RecordCount
                    mrcO.Close
                    MsgBox "上机成功!"
                    
                 '清空窗体内所有显示框
                    txtCardNo.SetFocus
                    txtCardNo.Text = ""
                    lblType.Caption = ""
                    lblSID.Caption = ""
                    lblName.Caption = ""
                    lblDept.Caption = ""
                    lblSex.Caption = ""
                    lblOnDate.Caption = ""
                    lblOnTime.Caption = ""
                    lblBalance.Caption = ""
                   
                End If
            End If
        End If
    End If
End Sub
</span></span>


机房收费系统之纵观全局_第4张图片

  我的下机过程写得有点乱,主要提体现在有些数据没必要赋给中间变量;还有一点就是计费方式不合理,应该采取分段计费方式,不然会导致用户不满意。但是整理逻辑还是清楚的,体现在上边的导图中,代码仅供参考:

<span style="font-size:18px;">Private Sub cmdOffLine_Click()
    Dim txtSQL As String
    Dim MsgText As String
    Dim mrc As ADODB.Recordset    'student_Info表,将计算后的最新余额存入
    Dim mrcO As ADODB.Recordset   'OnLine_Info表  取出上机记录,存入Line_Info表,然后删除
    Dim mrcB As ADODB.Recordset    'BasicData_Info表,用来算余额和消费时间
    Dim mrcL As ADODB.Recordset    'Line_Info表,将上下机记录存入
    Dim PastCash As Integer  '原余额
    Dim Newcash As Integer   '新余额
    Dim Timefact As Long '实际上机时间,定义为long便于有利于提高效率
    Dim FreeTime As Long  '上机前的准备时间,相当于白送的时间
    Dim FixUserCharge As Integer   '固定用户的单位费用
    Dim TemUserCharge As Integer   '临时用户的单位费用
    Dim OnTime As Date
    Dim offTime As Date
    
    '判断部分
    If Trim(txtCardNo.Text = "") Then
        MsgBox "请输入卡号!", vbOKOnly + vbExclamation, "警告"
        txtCardNo.SetFocus
        Exit Sub
    End If
    '判断卡号是否注册
    txtSQL = "select * from student_Info where cardno='" & txtCardNo.Text & "'"
    Set mrc = ExecuteSQL(txtSQL, MsgText)
    If mrc.EOF Then
        MsgBox "该卡号未注册,请重新输入!", vbOKOnly + vbExclamation, "警告"
        txtCardNo.SetFocus
        txtCardNo.Text = ""
        Exit Sub
    Else
        '判断该卡号是否上机
        txtSQL = "select * from Online_Info where cardno='" & txtCardNo.Text & "'"
        Set mrcO = ExecuteSQL(txtSQL, MsgText)
        If mrcO.EOF Then
            MsgBox "该卡没有上机!"
            txtCardNo.SetFocus
            txtCardNo.Text = ""
            Exit Sub
           
        End If
    End If
'----------------------------------------------------------
'----------------------------------------------------------
        
    '计算部分(前期准备)
    
    '后发现如果只是用time算时间的话,那么还需要用Date算出相差的天数换成分钟与time算出的数相加,所以,直接用Now
    '在Online表中添加了onnow字段,在Line表中添加了offnow字段
    OnTime = Trim(mrcO!onnow)
    '将下机时间等信息赋给中间变量
    offTime = Time
    '将原余额提出来用于计算下机后的余额
    txtSQL = "select * from student_Info where cardno='" & txtCardNo.Text & " '"
    Set mrc = ExecuteSQL(txtSQL, MsgText)
    PastCash = Val(Trim(mrc!cash))
    '从基本数据表中取出用于计算的每小时费用
    txtSQL = "select * from BasicData_Info "
    Set mrcB = ExecuteSQL(txtSQL, MsgText)
    FreeTime = Val(mrcB!PrepareTime)
    '将固定用户和临时用户的每小时费用分别赋给中间变量
    FixUserCharge = mrcB!Rate
    TemUserCharge = mrcB!tmpRate
    '计算实际上机时间
    Timefact = DateDiff("n", OnTime, Now) - FreeTime  '以分钟为单位,避免隔天问题,用Now算上机时间
    lblCTime.Caption = Timefact
    
 '----------------------------------------------------------
 '----------------------------------------------------------
    '正式计费
    
    '判断实际在线时间是否小于准备时间,若小于则消费时间为0
     If lblCTime.Caption <= Val(Trim(mrcB!PrepareTime)) Then
        lblCTime.Caption = 0
        lblCMoney.Caption = 0
     Else
        '判断实际在线时间是否小于最低消费时间,若小于消费时间为0
        If lblCTime.Caption <= Val(Trim(mrcB!leasttime)) Then
            lblCTime.Caption = 0
            lblCMoney.Caption = 0
        Else
         '实际在线时间大于最低消费时间则按单位时间算,分固定用户和临时用户
            If lblCTime.Caption >= Val(Trim(mrcB!leasttime)) And lblCTime.Caption < Val(Trim(mrcB!UnitTime)) _
            And Trim(mrc!Type) = "固定用户" Then
                lblCMoney.Caption = FixUserCharge '就像是网吧一样,不到一小时也按照一小时算
            Else
                If lblCTime.Caption >= Val(Trim(mrcB!leasttime)) And lblCTime.Caption < Val(Trim(mrcB!UnitTime)) _
                And Trim(mrc!Type) = "临时用户" Then
                    lblCMoney.Caption = TemUserCharge   '临时用户每小时费用
                Else
                    '当实际在线时间大于单位时间,即递增单位时间60分钟,就按有几个单位时间算,分固定用户和临时用户
                    '计算固定用户的消费
                    If lblCTime.Caption > Val(mrcB!UnitTime) And Trim(mrc!Type) = "固定用户" Then
                        lblCMoney.Caption = Int(Val(lblCTime.Caption) / 60 + 1) * Val(FixUserCharge) '加1是避免1.5小时按1小时算
                    Else
                        '计算临时用户的消费
                        If lblCTime.Caption > Val(mrcB!UnitTime) And Trim(mrc!Type) = "临时用户" Then
                            lblCMoney.Caption = Int(Val(lblCTime.Caption) / 60 + 1) * Val(TemUserCharge)
                        End If
                    End If
                End If
            End If
        End If
    End If
    
    '计算余额=原余额—消费金额
    Newcash = PastCash - Val(lblCMoney.Caption)
    
'----------------------------------------------------------
'----------------------------------------------------------

    '下机信息完整显示
    
    '先通过卡号显示上机信息
    txtSQL = "select * from Online_Info where cardno='" & txtCardNo.Text & "'"
    Set mrcO = ExecuteSQL(txtSQL, MsgText)
    lblType.Caption = mrcO!cardtype
    lblSID.Caption = mrcO!studentno
    lblName.Caption = mrcO!studentName
    lblDept.Caption = mrcO!department
    lblSex.Caption = mrcO!sex
    lblOnDate.Caption = Format(mrcO!ondate)
    lblOnTime.Caption = mrcO!OnTime
    '然后显示下机信息
    lblOffDate.Caption = Date  '下机日期
    lblOffTime.Caption = offTime   '下机时间
    lblBalance.Caption = Newcash '显示余额
    
'----------------------------------------------------------
'----------------------------------------------------------
    '更新相应表中的数据
    
    '更新student表中的余额记录
    txtSQL = "select * from student_Info where cardno='" & txtCardNo.Text & " '"
    Set mrc = ExecuteSQL(txtSQL, MsgText)
    mrc!cash = Newcash
    mrc.Update
    mrc.Close
    
    '更新Line_Info表
    txtSQL = "select * from Line_Info"
    Set mrcL = ExecuteSQL(txtSQL, MsgText)
    mrcL.AddNew    '敲代码时忘了加了,导致3021错误
    mrcL.Fields(1) = mrcO.Fields(0)
    mrcL.Fields(2) = mrcO.Fields(2)
    mrcL.Fields(3) = mrcO.Fields(3)
    mrcL.Fields(4) = mrcO.Fields(4)
    mrcL.Fields(5) = mrcO.Fields(5)
    mrcL.Fields(6) = mrcO.Fields(6)
    mrcL.Fields(7) = mrcO.Fields(7)
    '向line表中存入当前日期和时间
    mrcL.Fields(8) = Date
    mrcL.Fields(9) = offTime
    '向line表中存入经过计算的数据
    mrcL.Fields(10) = lblCTime.Caption
    mrcL.Fields(11) = lblCMoney.Caption
    mrcL.Fields(12) = Newcash
    '向line表中存入固定数据
    mrcL.Fields(13) = "正常下机"
    mrcL.Fields(14) = VBA.Environ("ComputerName")
    mrcL.Update
    
    '删除Online表中的上机数据
    mrcO.Delete
    mrcO.Update
    MsgBox "下机成功!欢迎再次使用~~~"
    mrcO.Close
     
     '重新打开上机表,更新一下,重新计算当前上机人数,否则保留的是原来取得的旧记录
    txtSQL = "select * from Online_Info "
    Set mrcO = ExecuteSQL(txtSQL, MsgText)
    lblPeople.Caption = mrcO.RecordCount
    
    '将显示的内容清空
    txtCardNo.Text = ""
    lblType.Caption = ""
    lblSID.Caption = ""
    lblName.Caption = ""
    lblDept.Caption = ""
    lblSex.Caption = ""
    lblOnDate.Caption = ""
    lblOnTime.Caption = ""
    lblBalance.Caption = ""
    lblOffDate.Caption = ""
    lblOffTime.Caption = ""
    lblCMoney.Caption = ""
    lblCTime.Caption = ""
    lblBalance.Caption = ""
 
End Sub
</span>

  关于结账部分:机房收费系统之结账,听取小伙伴们的建议,画了一张流程图,更新中,敬请期待……


你可能感兴趣的:(代码,vb,机房收费系统,计费,上下机)