PDA

Просмотр полной версии : Скрипты в RK7



vpavelv
26.07.2018, 12:27
Доброго времени суток!
Пытаюсь разобраться со скриптами в 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 ничего толком не рассказывает.

sibgaba
26.07.2018, 16:13
А цель всего этого какая?
Ну вот есть чек в файле, дальше с ним кто/что делать будет?
Я просто к тому что есть встроенные механизмы. Например логирование печати в файл. Это не подойдет?

vpavelv
26.07.2018, 16:30
В планах чек отправлять на сторонний ресурс и в дальнейшем пересчитывать скидку.
Обмен предварительно будет через файл с внешней прогой.

SH
28.07.2018, 07:01
Не проще ли по XML вытащить

vpavelv
30.07.2018, 10:57
Скорее всего так и придется.
Но еще есть моменты, при которых в дальнейшем нужно будет редактировать заказ, добавить блюдо или скидку.
Ищу разные подходы.

sibgaba
30.07.2018, 11:30
Ищу разные подходы.
Не в ту сторону копаете...
Скриптами вы этого не сделаете.

Если речь про внешнюю дисконтную систему, которая скидку будет возвращать и/или подарочное блюдо, то это вам под FarCard надо dll писать

vpavelv
01.08.2018, 11:48
Такое у меня уже реализовано)
С чеками немного изменилась задача: мне нужно получить содержимое чека после его сохранения и передать его во внешнюю систему без какого-либо воздействия на сам чек.
Сейчас копаю в сторону KDS/VDU, по сути мне нужно получить аналог системы с простым выводом чеков на экран.
Пытаюсь изучить разные интерфейсы и попытаться хоть как-то получить чек.

sibgaba
01.08.2018, 16:48
Нотификацию об изменениях получать через XML принтер, либо настраивать дополнительные схемы сервиспечати.
А дальше смотреть в сторону XML интерфейса...

vpavelv
02.08.2018, 11:48
Спасибо.
Существуют ли описания XML интерфейса?
Нашел только вот это: http://apidocs.ucs.ru/doku.php/ru:rk7xmlinterface

sibgaba
02.08.2018, 11:52
С примерами и готовыми - нет
То что вы нашли это основа с которой начинать, а дальше разбираться

vpavelv
02.08.2018, 12:15
Спасибо.
Буду разбираться.

vpavelv
09.08.2018, 19:00
С примерами и готовыми - нет
То что вы нашли это основа с которой начинать, а дальше разбираться

Вы не пробовали разобраться с XML Interface?
Пытаюсь делать запросы из документации. Список заказов, конкретный заказ могу получить, но пока никак не соображу как получить заказ с блюдами, где видно параметры сервис-печати.

mnekin
13.08.2018, 19:30
Обычный запрос getorder, что даст структуру самого заказа, при чем он разбит по пакетам печати, где видно кто, во сколько, и что добавил.
А вот что в Вашем понимании параметры печати мне не понятно.

vpavelv
14.08.2018, 18:45
Не проще ли по XML вытащить

С одной стороны проще, но мне нужно сначала получить весь список заказов, далее по гуид заказа его вытащить, а уже по ИД блюда получить о нем информацию. Мне придется постоянно дергать подключение к хмл интерфейсу, что не очень удобно и это не правильно.
Лучше бы, чтобы скрипт отдавал гуид заказа или номер визита и ИД заказа и сохранялся у меня файл при редактировании заказа на кассе, либо я буду вызывать прогу из скрипта и передавать в нее параметры заказа, а прога уже подключается к хмл интерфейсу через rk7xml.dll и по параметрам заказа/визита я могу получить всю структуру заказа.
Загвоздка в том, что я не знаю как в скрипте получить ид или гуид заказа. В доках, что я нашел просто вода и конкретики нет.
Может у вас есть какая-либо расширенная информация об объектах, с которыми можно работать в скриптах?

vpavelv
14.08.2018, 18:49
Обычный запрос getorder, что даст структуру самого заказа, при чем он разбит по пакетам печати, где видно кто, во сколько, и что добавил.
А вот что в Вашем понимании параметры печати мне не понятно.

Мне нужно понять в какую группу сервис печати относится блюдо, т.е. на выходе разбить заказ по группам-сервис печати.
Отдельно группы сервис-печати я могу получить. остается связать блюдо с группой сервис-печати.

