private ETCPaymentList CreateRecord(GetCardInfoResponse cardInfo, WriteCardResponse writeInfo, bool isExit) { var ret = new ETCPaymentList() { ListType = isExit ? 1 : 0, ListNo = string.Format("{0}{1}{2}{3}{4}{5}{6}", ProvinceNo, CityNo, AreaNo, GateNo, LaneNo, DateTime.Now.ToString("yyyyMMddHHmmss"), "00"), KeyServiceNo = writeInfo.KeyServiceNo, TradeType = writeInfo.TradeType, TermCode = writeInfo.TermCode, TermTradeNo = writeInfo.TermTradeNo, CardTradeNo = writeInfo.CardTradeNo, Tac = writeInfo.Tac, OBUID = null, OBUNO = null, CardNo = cardInfo.CardNo, CashMoney = writeInfo.CashMoney, Balance = writeInfo.Balance, TradeDevice = 1, VehPicture = null, VehPictureLen = 0, SquadDate = DateTime.Today.ToString("yyyyMMdd"), ShiftID = DateTime.Today.ToString("yyMMdd"), ExTime = isExit ? DateTime.Now.ToString("yyyyMMddHHmmss") : null, ExAreaNo = isExit ? AreaNo : null, ExGateNo = isExit ? GateNo : null, ExLaneNo = isExit ? LaneNo : null, ExOperatorNo = isExit ? "ffff" : null, ExVehPlate = isExit ? cardInfo.CardPlate : null, ExVehType = isExit ? cardInfo.CardVehClass : "255", ExVehClass = isExit ? cardInfo.CardVehUserType : "255", EnTime = isExit ? cardInfo.PassTime : DateTime.Now.ToString("yyyyMMddHHmmss"), EnOperatorNo = isExit ? cardInfo.OperatorNo : "000001", EnAreaNo = isExit ? cardInfo.CardAreaNo : AreaNo, EnGateNo = isExit ? cardInfo.CardGateNo : GateNo, EnLaneNo = isExit ? cardInfo.CardLaneNo : LaneNo, EnVehPlate = isExit ? cardInfo.VehPlate : cardInfo.CardPlate, EnVehType = isExit ? cardInfo.VehType : cardInfo.CardVehClass, EnVehClass = isExit ? cardInfo.VehClass : cardInfo.CardVehUserType, }; if (!string.IsNullOrEmpty(ret.ExGateNo) && ret.ExGateNo.Length > 2) { ret.ExGateNo = ret.ExGateNo.Substring(2); } if (!string.IsNullOrEmpty(ret.ExLaneNo) && ret.ExLaneNo.Length > 2) { ret.ExLaneNo = ret.ExLaneNo.Substring(2); } if (!string.IsNullOrEmpty(ret.EnGateNo) && ret.EnGateNo.Length > 2) { ret.EnGateNo = ret.EnGateNo.Substring(2); } if (!string.IsNullOrEmpty(ret.EnLaneNo) && ret.EnLaneNo.Length > 2) { ret.EnLaneNo = ret.EnLaneNo.Substring(2); } return(ret); }
/// <summary> /// 上传扣费流水 /// </summary> /// <param name="record"></param> /// <returns></returns> public ETCResponse ListUpLoad(ETCPaymentList record) { int plen = 1000; StringBuilder response = new StringBuilder(plen); var request = new { ListType = record.ListType.ToString(), ListNo = record.ListNo, KeyServiceNo = record.KeyServiceNo, TradeType = record.TradeType.ToString(), TermCode = record.TermCode, TermTradeNo = record.TermTradeNo, CardTradeNo = record.CardTradeNo, Tac = record.Tac, OBUID = record.OBUID == null ? string.Empty : record.OBUID, OBUNO = record.OBUNO == null ? string.Empty : record.OBUNO, CardNo = record.CardNo, CashMoney = record.CashMoney.ToString(), Balance = record.Balance.ToString(), TradeDevice = record.TradeDevice.ToString(), VehPicture = record.VehPicture, VehPictureLen = record.VehPictureLen.ToString(), SquadDate = record.SquadDate, ShiftID = record.ShiftID, ExTime = record.ExTime, ExAreaNo = record.ExAreaNo, ExGateNo = record.ExGateNo, ExLaneNo = record.ExLaneNo, ExOperatorNo = record.ExOperatorNo, ExVehPlate = record.ExVehPlate, ExVehType = record.ExVehType, ExVehClass = record.ExVehClass, EnTime = record.EnTime, EnOperatorNo = record.EnOperatorNo, EnAreaNo = record.EnAreaNo, EnGateNo = record.EnGateNo, EnLaneNo = record.EnLaneNo, EnVehPlate = record.EnVehPlate, EnVehType = record.EnVehType, EnVehClass = record.EnVehClass, }; var strReq = JsonConvert.SerializeObject(request); var n = ETCInterop.ListUpLoad(int.Parse(LaneNo), strReq, response, ref plen); if (n != 0) { Ralid.GeneralLibrary.LOG.FileLog.Log("未成功上传流水" + LaneNo.ToString(), strReq); return(new ETCResponse() { ErrorCode = n }); } var ret = JsonConvert.DeserializeObject <WriteCardResponse>(response.ToString()); ret.Content = response.ToString(); return(ret); }
private void device_OnReadOBUInfo(object sender, ReadOBUInfoEventArgs e) { ETCDevice device = sender as ETCDevice; if (device == null) { return; } EntranceInfo entrance = ParkBuffer.Current.GetEntrance(device.EntranceID); OpenCardEventArgs args = new OpenCardEventArgs() { CardID = e.OBUInfo.CardNo, CardType = ETCSetting.CardTyte, Entrance = entrance, Balance = (decimal)e.OBUInfo.Balance / 100, }; if (entrance != null) { var park = ParkBuffer.Current.GetPark(entrance.ParkID); //开始处理与已经存在的同车牌号的名单的冲突 bruce 2017-3-22 var con = new CardSearchCondition(); con.CarPlateOrLast = e.OBUInfo.CardPlate.Trim(); con.Status = Ralid.Park.BusinessModel.Enum.CardStatus.Enabled; var cards = new CardBll(AppSettings.CurrentSetting.ParkConnect).GetCards(con).QueryObjects; if (cards != null) { cards = cards.Where(it => it.CardID != e.OBUInfo.CardNo).ToList(); //选出卡号不一样的记录 } if (cards != null && cards.Count > 0) { if (cards.Count == 1) //如果系统中只有一个同一车牌号的名单 { var cardinfo = cards.Single(it => it.CardID != e.OBUInfo.CardNo); if ((!park.IsWriteCardMode || cardinfo.OnlineHandleWhenOfflineMode) && cardinfo.IsCardList) //如果是在线车场或卡片按在线处理 { args.CardID = cardinfo.CardID; //用现有名单的卡号去读卡 } else //不能在线处理,提示刷卡 { string err = park.ListMode == Ralid.Park.BusinessModel.Enum.ParkListMode.CarPlate ? "人工处理" : "请读车场卡"; if (this.OnError != null) { this.OnError(this, new OpenCardEventArgs() { Entrance = entrance, LastError = err }); } return; } } else //多个同车牌号的名单,提示刷卡 { string err = park.ListMode == Ralid.Park.BusinessModel.Enum.ParkListMode.CarPlate ? "人工处理" : "请读车场卡"; if (this.OnError != null) { this.OnError(this, new OpenCardEventArgs() { Entrance = entrance, LastError = err }); } return; } } //-------------------------------------------结束卡片冲突处理 bruce 2017-3-22 if (!entrance.IsExitDevice || (park != null && park.IsNested)) //入口或者嵌套车场, { ETCPaymentList pr = null; device.RSUWrite(e.OBUInfo, 0, false, out pr); //这里写卡主要是为了让卡片读卡时产生蜂鸣声 if (this.OnReadCard != null) { this.OnReadCard(this, args); } } else { HandlePayment(device, args, e, null); } } else { HandlePayment(device, args, e, null); } }
/// <summary> /// 进行读卡扣款操作 /// </summary> /// <param name="money"></param> /// <returns></returns> public WriteCardResponse ReaderWrite(GetCardInfoResponse r, int money, bool isExit, out ETCPaymentList record) { int n = -1; record = null; WriteCardResponse ret = null; int plen = 3000; StringBuilder response = new StringBuilder(plen); var request = new { CardNo = r.CardNo, CashMoney = money.ToString(), CardAreaNo = AreaNo, CardGateNo = GateNo.PadLeft(4, '0'), CardLaneNo = LaneNo.PadLeft(4, '0'), PassTime = DateTime.Now.ToString("yyyyMMddHHmmss"), VehPlate = r.CardPlate, VehType = r.CardVehClass, VehClass = r.CardVehUserType, OutFlag = isExit ? "1" : "0", OperatorNo = "ffff", LittleGateNo = r.LittleGateNo, LittleLaneNo = r.LittleLaneNo, LittlePassTime = r.LittlePassTime, LittleCashMoney = r.LittleCashMoney, LittleTime = r.LittleTime, OfferType = r.OfferType, OfferTime = r.OfferTime, BackUp = r.BackUp == null ? string.Empty : r.BackUp, //不能传NULL CheckCode = r.CheckCode, }; n = ETCInterop.ReaderWrite(int.Parse(LaneNo), JsonConvert.SerializeObject(request), response, ref plen); if (n != 0) { return new WriteCardResponse() { ErrorCode = n } } ; ret = JsonConvert.DeserializeObject <WriteCardResponse>(response.ToString()); ret.Content = response.ToString(); if (ret.ErrorCode == 0) { ret.CashMoney = money; //这两个属性返回串中没有,人为加上去,后面有用! ret.Balance = r.Balance - money; record = CreateRecord(r, ret, isExit); } return(ret); }
private void HandlePayment(ETCDevice device, OpenCardEventArgs e, ReadOBUInfoEventArgs obuInfo, ReadCardInfoEventArgs cardInfo) { if (this.OnPaying != null) { this.OnPaying(this, e); //产生收费事件 } if (e.Payment == null) { if (this.OnReadCard != null) { this.OnReadCard(this, e); } return; } if (e.Payment.GetPaying() <= 0) //不用收费直接返回收款成功事件 { WriteCardResponse r = null; ETCPaymentList list = null; if (obuInfo != null) { r = device.RSUWrite(obuInfo.OBUInfo, 0, true, out list); } else { r = device.ReaderWrite(cardInfo.CardInfo, 0, true, out list); } e.Payment.PaymentCode = Ralid.Park.BusinessModel.Enum.PaymentCode.Computer; e.Payment.PaymentMode = Ralid.Park.BusinessModel.Enum.PaymentMode.GDETC; if (this.OnPaidOk != null) { this.OnPaidOk(this, e); } } else //扣费 { //判断余额是否够扣费,否则返回"余额不足",注意钱包单位是分的,这里要转成分比较 if (e.Payment.GetPaying() <= e.Balance) { int paid = (int)(e.Payment.GetPaying() * 100); ETCPaymentList list = null; WriteCardResponse r = null; if (obuInfo != null) { r = device.RSUWrite(obuInfo.OBUInfo, paid, true, out list); } else { r = device.ReaderWrite(cardInfo.CardInfo, paid, true, out list); } if (r.ErrorCode == 0) { var res = device.ListUpLoad(list); //上传流水 var record = new Ralid.Park.BusinessModel.Model.ETCPaymentRecord() { LaneNo = device.LaneNo, Device = obuInfo != null ? 0 : 1, AddTime = DateTime.Now, Data = JsonConvert.SerializeObject(list), UploadTime = res.ErrorCode == 0 ? (DateTime?)DateTime.Now : null, }; new ETCPaymentRecordBll(AppSettings.CurrentSetting.ParkConnect).Insert(record); //在数据库中保存流水记录 e.Paid = e.Payment.GetPaying(); e.Payment.PaymentCode = Ralid.Park.BusinessModel.Enum.PaymentCode.Computer; e.Payment.PaymentMode = Ralid.Park.BusinessModel.Enum.PaymentMode.GDETC; e.Balance = (decimal)r.Balance / 100; if (obuInfo != null && obuInfo.OBUInfo.CardNo != e.CardID) { e.Payment.Memo = "ETC" + obuInfo.OBUInfo.CardNo; //说明收费的卡号与ETC卡是同一个车牌号 } if (this.OnPaidOk != null) { this.OnPaidOk(this, e); } } else { e.LastError = "扣款失败"; if (this.OnPaidFail != null) { this.OnPaidFail(this, e); } } } else { if (obuInfo != null) { e.LastError = "余额不足"; if (this.OnPaidFail != null) { this.OnPaidFail(this, e); } } else //ETC读卡器上余额不足时产生读卡事件,在收费电脑上显示明细 { if (this.OnReadCard != null) { this.OnReadCard(this, e); } } } } }