YKPN#79783 Ondersteuning van sensorlimieten
svn path=/Database/trunk/; revision=61638
This commit is contained in:
217
INS/INS_TRI.SRC
217
INS/INS_TRI.SRC
@@ -338,48 +338,191 @@ END;
|
||||
/
|
||||
|
||||
CREATE_TRIGGER(ins_t_ins_deel_A_U)
|
||||
AFTER UPDATE ON ins_deel
|
||||
FOR EACH ROW
|
||||
AFTER UPDATE
|
||||
ON ins_deel
|
||||
FOR EACH ROW
|
||||
DECLARE
|
||||
new_date DATE;
|
||||
prev_state ins_deel_state_history.ins_deel_state%TYPE;
|
||||
lmelder_oslogin CONSTANT VARCHAR (10) := '_HMAIL'; -- TODO!!!
|
||||
new_date DATE;
|
||||
prev_state ins_deel_state_history.ins_deel_state%TYPE;
|
||||
lstate_history_key ins_deel_state_history.ins_deel_state_history_key%TYPE;
|
||||
ins_srtdeel_statethreshold ins_srtdeel.ins_srtdeel_statethreshold%TYPE;
|
||||
ldubbelcheck_key mld_melding.mld_melding_key%TYPE;
|
||||
lstdmelding_key ins_srtdeel.mld_stdmelding_key%TYPE;
|
||||
ldiscipline_key mld_stdmelding.mld_ins_discipline_key%TYPE;
|
||||
lstatethreshold ins_srtdeel.ins_srtdeel_statethreshold%TYPE;
|
||||
lmelding_key mld_melding.mld_melding_key%TYPE;
|
||||
lmelder_key mld_melding.prs_perslid_key%TYPE;
|
||||
BEGIN
|
||||
IF (:old.ins_deel_state IS NULL AND :new.ins_deel_state IS NOT NULL)
|
||||
OR (:new.ins_deel_state <> :old.ins_deel_state)
|
||||
THEN
|
||||
BEGIN
|
||||
new_date := COALESCE (:new.ins_deel_statedate, SYSDATE); -- voorkom dat de update *net* een seconde later kan zijn
|
||||
INSERT INTO ins_deel_state_history (ins_deel_key, ins_deel_state, ins_deel_statedate)
|
||||
VALUES (:new.ins_deel_key, :new.ins_deel_state, COALESCE(:new.ins_deel_statedate, new_date));
|
||||
EXCEPTION
|
||||
WHEN DUP_VAL_ON_INDEX
|
||||
THEN
|
||||
BEGIN
|
||||
SELECT ins_deel_state
|
||||
INTO prev_state
|
||||
FROM ins_deel_state_history
|
||||
WHERE ins_deel_state_history_key =
|
||||
(SELECT MAX (ins_deel_state_history_key)
|
||||
FROM ins_deel_state_history
|
||||
WHERE ins_deel_key = :new.ins_deel_key
|
||||
AND ins_deel_statedate < new_date);
|
||||
EXCEPTION
|
||||
WHEN NO_DATA_FOUND THEN NULL;
|
||||
END;
|
||||
-- archiving chances in state_history
|
||||
IF (:old.ins_deel_state IS NULL AND :new.ins_deel_state IS NOT NULL)
|
||||
OR (:new.ins_deel_state <> :old.ins_deel_state)
|
||||
THEN
|
||||
BEGIN
|
||||
new_date := COALESCE (:new.ins_deel_statedate, SYSDATE); -- voorkom dat de update *net* een seconde later kan zijn
|
||||
|
||||
IF (prev_state = :new.ins_deel_state)
|
||||
INSERT INTO ins_deel_state_history (ins_deel_key, ins_deel_state, ins_deel_statedate)
|
||||
VALUES (:new.ins_deel_key,
|
||||
:new.ins_deel_state,
|
||||
COALESCE (:new.ins_deel_statedate, new_date))
|
||||
RETURNING ins_deel_state_history_key
|
||||
INTO lstate_history_key;
|
||||
EXCEPTION
|
||||
WHEN DUP_VAL_ON_INDEX
|
||||
THEN
|
||||
DELETE ins_deel_state_history
|
||||
WHERE ins_deel_key = :new.ins_deel_key
|
||||
AND ins_deel_statedate = new_date;
|
||||
ELSE -- kan alleen bij tri-stste statussen gebeuren
|
||||
UPDATE ins_deel_state_history
|
||||
SET ins_deel_state = :new.ins_deel_state
|
||||
WHERE ins_deel_key = :new.ins_deel_key
|
||||
AND ins_deel_statedate = new_date;
|
||||
BEGIN
|
||||
SELECT ins_deel_state
|
||||
INTO prev_state
|
||||
FROM ins_deel_state_history
|
||||
WHERE ins_deel_state_history_key =
|
||||
(SELECT MAX (ins_deel_state_history_key)
|
||||
FROM ins_deel_state_history
|
||||
WHERE ins_deel_key = :new.ins_deel_key
|
||||
AND ins_deel_statedate < new_date);
|
||||
EXCEPTION
|
||||
WHEN NO_DATA_FOUND
|
||||
THEN
|
||||
NULL;
|
||||
END;
|
||||
|
||||
IF (prev_state = :new.ins_deel_state)
|
||||
THEN
|
||||
DELETE ins_deel_state_history
|
||||
WHERE ins_deel_key = :new.ins_deel_key AND ins_deel_statedate = new_date;
|
||||
ELSE -- kan alleen bij tri-stste statussen gebeuren
|
||||
UPDATE ins_deel_state_history
|
||||
SET ins_deel_state = :new.ins_deel_state
|
||||
WHERE ins_deel_key = :new.ins_deel_key AND ins_deel_statedate = new_date;
|
||||
END IF;
|
||||
END;
|
||||
END IF;
|
||||
|
||||
-- potentially trigger dependent actions
|
||||
IF (:old.ins_deel_state IS NULL AND :new.ins_deel_state IS NOT NULL)
|
||||
OR (:new.ins_deel_state <> :old.ins_deel_state)
|
||||
THEN
|
||||
BEGIN
|
||||
SELECT ins_srtdeel_statethreshold, mld_stdmelding_key
|
||||
INTO lstatethreshold, lstdmelding_key
|
||||
FROM ins_srtdeel
|
||||
WHERE ins_srtdeel_key = :new.ins_srtdeel_key;
|
||||
|
||||
IF lstatethreshold IS NOT NULL
|
||||
AND lstdmelding_key IS NOT NULL
|
||||
AND ins.state_compare (:new.ins_deel_state, lstatethreshold) > 0
|
||||
AND ins.state_compare (:old.ins_deel_state, lstatethreshold) <= 0
|
||||
THEN
|
||||
-- Eerst controleren of er niet al een "heel recente" melding bestaat
|
||||
-- waarmee deze zou kunnen gaan overlappen. We hebben geen behoefte aan veel meer
|
||||
-- meldingen over hetzelfde, wellicht zou het iets over de urgentie zeggen..
|
||||
--
|
||||
BEGIN
|
||||
SELECT prs_perslid_key
|
||||
INTO lmelder_key
|
||||
FROM prs_perslid
|
||||
WHERE prs_perslid_oslogin = lmelder_oslogin AND prs_perslid_verwijder IS NULL;
|
||||
|
||||
-- Ik denk dat het voorlopig voldoende is om te checken dat *wij* hier niet al eerder
|
||||
-- een automatische melding hebben gegenereerd. Handmatige parallelle meldingen
|
||||
-- beschouwen we niet. We willen primair voorkomen dat er in een paar minuten tientallen
|
||||
-- meldingen ontstaan omdat de waarde rond de limiet flippert. Een daalmarge zou
|
||||
-- een ander mechanisme hiertegen kunnen zijn, maar dit is intrinsieker.
|
||||
-- Ik zoek de goedkoopst mogelijk check, ik weet hier al zeker dat we (weer)
|
||||
-- de limiet overschrijden. We nemen de tijd niet in beschouwing, omdat voor de ene
|
||||
-- toepassing 1 minuut recent is, en voor een andere misschien een maand.
|
||||
SELECT m.mld_melding_key
|
||||
INTO ldubbelcheck_key
|
||||
FROM mld_melding m, mld_melding_object mo
|
||||
WHERE m.mld_melding_key = mo.mld_melding_key
|
||||
AND mo.ins_deel_key = :new.ins_deel_key
|
||||
AND m.mld_stdmelding_key = lstdmelding_key
|
||||
AND m.prs_perslid_key = lmelder_key
|
||||
AND m.mld_melding_status IN (2,
|
||||
0,
|
||||
4,
|
||||
7); -- lopend
|
||||
|
||||
IF ldubbelcheck_key IS NOT NULL -- puur voor de leesbaarheid, als er geen is gaan we nl in de exception verder
|
||||
THEN
|
||||
-- track this. This seems like an appropriate place.
|
||||
UPDATE ins_deel_state_history
|
||||
SET ins_deel_state_history_opmerk =
|
||||
REPLACE (
|
||||
REPLACE (lcl.l ('lcl_ins_sensorstate_already_mld'),
|
||||
'{0}',
|
||||
lmelding_key),
|
||||
'{1}',
|
||||
lstatethreshold)
|
||||
WHERE ins_deel_state_history_key = lstate_history_key;
|
||||
END IF;
|
||||
EXCEPTION
|
||||
WHEN NO_DATA_FOUND
|
||||
THEN
|
||||
BEGIN
|
||||
-- dit zou de trigger van mld_melding wel mogen doen..
|
||||
SELECT msm.mld_ins_discipline_key
|
||||
INTO ldiscipline_key
|
||||
FROM mld_stdmelding msm
|
||||
WHERE msm.mld_stdmelding_key = lstdmelding_key;
|
||||
|
||||
INSERT INTO mld_melding (mld_melding_module,
|
||||
mld_meldbron_key,
|
||||
mld_alg_locatie_key,
|
||||
mld_alg_onroerendgoed_keys,
|
||||
mld_melding_datum,
|
||||
mld_melding_onderwerp,
|
||||
mld_melding_omschrijving,
|
||||
mld_stdmelding_key,
|
||||
mld_melding_status,
|
||||
mld_kosten_klant,
|
||||
prs_perslid_key,
|
||||
mld_melding_spoed,
|
||||
mld_ins_discipline_key)
|
||||
VALUES (
|
||||
'MLD',
|
||||
11, -- sensor
|
||||
:new.ins_alg_locatie_key,
|
||||
:new.ins_alg_ruimte_key,
|
||||
SYSDATE,
|
||||
lcl.l ('lcl_mld_state_generated_onderwerp'),
|
||||
REPLACE (
|
||||
REPLACE (
|
||||
lcl.l ('lcl_mld_state_generated_omschrijving'),
|
||||
'{0}',
|
||||
:new.ins_deel_state),
|
||||
'{1}',
|
||||
lstatethreshold),
|
||||
lstdmelding_key,
|
||||
2, -- of afh mld_directklaar
|
||||
NULL,
|
||||
lmelder_key, --TODO!!!!!!! prs_perslid_key,
|
||||
3,
|
||||
ldiscipline_key)
|
||||
RETURNING mld_melding_key
|
||||
INTO lmelding_key;
|
||||
|
||||
--en het sensorobject erbij registreren
|
||||
INSERT INTO mld_melding_object (ins_deel_key, mld_melding_key)
|
||||
VALUES (:new.ins_deel_key, lmelding_key);
|
||||
|
||||
-- track this. This seems like an appropriate place.
|
||||
UPDATE ins_deel_state_history
|
||||
SET ins_deel_state_history_opmerk =
|
||||
REPLACE (
|
||||
REPLACE (lcl.l ('lcl_ins_sensorstate_caused_mld'),
|
||||
'{0}',
|
||||
lmelding_key),
|
||||
'{1}',
|
||||
lstatethreshold)
|
||||
WHERE ins_deel_state_history_key = lstate_history_key;
|
||||
|
||||
-- If defined kick off the workflow
|
||||
mld.mld_nextworkflowstep (lmelding_key, -1);
|
||||
END;
|
||||
END;
|
||||
END IF;
|
||||
END;
|
||||
END IF;
|
||||
END;
|
||||
END IF;
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
Reference in New Issue
Block a user