Пример #1
0
 /// <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()}");
     }
 }
Пример #2
0
        /// <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: Ошибка чтения БД");
                                }
                            }
                        }
                    }
            }
        }