/// <summary> /// 设置调价计划 /// </summary> /// <param name="info"></param> /// <param name="meter"></param> /// <returns></returns> public string SetPricingPlan(PricingPlan info, IoT_PricingMeter meter) { string result = ""; try { MongoDBHelper <Task> mongo_task = new MongoDBHelper <Task>(); Task task = new Task(); task.MeterMac = meter.MeterNo.Trim(); task.TaskDate = QuShi.getDate(); task.TaskID = Guid.NewGuid().ToString(); //用于和指令进行进行关联 task.TaskState = TaskState.Waitting; task.TaskType = TaskType.TaskType_调整价格; // //读取表信息 info.MeterNo = meter.MeterNo.Trim(); info.TaskID = task.TaskID; //写任务 mongo_task.Insert(CollectionNameDefine.TaskCollectionName, task); meter.TaskID = task.TaskID; //2.设置调价计划数据 DataItem_A010 item_A010 = null; CT ct = new CT(info.MeterType == "00" ? MeterType.气量表 : MeterType.金额表, (bool)info.IsUsedLadder, (JieSuanType)Convert.ToInt16(info.SettlementType.ToString()), ((int)info.Ladder) <= 0 ? 1 : (int)info.Ladder); item_A010 = new DataItem_A010(Convert.ToByte(new Random().Next(0, 255)), ct, DateTime.Now); item_A010.Price1 = (decimal)info.Price1; item_A010.Price2 = (decimal)info.Price2; item_A010.Price3 = (decimal)info.Price3; item_A010.Price4 = (decimal)info.Price4; item_A010.Price5 = (decimal)info.Price5; item_A010.UseGas1 = (decimal)info.Gas1; item_A010.UseGas2 = (decimal)info.Gas2; item_A010.UseGas3 = (decimal)info.Gas3; item_A010.UseGas4 = (decimal)info.Gas4; item_A010.StartDate = Convert.ToDateTime(info.UseDate); Command cmd = new Command(); cmd.TaskID = task.TaskID; cmd.Identification = ((UInt16)item_A010.IdentityCode).ToString("X2"); cmd.ControlCode = (byte)ControlCode.WriteData;//设置参数 cmd.DataLength = Convert.ToByte(item_A010.Length); cmd.DataCommand = MyDataConvert.BytesToHexStr(item_A010.GetBytes()); cmd.Order = 1; CommandDA.Insert(cmd); new PricingPlanDA().NewPricingPlan(info); //注:该函数如何进行事务处理,保证所有数据更新都成功。 } catch (Exception e) { result = e.Message; } return(result); }
/// <summary> /// 主站请求写数据对象 /// </summary> /// <param name="buffer"></param> /// <returns></returns> private DataItem getWriteDataAskItem(byte[] buffer) { IdentityCode identityCode = MyDataConvert.get数据表示符(buffer); DataItem item = null; switch (identityCode) { case IdentityCode.写价格表: item = new DataItem_A010(buffer); break; case IdentityCode.写结算日: item = new DataItem_A011(buffer); break; case IdentityCode.写购入金额: item = new DataItem_A013(buffer); break; case IdentityCode.写新密钥: item = new DataItem_A014(buffer); break; case IdentityCode.写标准时间: item = new DataItem_A015(buffer); break; case IdentityCode.写阀门控制: item = new DataItem_A017(buffer); break; case IdentityCode.出厂启用: item = new DataItem_A019(buffer); break; case IdentityCode.写地址: item = new DataItem_A018(buffer); break; case IdentityCode.写表底数: item = new DataItem_A016(buffer); break; default: break; } return(item); }
/// <summary> /// 处理主站请求的写操作,并返回应答数据对象 /// </summary> /// <param name="identityCode"></param> /// <param name="ser"></param> /// <param name="oldItem"></param> /// <returns></returns> private DataItem DowithWriteData(IdentityCode identityCode, byte ser, DataItem oldItem) { //在该方法中将写入数据设置到响应变量中 DataItem item = null; switch (identityCode) { case IdentityCode.写价格表: DataItem_A010 item_10 = oldItem as DataItem_A010; this.MeterType = ((byte)item_10.CT.CTMeterType).ToString().PadLeft(2, '0'); if (出厂状态 && item_10.CT.CTMeterType == Common.Item.MeterType.金额表) { this.出厂状态 = false; this.IsUsedLadder = item_10.CT.CTIsLadder; this.Ladder = item_10.CT.CTLadderNum; this.Price1 = item_10.Price1; this.Gas1 = item_10.UseGas1; this.Price2 = item_10.Price2; this.Gas2 = item_10.UseGas2; this.Price3 = item_10.Price3; this.Gas3 = item_10.UseGas3; this.Price4 = item_10.Price4; this.Gas4 = item_10.UseGas4; this.Price5 = item_10.Price5; this.SettlementType = ((byte)item_10.CT.CTJieSuanType).ToString().PadLeft(2, '0'); //结算类型 //设置初次转换为金额表的当前计价参数 this.CurrentLadder = 1; this.CurrentPrice = this.Price1; this.LastGasPoint = 0; //上次结算时表底 if (this.IsUsedLadder && this.Ladder > this.CurrentLadder) { //计算下一个结算点 this.NextSettlementPointGas = this.Gas1; this.SetNextSettlementDateTime(); } else { //非阶梯价或无阶梯,-1表示正无穷大 this.NextSettlementPointGas = -1; } } else if (!出厂状态 && item_10.CT.CTMeterType == Common.Item.MeterType.金额表) { //调价 PricingPlan plan = new PricingPlan(); plan.IsUsedLadder = item_10.CT.CTIsLadder; plan.Ladder = item_10.CT.CTLadderNum; plan.Price1 = item_10.Price1; plan.Gas1 = item_10.UseGas1; plan.Price2 = item_10.Price2; plan.Gas2 = item_10.UseGas2; plan.Price3 = item_10.Price3; plan.Gas3 = item_10.UseGas3; plan.Price4 = item_10.Price4; plan.Gas4 = item_10.UseGas4; plan.Price5 = item_10.Price5; plan.UseDate = item_10.StartDate.ToString(); plan.MeterType = ((byte)item_10.CT.CTMeterType).ToString(); plan.SettlementType = ((byte)item_10.CT.CTJieSuanType).ToString().PadLeft(2, '0'); //结算类型 plan.MeterNo = this.Mac; this.AddPlan(plan); } item = new DataItem_A010_Answer(ser, _st1); break; case IdentityCode.写结算日: DataItem_A011 item_11 = oldItem as DataItem_A011; this.SettlementDay = item_11.JieSuanDay; this.SettlementMonth = item_11.JieSuanMonth; SetNextSettlementDateTime(); item = new DataItem_A011_Answer(ser); break; case IdentityCode.写购入金额: DataItem_A013 item_13 = oldItem as DataItem_A013; if (this.lastBuySer != ser) { if (this.lastBuySer != ser) { this.LastSettlementAmount += item_13.BuyMoney; //写入购买金额 this.TotalTopUp += item_13.BuyMoney; this.CurrentBalance += item_13.BuyMoney; this.lastBuySer = ser; } } item = new DataItem_A013_ASK(ser, item_13.BuyIndex, item_13.BuyMoney); break; case IdentityCode.写新密钥: DataItem_A014 item_14 = oldItem as DataItem_A014; this.Key = item_14.Key; this.MKeyVer = item_14.Version; item = new DataItem_A014_ASK(ser, item_14.Version); break; case IdentityCode.写标准时间: item = new DataItem_A015_ASK(ser); break; case IdentityCode.写阀门控制: DataItem_A017 item_17 = oldItem as DataItem_A017; this.ValveState = item_17.IsOpen == true ? "0" : "1"; this._st1.ValveStatu = item_17.IsOpen; item = new DataItem_A017_ASK(ser, this._st1); break; case IdentityCode.出厂启用: item = new DataItem_A019(ser); break; case IdentityCode.写地址: item = new DataItem_A018_Answer(ser); break; default: break; } Update(); return(item); }
/// <summary> /// 换表申请指令 /// </summary> /// <returns></returns> public string SubmitASK(string taskID, IoT_Meter meter, decimal LJGas) { /*数据标识DI,序号SER,当前累计用量(金额),当前剩余用量(气量/金额),本阶梯周期已使用累计用量(气量)*/ //创建一个任务 MongoDBHelper <Task> mongo_task = new MongoDBHelper <Task>(); Task task = new Task(); task.MeterMac = meter.MeterNo.Trim(); task.TaskDate = QuShi.getDate(); task.TaskID = taskID; //用于和指令进行进行关联 task.TaskState = TaskState.Waitting; task.TaskType = TaskType.TaskType_换表登记; //点火任务(DH),换表登记(HB)、开阀(KF)、关阀(GF)、充值(CZ)、调整价格(TJ) //写任务 mongo_task.Insert(CollectionNameDefine.TaskCollectionName, task); Command cmd = new Command(); byte ser = Convert.ToByte(new Random().Next(0, 255)); cmd = new Command(); //1.写密钥 //DataItem_A014 item_A014 = new DataItem_A014(ser, (byte)meter.MKeyVer, meter.MKey);// //cmd.TaskID = task.TaskID; //cmd.Identification = ((UInt16)item_A014.IdentityCode).ToString("X2"); //cmd.ControlCode = (byte)ControlCode.WriteData;//写操作 //cmd.DataLength = Convert.ToByte(item_A014.Length); //cmd.DataCommand = MyDataConvert.BytesToHexStr(item_A014.GetBytes()); //cmd.Order = 1; //CommandDA.Insert(cmd); ////2.设置上传周期 //DataItem_C105 item_C105 = new DataItem_C105(Convert.ToByte(new Random().Next(0, 255)), ReportCycleType.天周期, 1, 23, 59); //cmd = new Command(); //cmd.TaskID = task.TaskID; //cmd.Identification = ((UInt16)item_C105.IdentityCode).ToString("X2"); //cmd.ControlCode = (byte)ControlCode.CYWriteData;//设置参数 //cmd.DataLength = Convert.ToByte(item_C105.Length); //cmd.DataCommand = MyDataConvert.BytesToHexStr(item_C105.GetBytes()); //cmd.Order = 2; //CommandDA.Insert(cmd); ////3.设置报警参数 //DataItem_C103 item_C103 = new DataItem_C103(Convert.ToByte(new Random().Next(0, 255)), new WaringSwitchSign() { 长期未使用切断报警 = true, 长期未与服务器通讯报警 = true }); //cmd = new Command(); //cmd.TaskID = task.TaskID; //cmd.Identification = ((UInt16)item_C103.IdentityCode).ToString("X2"); //cmd.ControlCode = (byte)ControlCode.CYWriteData;//设置参数 //cmd.DataLength = Convert.ToByte(item_C103.Length); //cmd.DataCommand = MyDataConvert.BytesToHexStr(item_C103.GetBytes()); //cmd.Order = 3; //CommandDA.Insert(cmd); //4.写价格表 DataItem_A010 item_A010 = null; CT ct = new CT(meter.MeterType == "00" ? MeterType.气量表 : MeterType.金额表, (bool)meter.IsUsed, (JieSuanType)Convert.ToInt16(meter.SettlementType.ToString()), meter.Ladder == null ? 1 : (int)meter.Ladder); item_A010 = new DataItem_A010(Convert.ToByte(new Random().Next(0, 255)), ct, DateTime.Now); item_A010.Price1 = (decimal)meter.Price1; item_A010.Price2 = (decimal)meter.Price2; item_A010.Price3 = (decimal)meter.Price3; item_A010.Price4 = (decimal)meter.Price4; item_A010.Price5 = (decimal)meter.Price5; item_A010.UseGas1 = (decimal)meter.Gas1; item_A010.UseGas2 = (decimal)meter.Gas2; item_A010.UseGas3 = (decimal)meter.Gas3; item_A010.UseGas4 = (decimal)meter.Gas4; item_A010.StartDate = DateTime.Now; cmd = new Command(); cmd.TaskID = task.TaskID; cmd.Identification = ((UInt16)item_A010.IdentityCode).ToString("X2"); cmd.ControlCode = (byte)ControlCode.WriteData;//设置参数 cmd.DataLength = Convert.ToByte(item_A010.Length); cmd.DataCommand = MyDataConvert.BytesToHexStr(item_A010.GetBytes()); cmd.Order = 4; CommandDA.Insert(cmd); //5.写结算日 DataItem_A011 item_a011 = new DataItem_A011(Convert.ToByte(new Random().Next(0, 255)), Convert.ToByte(meter.SettlementDay)); item_a011.JieSuanMonth = 1;//根据系统定义取值 cmd = new Command(); cmd.TaskID = task.TaskID; cmd.Identification = ((UInt16)item_a011.IdentityCode).ToString("X2"); cmd.ControlCode = (byte)ControlCode.WriteData;//设置参数 cmd.DataLength = Convert.ToByte(item_a011.Length); cmd.DataCommand = MyDataConvert.BytesToHexStr(item_a011.GetBytes()); cmd.Order = 5; CommandDA.Insert(cmd); //6.写换表指令 DataItem_C107 item_C107 = new DataItem_C107(Convert.ToByte(new Random().Next(0, 255)), 0.0m, (decimal)meter.TotalTopUp, LJGas); cmd = new Command(); cmd.TaskID = task.TaskID; cmd.Identification = ((UInt16)item_C107.IdentityCode).ToString("X2"); cmd.ControlCode = (byte)ControlCode.CYWriteData;//设置参数 cmd.DataLength = Convert.ToByte(item_C107.Length); cmd.DataCommand = MyDataConvert.BytesToHexStr(item_C107.GetBytes()); cmd.Order = 6; CommandDA.Insert(cmd); return(""); }