首页 > 代码库 > 机房收费系统之下机完整版

机房收费系统之下机完整版

 

  前篇博客只是简单的说了下,机房收费系统下机的简单思路,下面来正式的介绍下整个流程。


image


分析


  由于下机的时候需要涉及到两个表中的数值——StudentInfo表和OnlineInfo表,那么我们的思路就是如何能够简化查

询的操作。

  

 学生表中包含的学生的静态信息,而上机信息表中则包含了有关学生上机的所有的信息。


 流程

 

  1.更新学生下机信息

  2.触发器触发后,会自动的更新学生的消费时间,消费金额并更新学生余额

  3.两张表联合查询有关界面上的所有信息

  4.为所有的文本框赋值


注意:其实最有意思的就是触发器的使用了,由于引用了触发器省了很多不必要的麻烦


代码如下

U层

 Private Sub btnOff_Click(sender As Object, e As EventArgs) Handles btnOff.Click
        '用来验证学生卡号是否存在
        Dim BLL_StuInfo As New BLL.B_StuInfo   '定义B层用户记录的对象
        Dim En_stuinfo As New Entity.En_StuInfo   '实例化实体层用户信息表对象
        '用来验证学生是否正在上机
        Dim Bll_IsOnline As New BLL.B_OnlineInfo
        Dim En_Online As New Entity.OnlineInfo

        '用来判断输入文本不能为空
        If txtCardId.Text = "" Then

            MsgBox("卡号不能为空!")
            txtCardId.Focus()  '该文本框获得焦点
            Exit Sub
        End If
        '为学生卡号赋值
        En_stuinfo.En_stuID = txtCardId.Text
        '判断学生卡号是否存在
        If BLL_StuInfo.BLL_VerifyStu(En_stuinfo) = False Then

            txtCardId.Focus()  '该文本框获得焦点
            Exit Sub
        End If
        En_Online.En_stuID = txtCardId.Text
        If Bll_IsOnline.StuIsOnline(En_Online) = False Then
            MsgBox("此用户还未上机")
            txtCardId.Focus()  '该文本框获得焦点
            Exit Sub
        End If
        '开始更新下机记录
        En_Online.En_offTime = TimeOfDay   '下机日期
        En_Online.En_offDate = Today  '下机时间
        '开始更新下机记录
        Bll_IsOnline.AddOffInfo(En_Online)

        '当更新完下机记录后,触发器会自动的更新学生的余额
        '直接提取记录即可
        Dim StuInfo As New DataTable
        StuInfo = BLL_StuInfo.BLL_CheckMoney(En_stuinfo)
        '写入学生固定信息
        txtStuNumber.Text = StuInfo.Rows(0).Item(1)
        txtName.Text = StuInfo.Rows(0).Item(2)
        txtDepartment.Text = StuInfo.Rows(0).Item(3)
        txtSex.Text = StuInfo.Rows(0).Item(4)
        txtType.Text = StuInfo.Rows(0).Item(0)
        txtStillBill.Text = StuInfo.Rows(0).Item(5)

        '继续写入下机记录
        StuInfo = Bll_IsOnline.WriteOnlineInfo(En_Online)
        txtOnlineDate.Text = StuInfo.Rows(0).Item(1).ToString
        txtOnlineTime.Text = StuInfo.Rows(0).Item(0).ToString
        txtOffDate.Text = StuInfo.Rows(0).Item(3).ToString
        txtOffTime.Text = StuInfo.Rows(0).Item(2).ToString
        txtConsumeTime.Text = StuInfo.Rows(0).Item(4)
        txtconsumeMoney.Text = StuInfo.Rows(0).Item(5)
        MsgBox("下机成功")
    End Sub

B层

    ''' <summary>
    ''' 更新下机信息
    ''' </summary>
    ''' <param name="En_StuId"> 传递的实体层的参数</param>
    ''' <remarks></remarks>
    Sub AddOffInfo(ByVal En_StuId As Entity.OnlineInfo)
        ID_StuOnlineInfo = sqlFactory.OnlineInfo  '实例化一个下机对象
        ID_StuOnlineInfo.AddOffInfo(En_StuId)  '调用D层方法,更新下机信息

    End Sub

D层

    ''' <summary>
    ''' D层添加下机信息
    ''' </summary>
    ''' <param name="En_StuInfo"></param>
    ''' <remarks></remarks>
    Public Sub AddOffInfo(En_StuInfo As Entity.OnlineInfo) Implements IDAL.I_OnlineInfo.AddOffInfo
        Dim strConn As String

        '传递的参数
        Dim paras As SqlParameter() = {New SqlParameter("@stuid", En_StuInfo.En_stuID), _
                                        New SqlParameter("@offlineTime", En_StuInfo.En_offTime.ToString), _
                                        New SqlParameter("@offlineDate", En_StuInfo.En_offDate.ToString)}
        Dim sqlHelper As New sqlHelper
        strConn = "pro_StuOffOnlineInfo"   '存储过程名字
        '调用sqlhelper执行更新操作
        sqlHelper.ExecAddDelUpdate(strConn, CommandType.StoredProcedure, paras)
    End Sub

触发器

alter trigger tgr_UpdateOffline

on onlineInfo

for update--插入触发

as

--定义变量

declare @regulareUser float,@instantUser float,

@atleastTime float,@prepareTime float,@stuid char(11),

@consumeTime float,@money float,@atleastMoney float

select @regulareUser =RegularUser,@instantUser =instantUser,@atleastTime=atleastTime,@prepareTime =preparetime,@atleastMoney=AtLeastMoney

from BasicData 

--计算出学生上机消费时间

select @stuid=stuid,@consumeTime= datediff(minute,onlineTime ,offTime ) from inserted 



--开始判断学生上机花费的时间

--begin...and操作封装计算学生余额操作

begin

if @consumeTime -@prepareTime <0 

set @money=0

else

if @consumeTime -@prepareTime -@atleastTime <0

set @money=@atleastMoney 

else

set @money=@instantUser/60 * @consumeTime 

end

--最后更新学生余额操作

update StudentInfo set money =money-@money where stuid=@stuid 
--更新消费金额和消费时间信息

update OnlineInfo set consumeMoney=@money,consumeTime=@consumeTime where offtime=(select max(offTime) as offTime from OnlineInfo  where stuId=@stuid) and offDate=(select max(offDate) as offTime from OnlineInfo where <a target=_blank href="mailto:stuId=@stuid">stuId=@stuid</a>)


小结

由于引用了触发器,使得下机的时候特别的方便,只需要添加下机信息即可,并且如果所有人强制下机的话,也只要更新下机信息即可。所有的关于学生下机消费信息的算法,全部封装到触发器中。小编不才,上述的触发器也耦合度太大,也正在优化中。具体的思路是,可以把不同类型用户的计算金额的算法封装成数据库中不同的函数,在触发器中调用即可。