Просмотр полной версии : Скрипты в RK7
Доброго времени суток!
Пытаюсь разобраться со скриптами в RK7.
Цель: написать скрипт, который будет сохранять содержимое чека в файл.
Сделал скрипт и разместил его в "Перед расчетом заказа".
procedure ReceiptXMLAnalysis1000010(AXMLReceiptParameters: TXMLReceiptParameters);
var
it: TCheckItem;
FileStream: TFileStream;
str, strend: string;
i, code: integer;
CurItem: TCheckItem;
begin
if not RkCheck.Valid then
exit;
FileStream := TFileStream.Create('c:\PerfLogs\check.txt', fmCreate);
str := FloatToStr(RKCheck.CurrentOrder.ToPaySum);
strend := #13#10;
FileStream.Write(str, Length(str));
FileStream.Write(strend, Length(strend));
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then
begin
str := it.name;
FileStream.Write(str, Length(str));
str := floattostr(TDish(it).Price * TDish(it).Quantity);
FileStream.Write(str, Length(str));
end;
end;
FileStream.Free;
end;
Пока что осилил это.
Файл создается, в нем белиберда, даже сумма чека очень странная. У меня чек на 45р, а в файле:
1454,95
Предоплата Plazius0,00Щи-225,00Former undistributed markup0,00Макароны отварные0,00Макароны отварные-30,00Рис отварной15,00Макароны отварные0,00Макароны отварные0,00Предоплата Plazius0,00Щи-67,50Макароны отварные37,50Щи225,00Рис отварной0,00Щи0,00Щи180,00Рис отварной30,00Рис отварной0,00Рис отварной30,00Щи-45,00Рис отварной0,00Рис отварной75,00
Может есть у кого пример скрипта с разбором чека?
И еще, есть ли дока с описанием класса RKCheck?
Стандартная дока от UCS ничего толком не рассказывает.
А цель всего этого какая?
Ну вот есть чек в файле, дальше с ним кто/что делать будет?
Я просто к тому что есть встроенные механизмы. Например логирование печати в файл. Это не подойдет?
В планах чек отправлять на сторонний ресурс и в дальнейшем пересчитывать скидку.
Обмен предварительно будет через файл с внешней прогой.
Не проще ли по XML вытащить
Скорее всего так и придется.
Но еще есть моменты, при которых в дальнейшем нужно будет редактировать заказ, добавить блюдо или скидку.
Ищу разные подходы.
Ищу разные подходы.
Не в ту сторону копаете...
Скриптами вы этого не сделаете.
Если речь про внешнюю дисконтную систему, которая скидку будет возвращать и/или подарочное блюдо, то это вам под FarCard надо dll писать
Такое у меня уже реализовано)
С чеками немного изменилась задача: мне нужно получить содержимое чека после его сохранения и передать его во внешнюю систему без какого-либо воздействия на сам чек.
Сейчас копаю в сторону KDS/VDU, по сути мне нужно получить аналог системы с простым выводом чеков на экран.
Пытаюсь изучить разные интерфейсы и попытаться хоть как-то получить чек.
Нотификацию об изменениях получать через XML принтер, либо настраивать дополнительные схемы сервиспечати.
А дальше смотреть в сторону XML интерфейса...
Спасибо.
Существуют ли описания XML интерфейса?
Нашел только вот это: http://apidocs.ucs.ru/doku.php/ru:rk7xmlinterface
С примерами и готовыми - нет
То что вы нашли это основа с которой начинать, а дальше разбираться
Спасибо.
Буду разбираться.
С примерами и готовыми - нет
То что вы нашли это основа с которой начинать, а дальше разбираться
Вы не пробовали разобраться с XML Interface?
Пытаюсь делать запросы из документации. Список заказов, конкретный заказ могу получить, но пока никак не соображу как получить заказ с блюдами, где видно параметры сервис-печати.
Обычный запрос getorder, что даст структуру самого заказа, при чем он разбит по пакетам печати, где видно кто, во сколько, и что добавил.
А вот что в Вашем понимании параметры печати мне не понятно.
Не проще ли по XML вытащить
С одной стороны проще, но мне нужно сначала получить весь список заказов, далее по гуид заказа его вытащить, а уже по ИД блюда получить о нем информацию. Мне придется постоянно дергать подключение к хмл интерфейсу, что не очень удобно и это не правильно.
Лучше бы, чтобы скрипт отдавал гуид заказа или номер визита и ИД заказа и сохранялся у меня файл при редактировании заказа на кассе, либо я буду вызывать прогу из скрипта и передавать в нее параметры заказа, а прога уже подключается к хмл интерфейсу через rk7xml.dll и по параметрам заказа/визита я могу получить всю структуру заказа.
Загвоздка в том, что я не знаю как в скрипте получить ид или гуид заказа. В доках, что я нашел просто вода и конкретики нет.
Может у вас есть какая-либо расширенная информация об объектах, с которыми можно работать в скриптах?
Обычный запрос getorder, что даст структуру самого заказа, при чем он разбит по пакетам печати, где видно кто, во сколько, и что добавил.
А вот что в Вашем понимании параметры печати мне не понятно.
Мне нужно понять в какую группу сервис печати относится блюдо, т.е. на выходе разбить заказ по группам-сервис печати.
Отдельно группы сервис-печати я могу получить. остается связать блюдо с группой сервис-печати.
Подскажите, правильно ли я понял, что есть визит, у визита есть заказы. Каждый заказ - это любое редактирование состояния блюд в столе?
GetOrders - выдаст весь список заказов c их guid, далее по guid вытаскиваете нужный заказ через GetOrder.
Группа сервис-печати я как понимаю это где какое блюдо должно выйти, т.е. Вам нужна вся схема сервис-печати?
Тут я думаю проще отлавливать через XML-принтер.
Можно конечно вытащить через XML всю сервис-схему и состыковать с заказом, но это будет не просто.
А так выдаете инфу кусочками, не понятно что с чем стыковать то?
С GetOrders все понятно, единственный минус, я не знаю текущий заказ и постоянно буду получать весь список заказов и мое приложение в цикле опрашивает кассовый сервер, что с неправильно.
Если кратко и объемно, то на выходе моей задумки должен получиться аналог KDS, только в более простом виде.
Задумка такая: скрипт, который при сохранении заказа вызывает внешнюю программу и передает в нее информацию о текущем заказе и не ожидает ее выполнения. Внешняя программа при запуске обращается к кассовому серверу по xml протоколу и командой GetOrder с параметрами ,которые передались в приложение из скрипта получает нужный мне заказ.
Далее по информации о заказе я получаю блюда и список всей схемы сервис-печати. Вот в этот момент буду связывать блюдо со схемой сервис-печати, чтобы узнать, где какое блюдо должно печататься.
В итоге у меня прога должна формировать файлы с заказами, каждый файл отдельно для каждого заказа, т.е. если в заказе несколько блюд и у них разная схема сервис-печати, то формируется файл на каждую категорию сервис-печати.
Если возможно реализовать передачу информации о заказе через XML-принтер, чтобы все происходило так, как бы печать с разбивкой по схемам сервис-печати, то похоже, это упростило мою задачу.
Четко, полно и главное своевременно поставленный вопрос - это 80% ответа.
Не нужны вам ни скрипты ни XML в такой постановке вопроса.Допустим у вас 3 сервис принтера.
Делаете еще 3 с печатью в файл. В существующие схемы сервис-печати добавляете печать и на эти принтеры.
В итоге: каждый заказник в момент сохранения у вас будет улетать на принтер и сохраняться в файл.
Можно пойти еще дальше и вместо файловых принтеров завести в кипере пары IP : рort на этих портах повесить ваш софт который будет ловить эти потоки сервис-печати.
Так и сделал.
По сети тоже передается xml структура чека. Если поправить макет, то примерно получится, то что мне и нужно.
Вот только не пойму про печать в файл.
В устройствах кассы я добавил драйвера "Print to file". для каждого драйвера добавил принтер "Plain to text". На вкладке "Принтеры" у кассы создались соответствующие принтеры. Если я ставлю галку "Журналировать", то на каждый принтер создается файл в папке PRTLOGS кассового сервера. Если эта галка не установлена, то куда же сохраняется файл печати?
Спасибо.
У меня все получилось, реализовал то, что хотел.
Можно еще один вопрос: в макетах есть раздел "Для кдс". У меня все макеты из КДС зачеркнуты.
Там есть такой макет "КДС: Данные о блюдах" он подходит для моей задумки идеально. Можно ли его как-то использовать как макет сервис-схемы?
В данный момент я могу выбрать только макеты сервис-печати.
Спасибо.
У меня все получилось, реализовал то, что хотел.
Можно еще один вопрос: в макетах есть раздел "Для кдс". У меня все макеты из КДС зачеркнуты.
Там есть такой макет "КДС: Данные о блюдах" он подходит для моей задумки идеально. Можно ли его как-то использовать как макет сервис-схемы?
В данный момент я могу выбрать только макеты сервис-печати.
Вот видите, если не кусочками инфу бы давали, давно уж сделали.
Создание заказа отлавливаете через XML-принтер, а о заказе получаете через getorders. Даже больше скажу у XML интерфейса midserv есть команды для KDS, которыми Вы можете воспользоваться. Дока на FTP UCS здесь /rk7/ForDealers/XMLInterface
Скорее всего так и придется делать.
К сожалению доступа к фтп у меня нет.
Если вам не трудно, можете скинуть доку?
Всё давно лежит в https://yadi.sk/d/MiNBFMVk3aSSH9 (хранилище)
Сергей Горбачев
24.08.2018, 11:15
Здравствуйте , можно посмотреть как у вас организованно дублирование в файл в картинках, меня это тоже интересует, но к сожалению не все понятно с
Так и сделал.
По сети тоже передается xml структура чека. Если поправить макет, то примерно получится, то что мне и нужно.
Вот только не пойму про печать в файл.
В устройствах кассы я добавил драйвера "Print to file". для каждого драйвера добавил принтер "Plain to text". На вкладке "Принтеры" у кассы создались соответствующие принтеры. Если я ставлю галку "Журналировать", то на каждый принтер создается файл в папке PRTLOGS кассового сервера. Если эта галка не установлена, то куда же сохраняется файл печати?
Сергей Горбачев
24.08.2018, 11:32
Файл надо в ручную создать или он создастся автоматически?
6686
Файл надо в ручную создать или он создастся автоматически?
сам создаст. главное что бы прав хватило на запись в указанную папку
Сергей Горбачев
24.08.2018, 12:20
Делаю так 670167026703
Четко, полно и главное своевременно поставленный вопрос - это 80% ответа.
"Не нужны вам ни скрипты ни XML в такой постановке вопроса.Допустим у вас 3 сервис принтера.
Делаете еще 3 с печатью в файл. В существующие схемы сервис-печати добавляете печать и на эти принтеры.
В итоге: каждый заказник в момент сохранения у вас будет улетать на принтер и сохраняться в файл.
Можно пойти еще дальше и вместо файловых принтеров завести в кипере пары IP : рort на этих портах повесить ваш софт который будет ловить эти потоки сервис-печати."
Где добавлять в моей схеме печать? Спасибо.
Где добавлять в моей схеме печать?
То что у вас на 3ем скрине с вопросом - это не то.
Вам надо:
В схеме печати "Схема Зимник" добавить еще один сервис чек, в его свойствах (справа). Внизу выбрать принтер "cash PlaintText", а выше отметить нужные категории (блюда с этими категориями будут уходить на этот принтер)
Сергей Горбачев
24.08.2018, 16:37
Спасибо, попробую.
Сергей Горбачев
24.08.2018, 17:21
То что у вас на 3ем скрине с вопросом - это не то.
Вам надо:
В схеме печати "Схема Зимник" добавить еще один сервис чек, в его свойствах (справа). Внизу выбрать принтер "cash PlaintText", а выше отметить нужные категории (блюда с этими категориями будут уходить на этот принтер)
6706
Файл не создается. Что я делаю не так?
Что я делаю не так?
1. Первый скрин в 29ом посте
Я не уверен что "Имя Файла для печати через пробелы.txt" это корректно.
2. Этот заказ на реальных принтерах вышел?
Сергей Горбачев
24.08.2018, 21:29
6708
Сергей Горбачев
24.08.2018, 21:46
А на принтер заказник печать не пошла, а выскочила эта надпись. Завтра утром попробую название файла слитно написать.
Сергей Горбачев
25.08.2018, 11:38
6708 Перепутал принтер. Сейчас у меня заказники на реальных принтерах печатаются, а файлы в каталоге ( D:\ ) не создаются. Имена файлов написал слитно без пробелов на латинице.
Перепутал принтер. Сейчас у меня заказники на реальных принтерах печатаются, а файлы в каталоге ( D:\ ) не создаются. Имена файлов написал слитно без пробелов на латинице.
Добрый день!
Я отказался от печати в файл.
Но ради эксперимента сделал.
В сервис схемах для каждого сервис чека у меня установлен соответствующий xml-принтер:
6715
В станциях и устройствах настроены принтеры для кассы:
6716
На вкладке Устройства для кассы указан полный путь к файлу:
6717
После сохранения заказа у меня создается файл:
6718
Сергей Горбачев
28.08.2018, 10:46
Добрый день!
Я отказался от печати в файл.
Но ради эксперимента сделал.
В сервис схемах для каждого сервис чека у меня установлен соответствующий xml-принтер:
6715
В станциях и устройствах настроены принтеры для кассы:
6716
На вкладке Устройства для кассы указан полный путь к файлу:
6717
После сохранения заказа у меня создается файл:
6718
671967206721
Не получилось, файл не создается.
Чтобы не плодить темы со скриптами, задам вопрос здесь.
Можно ли как-то в стриптах сделать вызов формы ввода?
Где-то встречал такое, но не могу найти. Может кто знает как в сриптах вызвать форму ввода, к примеру числа, и потом обработать результат ввода?
В документации ничего подобного нет, да и дока на столько скудная, что по ней невозможно ничего разобрать.
xxx := gui.InputBox('Введите ХХХ', 'Надо ввести ХХХ', '', true);
xxx := gui.InputBox('Введите ХХХ', 'Надо ввести ХХХ', '', true);
Александр, спасибо!
Существует ли расширенная дока по скриптам?
У меня есть только RK7Scripts.chm и RK7Scripts.chw. Но в этой доке нет ничего подобного.
Может у вас есть расширенная дока по скриптам?
Может у вас есть расширенная дока по скриптам?
Есть. В голове...
Но по понятным причинам поделиться ею не смогу :)
Есть. В голове...
Но по понятным причинам поделиться ею не смогу :)
Еще вопрос можно по скрипту?
Можно ли удалить оплату из заказа?
Саму оплату я отловил:
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then
begin
if TPayLine(it).code = 97 then
begin
InputBox := gui.InputBox('123', '321', true);
if InputBox <> '1234' then
// если код оплаты 92 и значение из импут-бокса не нужное, то удаляем оплату из заказа.
end;
end;
Можно ли удалить оплату из заказа?
Что то типа
RKCheck.DeleteCheckItem(it)
Что то типа
RKCheck.DeleteCheckItem(it)
Спасибо!
Работает. Приходится разбираться по скриптам, которые нахожу на форумах.
Приходится разбираться по скриптам, которые нахожу на форумах.
Аналогично...
Аналогично...
Александр, наверно уже замучил вас.
Есть такой метод у гуи, как GUI.CmdExec('notepad.exe');
Он запускает исполняемый файл и ждет его выполнение. Дополнительные параметры передать не получится, кроме как CmdExec('notepad.exe 123 у');
Вопрос в том, возвращает ли этот метод код работы приложения?
Вопрос в том, возвращает ли этот метод код работы приложения?
Нет. CmdExec - это процедура.
Есть еще функция
CmdExecWithFlags(const CmdLine: string; CmdWindowState: integer; HideCashWindow: boolean): boolean;
Но судя по описанию она булевая, и возвращает только успех или провал
Нет. CmdExec - это процедура.
Есть еще функция
CmdExecWithFlags(const CmdLine: string; CmdWindowState: integer; HideCashWindow: boolean): boolean;
Но судя по описанию она булевая, и возвращает только успех или провал
И еще вопрос по работе с XML. Есть тип TXMLReceiptParameters, можно ли как-то работать с xml-файлами в скрипте?
TXMLReceiptParameters
Точно не знаю но думаю что тут речь про внутреннее ЧЬД представление чека в кипере.
А то о чем вы говорите - парсить в рукопашную...
Точно не знаю но думаю что тут речь про внутреннее ЧЬД представление чека в кипере.
А то о чем вы говорите - парсить в рукопашную...
Парсить как строку, пока больше вариантов нет.
TXMLReceiptParameters участвует в представлении чека. Но вот как отдельно интересно пользоваться этим классом.
У UCS в скрипте нет поддержки класса TXMLDocument, что осложняет парсинг отдельных файлов xml.
Спасибо!
Нашел пример скрипта "Спасибо от сбера", они xml разбирают как строку. Возможно мне этого будет достаточно.
Powered by vBulletin® Version 4.2.6 LTS Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot