/// <summary> /// Назначение платежа /// </summary> public void GetReason() { try { using (SqlParamCommand pcmd = new SqlParamCommand(Settings.ConnectionString, "OldiGW.Ver3_GetReason")) { pcmd.AddParam("Tid", tid); pcmd.ConnectionOpen(); using (SqlDataReader dr = pcmd.ExecuteReader(CommandBehavior.SingleRow)) if (dr.Read()) { if (dr.GetInt32(dr.GetOrdinal("ErrCode")) == 0) { reason = dr.GetString(dr.GetOrdinal("Reason")); } else { reason = null; } } } } catch (Exception ex) { reason = null; RootLog($"{tid} {Number}{Card} {Account} {Provider}/{Service}/{Gateway}\r\n{ex.ToString()}"); } }
/// <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: Ошибка чтения БД"); } } } } } }