Подскажите, правильно ли я понял, что есть визит, у визита есть заказы. Каждый заказ - это любое редактирование состояния блюд в столе?

mnekin
14.08.2018, 23:39
GetOrders - выдаст весь список заказов c их guid, далее по guid вытаскиваете нужный заказ через GetOrder.
Группа сервис-печати я как понимаю это где какое блюдо должно выйти, т.е. Вам нужна вся схема сервис-печати?
Тут я думаю проще отлавливать через XML-принтер.
Можно конечно вытащить через XML всю сервис-схему и состыковать с заказом, но это будет не просто.
А так выдаете инфу кусочками, не понятно что с чем стыковать то?

vpavelv
15.08.2018, 11:02
С GetOrders все понятно, единственный минус, я не знаю текущий заказ и постоянно буду получать весь список заказов и мое приложение в цикле опрашивает кассовый сервер, что с неправильно.
Если кратко и объемно, то на выходе моей задумки должен получиться аналог KDS, только в более простом виде.
Задумка такая: скрипт, который при сохранении заказа вызывает внешнюю программу и передает в нее информацию о текущем заказе и не ожидает ее выполнения. Внешняя программа при запуске обращается к кассовому серверу по xml протоколу и командой GetOrder с параметрами ,которые передались в приложение из скрипта получает нужный мне заказ.
Далее по информации о заказе я получаю блюда и список всей схемы сервис-печати. Вот в этот момент буду связывать блюдо со схемой сервис-печати, чтобы узнать, где какое блюдо должно печататься.
В итоге у меня прога должна формировать файлы с заказами, каждый файл отдельно для каждого заказа, т.е. если в заказе несколько блюд и у них разная схема сервис-печати, то формируется файл на каждую категорию сервис-печати.

Если возможно реализовать передачу информации о заказе через XML-принтер, чтобы все происходило так, как бы печать с разбивкой по схемам сервис-печати, то похоже, это упростило мою задачу.

sibgaba
15.08.2018, 12:07
Четко, полно и главное своевременно поставленный вопрос - это 80% ответа.

Не нужны вам ни скрипты ни XML в такой постановке вопроса.Допустим у вас 3 сервис принтера.
Делаете еще 3 с печатью в файл. В существующие схемы сервис-печати добавляете печать и на эти принтеры.
В итоге: каждый заказник в момент сохранения у вас будет улетать на принтер и сохраняться в файл.
Можно пойти еще дальше и вместо файловых принтеров завести в кипере пары IP : рort на этих портах повесить ваш софт который будет ловить эти потоки сервис-печати.

vpavelv
15.08.2018, 12:49
Так и сделал.
По сети тоже передается xml структура чека. Если поправить макет, то примерно получится, то что мне и нужно.

Вот только не пойму про печать в файл.
В устройствах кассы я добавил драйвера "Print to file". для каждого драйвера добавил принтер "Plain to text". На вкладке "Принтеры" у кассы создались соответствующие принтеры. Если я ставлю галку "Журналировать", то на каждый принтер создается файл в папке PRTLOGS кассового сервера. Если эта галка не установлена, то куда же сохраняется файл печати?

sibgaba
15.08.2018, 13:05
6686

vpavelv
16.08.2018, 18:35
Спасибо.
У меня все получилось, реализовал то, что хотел.
Можно еще один вопрос: в макетах есть раздел "Для кдс". У меня все макеты из КДС зачеркнуты.
Там есть такой макет "КДС: Данные о блюдах" он подходит для моей задумки идеально. Можно ли его как-то использовать как макет сервис-схемы?
В данный момент я могу выбрать только макеты сервис-печати.

mnekin
19.08.2018, 07:40
Спасибо.
У меня все получилось, реализовал то, что хотел.
Можно еще один вопрос: в макетах есть раздел "Для кдс". У меня все макеты из КДС зачеркнуты.
Там есть такой макет "КДС: Данные о блюдах" он подходит для моей задумки идеально. Можно ли его как-то использовать как макет сервис-схемы?
В данный момент я могу выбрать только макеты сервис-печати.

Вот видите, если не кусочками инфу бы давали, давно уж сделали.
Создание заказа отлавливаете через XML-принтер, а о заказе получаете через getorders. Даже больше скажу у XML интерфейса midserv есть команды для KDS, которыми Вы можете воспользоваться. Дока на FTP UCS здесь /rk7/ForDealers/XMLInterface

