wiki:AdvancedApplicationDesign/vozenje

Стартување на возење

Само корисник со улога патник може да започне возење. Прво одбира билет со кој сака да се вози. Потоа бира постојка на која се качува и откога ќе одбере постојка му се листаат сите активни инстанци на линии кои се уште не ја поминале таа станица.

Тригер во база:

Пред да се внесе возењето во база се извршува тригер во база за да се провери валидноста на билетот:

create or replace function check_expiry_date() returns trigger
as
    $$
    begin
        if exists(
            select 1
            from vozenje v
            where v.patnik_id = new.patnik_id and v.end_date is null
        ) then
            update vozenje set end_date = now(), status = 'FINISHED' where id in (select v.id
                                                                                  from vozenje v
                                                                                  where v.patnik_id = new.patnik_id and v.end_date is null);
        end if;

        if exists(
            select 1
            from bilet
            where id = new.bilet_id and datum_aktivacija is null
        ) then
            update bilet set datum_aktivacija = now(), status = 'ACTIVE' where id = new.bilet_id;
        end if;

        if exists(
            select 1
            from bilet b
            join tipbilet tb on b.tip_id = tb.id
            where b.id = new.bilet_id and ((b.datum_aktivacija + (tb.trajnost || ' milliseconds')::interval) < now())
        ) then
            update bilet set status = 'EXPIRED' where id = new.bilet_id;
            end if;

        if exists(
            select 1
            from bilet b
                     join tipbilet tb on b.tip_id = tb.id
            where b.id = new.bilet_id and ((b.datum_aktivacija + (tb.trajnost || ' milliseconds')::interval) < now())
        ) then
            RAISE exception 'Ticket is expired';
        end if;
        return new;
    end;
    $$ language plpgsql;

create or replace trigger check_validity_of_ticket
    before insert on vozenje
    for each row
    execute function check_expiry_date();

Query за да се добијат потрбните инстанци на линии:

 @Query(
        value =
            """
            select distinct inl.id
from instanca_na_linija inl
         join instanca_na_linija_postojka_na_linija inlpnl on inl.id = inlpnl.instanca_na_linija_id
where end_date is null
  and linija_id in (
    select distinct(pnl.linija_id)
    from postojka_na_linija pnl
    where postojka_id = ?1
)
except
select inl.id
from postojka_na_linija pnl
         join instanca_na_linija inl on inl.linija_id = pnl.linija_id and inl.pravec_id = pnl.pravec_id
join instanca_na_linija_postojka_na_linija inlpnl on inl.id = inlpnl.instanca_na_linija_id and pnl.id = inlpnl.postojka_na_linija_id
where inl.end_date is null and postojka_id = ?1;
        """,
        nativeQuery = true,
    )
    fun findIncomingRouteInstancesForStation(stationId: Int): List<Long>


Last modified 3 months ago Last modified on 08/20/24 18:47:39

Attachments (1)

Download all attachments as: .zip

Note: See TracWiki for help on using the wiki.