求一计费思路(200)

  • 主题发起人 主题发起人 asnychen
  • 开始时间 开始时间
A

asnychen

Unregistered / Unconfirmed
GUEST, unregistred user!
现在有个项目,类是网吧,但不完全和网吧一样。。。会员是先在会员自己的上网卡上先存预存一笔钱,然后才能上网,或者在该俱乐部消费。1、当会员卡上余额不够上1个小时的时候,就不让他上机,但是如果他余额大于等于1个小时就可以上机,并且这时根据他的余额计算出他总共能上多久,把这个截止时间写到管理的数据库中,2、数据库服务器检测到截止时间小于等于当前时间,就表示该用户上网时间到了,提示用户余额不足,并且锁定他的机子。3、如果是没到他的最大截止时间,他就下机了,那就根据他下机的时间和上机的时间结算实际费用。(在没到最大截止时间的时候,下机时,由于有一个针对俱乐部会员的免费时间上机,所以结算的时候,会只计算收费时间的实际金额,比如零晨4点到6点为免费时间)4、但是在会员上网过程中有可能在俱乐部消费其他项目,比如买饮料喝或者咖啡、餐点什么的,都是从用他的会员卡进行消费。5、会员卡余额不能为负,上网的时候消费其他东西的时候,不会影响他上网扣费(就比如是,上网1小时5元,他卡上是8元,上机后,他买了瓶饮料用了4元,那就会出现负1的情况,这样是不允许的。)目前我的想法是上网扣费是每个小时记费一次(每个小时开始的时候就扣一个小时的钱),中间的消费就不会影响,因为是提前扣费。但是由于该俱乐部目前计算会有上千台电脑(包括上网用的和租赁使用的,都是按小时计算的),我在数据库服务器上写了存储过程来进行扣费检测。然后程序没10秒中调用一次,判断时间到了没,或者余额是否足够。但是我发现我模拟只有几百台电脑在使用时,还可以。。当我模拟有1000台以上正在使用的的时候这样的效率就太低了。而且数据库服务器的占用的内存达最大达到了500M(服务器是4核1G内存)不知道有没有更好的办法,我的想法是可不可以上机时只做记录不计费只根据他的余额判定可以上多久做个记录时间,在下机时再统一结算,但是这样中间的消费就有可能造成让别人免费上了很长时间,却没扣钱。(因为不能为负,最多只能扣到0)。。希望有朋友能给出好的思路。。
 
每10s对1000人刷新一次,效率肯定低我的想法,有一个表,记录当前在线人员,信息如下:-----------------会员ID,上线时间,上线时余额,最晚下线时间-----------------在他上线的时候,插入记录,并计算好最晚下线时间(含免费的时间),这个有些复杂,但不难,是吧?当他刷卡消费买东西的时候,计算一下他当前上网花费了多少钱,还剩下多少钱可购买东西,购买完成后,再次刷新刚才的那张表中的最晚下线时间。时间间隔由10s更改为1分钟,不必那么频繁。剩下的就是你只需要查询处理< 最晚下线时间>=当前时间>的人
 
同意znxia的意见。
 
PubWin等都市刷卡时才计算开始或结束时间啊!你为何要每分钟都计算呢?
 
首先非常感谢各位朋友的回答znxia 说的,我已经想到了,还有个问题,我开始没提到就是对部分会员卡有这样一个功能1个会员卡可以同时上机几台电脑,比如我有会员卡,我有3个朋友没有,我可以用的会员卡为他们另外开3台电脑,所以一共就是4台电脑了。如果是这样的按照 znxia 说的方法就不行了本来会员卡可以上3个小时,但是他同时开了4台电脑,因为按小时收费而且会员卡余额不能为负,也就是说实际上根本就开不了4台或者就是会员卡的余额可以上5个小时,同时开4台电脑,相当于只有其中一台可以上2个小时,其他3台只能上一个小时。像这样的问题存在,我目前考虑是用2种方式并存的方法来计算,一种就是znxia 说的,一种就是最开始我说的那样,(因为这样的会员卡很少,假如1000台同时使用,这样的用户最多不会超过1/10)每分钟一直循环检测对这部分会员卡进行扣费处理。我觉得这样扣费更准备一点,不知道各位觉得如何,有好的方法望指教。谢谢!!
 
会员ID,机器号,上线时间,上线时余额,最晚下线时间-----------1》上第一台机器时,计算对你来说,应该没问题了。2》半小时候,上第二台时,计算该会员以及扣除的金额,得出新的余额,将该余额(X)分摊给2条记录,计算出第二条记录可以上机的期限以及对应的金额(Y),然后再根据(X-Y)反向计算机器1还可以上机的期限,你可以做一个函数,参数为 Function (金额,开始时间):结束时间3》10分钟后,该会员开通第三台机器,同理,计算该会员以及扣除的金额,得出新的余额,将该余额(X2)分摊给3条记录,计算出第2,3条记录可以上机的期限以及对应的金额(Y2,y3),然后再根据(X2-Y2-y3)反向计算机器1还可以上机的期限.4>买东西时,计算3台机器已经耗费的金额,得出月余额XX,此为购物时的最大消费金额,消费完毕,执行类似步骤3的过。
 
此为思路,关于细节上的事情就不讨论了。
 
yjmxtb.yfid也加index吧Select a.*From yjmxtb awhere a.wpbs=''3'' and a.yfid='+''''+yfid+''''+' and exist (select b.ProducNo from famxtb b, fatb c where b.a.ProducNo=b.MateNo and b.ProducNo=c.ProducNo and c.Sort='+''''+ComboBox3.Text+'''')
 
多人接受答案了。
 
虽然这个过程计算比较复杂,但是也只是当触发的时候才会去计算,比我那样每分钟都去计算,对服务器的负载小多了。。。觉得应该按照你的方法。。。在此表示感谢!
 

Similar threads

回复
0
查看
813
不得闲
回复
0
查看
848
不得闲
回复
0
查看
804
不得闲
后退
顶部