/// <summary> /// 翻车业务逻辑入口 /// </summary> private void CreateMainTask() { taskSimpleScheduler = new TaskSimpleScheduler(); autoResetEvent.Reset(); taskSimpleScheduler.StartNewTask("翻车业务逻辑", () => { // 获取待处理的车号识别记录 - 入厂方向 CmcsTrainCarriagePass inTrainCarriagePass = carriageRecognitionerDAO.GetUnHandleTrainCarriagePass(this.carriageRecognitionerMachineCode, eTrainPassDirection.进厂); if (inTrainCarriagePass != null) { this.CurrentTrainCarriagePass = inTrainCarriagePass; // 检测采样机系统的状态 string samplerSystemStatue = commonDAO.GetSignalDataValue(this.trainBeltSampler.EquipmentCode, eSignalDataName.系统.ToString()); if (samplerSystemStatue == eEquInfSamplerSystemStatus.发生故障.ToString() || samplerSystemStatue == eEquInfSamplerSystemStatus.正在卸样.ToString()) { MessageBoxEx2Show("禁止翻车, " + this.trainBeltSampler.EquipmentName + "发生故障或正在卸样,已暂停运行", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); btnStartTurnover.Enabled = true; // 取消任务 this.taskSimpleScheduler.Cancal(); return; } StartTippingTask(this.CurrentTrainCarriagePass); autoResetEvent.WaitOne(); } }, 4000); }
/// <summary> /// 同步报文 /// </summary> /// <param name="output"></param> /// <returns></returns> public int Save(List <CmcsTrainCarriagePass> cmcstraincarriagepass, Action <string, eOutputType> output) { int res = 0; try { foreach (var item in cmcstraincarriagepass) { CmcsTrainCarriagePass item1 = Dbers.GetInstance().SelfDber.Entity <CmcsTrainCarriagePass>("where TrainNumber=:TrainNumber and PassTime=:PassTime", new { TrainNumber = item.TrainNumber, PassTime = item.PassTime }); if (item1 == null) { res += Dbers.GetInstance().SelfDber.Insert(item); } else { item1.Direction = item.Direction; item1.MachineCode = item.MachineCode; item1.TrainNumber = item.TrainNumber; item1.PassTime = item.PassTime; item1.DataFlag = item.DataFlag; res += Dbers.GetInstance().SelfDber.Update <CmcsTrainCarriagePass>(item1); } } } catch (Exception ex) { output(string.Format("保存数据失败,原因:{0}", ex.Message), eOutputType.Error); } output(string.Format("同步车号识别数据 {0} 条(集中管控 )", res), eOutputType.Normal); return(res); }
/// <summary> /// 2号车号识别 /// </summary> /// <param name="carNumber">车号</param> /// <param name="carDate">时间</param> /// <param name="direction">方向</param> /// <param name="infactoryordernumber">顺序号</param> /// <param name="carmodel">车型</param> /// <returns></returns> public static bool CarSpot2Data(Action <string, eOutputType> output, CmcsTrainRecognition trainPass) { if (trainPass == null) { return(false); } if (trainPass.Direction == "进厂") { CmcsTrainCarriagePass transport = Dbers.GetInstance().SelfDber.Entity <CmcsTrainCarriagePass>("where TrainNumber='" + trainPass.CarNumber + "' and PassTime>=to_date('" + DateTime.Now.Date.AddDays(-1) + "','yyyy/mm/dd HH24:MI:SS') order by PassTime desc"); if (transport == null) { transport = new CmcsTrainCarriagePass(); transport.TrainNumber = trainPass.CarNumber; transport.CarModel = trainPass.CarModel; transport.MachineCode = trainPass.MachineCode; transport.PassTime = trainPass.CrossTime; transport.Direction = trainPass.Direction; transport.OrderNum = trainPass.OrderNum; transport.DataFlag = 0; transport.PKID = trainPass.Id; Dbers.GetInstance().SelfDber.Insert(transport); } else { transport.MachineCode = trainPass.MachineCode; Dbers.GetInstance().SelfDber.Update(transport); } CommonDAO.GetInstance().SetSignalDataValue(GlobalVars.MachineCode_HCJXCYJ_1, eSignalDataName.当前车号.ToString(), trainPass.CarNumber); // 插入定位信息 if (InsertTransportPosition("#2", trainPass.CarNumber)) { output(string.Format("#2轨道插入定位信息;{0}车号识别 车号:{1}", trainPass.MachineCode, trainPass.CarNumber), eOutputType.Normal); return(true); } } else if (trainPass.Direction == "出厂") { CommonDAO.GetInstance().SetSignalDataValue(GlobalVars.MachineCode_HCJXCYJ_2, eSignalDataName.当前车号.ToString(), string.Empty); // 移除定位信息 if (RemoveTransportPosition(trainPass.CarNumber)) { output(string.Format("#2轨道移除定位信息;{0}车号识别 车号:{1}", trainPass.MachineCode, trainPass.CarNumber), eOutputType.Normal); return(true); } } return(false); }
/// <summary> /// 移除轨道车辆定位信息 /// </summary> /// <param name="transportId"></param> public static bool RemoveTransportPosition(string trainNumber) { CmcsTrainCarriagePass oldtrain = Dbers.GetInstance().SelfDber.Entity <CmcsTrainCarriagePass>("where TrainNumber=:TrainNumber and PassTime>=:PassTime order by PassTime desc", new { TrainNumber = trainNumber, PassTime = DateTime.Now.AddDays(-1) }); if (oldtrain == null) { return(false); } CmcsTransportPosition entity = Dbers.GetInstance().SelfDber.Entity <CmcsTransportPosition>("where TransportId='" + oldtrain.Id + "' order by CreationTime desc"); if (entity == null) { return(false); } return(Dbers.GetInstance().SelfDber.Delete <CmcsTransportPosition>(entity.Id) > 0); }
private void PrintRecvMssg(string str, String machinecode, Action <string, eOutputType> output) { int res = 0; try { if (str.Length >= 67) { string no = str.Substring(5, 2); if (no == "03") { CmcsTrainCarriagePass item = Dbers.GetInstance().SelfDber.Entity <CmcsTrainCarriagePass>("where TrainNumber=:TrainNumber and PassTime=:PassTime", new { TrainNumber = str.Substring(24, 7).Trim(), PassTime = Convert.ToDateTime(str.Substring(str.Length - 30, 19)) }); if (item == null) { res += Dbers.GetInstance().SelfDber.Insert <CmcsTrainCarriagePass>( new CmcsTrainCarriagePass { OrderNum = Convert.ToInt32(str.Substring(0, 2)), CarModel = str.Substring(2, 5).Trim(), TrainNumber = str.Substring(24, 7).Trim(), PassTime = Convert.ToDateTime(str.Substring(str.Length - 30, 19)), Speed = Convert.ToDecimal(str.Substring(31, 3)), MachineCode = machinecode } ); } else { item.OrderNum = Convert.ToInt32(str.Substring(0, 2)); item.CarModel = str.Substring(2, 5).Trim(); item.TrainNumber = str.Substring(24, 7).Trim(); item.PassTime = Convert.ToDateTime(str.Substring(str.Length - 30, 19)); item.Speed = Convert.ToDecimal(str.Substring(31, 3)); item.MachineCode = machinecode; res += Dbers.GetInstance().SelfDber.Update <CmcsTrainCarriagePass>(item); } output(string.Format("成功读取TCPIP文件车号:{0}通过时间:{1}", str.Substring(24, 7).Trim(), Convert.ToDateTime(str.Substring(str.Length - 30, 19))), eOutputType.Normal); } } } catch (Exception ex) { output(string.Format("解析报文失败,原因:{0}", ex.ToString()), eOutputType.Error); } }
/// <summary> /// 修改轨道车辆定位信息,设定为未翻车 /// </summary> /// <param name="transportId"></param> public static bool UnTurnTransportPosition(string trainNumber) { CmcsTrainCarriagePass oldtrain = Dbers.GetInstance().SelfDber.Entity <CmcsTrainCarriagePass>("where TrainNumber=:TrainNumber and PassTime>=:PassTime order by PassTime desc", new { TrainNumber = trainNumber, PassTime = DateTime.Now.AddDays(-1) }); if (oldtrain == null) { return(false); } CmcsTransportPosition entity = Dbers.GetInstance().SelfDber.Entity <CmcsTransportPosition>("where TransportId='" + oldtrain.Id + "' and IsDisCharged=1 order by CreationTime desc"); if (entity == null) { return(false); } entity.IsDisCharged = 0; entity.TurnCarDate = DateTime.MinValue; return(Dbers.GetInstance().SelfDber.Update(entity) > 0); }
/// <summary> /// 插入定位信息 /// </summary> /// <param name="trackNumber"></param> /// <param name="transportid"></param> /// <returns></returns> public static bool InsertTransportPosition(string trackNumber, string carNumber) { CmcsTrainCarriagePass transport = Dbers.GetInstance().SelfDber.Entity <CmcsTrainCarriagePass>("where TrainNumber=:TrainNumber and PassTime>=:PassTime order by CreationTime desc", new { TrainNumber = carNumber, PassTime = DateTime.Now.AddDays(-1) }); if (transport == null) { return(false); } CmcsTransportPosition entity = Dbers.GetInstance().SelfDber.Entity <CmcsTransportPosition>("where TransportId='" + transport.Id + "'"); if (entity != null) { Dbers.GetInstance().SelfDber.Delete <CmcsTransportPosition>(entity.Id); } return(Dbers.GetInstance().SelfDber.Insert(new CmcsTransportPosition() { OrderNumber = GetTransportPositionMaxOrder(), TrackNumber = trackNumber, TransportId = transport.Id, IsDisCharged = 0 }) > 0); }
/// <summary> /// 接收车号识别数据,开始翻车逻辑控制 /// </summary> /// <param name="inTrainCarriagePass"></param> private void StartTippingTask(CmcsTrainCarriagePass trainCarriagePass) { Task task = new Task((state) => { CmcsTrainCarriagePass inTrainCarriagePass = state as CmcsTrainCarriagePass; if (inTrainCarriagePass != null) { #region 车号为空时,执行车号补录 if (string.IsNullOrEmpty(inTrainCarriagePass.TrainNumber)) { Log4Neter.Info(this.trainTipper.EquipmentName + " - 车号识别失败,要求输入车号"); this.InvokeEx(() => { Form1.superTabControlManager.ChangeToTab(this.trainTipper.EquipmentCode); }); // 弹出输入框,要求输入车厢号 FrmInput frmInput = new FrmInput("请输入所翻车厢号", (input) => { if (string.IsNullOrEmpty(input)) { MessageBoxEx.Show("请输入车厢号", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return(false); } if (!this.view_TrainTipperQueue_DF.Any(a => a.TrainNumber == input)) { MessageBoxEx.Show("在队列中未找到此车,请重新输入", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return(false); } return(true); }); if (frmInput.ShowDialog() == DialogResult.OK) { Log4Neter.Info(this.trainTipper.EquipmentName + " - 用户输入:" + frmInput.Input); inTrainCarriagePass.TrainNumber = frmInput.Input; } else { Log4Neter.Info(this.trainTipper.EquipmentName + " - 用户关闭输入窗口"); inTrainCarriagePass.DataFlag = 1; Dbers.GetInstance().SelfDber.Update(inTrainCarriagePass); autoResetEvent.Set(); }; } #endregion Log4Neter.Info(this.trainTipper.EquipmentName + " - 当前车号:" + inTrainCarriagePass.TrainNumber); commonDAO.SetSignalDataValue(this.trainTipper.EquipmentCode, eSignalDataName.当前车号.ToString(), inTrainCarriagePass.TrainNumber); View_TrainTipperQueue selfView_TrainTipperQueue = this.view_TrainTipperQueue_All.FirstOrDefault(a => a.TrainNumber == inTrainCarriagePass.TrainNumber); if (selfView_TrainTipperQueue != null) { commonDAO.SetSignalDataValue(this.trainTipper.EquipmentCode, eSignalDataName.当前车Id.ToString(), selfView_TrainTipperQueue.TransportId); if (selfView_TrainTipperQueue.SampleType != eSamplingType.皮带采样.ToString()) { // 采样方案中设置为非火车皮采 Log4Neter.Info(this.trainTipper.EquipmentName + " - 采样方案中设置为非皮带采样,SampleType=" + selfView_TrainTipperQueue.SampleType); DialogResult dialogResult = MessageBoxEx2Show("<font size='+2'>车号: <font color='red'>" + selfView_TrainTipperQueue.TrainNumber + "</font><br/><br/>该车为" + selfView_TrainTipperQueue.SampleType + "<br/><br/>点击<font color='red'>[是]</font>立即通知皮带采样机停止采样<br/>然后在采样机成功停止后开始翻车<br/><br/>点击<font color='red'>[否]</font>直接开始翻车<br/><br/>点击<font color='red'>[取消]</font>不做任何处理</font>", "提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning); if (dialogResult == DialogResult.Yes) { if (SendSamplerStopCmd(selfView_TrainTipperQueue)) { // 标记为已处理 ToHandled(inTrainCarriagePass.Id, selfView_TrainTipperQueue.Id); } } else if (dialogResult == DialogResult.No) { // 标记为已处理 ToHandled(inTrainCarriagePass.Id, selfView_TrainTipperQueue.Id); } } else { if (MessageBoxEx2Show("<font size='+2'>车号: <font color='red'>" + selfView_TrainTipperQueue.TrainNumber + "</font><br/><br/>点击<font color='red'>[确定]</font>立即通知皮带采样机开始采样<br/>确认采样机启动成功后再开始翻车<br/><br/>点击<font color='red'>[取消]</font>不做任何处理</font>", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK) { if (SendSamplerStartCmd(selfView_TrainTipperQueue)) { // 标记为已处理 ToHandled(inTrainCarriagePass.Id, selfView_TrainTipperQueue.Id); } } } } else { // 未找到此车 commonDAO.SetSignalDataValue(this.trainTipper.EquipmentCode, eSignalDataName.当前车Id.ToString(), string.Empty); if (MessageBoxEx2Show("未找到车厢[" + inTrainCarriagePass.TrainNumber + "],是否忽略?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { // 标记车号识别记录为已处理 carriageRecognitionerDAO.ChangeTrainCarriagePassToHandled(inTrainCarriagePass.Id); } } } autoResetEvent.Set(); }, trainCarriagePass); task.Start(); }
/// <summary> /// 同步报文 /// </summary> /// <param name="output"></param> /// <returns></returns> public List <CmcsTrainCarriagePass> GetDBWInfo(Action <string, eOutputType> output) { List <CmcsTrainCarriagePass> cmcstraincarriagepasses = new List <CmcsTrainCarriagePass>(); String interface_dbwdest = CommonDAO.GetInstance().GetAppletConfigString("车号识别文件储存位置"); int interface_dbwtime = CommonDAO.GetInstance().GetAppletConfigInt32("车号识别文件读取天数"); int res = 0; if (Directory.Exists(interface_dbwdest)) { String[] dir = Directory.GetFiles(interface_dbwdest); foreach (var diritem in dir) { ///解析数据 if (File.Exists(diritem) && CheckUseFull(diritem).AddDays(interface_dbwtime) >= DateTime.Now.Date) { String Info = File.ReadAllText(diritem); if (Info.StartsWith("D")) { try { //火车方向 String fx = Info.Substring(18, 1) == "0" ? "入厂" : "出厂"; //到达时间 DateTime ddsj = new DateTime(Convert.ToInt32(Info.Substring(34, 4)), Convert.ToInt32(Info.Substring(38, 2)), Convert.ToInt32(Info.Substring(40, 2)), Convert.ToInt32(Info.Substring(42, 2)), Convert.ToInt32(Info.Substring(44, 2)), Convert.ToInt32(Info.Substring(46, 2))); //通过时间 DateTime tgsj = new DateTime(Convert.ToInt32(Info.Substring(50, 4)), Convert.ToInt32(Info.Substring(54, 2)), Convert.ToInt32(Info.Substring(56, 2)), Convert.ToInt32(Info.Substring(58, 2)), Convert.ToInt32(Info.Substring(60, 2)), Convert.ToInt32(Info.Substring(62, 2))); //报告时间 DateTime bgsj = new DateTime(Convert.ToInt32(Info.Substring(66, 4)), Convert.ToInt32(Info.Substring(70, 2)), Convert.ToInt32(Info.Substring(72, 2)), Convert.ToInt32(Info.Substring(74, 2)), Convert.ToInt32(Info.Substring(76, 2)), Convert.ToInt32(Info.Substring(78, 2))); //车数 int countnum = Convert.ToInt32(Info.Substring(82, 3)); //车头 int ctnum = Convert.ToInt32(Info.Substring(85, 1)); //车中 int cznum = Convert.ToInt32(Info.Substring(86, 1)); //车尾 int cwnum = Convert.ToInt32(Info.Substring(87, 1)); if ((int)Info.Substring(88 + 24 * countnum, 1).ToCharArray()[0] == 0x04) { for (int i = 0; i < countnum; i++) { String trainnum = Info.Substring(88 + 24 * i, 24); //车型 String cx = ""; //车号 String ch = ""; //车类型 String clx = ""; if (trainnum.StartsWith("T")) { //车型 cx = trainnum.Substring(1, 6).Trim(); //车号 ch = trainnum.Substring(7, 7); clx = "车厢"; } else if (trainnum.StartsWith("J")) { //车型 cx = trainnum.Substring(1, 3); //车号 ch = trainnum.Substring(4, 4); clx = "车头"; } string pkid = ch + "-" + tgsj.ToString("yyyyMMddHHmmss"); if (clx == "车厢") { CmcsTrainCarriagePass item = new CmcsTrainCarriagePass { MachineCode = MachineCode_CHSB, Direction = fx, TrainNumber = ch, PassTime = tgsj, DataFlag = 0 }; cmcstraincarriagepasses.Add(item); } } } } catch (Exception ex) { output(string.Format("解析 {0} 报文失败,原因:{1}", diritem, ex.Message), eOutputType.Error); } } } } } return(cmcstraincarriagepasses); }
/// <summary> /// 车辆数据处理_1号车号识别 /// </summary> /// <param name="carSpotsNum">车辆识别器编号</param> /// <returns></returns> public int CarSpotsHandle1(Action <string, eOutputType> output, int carSpotsNum) { lock (LockObject) { int res = 0; IList <CmcsTrainRecognition_01> cardata = Dbers.GetInstance().SelfDber.Entities <CmcsTrainRecognition_01>(" where MachineCode like '%" + carSpotsNum + "%' and CrossTime>=to_date('" + DateTime.Now.Date.AddDays(-1) + "','yyyy/mm/dd HH24:MI:SS') and DataFlag=0 and carnumber<>'*' order by CrossTime asc,OrderNum asc"); bool flag = false; foreach (var item in cardata) { if (item.Direction == "进") { CmcsTrainWeightRecord transportOver = Dbers.GetInstance().SelfDber.Entity <CmcsTrainWeightRecord>(" where TrainNumber='" + item.CarNumber + "' and IsTurnover='已翻' and ArriveTime>=to_date('" + DateTime.Now.Date.AddDays(-2) + "','yyyy/mm/dd HH24:MI:SS')"); CmcsTrainWeightRecord transport = Dbers.GetInstance().SelfDber.Entity <CmcsTrainWeightRecord>(" where TrainNumber='" + item.CarNumber + "' and IsTurnover='未翻' and ArriveTime>=to_date('" + DateTime.Now.Date.AddDays(-2) + "','yyyy/mm/dd HH24:MI:SS')"); if (transport == null) { // 此判断是过滤车辆出厂后立马进厂合并不同轨道车辆的情况,时间相差几分钟 if (transportOver != null) { //flag = true; } else { Dbers.GetInstance().SelfDber.Insert(new CmcsTrainWeightRecord() { PKID = item.Id, TrainNumber = item.CarNumber, ArriveTime = item.CrossTime, TrainType = item.CarModel.Trim().TrimStart('T'), IsTurnover = "未翻", MachineCode = "1", DataFlag = 0, TicketWeight = (decimal)CommonDAO.GetInstance().GetTrainRateLoadByTrainType(item.CarModel.Trim().TrimStart('T')), OrderNumber = item.OrderNum, GrossTime = item.CrossTime, SkinTime = item.CrossTime, LeaveTime = item.CrossTime, UnloadTime = item.CrossTime, }); } } CmcsTrainCarriagePass transportPass = Dbers.GetInstance().SelfDber.Entity <CmcsTrainCarriagePass>("where TrainNumber='" + item.CarNumber + "' and PassTime>=to_date('" + DateTime.Now.Date.AddDays(-1) + "','yyyy/mm/dd HH24:MI:SS') order by PassTime desc"); if (transportPass == null) { transportPass = new CmcsTrainCarriagePass(); transportPass.TrainNumber = item.CarNumber; transportPass.CarModel = item.CarModel.Trim().TrimStart('T'); transportPass.MachineCode = "1"; transportPass.PassTime = item.CrossTime; transportPass.Direction = "进厂"; transportPass.OrderNum = item.OrderNum; transportPass.DataFlag = 0; transportPass.PKID = item.Id; Dbers.GetInstance().SelfDber.Insert(transportPass); } // 插入定位信息 if (InsertTransportPosition("入厂", item.CarNumber)) { output(string.Format("入厂轨道插入定位信息;{0}车号识别 车号:{1}", item.MachineCode, item.CarNumber), eOutputType.Normal); } flag = true; } else if (item.Direction == "出") { CmcsTrainWeightRecord trainRecord = Dbers.GetInstance().SelfDber.Entity <CmcsTrainWeightRecord>("where TrainNumber=:TrainNumber order by ArriveTime desc", new { TrainNumber = item.CarNumber }); if (trainRecord != null) { trainRecord.LeaveTime = item.CrossTime; Dbers.GetInstance().SelfDber.Update(trainRecord); CmcsTransport transport = Dbers.GetInstance().SelfDber.Entity <CmcsTransport>("where PKID=:PKID order by InfactoryTime desc", new { PKID = item.Id }); if (transport != null) { transport.OutfactoryTime = item.CrossTime; Dbers.GetInstance().SelfDber.Update(transport); } } //移除定位信息 RemoveTransportPosition(item.CarNumber); flag = true; } if (flag) { //item.DataFlag = 1; Dbers.GetInstance().SelfDber.Execute(" update Cmcstbtrainrecognition_01 set DataFlag=1 where Id='" + item.Id + "'"); res++; } } output(string.Format("读取{0}号车号识别数据{1}条", carSpotsNum, res), eOutputType.Normal); return(res); } }