注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

李建敏 廊坊师范学院信息技术提高班十二期

变是永远不变的

 
 
 

日志

 
 

机房收费系统后传—关于“钱”的那点事  

2015-07-25 19:08:46|  分类: 机房收费 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
           收方收费系统最核心的存在价值基本就是“钱”,围绕着收费与退钱展开,究竟有多少钱呢,多少种钱,如何算钱才能及不亏也不占便宜呢,下面便是谈钱不伤感情。
           首先我们的注意一下“临时用户”和“固定用户”的区别:首先临时用户的每小时费用是比普通用户贵的,其次临时用户是不具有充值属性的,其它在结账时也有一些极易忽略的小细节,(在讨论的过程中渐渐的明晰起来)
           直接上图
           机房收费系统后传—关于“钱”的那点事 -  12期 李建敏 - 李建敏 廊坊师范学院信息技术提高班十二期
 
         图解:首先应该弄得是真正要算钱的地方,充值(注册,充卡),退卡,下机结算,结账,日销金额,然后结账的任务是对操作员的管理,操作员的功能涉及到钱的只有注册,充值,退卡。所以结账是对注册,充值,退卡的钱数的一个汇总,即操作员一天工作的现金收入充值+退卡+注册,因为注册后的数据存储到了student表里而注册时的钱只需要第一次的钱而以后充值后的钱还会刷新到student表里,为了避免混乱,所以在第一次注册时便将注册金额放到recharge表里即可,这要再算一天的充值金额时只需遍历recharge表便可以了,正如图所示。到这结账=充值+退卡便是当日所收的现金,也是结账的目标。
         在师姐的结账窗体里有一个“临时用户”和“临时消费金额”,开始确实有干扰作用,把这个钱也加了进去,仔细一分析这是不应该的。如下图
       机房收费系统后传—关于“钱”的那点事 -  12期 李建敏 - 李建敏 廊坊师范学院信息技术提高班十二期
 
          第四个临时用户选项卡只是临时用户信息的显示,并没有涉及到钱,那这个临时收费金额是做什么用的呢,就是临时用户的注册金额,又因其不具有充值功能,而注册金额在注册时以放进了recharge表里,故临时收费金额只是一个显示信息的作用,并不进入到计算,可有可无,(想要计算这个金额只需在recharge表里面调取数据即可,切不可在进行应收金额计算)这个疑问就这么迎刃而解了
          第二个疑惑可以算是报表里的“日销金额”了,所有窗体都没有这个“日销金额”,在报表里出现,一个是令人不解,还有就是很容易将其相加到本期金额里。如下图
          机房收费系统后传—关于“钱”的那点事 -  12期 李建敏 - 李建敏 廊坊师范学院信息技术提高班十二期
 
            
          开始不能理解为什么消费金额不加入到最后的本期金额中,后来想到了“流水账”即那个曾经在网上流传的阿里面试题,懂了一点,再加上前面所说的结账是对操作员的管理,所以与消费者自然无关,这个字段放在这同那个“临时消费金额”可以说是一样的。最后就是在算本期金额时应不应加上上期余额,这个就看实际要求了。(PS:为了容易向报表里存日销金额数据,我便在结账的选项卡里多加了一个功能,如下图)
          机房收费系统后传—关于“钱”的那点事 -  12期 李建敏 - 李建敏 廊坊师范学院信息技术提高班十二期
 
           最后的大Boss便是下机结算了,从两方面考虑:
           一是单人下机结算和多人下机结算
 
            单人下机:
           下机结算必不可少的便是消费时间和单价了,具体的操作过程便是:先根据卡号从student表里调取相关数据,然后存到Online表里(因为不可能只有一个好上机,只有存到Online表里才方便下机时信息的调取),当下机时,利用DateDiff函数计算出来时间,在从basicdata表里调取单价,相乘便是最后的消费金额了,然后将这些数据都放到line表里。(注意:这里面的钱与收益并无直接联系,而是通过计算消费金额来判断卡里还有没有钱,进而令其充值或退卡,这才是收益的关键
            多人下机:
             与单人下机的原理是一样的,都要在下机前进行数据的存储和计算,然后从第一条一个一个的删除,即使用一个循环语句,代码如下:
         

Private Sub numalloff_Click()
Dim aa As String
Dim txtSQL As String
Dim MsgText As String
'定义足够多的数据库记录集
Dim mrc As ADODB.Recordset
Dim mrc1 As ADODB.Recordset
Dim mrc2 As ADODB.Recordset
Dim mrc3 As ADODB.Recordset
Dim mrc4 As ADODB.Recordset
'定义变量用来存取数据
Dim Starttime, Endtime, n, usertime As String
Dim oldcash, cardtype, leatime, pretime, newcash, truetime, strRate
Dim a, b, c As String
Dim Winsock1 As String

txtSQL = "select * from Online_Info"
Set mrc4 = ExecuteSQL(txtSQL, MsgText)
If mrc4.EOF Then

MsgBox "没有正在上机的记录!", vbOKOnly + vbExclamation, "提示"
Else
'开始循环,算一个,删一个,相当于都是再算第一个
Do While Not mrc4.EOF
mflg1.RowSel = 1
aa = Trim(mflg1.TextMatrix(1, 0)) '定位第一条数据的
txtSQL = "select * from OnLine_Info where cardno = '" & aa & "'"
Set mrc1 = ExecuteSQL(txtSQL, MsgText)

'计算消费时间
Starttime = Format(mrc1.Fields(7))
Endtime = Format(Time, "hh:mm:ss")

usertime = DateDiff("n", Trim(Starttime), Trim(Endtime))

'判断用户类型
txtSQL = "select * from student_Info where cardno = '" & aa & "'"
Set mrc = ExecuteSQL(txtSQL, MsgText)
cardtype = Trim(mrc.Fields(14))
oldcash = Trim(mrc.Fields(7))

txtSQL = "select * from BasicData_Info"
Set mrc2 = ExecuteSQL(txtSQL, MsgText)
leatime = Trim(mrc2.Fields(3))
pretime = Trim(mrc2.Fields(4))


'判断用户类型
If cardtype = "固定用户" Then
strRate = Val(Trim(mrc2.Fields(0)))
Else
strRate = Val(Trim(mrc2.Fields(1)))
End If


'判断用户上机时间
If Val(Trim(usertime)) <= (pretime + leatime) Then
b = oldcash
c = "0.0"
Else
If Val(Trim(usertime)) <= 60 Then
b = oldcash - 1
c = Val(strRate)
Else
If Round(Val(Trim(usertime)) / 60) < Val(Trim(usertime)) Then
truetime = Round(Val(Trim(usertime)) / 60) + 1
newcash = Val(oldcash) - Val(strRate) * Val(truetime)
b = oldcash - newcash
c = newcash
End If
End If
End If


If cardtype = "临时用户" Then
txtSQL = "DELETE student_Info where cardno= '" & aa & "'"
Call ExecuteSQL(txtSQL, MsgText)
End If

'录入student表
txtSQL = "select * from student_Info where cardno= '" & aa & "'"
Set mrc = ExecuteSQL(txtSQL, MsgText)
mrc.Fields(7) = c
mrc.Update

'录入Line表

txtSQL = "select * from Line_Info "
Set mrc3 = ExecuteSQL(txtSQL, MsgText)
mrc3.AddNew

mrc3.Fields(1) = Trim(mrc1.Fields(0))
mrc3.Fields(2) = mrc1.Fields(2)
mrc3.Fields(3) = mrc1.Fields(3)
mrc3.Fields(4) = mrc1.Fields(4)
mrc3.Fields(5) = mrc1.Fields(5)
mrc3.Fields(6) = mrc1.Fields(6)
mrc3.Fields(7) = mrc1.Fields(7)
mrc3.Fields(8) = Trim(Format(Date, "yyyy-mm-dd"))
mrc3.Fields(9) = Trim(Format(Endtime, "hh:mm:ss"))
mrc3.Fields(10) = Trim(Format(usertime, "hh:mm:ss"))
mrc3.Fields(11) = Trim(c)
mrc3.Fields(12) = Trim(b)
mrc3.Fields(13) = "正常下机"
mrc3.Fields(14) = Trim(Environ("computername"))

mrc3.Update
mrc3.Close
mrc.Close
mrc1.Close
mrc2.Close


'删除Online表
txtSQL = "DELETE from Online_Info where cardno= '" & aa & "'"
Call ExecuteSQL(txtSQL, MsgText) '刷新online表中的人数

mflg1.RemoveItem (mflg1.RowSel)
mrc4.MoveNext

Loop

MsgBox "全部下机成功", vbOKOnly + vbExclamation, "警告"
End If
End Sub

                 二是如何来算钱呢
                 这个需要考虑的便是一个小时时60分钟,按两元计算,那就是每15分钟5角钱,那不足15分钟收不收钱呢,过了45分钟算不算一个小时,如何所剩金额已不足够支付下个小时的金额又该怎么办呢?
                 我是只要过了15分钟便开始收钱,30分钟前收一元,过了45分钟再收1元,直到一小时结束为两元,这个过程定义了一个函数便可以了:
                

Function zh(i As Double) As Integer
If i < 0.25 Then
zh = Int(i)
Else
If i > 0.25 Or i = 0.25 Then
i = i + 1
zh = Int(i)
End If
End If
End Function

                  第二个问题如何解决呢,就是不断动态刷新。



 



  评论这张
 
阅读(188)| 评论(49)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017