Как динамически считать людей на этапах автоперевозок - PullRequest
0 голосов
/ 30 апреля 2019

Мне нужно разработать сервис совместного использования автомобилей, в котором пользователи участвуют в создании автопарка.Пользователь выбирает два этапа: этап вылета и этап прибытия.Для управления этим «ограничением» я создаю две взаимосвязи между пользователем и сущностью сцены.В одном я вставляю начальные этапы пользователей, в другом я вставляю этапы прибытия пользователей.(Сущность объекта связана с отношением 1,1 - 0, N с объектом пути, поэтому этап однозначно связан с путем).Моя проблема заключается в следующем: я должен создать триггер, который позволяет мне закрывать состояние этапа, когда вместимость транспортного средства для этого этапа = 0;Я должен учитывать количество людей, которые будут ездить со мной, и количество людей, которые выходят на каждом этапе, чтобы я мог понять, могу ли я взять кого-то на поездку или нет.Проблема в том, что если у меня есть стадии «A, B, C, D», пользователь может выбрать в качестве начальной стадии «C» и в качестве стадии прибытия «D».Но если вы первый, кто примет участие в этой автобазе, я должен учесть, что для «C» и только для него, вместимость транспортного средства должна уменьшиться на единицу, оставляя способность транспортного средства для других этапов неизменной, но помня, чтоУ меня уже будет кто-то на C. Поэтому, если изначально моя вместимость составляет 4 (5 мест - 1 для водителя), я смогу надеть A, например, 4 человека, на B 4 человека, только если 4 человека, которые япрокатился на А сойти, или 1 одиночка, если я сойду с одного, и так далее.Другой пример, если на ИИ набираются 2 человека, на БИ можно взять на прокат только двух человек, если никто из тех, кто занимался ранее, не уходит на Б. Или, опять же, если у меня есть первые два человека, которые участвуют в автопарке,выберите C в качестве начальной стадии и D в качестве прибытия, я должен знать, что на A я могу принять 4 человек, ЕСЛИ по крайней мере два из них сойдут до или на C и т. д. Спасибо всем.

TappePartenzaPremium contains the Start Stages
TappeArrivoPremium  contains the Arrival Stages
IdTragitto is the id for the path.

Inside TappePartenzaPremium I have "idTragitto, Latitude, Longitude"
Inside TappeArrivoPremium  I have "idTragitto, Latitude, Longitude"
Inside Tragitto I have "IdTragitto, Type, numberOfKm)

SET @CONTATORE=0; //it means COUNTER
SET @PERSONEABORDO=0; //PEOPLE THAT TAKE A RIDE WITH ME

/*TRIGGER*/
delimiter |
create trigger ContaCapienza
before insert on TappePartenzaPremium
for each row
SET @IDTRAG = new.idTragitto;
SET @CAPIENZA = ((SELECT Capienza FROM VEICOLO, PRENOTAZIONE WHERE IDTrag=@IDTRAG AND TargaV=Targa)-1);
if((@CAPIENZA - @PERSONEABORDO - (SELECT COUNT(*) FROM TappePartenzaPremium WHERE idTragitto=new.idTragitto AND LatTappa=new.LatTappa AND LngTappa=new.LngTappa) + 
(SELECT COUNT(*) FROM TappeArrivoPremium WHERE idTragitto=new.idTragitto AND LatTappa=new.LatTappa AND LngTappa=new.LngTappa)) =0 && ((SELECT Stato FROM TAPPA WHERE Latitudine=new.LatTappa AND Longitudine=new.LngTappa AND IdTragitto=new.idTragitto)="APERTA")) then
UPDATE TAPPA SET Stato = "CHIUSA" WHERE Latitudine=new.LatTappa AND Longitudine=NEW.LngTappa AND IdTragitto=NEW.idTragitto;
SET @CONTATORE := @CONTATORE+1;
IF((Select count(*) from TAPPA where IdTragitto=New.idTragitto)=@CONTATORE) Then
UPDATE PRENOTAZIONE SET Stato = "CHIUSA" WHERE IdTrag=NEW.idTragitto;
end if;
end if;
SET @PERSONEABORDO= (SELECT COUNT(*) FROM TappePartenzaPremium WHERE idTragitto=new.idTragitto AND LatTappa=new.LatTappa AND LngTappa=new.LngTappa);
|

очевидно, что это не правильно .. Мне нужен @CONTATORE, потому что, когда число этапов для пути = @CONTATORE (Это увеличивается каждый раз, когда этап становится "ЗАКРЫТО", поэтому, когда емкость транспортного средства для этого этапа0) я также должен закрыть все бронирование.

Я ожидаю, что алгоритм-триггер управляет правильным количеством мест, доступных для каждого этапа, и закрывает / открывает этап, если он заполнен или нет.

...