vpavelv
20.08.2018, 15:47
Скорее всего так и придется делать.
К сожалению доступа к фтп у меня нет.
Если вам не трудно, можете скинуть доку?

SH
21.08.2018, 23:02
Всё давно лежит в https://yadi.sk/d/MiNBFMVk3aSSH9 (хранилище)

vpavelv
22.08.2018, 16:47
Спасибо!

Сергей Горбачев
24.08.2018, 11:15
Здравствуйте , можно посмотреть как у вас организованно дублирование в файл в картинках, меня это тоже интересует, но к сожалению не все понятно с
Так и сделал.
По сети тоже передается xml структура чека. Если поправить макет, то примерно получится, то что мне и нужно.

Вот только не пойму про печать в файл.
В устройствах кассы я добавил драйвера "Print to file". для каждого драйвера добавил принтер "Plain to text". На вкладке "Принтеры" у кассы создались соответствующие принтеры. Если я ставлю галку "Журналировать", то на каждый принтер создается файл в папке PRTLOGS кассового сервера. Если эта галка не установлена, то куда же сохраняется файл печати?

Сергей Горбачев
24.08.2018, 11:32
Файл надо в ручную создать или он создастся автоматически?
6686

sibgaba
24.08.2018, 11:58
Файл надо в ручную создать или он создастся автоматически?

сам создаст. главное что бы прав хватило на запись в указанную папку

Сергей Горбачев
24.08.2018, 12:20
Делаю так 670167026703
Четко, полно и главное своевременно поставленный вопрос - это 80% ответа.

"Не нужны вам ни скрипты ни XML в такой постановке вопроса.Допустим у вас 3 сервис принтера.
Делаете еще 3 с печатью в файл. В существующие схемы сервис-печати добавляете печать и на эти принтеры.
В итоге: каждый заказник в момент сохранения у вас будет улетать на принтер и сохраняться в файл.
Можно пойти еще дальше и вместо файловых принтеров завести в кипере пары IP : рort на этих портах повесить ваш софт который будет ловить эти потоки сервис-печати."
Где добавлять в моей схеме печать? Спасибо.

sibgaba
24.08.2018, 14:36
Где добавлять в моей схеме печать?

То что у вас на 3ем скрине с вопросом - это не то.
Вам надо:
В схеме печати "Схема Зимник" добавить еще один сервис чек, в его свойствах (справа). Внизу выбрать принтер "cash PlaintText", а выше отметить нужные категории (блюда с этими категориями будут уходить на этот принтер)

Сергей Горбачев
24.08.2018, 16:37
Спасибо, попробую.

Сергей Горбачев
24.08.2018, 17:21
То что у вас на 3ем скрине с вопросом - это не то.
Вам надо:
В схеме печати "Схема Зимник" добавить еще один сервис чек, в его свойствах (справа). Внизу выбрать принтер "cash PlaintText", а выше отметить нужные категории (блюда с этими категориями будут уходить на этот принтер)
6706
Файл не создается. Что я делаю не так?

sibgaba
24.08.2018, 18:11
Что я делаю не так?

1. Первый скрин в 29ом посте
Я не уверен что "Имя Файла для печати через пробелы.txt" это корректно.

2. Этот заказ на реальных принтерах вышел?

Сергей Горбачев
24.08.2018, 21:29
6708

Сергей Горбачев
24.08.2018, 21:46
А на принтер заказник печать не пошла, а выскочила эта надпись. Завтра утром попробую название файла слитно написать.

Сергей Горбачев
25.08.2018, 11:38
6708 Перепутал принтер. Сейчас у меня заказники на реальных принтерах печатаются, а файлы в каталоге ( D:\ ) не создаются. Имена файлов написал слитно без пробелов на латинице.

vpavelv
27.08.2018, 11:06
Перепутал принтер. Сейчас у меня заказники на реальных принтерах печатаются, а файлы в каталоге ( D:\ ) не создаются. Имена файлов написал слитно без пробелов на латинице.

Добрый день!
Я отказался от печати в файл.
Но ради эксперимента сделал.
В сервис схемах для каждого сервис чека у меня установлен соответствующий xml-принтер:
6715

В станциях и устройствах настроены принтеры для кассы:
6716

На вкладке Устройства для кассы указан полный путь к файлу:
6717

После сохранения заказа у меня создается файл:
6718

