public Autoshow(GWRequest req) : base(req) { this.account = req.Account; this.phone = req.Phone; this.amount = req.Amount; }
public RTClass16(GWRequest src) : base(src) { }
public Smtp(GWRequest req) : base(req) { }
public GWMtsRequest(GWRequest src) : base(src) { }
public RTRequest09(GWRequest src) : base(src) { }
public GWCyberRequest(GWRequest gw) : base(gw) { }
public GWEktRequest(GWRequest src) : base(src) { // Номер кассы / ПА terminal = src.Terminal; }
public CheckInfo(GWRequest gw /*, ManualResetEvent CancelEvent*/) { // this.gw = new GWRequest(gw); this.gw = gw; // this.CancelEvent = CancelEvent; }
/// <summary> /// Процесс обработки платежа /// </summary> public void CheckState(Object stateInfo) { if (Canceling) { return; // Запущен процесс остановки службы } GWRequest gw = ((CheckInfo)stateInfo).gw; try { // Увеличим счетчик процессов RegisterBackgroundProcess(); // Если отладка не производится... if (gw.Provider == Settings.Cyber.Name) { gw = new GWCyberRequest(gw); } // else if (gw.Provider == Settings.Mts.Name) // gw = new GWMtsRequest(gw); else if (gw.Provider == Settings.Ekt.Name) { gw = new GWEktRequest(gw); } else if (gw.Provider == "boriska") { gw = new ServerGate(gw); } else if (gw.Provider == Settings.Rt.Name) { gw = new RT.RTClass16(gw); } else if (gw.Provider == Settings.Rapida.Name) { gw = new GWRapidaRequest(gw); } else if (gw.Provider == Settings.Xsolla.Name) { gw = new GWXsolllaRequest(gw); } if (gw != null) { gw.SetLock(1); gw.ReportRequest("REDO - strt"); // Синхронизация с БД Город gw.Sync(false); // Выполнение допроведения if (gw.State < 6) { gw.Processing(false); } gw.ReportRequest("REDO"); } } catch (Exception ex) { Log(ex.ToString()); gw.ReportRequest("REDO"); } finally { if (gw != null) { gw.SetLock(0); } // Уменьшим счетчик процессов UnregisterBackgroundProcess(); } }
/// <summary> /// Допроведение платежей /// </summary> private void DoRedo() { GWRequest req = null; /* * using (Oldigw db = new Oldigw()) * { * } */ int SafeInterval = Config.AppSettings["Safe-Interval"].ToInt(); // Удалим из очереди платежи старше 1 минуты foreach (long key in RedoDict.Keys) { DateTime d; RedoDict.TryGetValue(key, out d); if (d < DateTime.Now.AddMinutes(-SafeInterval)) { RedoDict.TryRemove(key, out d); Log("{0} [DoREDO] Элемент старше {1} минут - удаляем из фильтра", key, SafeInterval); } } using (SqlParamCommand cmd = new SqlParamCommand(Settings.ConnectionString, "OldiGW.ver3_ReadHolded")) { cmd.ConnectionOpen(); using (SqlDataReader dr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection)) while (dr.Read()) { // Прочитаем отложенный платеж req = new GWRequest(); if (req.ReadAll(dr) == 0) { // Проверим наличие платежа в очереди DateTime d; if (RedoDict.TryGetValue(req.Tid, out d)) { Log("{0} [REDO] Найден в фильтре. Перепроведение откладывается: {1}", req.Tid, Oldi.Utility.XConvert.AsDate2(d)); } else { // Добавим платёж в фильтр RedoDict.TryAdd(req.Tid, DateTime.Now); if (req.State < 6) // Только новые платежи допроводим { req.SetLock(1); // Заблокировать ещё до постановки в очередь if (string.IsNullOrEmpty(req.Account) && string.IsNullOrEmpty(req.Phone) && string.IsNullOrEmpty(req.Number)) { Log("{0} [REDO] Ошибка. Не задан ни один из параметров счёта!", req.Tid); } // Допровести платежи с нефинальными статусами CheckInfo checkinfo = new CheckInfo(req); if (!ThreadPool.QueueUserWorkItem(new WaitCallback(CheckState), checkinfo)) { req.SetLock(0); // Не удалось поставить в очередь - разблокировать Log("Redo: Не удалось запустить процесс допроведения для tid={0}, state={1}", req.Tid, req.State); } } else { Log("DoRedo: Ошибка чтения БД"); } } } } } }