Exemple #1
0
        public int NewUserId(bool isPerson = true)
        {
            int?untn = isPerson ? QM.QueryInteger(Connection, "select untn from v_kadr_fin k where not exists(select null from user_name u where u.untn = k.untn) and k.r_u = 'Работает' and rownum < 2", null) : null;

            var username = RandomString(10);

            using (var fsis = new OracleConnection("Direct=True;User Id = fsis;Password=fs;Host=testfin;SID=B;Port=1521;Pooling=false"))
            {
                fsis.Open();

                var command = new OracleCommand
                {
                    Connection  = fsis,
                    CommandType = System.Data.CommandType.StoredProcedure,
                    CommandText = "create_username"
                };

                command.Parameters.Add("p_username", username);
                command.Parameters.Add("p_untn", untn);

                command.ExecuteNonQuery();

                fsis.Commit();
            }

            Commit();

            return(NUserPack.GetUserId(Connection, username));
        }
        /// <summary>Обрабатывает поступивший запрос на пересчёт транзакций</summary>
        void ProcessRequest(OracleConnection Connection)
        {
            SendResponse(Connection, ResponseType.Start); // отправляет ответ: мы взялись за обработку запроса
              ChangeStatus("Request processing started");
              try
              {
            var SharedData = DataLoader.Allocate(); // получаем действующие в этот момент ОРД
            GetTransactions(Connection, SharedData); // получаем список неотменённых ранее транзакций для корректировки
            try
            {
              // начинаем обработку транзакций
              Log.Message("Транзакций для пересчёта: {0}", Request.Transactions.Count);
              Request.Counter.Start();
              Request.LastContract = null;
              foreach (RecalculationTransactionItem Item in Request.Transactions)
              {
            using (var TransactionConnection = OpenedConnection)
            {
              if (ProcessTransactionItem(TransactionConnection, Item, SharedData))
                Request.SuccessCount++;
              else
                Request.FailedCount++;
              /*if (!ProcessTransactionItem(Connection, Item, SharedData))
                throw new Exception("Ошибка транзакции. Обработка прекращена.");*/

              // пишем в лог информацию о транзакции
              try
              {
                OraQuery.ExecuteNonQuery(Connection, "insert into RecalculationLog (RecalcID, TransactionID, State, Message) values (:RecalcID, :TransactionID, :State, :Message)",
                  new string[] { "RecalcID", "TransactionID", "State", "Message" }, new object[] { Request.ID, Item.ID, Item.State, Item.ErrorMessage });
              }
              catch (OracleException e)
              {
                if (e.Code == 1) // ORA-00001: unique constraint
                {
                  OraQuery.ExecuteNonQuery(Connection, "update RecalculationLog set State = :State, Message = :Message where RecalcID = :RecalcID and TransactionID = :TransactionID",
                    new string[] { "RecalcID", "TransactionID", "State", "Message" }, new object[] { Request.ID, Item.ID, Item.State, Item.ErrorMessage });
                }
              }
            }
            if (Item.IsChanged)
              Request.ChangedCount++; // у нас одной изменённой после пересчета транзакцией больше
            Request.ProcessedCount++;
            SendResponse(Connection, ResponseType.Progress);
            ChangeStatus(string.Format("Processing: {0}/{1}", Request.ProcessedCount, Request.TotalCount));
              }
              // помечаем запрос как обработанный
              OraQuery.ExecuteNonQuery(Connection, "update Recalculations set Processed = 1 where ID = :ID", new string[] { "ID" }, new object[] { Request.ID });

              Request.Processed = true;
              Connection.Commit(); // сохраняем результат
              Request.Counter.Stop();
              SendResponse(Connection, ResponseType.Finish);
              Log.Message("Транзакций изменено по итогам пересчёта: {0}", Request.ChangedCount);
              Log.Message("Обработка запроса завершена успешно");
              ChangeStatus("Finished successfully");
            }
            finally
            {
              DataLoader.Release(SharedData);
            }
              }
              catch (Exception e)
              {
            if (e is OracleException && (e as OracleException).Code == 54) // ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
              LogError(Connection, "Не удаётся заблокировать транзакции для обработки");
            else
              LogError(Connection, "Ошибка обработки:\n" + e.Message + "\n" + e.StackTrace);
            Connection.Rollback(); // отменяем изменения
            ChangeStatus("Finished with an error");
              }
        }
        private void CheckNotifier()
        {
            try
              {
            NotifierCheckState = NotifierCheckStates.Idle;
            while (true)
            {
              //Log.Message("Check Notifier state: {0}", NotifierCheckState);
              switch (NotifierCheckState)
              {
            case NotifierCheckStates.Idle:
              var StartWaitTime = DateTime.Now;
              ShowFullStatus("Sleeping...");
              while (DateTime.Now - StartWaitTime <= CheckChangeNotifierInterval)
              {
                Thread.Sleep(1000);
                if (NotifierCheckState != NotifierCheckStates.Idle)
                  break;
              }
              if (NotifierCheckState != NotifierCheckStates.CheckSuccess)
                NotifierCheckState = NotifierCheckStates.StartCheck;
              break;
            case NotifierCheckStates.StartCheck:
              using (var c = new OracleConnection(ConnectionString))
              {
                c.AutoCommit = false;
                c.Open();

                NotifierCheckState = NotifierCheckStates.CheckStarted; // must be set before, because notification can come right away
                NotifierCheckStartTime = DateTime.Now;

                int RowsUpdated = OraQuery.ExecuteNonQuery(c, string.Format("update {0} set id = id + 1 where rownum = 1", NotifierCheckTable));
                if (RowsUpdated > 0) c.Commit(); else c.Rollback();
              }
              break;
            case NotifierCheckStates.CheckStarted: // started, in processes
              if (DateTime.Now - NotifierCheckStartTime >= CheckChangeNotifierTimeout) // if no answer after starting
                NotifierCheckState = NotifierCheckStates.CheckFailed;
              else
                Thread.Sleep(1000);
              break;
            case NotifierCheckStates.CheckSuccess:
            case NotifierCheckStates.WasRestarted:
              NotifierCheckState = NotifierCheckStates.Idle;
              break;
            case NotifierCheckStates.CheckFailed: // need restart
              Log.Message("Check Notifier state: {0}", NotifierCheckState); // It is important state
              EventHandle.Set(); // wake up thread for restart
              Thread.Sleep(1000);
              break;
            default:
              Log.Message("Unknown status: {0}", NotifierCheckState);
              break;
              }
            }
              }
              catch (Exception e)
              {
            if (e is ThreadAbortException || e is ThreadInterruptedException) return;
            else Log.Message("Ошибка потока проверки нотификатора: {0}\n{1}", e.Message, e.StackTrace);
              }
        }
