public bool CreateBill(out string msgBoxText) { bool retVal = true; msgBoxText = null; string userErrMsgSuffix = Environment.NewLine + AppLib.GetLangTextFromAppProp("userErrMsgSuffix"); userErrMsgSuffix = userErrMsgSuffix.Replace("\\n", Environment.NewLine); AppLib.WriteLogTraceMessage("Создание пречека для заказа " + _order.OrderNumberForPrint.ToString()); // свойства заказа, созадаваемые перед печатью чека: // 1. BarCodeValue - значение штрих-кода, 12 цифр (6 - yymmdd, 2 - код источника, 4 - номер чека для печати) // 2. LanguageTypeId - язык, который был выбран при создании чека (ua/en/ru) //-------------------------------------------------- string deviceName = (string)AppLib.GetAppGlobalValue("ssdID", string.Empty); if (deviceName == string.Empty) { AppLib.WriteLogErrorMessage("В config-файле не найден элемент \"ssdID\" - идентификатор терминала самообслуживания.\n\t\tTrace: PrintBill.cs, CreateBill()"); msgBoxText = "App config error: don't find 'ssdID' element." + userErrMsgSuffix; return(false); } if (deviceName.Length > 2) { deviceName = deviceName.Substring(0, 2); } // 1. OrderNumberForPrint if (_order.OrderNumberForPrint == -1) { AppLib.WriteLogErrorMessage("Класс PrintBill. Не указан номер заказа"); msgBoxText = "App error: no order number." + userErrMsgSuffix; return(false); } // дату заказа создаем ПЕРЕД печатью _order.OrderDate = DateTime.Now; // 2. BarCodeValue // идент.устройства - 2 символа if (deviceName.Length <= 2) { deviceName = string.Format("{0:D2}", deviceName); } else { deviceName = deviceName.Substring(0, 2); } // дата заказа в формате yyMMdd - 6 символов // номер заказа (для печати - случайный) в формате 0000 - 4 символа // т.к. в формате EAN-13 если первый символ - 0, то он удаляется, используем в начале дату string sBuf = (_order.OrderDate == null) ? "000000" : string.Format("{0:yyMMdd}", _order.OrderDate); _order.BarCodeValue = sBuf + _order.OrderNumberForPrint.ToString("000000"); // 3. LanguageTypeId _order.LanguageTypeId = AppLib.AppLang; // ширина из config-файла int width = (int)AppLib.GetAppGlobalValue("BillPageWidht", 0); if (width == 0) { AppLib.WriteLogErrorMessage("В config-файле не указан элемент BillPageWidht с шириной чека. Берется значение по умолчанию - 300 (7,8см)"); width = 300; } // принтеры в системе List <PrintQueue> printers = PrintHelper.getPrintersList(); if (printers == null) { AppLib.WriteLogErrorMessage("В системе не зарегистрирован ни один принтер!!"); msgBoxText = AppLib.GetLangTextFromAppProp("printConfigError"); return(false); } else { try { string sLog = string.Join(Environment.NewLine + "\t", printers.Select(pq => pq.Name + ", status '" + getPrinterStatus(pq) + "', driver '" + pq.QueueDriver.Name + "'")); AppLib.WriteLogTraceMessage("Системные принтеры: " + Environment.NewLine + "\t" + sLog); } catch (Exception) { } } // имя принтера для печати чека string printerName = null; string result = null; #region поиск принтера для печати чека printerName = AppLib.GetAppSetting("PrinterName"); PrintQueue printer = PrintHelper.GetPrintQueueByName(printerName); if (printer == null) { AppLib.WriteLogErrorMessage("В config-файле не указан элемент PrinterName или в системе не найден принтер: " + printerName); printerName = null; } else { result = getPrinterStatus(printer); AppLib.WriteLogTraceMessage($"Принтер '{printerName}' находится в состоянии '{result}'"); } // если принтер из настроек не Ок, то берем принтер по умолчанию if ((printer == null) || ((result != null) && (result != "OK"))) { AppLib.WriteLogTraceMessage("Предпринимается попытка использовать принтер по умолчанию..."); printer = PrintHelper.GetDefaultPrinter(); if ((printer != null) && ((printerName == null) || ((printerName != null) && (printer.Name != printerName)))) { printerName = printer.Name; result = getPrinterStatus(printer); AppLib.WriteLogTraceMessage($"Найден принтер по умолчанию: {printerName}"); AppLib.WriteLogTraceMessage($"Принтер '{printerName}' находится в состоянии '{result}'"); } } // если принтер по умолчанию не ОК, то берем первый в системе if (printer == null) { AppLib.WriteLogTraceMessage("Предпринимается попытка использовать первый найденный принтер в ОС..."); printer = PrintHelper.GetFirstPrinter(); if ((printer != null) && ((printerName == null) || ((printerName != null) && (printer.Name != printerName)))) { printerName = printer.Name; result = getPrinterStatus(printer); AppLib.WriteLogTraceMessage($"Найден первый принтер: {printerName}"); AppLib.WriteLogTraceMessage($"Принтер '{printerName}' находится в состоянии '{result}'"); } } // принтер не найден - досвидос if (printer == null) { msgBoxText = "App print error: not found any printer." + userErrMsgSuffix; return(false); } // найден, но статус не ОК - досвидос else if ((result != null) && (result != "OK")) { string sFormat = AppLib.GetLangTextFromAppProp("printerStatusMsg"); if (sFormat != null) { sFormat = sFormat.Replace("\\n", Environment.NewLine); } msgBoxText = string.Format(sFormat, printerName, result) + userErrMsgSuffix; return(false); } #endregion // создание документа AppLib.WriteLogTraceMessage($" Создаю документ для печати..."); FlowDocument doc = null; try { doc = createDocument(width); AppLib.WriteLogTraceMessage($" - документ создан успешно"); } catch (Exception ex) { result = AppLib.GetLangTextFromAppProp("afterPrintingErrMsg"); if (result != null) { result = result.Replace("\\n", Environment.NewLine); } msgBoxText = result + userErrMsgSuffix; AppLib.WriteLogErrorMessage(" Ошибка формирования документа: " + ex.ToString()); return(false); } // имя задания на принтер string prnTaskName = "bill " + _order.OrderNumberForPrint.ToString(); // вывод документа на принтер AppLib.WriteLogTraceMessage($" Вывожу пречек на принтер..."); retVal = PrintHelper.PrintFlowDocument(doc, prnTaskName, printerName, out msgBoxText); if (retVal == false) { // сообщение об ошибке в лог AppLib.WriteLogErrorMessage(" Ошибка печати документа: " + msgBoxText); // и на экран пользователю result = AppLib.GetLangTextFromAppProp("afterPrintingErrMsg"); if (result != null) { result = result.Replace("\\n", Environment.NewLine); } msgBoxText = result + userErrMsgSuffix; } else { AppLib.WriteLogTraceMessage("Пречек распечатан успешно"); if (msgBoxText != null) { AppLib.WriteLogErrorMessage(msgBoxText); } } return(retVal); }