Сергей Горбачев
28.08.2018, 10:46
Добрый день!
Я отказался от печати в файл.
Но ради эксперимента сделал.
В сервис схемах для каждого сервис чека у меня установлен соответствующий xml-принтер:
6715

В станциях и устройствах настроены принтеры для кассы:
6716

На вкладке Устройства для кассы указан полный путь к файлу:
6717

После сохранения заказа у меня создается файл:
6718
671967206721
Не получилось, файл не создается.

vpavelv
22.10.2018, 18:44
Чтобы не плодить темы со скриптами, задам вопрос здесь.
Можно ли как-то в стриптах сделать вызов формы ввода?
Где-то встречал такое, но не могу найти. Может кто знает как в сриптах вызвать форму ввода, к примеру числа, и потом обработать результат ввода?
В документации ничего подобного нет, да и дока на столько скудная, что по ней невозможно ничего разобрать.

sibgaba
23.10.2018, 07:00
xxx := gui.InputBox('Введите ХХХ', 'Надо ввести ХХХ', '', true);

vpavelv
23.10.2018, 11:22
xxx := gui.InputBox('Введите ХХХ', 'Надо ввести ХХХ', '', true);

Александр, спасибо!
Существует ли расширенная дока по скриптам?
У меня есть только RK7Scripts.chm и RK7Scripts.chw. Но в этой доке нет ничего подобного.
Может у вас есть расширенная дока по скриптам?

sibgaba
23.10.2018, 11:42
Может у вас есть расширенная дока по скриптам?

Есть. В голове...
Но по понятным причинам поделиться ею не смогу :)

vpavelv
24.10.2018, 17:05
Есть. В голове...
Но по понятным причинам поделиться ею не смогу :)

Еще вопрос можно по скрипту?
Можно ли удалить оплату из заказа?
Саму оплату я отловил:


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;

sibgaba
24.10.2018, 22:21
Можно ли удалить оплату из заказа?
Что то типа

RKCheck.DeleteCheckItem(it)

vpavelv
25.10.2018, 10:39
Что то типа

RKCheck.DeleteCheckItem(it)

Спасибо!
Работает. Приходится разбираться по скриптам, которые нахожу на форумах.

sibgaba
25.10.2018, 12:43
Приходится разбираться по скриптам, которые нахожу на форумах.
Аналогично...

vpavelv
26.10.2018, 13:40
Аналогично...

Александр, наверно уже замучил вас.
Есть такой метод у гуи, как GUI.CmdExec('notepad.exe');
Он запускает исполняемый файл и ждет его выполнение. Дополнительные параметры передать не получится, кроме как CmdExec('notepad.exe 123 у');
Вопрос в том, возвращает ли этот метод код работы приложения?

sibgaba
28.10.2018, 09:23
Вопрос в том, возвращает ли этот метод код работы приложения?

Нет. CmdExec - это процедура.
Есть еще функция
CmdExecWithFlags(const CmdLine: string; CmdWindowState: integer; HideCashWindow: boolean): boolean;
Но судя по описанию она булевая, и возвращает только успех или провал

vpavelv
31.10.2018, 18:38
Нет. CmdExec - это процедура.
Есть еще функция
CmdExecWithFlags(const CmdLine: string; CmdWindowState: integer; HideCashWindow: boolean): boolean;
Но судя по описанию она булевая, и возвращает только успех или провал

И еще вопрос по работе с XML. Есть тип TXMLReceiptParameters, можно ли как-то работать с xml-файлами в скрипте?

sibgaba
01.11.2018, 09:53
TXMLReceiptParameters

Точно не знаю но думаю что тут речь про внутреннее ЧЬД представление чека в кипере.
А то о чем вы говорите - парсить в рукопашную...

vpavelv
01.11.2018, 10:48
Точно не знаю но думаю что тут речь про внутреннее ЧЬД представление чека в кипере.
А то о чем вы говорите - парсить в рукопашную...

Парсить как строку, пока больше вариантов нет.
TXMLReceiptParameters участвует в представлении чека. Но вот как отдельно интересно пользоваться этим классом.
У UCS в скрипте нет поддержки класса TXMLDocument, что осложняет парсинг отдельных файлов xml.

Спасибо!
Нашел пример скрипта "Спасибо от сбера", они xml разбирают как строку. Возможно мне этого будет достаточно.