Проблемы с очередью пациентов / системой управления токенами - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть таблица с именем tblTokenQueue , как показано ниже

CouponNo   Status      Sequence
A101      Completed       1
A102      Completed       2
A103      Completed       3
A104      Serving         4
A105      Pending         5
A106      Pending         6
A107      Pending         7
A108      Pending         8
A109      Pending         9
A110      Pending         10
A111      Pending         11
A112      Pending         12
A113      Pending         13
A114      Pending         14
A115      Pending         15

У меня есть случай, когда токены могут быть приостановлены.Больница сообщает, что когда мы возобновляем токены удержания, их следует размещать после 3 токенов от текущего токена.В нашем примере допустим, что A105 и A106 приостановлены.Я назначу последовательность -99 для всех жетонов удержания.Тогда таблица становится

CouponNo   Status      Sequence
    A101      Completed       1
    A102      Completed       2
    A103      Completed       3
    A104      Serving         4
    A105      Hold           -99
    A106      Hold           -99
    A107      Pending         5
    A108      Pending         6
    A109      Pending         7
    A110      Pending         8
    A111      Pending         9
    A112      Pending         10
    A113      Pending         11
    A114      Pending         12
    A115      Pending         13

И когда мы возобновим оба, я хочу таблицу как ниже.Это означает, что возобновленные токены должны быть размещены после 3 токенов текущего токена.

CouponNo   Status      Sequence
    A101      Completed       1
    A102      Completed       2
    A103      Completed       3
    A104      Serving         4
  **A105      Pending         8**
  **A106      Pending         9**            
    A107      Pending         5
    A108      Pending         6
    A109      Pending         7
    A110      Pending         10
    A111      Pending         11
    A112      Pending         12
    A113      Pending         13
    A114      Pending         14
    A115      Pending         15

Когда мы держим токен и возобновляем работу, могут возникнуть следующие условия

  1. Обслужен один клиент.в приведенном выше примере его A104 и токен A105 возобновляются.
  2. Допустим, в настоящий момент обслуживается токен A105, и я поставил его на удержание.Следующий токен - A106, и я тоже остановил его.И сразу же я хочу возобновить A105 в ожидании, не обслуживая ни одного другого.В этом случае никто не получает "обслужен"
  3. Токен A101 является первым токеном, и я поставил его на удержание и хочу возобновить.на этом этапе никто не получает обслуженных и не завершенных токенов.
  4. Теперь допустим, что токен A114 находится в режиме ожидания (согласно нашему примеру выше) и хочет возобновить.После него остался только один жетон.Поэтому нет смысла добавлять 3 к его порядковому номеру.

Я создал две процедуры

для удержания токена

create procedure TokenHoldProc(@TokenNo varchar(10))
        as
        begin
        update tblTokenQueue set TokenSequence='-99',TokenStatus='Hold' where TokenNo=@TokenNo
        end

для возобновления токена

create procedure TokenResumeProc(@TokenNo varchar(10),@TokenPushCount int)
    as
    begin
    declare @ServingPosition int
    select  @ServingPosition=TokenSequence from tblTokenQueue where TokenStatus='Serving'
        if (@ServingPosition is null) --if no one is getting served at present 
            begin
            select @ServingPosition=TokenSequence from tblTokenQueue where TokenStatus='Completed'
                if (@ServingPosition is  null)  --if its the first token
                    update tblTokenQueue set TokenSequence = 1 where TokenNo=@TokenNo;
                    else
                    begin
                        update tblTokenQueue set TokenSequence = TokenSequence + 1 where TokenSequence >=@ServingPosition+(@TokenPushCount+1);
                        update tblTokenQueue set TokenSequence = @ServingPosition+(@TokenPushCount+1),TokenStatus='Pending'  where TokenNo=@TokenNo;
                    end
                    end
        else
        begin
            update tblTokenQueue set TokenSequence = TokenSequence + 1 where TokenSequence >=@ServingPosition+(@TokenPushCount+1);
            update tblTokenQueue set TokenSequence = @ServingPosition+(@TokenPushCount+1),TokenStatus='Pending'  where TokenNo=@TokenNo;
        end
    end

В соответствии с этими процедурами будут выполнены первые 3 случая.Но есть 2 вопроса

  1. номер дела 4.
  2. Если я хочу возобновить 2 маркера удержания один за другим, он сгенерирует одинаковый номер последовательности для обоих

Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 29 сентября 2019

Я чувствую, что вам нужно максимум в этой части:

select @ServingPosition=max(TokenSequence) from tblTokenQueue where TokenStatus='Completed'

Для вашей второй задачи мне нужно знать больше.Если вы одновременно снимаете партию токенов, то, возможно, вы можете просто обработать их в обратном порядке.Если они не партия, то то, что происходит, соответствует представленным критериям.Одна возможность, которую я вижу, чтобы помочь этой проблеме, состоит в том, чтобы добавить новый Статус, названный "Возобновленный".Вы можете создать особый случай, когда возобновленные купоны имеют более высокий приоритет и не включены в расчет «плюс 3».

Я не совсем понимаю, что понимаю вашу первую проблему с делом № 4.Но, возможно, это так же просто, как захват максимальной последовательности и использование ее в вашем выражении set -

case when @ServingPosition+(@TokenPushCount+1) > @MaxSequence + 1 then @MaxSequence + 1 else @ServingPosition+(@TokenPushCount+1) end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...