예제 #1
0
        private bool isDuplicate(CorrectRecord record)
        {
            foreach (CorrectRecord s in dataSets)
            {
                int conditions = 0;

                if (Equals(s.getIndexNumber(), record.getIndexNumber()))
                {
                    conditions++;
                }

                if (Equals(s.getFname(), record.getFname()))
                {
                    conditions++;
                }

                if (Equals(s.getLname(), record.getLname()))
                {
                    conditions++;
                }

                if (conditions == 3)
                {
                    return(true);
                }
            }


            return(false);
        }
예제 #2
0
        public void extractData(List <string> lista)
        {
            int iloscposprawdzeniu       = 0;
            int iloscrekordowWejsciowych = lista.Count;



            foreach (string s in lista)
            {
                string[] studentsData = s.Split(',');



                try
                {
                    CorrectRecord correctRecord = new CorrectRecord(studentsData);

                    if (isDuplicate(correctRecord))
                    {
                        throw new Exception("Znaleziono duplikat: " + correctRecord.getCorrectedRecord());
                    }
                    else
                    {
                        dataSets.Add(correctRecord);
                        string record = correctRecord.getCorrectedRecord();

                        data.Add(record);

                        correctRecord.showDataSet();



                        iloscposprawdzeniu++;
                    }



                    //     correctRecord.showDataSet();



                    //    iloscposprawdzeniu++;
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }



            // zrobić set data i dodać



            Console.WriteLine(" przed " + iloscrekordowWejsciowych + "----> " + "po" + iloscposprawdzeniu);
        }
예제 #3
0
        /// <summary>
        /// 添加修正任务
        /// </summary>
        /// <param name="correctRecord"></param>
        /// <returns></returns>
        public string AddCorrentTask(CorrectRecord correctRecord, out Task returnTask)
        {
            string result = "";

            returnTask = null;
            try
            {
                //先删除未执行的任务
                DeleteUnRunTask(correctRecord.MeterNo.Trim());
                MongoDBHelper <Meter> mongo = new MongoDBHelper <Meter>();
                //1、记录修正信息
                result = mongo.Insert(CollectionNameDefine.MeterCorrectRecord, correctRecord);
                if (result != "")
                {
                    return(result);
                }
                //2、创建修正任务指令
                //创建一个任务
                MongoDBHelper <Task> mongo_task = new MongoDBHelper <Task>();
                Task task = new Task();
                task.MeterMac  = correctRecord.MeterNo.Trim();
                task.TaskDate  = QuShi.getDate();
                task.TaskID    = Guid.NewGuid().ToString(); //用于和指令进行进行关联
                task.TaskState = TaskState.Waitting;
                task.TaskType  = TaskType.TaskType_校准;      //点火任务(DH),换表登记(HB)、开阀(KF)、关阀(GF)、充值(CZ)、调整价格(TJ)
                //写任务
                result = mongo_task.Insert(CollectionNameDefine.TaskCollectionName, task);
                if (result != "")
                {
                    return(result);
                }

                Command cmd = new Command();
                //1.写校正指令
                byte          ser       = Convert.ToByte(new Random().Next(0, 255));
                DataItem_C102 item_C102 = new DataItem_C102(ser, correctRecord.TotalTopUp - correctRecord.SettlementBalance, correctRecord.SettlementBalance, correctRecord.LastSettlementDayLJGas);
                cmd.TaskID         = task.TaskID;
                cmd.Identification = ((UInt16)item_C102.IdentityCode).ToString("X2");
                cmd.ControlCode    = (byte)ControlCode.CYWriteData;//创源写操作
                cmd.DataLength     = Convert.ToByte(item_C102.Length);
                cmd.DataCommand    = MyDataConvert.BytesToHexStr(item_C102.GetBytes());
                cmd.Order          = 1;
                //返回修正任务
                result     = CommandDA.Insert(cmd);
                returnTask = task;
                task.CommandList.Add(cmd);
                if (result != "")
                {
                    return(result);
                }
            }
            catch (Exception e)
            {
                return(e.Message);
            }
            return("");
        }
예제 #4
0
        /// <summary>
        /// 进行计费汇算,本次会算值作为是否校准的依据,如需要校准,则返回true
        /// </summary>
        /// <param name="meter"></param>
        /// <param name="dataItem"></param>
        /// <returns></returns>
        public bool Calculate(Meter meter, SubmitData dataItem, SubmitResult returnResult)
        {
            #region

            /*
             * //计算当前阶段用气量
             * decimal JieDuanYongQiLiang = dataItem.LJGas - meter.LastTotal;// dataItem.LastLJGas;
             * decimal[] prices = new decimal[5];
             * prices[0] = meter.Price1;
             * prices[1] = meter.Price2;
             * prices[2] = meter.Price3;
             * prices[3] = meter.Price4;
             * prices[4] = meter.Price5;
             * decimal[] gas = new decimal[4];
             * gas[0] = meter.Gas1;
             * gas[1] = meter.Gas2;
             * gas[2] = meter.Gas3;
             * gas[3] = meter.Gas4;
             * decimal currentPirce = meter.Price1;
             * decimal currentGas = meter.Gas1;
             * decimal amount = meter.LastSettlementAmount;
             *
             * decimal[] fees = new decimal[5];
             * decimal[] usedGas = new decimal[5];
             * if (meter.IsUsedLadder)
             * {
             *  //启用了阶梯价
             *  int iLadder = 1;
             *  while (iLadder < meter.Ladder)
             *  {
             *      currentPirce = prices[iLadder - 1];
             *      currentGas = gas[iLadder - 1];
             *      if (JieDuanYongQiLiang > currentGas)
             *      {
             *          //当前阶段总用气量大于当前阶梯用气量
             *          fees[iLadder - 1] = currentGas * currentPirce;
             *          usedGas[iLadder - 1] = currentGas;
             *
             *          amount -= fees[iLadder - 1];
             *          JieDuanYongQiLiang -= currentGas;
             *          iLadder++;
             *      }
             *      else if (JieDuanYongQiLiang > 0)
             *      {
             *          fees[iLadder - 1] = JieDuanYongQiLiang * currentPirce;
             *          usedGas[iLadder - 1] = JieDuanYongQiLiang;
             *
             *          amount -= fees[iLadder - 1];
             *          JieDuanYongQiLiang = 0;
             *          iLadder++;
             *          break;
             *      }
             *      else
             *      {
             *          iLadder++;
             *          break;
             *      }
             *  }
             *  if (JieDuanYongQiLiang > 0)
             *  {
             *      //计算最后一个阶梯
             *      currentPirce = prices[iLadder - 1];
             *
             *      fees[iLadder - 1] = JieDuanYongQiLiang * currentPirce;
             *      usedGas[iLadder - 1] = JieDuanYongQiLiang;
             *      amount -= fees[iLadder - 1];
             *  }
             * }
             * else
             * {
             *  //未使用阶梯价
             *  amount -= JieDuanYongQiLiang * currentPirce;
             *  fees[0] = JieDuanYongQiLiang * currentPirce;
             *  usedGas[0] = JieDuanYongQiLiang;
             * }
             */
            #endregion
            if (meter.BillID == null)
            {
                meter.CreateBillID();
            }
            decimal amount = CalculateGasFee(meter, dataItem);

            //判断结算日是否到达
            //判断是否到结算日,该处的功能依赖表必须传输结算日气量数据,且上报的数据必须按时间顺序传输。
            if (meter.Jiange(meter.GetSettlementTimePoint()) >= 0)
            {
                decimal[] gas = new decimal[5];
                gas[0] = meter.Gas1;
                gas[1] = meter.Gas2;
                gas[2] = meter.Gas3;
                gas[3] = meter.Gas4;
                gas[4] = -1;

                //记录结算记录
                BillRecord record = new BillRecord()
                {
                    UserID = meter.UserID, MeterNo = meter.Mac
                };
                record.RecordDate     = dataItem.ReadDate.ToString("yyyy-MM-dd HH:mm:ss");
                record.BillRecordType = BillRecordType.结算点记录;
                record.BillID         = meter.BillID;
                record.Ladder         = meter.CurrentLadder;

                if (meter.NextSettlementPointGas != -1 && dataItem.LJGas < meter.NextSettlementPointGas)
                {
                    record.EndPoint = dataItem.LJGas;
                    if (meter.IsPricing)
                    {
                        record.BeginPoint = meter.TiaoJiaPointGas;
                    }
                    else
                    {
                        record.BeginPoint = meter.NextSettlementPointGas - gas[meter.CurrentLadder - 1];
                    }
                    record.Gas     = record.EndPoint - record.BeginPoint;
                    record.Price   = meter.CurrentPrice;
                    record.Amount  = record.Gas * record.Price;
                    record.Balance = meter.CurrentBalance;
                }
                else if (meter.NextSettlementPointGas != -1 && dataItem.LJGas == meter.NextSettlementPointGas)
                {
                    record.EndPoint = meter.NextSettlementPointGas;
                    if (meter.IsPricing)
                    {
                        record.BeginPoint = meter.TiaoJiaPointGas;
                    }
                    else
                    {
                        record.BeginPoint = meter.NextSettlementPointGas - gas[meter.CurrentLadder - 1];
                    }
                    record.Gas     = record.EndPoint - record.BeginPoint;
                    record.Price   = meter.CurrentPrice;
                    record.Amount  = record.Gas * record.Price;
                    record.Balance = meter.CurrentBalance;
                }
                else
                {
                    //最后一个阶梯
                    record.EndPoint = dataItem.LJGas;
                    if (meter.IsPricing)
                    {
                        record.BeginPoint = meter.TiaoJiaPointGas;
                    }
                    else
                    {
                        record.BeginPoint = meter.LastTotal;
                        for (int i = 0; i < meter.Ladder; i++)
                        {
                            record.BeginPoint += gas[i];
                        }
                    }
                    record.Gas     = record.EndPoint - record.BeginPoint;
                    record.Price   = meter.CurrentPrice;
                    record.Amount  = record.Gas * record.Price;
                    record.Balance = meter.CurrentBalance;
                }
                new M_BillRecordService().AddBillRecord(record);
                meter.IsPricing = false;
                meter.CreateBillID();
                //创建新的账单
                Bill bill = new Bill()
                {
                    BillID = meter.BillID, UserID = meter.UserID, BeginDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                };
                new M_BillRecordService().AddBill(bill);

                returnResult.IsReLoadMeter = true;
                //更新结算数据
                if (meter.NextSettlementPointGas != 0 && !String.IsNullOrEmpty(meter.SettlementDateTime))
                {
                    meter.LastTotal = dataItem.LJGas;
                }
                meter.SetNextSettlementDateTime();
                meter.TotalAmount          = dataItem.LJGas;
                meter.LastSettlementAmount = amount;
                meter.CurrentLadder        = 1;
                meter.CurrentPrice         = meter.Price1;

                if (meter.IsUsedLadder && meter.CurrentLadder < meter.Ladder)
                {
                    //设置第1个节点的结算点气量
                    meter.NextSettlementPointGas = meter.LastTotal + gas[meter.CurrentLadder - 1];
                }
                else
                {
                    //下一次结算点气量为无穷大
                    meter.NextSettlementPointGas = -1;
                }
                new TaskManageDA().UpdateMeter(meter);
                //TODO:在此记录阶段用气账单
            }
            //处理调价。
            TiaoJiaDowith(meter, dataItem);

            decimal syMoney = Convert.ToDecimal(dataItem.SYMoney.ToString("0.00"));
            //在此可以定义系统参数,修正精度,默认差值大于1角做修正处理
            if (meter.IsDianHuo && Math.Abs(syMoney - amount) > 0.1m)
            {
                //修正时间、修正原因、 表号、表上传的当前余额、 上次结算日累计气量(4字节),上次结算日剩余金额(4字节),累计购入金额(4字节),当前结算日
                Console.WriteLine("需要修正表计量数据,表余额:{0} ,后台系统余额:{1}", dataItem.SYMoney, amount);
                CorrectRecord correct = new CorrectRecord();
                correct.MeterBalance = syMoney;
                correct.MeterNo      = meter.Mac;
                correct.MeterLastSettleMentDayLJGas = dataItem.LastLJGas;
                correct.MeterLJGas    = dataItem.LJGas;
                correct.MeterLJMoney  = dataItem.LJMoney;
                correct.MeterReadDate = dataItem.ReadDate.ToString("yyyy-MM-dd HH:mm:ss");

                correct.SettlementDay          = (byte)meter.SettlementDay;
                correct.CorrectDate            = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                correct.CorrectReason          = string.Format("表计量数据和后台不一致,表余额误差超出允许范围,表余额:{0} ,后台余额:{1} 差额:{2}", dataItem.SYMoney, amount, Math.Abs(syMoney - amount));
                correct.TotalTopUp             = meter.TotalTopUp;
                correct.SettlementBalance      = amount;
                correct.LastSettlementDayLJGas = meter.LastTotal;
                dataItem.SYMoney = amount;
                Task   _task;
                string result = new CorrectDA().AddCorrentTask(correct, out _task);//记录修正数据和添加修正任务
                if (result == "")
                {
                    returnResult.IsCalibration = true;
                    returnResult.Calibrations.Add(_task);
                }
            }
            return(returnResult.IsCalibration);
        }