Exemple #4
0
 internal void Commit()
 {
     Connection.Commit();
     GRPOConnection.Commit();
 }
        public void Show(OracleConnection connection, PassportInfo info)
        {
            if (Functions.IsNull(info))
            return;
              Splash.ProgressInit(2);
              try
              {
            string HostName = Dns.GetHostName();
            string IPAddress = Functions.GetCurrentIPAddress();
            string TemporaryFileName;

            // запрос для получения вида паспорта (pdf файл)
            Splash.Message("Получение вида паспорта...");
            MemoryStream PassportStream = GetPassport(connection, info.PlantID, info.OrderID, info.LanguageID);
            Splash.ProgressAdd();

            if (!Functions.IsNull(PassportStream)) // нашли вид паспорта
            {
              Splash.ProgressMaximum(4);
              Splash.Message("Маркировка паспорта...");
              PassportStream = MarkPassport(PassportStream); // маркируем документ - добавляем слова "Копия" и разную информацию
              if (Functions.IsNull(PassportStream))
              {
            MessageBox.Show("Ошибка при маркировке паспорта. Паспорт без маркировке 'COPY' выдать нельзя", "Просмотр паспорта", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return;
              }
              TemporaryFileName = GetTempFilePath(".pdf");
              FileStream FS = new FileStream(TemporaryFileName, FileMode.Create, FileAccess.Write);
              PassportStream.WriteTo(FS);
              FS.Close();
              Splash.ProgressAdd();
            }
            else
            {
              Splash.ProgressMaximum(6);
              // запрос для получения данных паспорта
              Splash.Message("Получение данных паспорта...");
              OracleCommand DataCommand = OracleProc.Execute(connection, "DataAccessPKG.GetPassportData",
            new object[] { info.PlantID, info.OrderID, info.LanguageID, null });
              QueryResult Data = new QueryResult(DataCommand.Parameters["rc"].Value);
              Splash.ProgressAdd();

              Splash.Message("Загрузка шаблона паспорта...");
              MemoryStream TemplateStream = GetPassportTemplate(connection, info.PlantID, info.ProductID, info.LanguageID);
              Splash.ProgressAdd();

              Splash.Message("Формирование документа...");
              //PassportTemplate CurrentTemplate = plant.PassportTemplates.FindLanguage(LanguageID);
              if (TemplateStream == null)
              {
            MessageBox.Show(string.Format("Отсутствует шаблон паспорта продукта {0} (ID предприятия: {1}) для языка {2}. Обратитесь в тех.поддержку за помощью", info.ProductID, info.PlantID, info.LanguageID), "Просмотр паспорта", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return;
              }
              if (Data.Rows.Count == 0)
              {
            MessageBox.Show("Отсутствуют данные по выбранному паспорту. Попробуйте обновить данные за текущий период", "Просмотр паспорта", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return;
              }

              MSWordReport word = new MSWordReport(TemplateStream);
              QueryResult PassportData = FormatPassportData(Data);
              word.Execute(PassportData);

              // добавляем информацию о пользователе
              Data.AddColumn("UserInfo", typeof(string), string.Format("Пользователь: {0} ({1}). Компьютер: {2} ({3})", Program.StartForm.current.User.name, Common.PZUsers.Current.WindowsDomainName(), HostName, IPAddress));
              Data.AddColumn("CreationDate", typeof(DateTime), DateTime.Now);
              word.Document.MailMerge.Execute(Data.Rows[0]);
              word.PrepareToSave();
              word.Document.Protect(Aspose.Words.ProtectionType.ReadOnly);

              // вставляем знак "Копия"
              Aspose.Words.DocumentBuilder builder = new Aspose.Words.DocumentBuilder(word.Document);
              builder.MoveToHeaderFooter(Aspose.Words.HeaderFooterType.HeaderPrimary);
              System.Drawing.Image image = System.Drawing.Image.FromFile(System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath, "Images\\Exclamation.gif"));
              double useablePageWidth = builder.PageSetup.PageWidth - builder.PageSetup.LeftMargin - builder.PageSetup.RightMargin;
              double useablePageHeight = builder.PageSetup.PageHeight - builder.PageSetup.TopMargin - builder.PageSetup.BottomMargin;
              const int PointsPerInch = 72;
              double imageWidth = (image.Width / image.HorizontalResolution) * PointsPerInch;
              double imageHeight = (image.Height / image.VerticalResolution) * PointsPerInch;
              double imageLeft = (useablePageWidth - imageWidth) / 2;
              double imageTop = (useablePageHeight - imageHeight) / 2;
              builder.InsertImage(image, Aspose.Words.RelativeHorizontalPosition.Margin, imageLeft, Aspose.Words.RelativeVerticalPosition.Margin, imageTop, imageWidth, imageHeight, Aspose.Words.WrapType.None, Aspose.Words.WrapSide.Both, true, null);

              TemporaryFileName = GetTempFilePath(".doc");
              word.Document.Save(TemporaryFileName);
              Splash.ProgressAdd();
            }

            // логирование паспорта
            Splash.Message("Запись в журнал операций...");
            OracleProc.Execute(connection, "LogPKG.LogPassport",
              new object[] { info.PlantID, info.CertificateID, info.OrderID, Program.StartForm.current.Program.id, Program.StartForm.current.User.id, HostName, IPAddress, Common.PZUsers.Current.WindowsDomainName() });
            connection.Commit();
            Splash.ProgressAdd();

            Splash.Message(TemporaryFileName.EndsWith(".doc") ? "Запуск Microsoft Word..." : "Запуск Adobe Acrobat Reader...");
            //PrintDocumentFromWord(TemporaryFileName);
            OpenDocument(TemporaryFileName);
            Splash.ProgressAdd();

              }
              finally
              {
            Splash.Close();
              }
              /*System.Diagnostics.Process.Start(TemporaryFileName);
              Splash.ProgressAdd(); */
        }