Ошибка выполнения команды

Mini web-сервер для печати чеков на фискальных регистраторах из мобильных приложений через HTTP запрос JSON.
Ответить
andrew
Сообщения: 104
Зарегистрирован: 05 июн 2017, 11:41

Ошибка выполнения команды

Сообщение andrew » 23 июн 2017, 19:40

Если команда по какой-либо причине не была выполнена (например просрочена смена),
то после устранения причины ошибки, эту команду нельзя выполнить повторно с тем же IdCommand.
Получаем:
Ошибка 5 "Команда уже была выполнена".
Но ведь команда не была выполнена.
Нельзя ли что-то с этим сделать?

Смысл в том, что мы формируем idCommand из id платежа. И если по какой-то причине чек не был зарегистрирован,
то хотелось бы, чтобы после устранения этой причины, его таки можно было зарегистрировать той же командой.

Audim
Администратор
Сообщения: 1701
Зарегистрирован: 17 мар 2015, 18:36

Re: Ошибка выполнения команды

Сообщение Audim » 23 июн 2017, 20:20

Категорически нет!
IdCommand специально была сделана чтобы команда не дай бог не выполнилась дважды.
В HTTP протоколе может быть повторная пересылка пакета если на первый не был получен ответ.
И IdCommand защищает от этого! Чтобы один и тот-же чек не зарегистрировался дважды.

А почему не можете обновить поле "IdCommand" ???

andrew
Сообщения: 104
Зарегистрирован: 05 июн 2017, 11:41

Re: Ошибка выполнения команды

Сообщение andrew » 24 июн 2017, 01:17

Вот и мы решили, что использовать IdCommand для защиты от
повторной регистрации чека очень удобно. Посылаем платежный документ
из нашей БД на kkmserver, в случае успешной регистрации чека
записываем ответ kkmserver в базу. Если по какой-то причине в БД не
зафиксирован факт регистрации чека, то этот платежный документ снова
может быть отправлен на регистрацию чека. Вот тут-то нас и страхует
IdCommand, уникальный для каждого нашего платежного документа. И все
хорошо до того момента, пока мы не получаем ошибку от kkmserver.
У нас сейчас это связано в основном с несвоевременным закрытием смены -
утрясаем формальности.
Все же, требование уникальности IdCommand только среди успешно
выполненных команд, здорово расширило бы его защитный потенциал.

andrew
Сообщения: 104
Зарегистрирован: 05 июн 2017, 11:41

Re: Ошибка выполнения команды

Сообщение andrew » 27 июн 2017, 14:24

Я попробую еще раз сформулировать проблему.
Если команда успешно выполнена, то разумеется повторное выполнение команды с тем же IdCommand недопустимо.
Но, если команда вызвала ошибку (устройство не готово, смена просрочена, что-то еще), то на наш взгляд логично иметь возможность повторить ту же команду (с тем же IdCommand) до ее успешного выполнения.
Для нас это важно, поскольку мы формируем IdCommand из id транзакции. Если она успешно выполнена, то для нас уникальность IdCommand это тоже хорошая гарантия от повторного выполнения транзакции.
До тех пор, пока не получена ошибка.
Получив ошибку, мы не можем повторить транзакцию, поскольку ее id завязан на IdCommand и мы не можем повторить ту же команду.

То есть мы хотели бы иметь возможность иметь возможность повторно выполнить команду с тем же IdCommand, если предыдущая команду вызвала ошибку.

Вопрос - это можно сделать?
Если вы считаете, что нельзя или нежелательно, то так и напишите.
Тогда мы будем решать проблему на своей стороне.

Audim
Администратор
Сообщения: 1701
Зарегистрирован: 17 мар 2015, 18:36

Re: Ошибка выполнения команды

Сообщение Audim » 27 июн 2017, 15:45

Если при выполнении команды была ошибка команда считается выполненной.
И по IdCommand нужно иметь возможность всегда получить итог команды, пусть и с ошибкой.

На такую логику завязаны все мои клиенты - поменять - значит и всем клиентам придется менять свой код.

Вопрос: Почему Вы не можете сделать у себя соответствие: id транзакции -> IdCommand?
Т.е. при транзакции запоминаете id транзакции и рядом с ней IdCommand.
Если в команде была ошибка генерите новый IdCommand, записываете его в соответствие и заново отправляете.
???

andrew
Сообщения: 104
Зарегистрирован: 05 июн 2017, 11:41

Re: Ошибка выполнения команды

Сообщение andrew » 27 июн 2017, 15:51

Audim писал(а): Вопрос: Почему Вы не можете сделать у себя соответствие: id транзакции -> IdCommand?
Т.е. при транзакции запоминаете id транзакции и рядом с ней IdCommand.
Если в команде была ошибка генерите новый IdCommand, записываете его в соответствие и заново отправляете.
???
Да можем конечно, и видимо примерно так и будем делать. Просто хотелось пойти по пути наименьшего сопротивления :)

Хорошо, вопрос закрыт.

Аватара пользователя
oum
Сообщения: 113
Зарегистрирован: 03 июн 2017, 17:44
Откуда: Lipetsk,Russia
Контактная информация:

Re: Ошибка выполнения команды

Сообщение oum » 28 июн 2017, 22:18

andrew, тут нет идеала. Вот стоит перезагрузить ккм сервер и он забывает ид команд.
получается, что можно выполнить дважды ;(
можно маску сделать
order-000000000000-try-00
и обязательно еще самому отслеживать, чтобы не ушел повторно по ошибке

Аватара пользователя
oum
Сообщения: 113
Зарегистрирован: 03 июн 2017, 17:44
Откуда: Lipetsk,Russia
Контактная информация:

Re: Ошибка выполнения команды

Сообщение oum » 28 июн 2017, 22:28

p.s. Перед registerCheck можно запрашивать статус смены через getDataKkt

Ответить