机房收费系统遇到的问题(二) 逆向思维,消费时间不是相减,而是递增

    当时我们小组的UI设计师文彬一直强调面向对象,总是把"应用面向对象思维去实现机房收费系统"挂在嘴边,所以,我们合作版的机房收费系统,三个级别的用户:一般用户、操作员、管理员各有他们自己的主窗体,,,


    一般用户,也就是学生的窗体,是这个样子的






    相比之前的设计理念,








    我们现在的系统更像是"一种网吧运营模式的学校机房收费系统",这是我起的名



    现在咱们来说如何计算消费时间



   过去是这么实现的:上下机都会获取当前时间,并展示在界面上,调用封装的函数DataDiff就可以求得

    可是现在,虽然也有封装好的函数,但上下机时间的获取要么查询数据库,要么存入全局变量,而且计算起来也是很费劲的


    正苦恼的时候,灵光一显,相减不容易做到,那就让它递增吧


    于是乎,这个窗体文本框里的数据是一直在变化的,并设置每秒更新存入一次数据库



   贴一下代码,分享给大家



    窗体加载代码


   

        # region 窗体加载代码

        private void frm_GU_Main_Load(object sender, EventArgs e)
        {
            txtConsumedCash.Text = "0";
            txtConsumedLength.Text = "0";
            GetLineInfo();
        }
        #endregion

        #region 获取上机信息
        private void GetLineInfo()
        {
            //获取收费标准
            Facade.QueryBasicData fquerybd = new Facade.QueryBasicData();
            List<basicdataEntity> basicData = new List<basicdataEntity>();
            basicData = fquerybd.QueryBasicDataInfo();
            string regRate = basicData[0].regRate;
            string tmpRate = basicData[0].temRate;
            string unitTime = basicData[0].unitTime;
            string limitTime = basicData[0].limitTime;
            string prepareTime = basicData[0].prepareTime;
            string limitCash = basicData[0].limitCash;
            //一般用户登录成功即上机成功
            lblCurrentUser.Text = UI.Common.CommonClass.CurrentUserId.ToString().Trim();
            Entity.cardEntity cardInfo = new Entity.cardEntity();
            cardInfo.cardID = UI.Common.CommonClass.CurrentUserId;
            //获取卡的类型和余额
            Facade.LoginFa logfa = new Facade.LoginFa();
            List<cardEntity> cardIn = new List<cardEntity>();
            cardIn = logfa.GetCardBalance(cardInfo);
            string cardtype = cardIn[0].cardType.ToString();
            //int balanceleft = int.Parse(cardIn[0].leftCash);
            string balanceleft = cardIn[0].leftCash;
            //计算剩余时长=余额匹配的时间+准备时间+最少上机时间
            //先来计算余额匹配的时间
            if (cardtype == "固定")
            {
                int matchTime = int.Parse(balanceleft) / int.Parse(regRate) * 60;
                int allTime = matchTime + int.Parse(limitTime) + int.Parse(prepareTime);
                txtRestLength.Text = allTime.ToString();//剩余时长
            }
            else
            {
                int matchTime = int.Parse(balanceleft) / int.Parse(tmpRate) * 60;
                int allTime = matchTime + int.Parse(limitTime) + int.Parse(prepareTime);
                txtRestLength.Text = allTime.ToString();//剩余时长
            }
            txtConsumedCash.Text = "0";
            txtConsumedLength.Text = "0";
            txtBalance.Text = balanceleft.ToString();
            //存入数据库上机信息
            Entity.onLineEntity onLineInfo = new onLineEntity();
            onLineInfo.cardID = UI.Common.CommonClass.CurrentUserId;
            onLineInfo.loginDate = DateTime.Now.ToString("yyyy-MM-dd");
            onLineInfo.loginTime = DateTime.Now.ToString("HH:mm:ss");
            onLineInfo.IsOnLine = "正在上机";
            onLineInfo.pcNo = Dns.GetHostName();
            Facade.LoginFa logGfa = new Facade.LoginFa();
            logGfa.GoLineFa(onLineInfo);//调用外观层上机方法
        }
        #endregion




    每秒更新代码





        #region 每一秒更新一次页面显示,并把页面结果写入数据库
        private void timRefresh_Tick(object sender, EventArgs e)
        {
            //页面只读
            txtBalance.ReadOnly = true;
            txtConsumedCash.ReadOnly = true;
            txtConsumedLength.ReadOnly = true;
            txtRestLength.ReadOnly = true;
            //消费的时长
            txtConsumedLength.Text = (int.Parse(txtConsumedLength.Text.ToString().Trim()) + 1).ToString();
            //剩余的时长
            txtRestLength.Text = (int.Parse(txtRestLength.Text.ToString().Trim()) - 1).ToString();
            //获取收费标准
            Facade.QueryBasicData fquerybd = new Facade.QueryBasicData();
            List<basicdataEntity> basicData = new List<basicdataEntity>();
            basicData = fquerybd.QueryBasicDataInfo();
            string regRate = basicData[0].regRate;
            string tmpRate = basicData[0].temRate;
            string unitTime = basicData[0].unitTime;
            string limitTime = basicData[0].limitTime;
            string prepareTime = basicData[0].prepareTime;
            string limitCash = basicData[0].limitCash;

            //把消费信息存到下面这些变量里,写入数据库-韩林-2016年3月17日10:22:34

            double costMon;//花费的总金额
            string costT = null;//花费总时间
            string moneyLeft = null;//余额
            string Cid = UI.Common.CommonClass.CurrentUserId.Trim();//卡号

            //计算消费的金额,分两种情况
            //第一种,消费时间小于准备时间+最少上机时间
            if (int.Parse(txtConsumedLength.Text.ToString().Trim()) <= (int.Parse(limitTime) + int.Parse(prepareTime)))
            {
                costMon = 0;
                costT = txtConsumedLength.Text.Trim();
                moneyLeft = txtBalance.Text.Trim();
            }
            //第二种,消费时间超过规定时间
            else
            {
                //上机总花费时间
                int costTime = int.Parse(txtConsumedLength.Text.ToString().Trim()) - int.Parse(limitTime) - int.Parse(prepareTime);
                costT = costTime.ToString().Trim();
                //计算共有几个收费单位时间段
                int numberCost = Convert.ToInt32(Math.Ceiling((double)costTime / (double)int.Parse(unitTime)));
                //获取卡的类型和余额
                Facade.LoginFa logfa = new Facade.LoginFa();
                List<cardEntity> cardIn = new List<cardEntity>();
                Entity.cardEntity cardInfo = new Entity.cardEntity();
                cardInfo.cardID = UI.Common.CommonClass.CurrentUserId;
                cardIn = logfa.GetCardBalance(cardInfo);
                //卡的类型
                string cardtype = cardIn[0].cardType.ToString().Trim();
                //卡的余额
                string balanceleft = cardIn[0].leftCash;
                //固定用户单位时间花费
                double regUserCost = double.Parse(regRate) / double.Parse("60") * double.Parse(unitTime);
                //临时用户单位时间花费
                double tmpUserCost = double.Parse(tmpRate) / double.Parse("60") * double.Parse(unitTime);
                if (cardtype == "固定")
                {
                    //注意老外的四舍六入和中国式的四舍五入
                    double costMoney = Math.Round(regUserCost * numberCost, 1, MidpointRounding.AwayFromZero);
                    costMon = costMoney;
                }
                else
                {
                    double costMoney = Math.Round(tmpUserCost * numberCost, 1, MidpointRounding.AwayFromZero);
                    costMon = costMoney;
                }
                txtConsumedCash.Text = costMon.ToString().Trim();
                //有一点需要注意,卡内余额只能在消费金额变化时才能变,不能每秒都减去消费金额
                //所以不能用下面这句话
                //txtBalance.Text = (Math.Round(double.Parse(balanceleft), 1, MidpointRounding.AwayFromZero) - costMon).ToString().Trim();
                moneyLeft = txtBalance.Text.Trim();
            }


            //开始写入数据库-韩林-2016年3月17日10:30:16
            Entity.cardEntity enC = new cardEntity();
            Entity.onLineEntity enL = new onLineEntity();
            enC.cardID = Cid;
            enC.leftCash = moneyLeft;
            enL.conCash = costMon.ToString().Trim();
            enL.conTime = costT;
            Facade.LoginFa updateFa = new Facade.LoginFa();
            bool flag = updateFa.updateCL(enC, enL);
            if (flag == false)
            {
                MessageBox.Show("消费信息更新失败!", "提示");
                return;
            }
        }
        #endregion





    消费金额文本框值变化时的代码




        private void txtConsumedCash_TextChanged(object sender, EventArgs e)
        {
            //获取卡的余额和类型
            Facade.LoginFa logfa = new Facade.LoginFa();
            List<cardEntity> cardIn = new List<cardEntity>();
            Entity.cardEntity cardInfo = new Entity.cardEntity();
            cardInfo.cardID = UI.Common.CommonClass.CurrentUserId;
            cardIn = logfa.GetCardBalance(cardInfo);
            //卡的余额
            string balanceleft = cardIn[0].leftCash;
            //卡的类型
            string cardtype = cardIn[0].cardType.ToString().Trim();
            //获取基本收费标准
            Facade.QueryBasicData fquerybd = new Facade.QueryBasicData();
            List<basicdataEntity> basicData = new List<basicdataEntity>();
            basicData = fquerybd.QueryBasicDataInfo();
            string regRate = basicData[0].regRate;
            string tmpRate = basicData[0].temRate;
            string unitTime = basicData[0].unitTime;
            string limitTime = basicData[0].limitTime;
            string prepareTime = basicData[0].prepareTime;
            string limitCash = basicData[0].limitCash;
            //固定用户单位时间花费
            double regUserCost = double.Parse(regRate) / double.Parse("60") * double.Parse(unitTime);
            //临时用户单位时间花费
            double tmpUserCost = double.Parse(tmpRate) / double.Parse("60") * double.Parse(unitTime);
            if (cardtype == "固定")
            {
                txtBalance.Text = (Math.Round(double.Parse(balanceleft), 1, MidpointRounding.AwayFromZero) - regUserCost).ToString().Trim();
            }
            else
            {
                txtBalance.Text = (Math.Round(double.Parse(balanceleft), 1, MidpointRounding.AwayFromZero) - tmpUserCost).ToString().Trim();
            }
        }




    所以,一条路不好走的时候,要及时换一条路

    做软件要做活,做人也要灵活

    人有多大胆,地有多大产,我不怕千万人阻挡,只怕自己投降,迈开步子去做,生活总会给你惊喜



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 53
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 53
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值