Home Forum Nuclos Entwicklung Makros und Regeln Statuswechsel per Regel

Schlagwörter: , ,

Ansicht von 4 Beiträgen - 1 bis 4 (von insgesamt 4)
  • Autor
    Beiträge
  • #19537
    Frank Kittendorf
    Teilnehmer

    Hallo Forum,
    ich möchte gerne einen Statuswechsel per Regel durchführen, bekomme das aber einfach nicht hin.
    Hier meine Regel:

    package org.nuclet.businessentity; 
    
    import org.nuclos.api.rule.UpdateRule; 
    import org.nuclos.api.context.UpdateContext; 
    import org.nuclos.api.annotation.Rule; 
    import org.nuclos.api.exception.BusinessException;
    import org.nuclet.statemodel.AM3AufgabeSM;
    
    /** @name        
      * @description 
      * @usage       
      * @change      
    */
    
    @Rule(name="AM3Statuswechselerledigt", description="aktive Aufgabe auf erledigt setzen")
    public class AM3Aufgabeerledigen implements UpdateRule {
    
    	public void update(UpdateContext context) throws BusinessException { 
        
            AM3Aufgabe curAufg = context.getBusinessObject(AM3Aufgabe.class);
            curAufg.changeStatus(AM3AufgabeSM.State_99);
        }
    }

    Das ist meine Statusmodell-Klasse:

    package org.nuclet.statemodel;
    
    import org.nuclos.common.UID;
    import org.nuclos.api.statemodel.State;
    import org.nuclos.api.exception.BusinessException;
    import org.nuclos.api.businessobject.facade.thin.Stateful;
    
    public class AM3AufgabeSM {
    
    public static State State_10 = 
    	new State(UID.parseUID("AsAY0q9DqF6IxrdtF0YC"), "aktiv", "aktiv", 10, UID.parseUID("zxYU7wQutEgNa7ef95rT"));
    public static State State_99 = 
    	new State(UID.parseUID("TlRF012pzS5prNOefKLk"), "erledigt", "erledigt", 99, UID.parseUID("zxYU7wQutEgNa7ef95rT"));
    
      public static Integer getNumeral(org.nuclos.api.UID stateId) throws BusinessException {
        if (stateId == null) {
          throw new IllegalArgumentException("stateId must not be null");
        }
    
        if (stateId.equals(State_10.getId())) {
          return State_10.getNumeral();
        }
        if (stateId.equals(State_99.getId())) {
          return State_99.getNumeral();
        }
        throw new BusinessException("Status with id " + stateId + " does not exist in this status model");
      }
    
      public static Integer getNumeral(Stateful statefulBusinessObject) throws BusinessException {
        return getNumeral(statefulBusinessObject.getNuclosStateId());
      }
    
    }

    Der manuelle Statuswechsel funktioniert, der Statuswechsel per Regel leider nicht. Fehlermeldungen in den Logs bekomme ich nicht.
    Es wäre super, wenn mir jemand hierbei helfen könnte.

    #19591
    tobyase
    Teilnehmer

    Hallo,
    für den Statuswechsel musst du den StatemodelProvider verwenden.
    Also bei deinem Code wäre das dann

    
    AM3Aufgabe curAufg = context.getBusinessObject(AM3Aufgabe.class);
    StatemodelProvider.changeState(curAufg, AM3AufgabeSM.State_99);
    

    Und natürlich in den Imports import org.nuclos.api.provider.StatemodelProvider; nicht vergessen.
    Viele Grüße,
    TC

    #19593
    Frank Kittendorf
    Teilnehmer

    Hallo TC,
    danke für die schnelle Rückmeldung. Leider funktioniert es immer noch nicht.
    Im Logfile bekomme ich nur die Meldung:
    2019-03-06 11:29:53,904 INFO [org.nuclos.server.customcode.codegenerator.RuleDebugLoggerSingleton] - org/nuclet/businessentity/AMAM3Aufgabeerledigen.update(Lorg/nuclos/api/context/UpdateContext;)V [21] => AM3Aufgabe curAufg => AM3 Aufgabe 40107244

    Könne es ein Problem sein, dass ich eine Update-Regel anstelle einer Statemodel-Regel benutze?
    Oder ist ggf. mein Statusmodell falsch definiert? Muss der Übergang auf automatisch o. ä. gesetzt werden?
    [aktiv] —> [erledigt]

    Viele Grüße
    FKI

    #19601
    Frank Kittendorf
    Teilnehmer

    Hallo Forum,
    Problem gelöst!! Der Statuswechsel darf nicht vor dem Speichern (Update), sondern erst danach (UpdateFinal) ausgeführt werden.
    Hier die funktionierende Regel.

    package org.nuclet.businessentity; 
    
    import org.nuclos.api.rule.UpdateFinalRule; 
    import org.nuclos.api.context.UpdateContext; 
    import org.nuclos.api.annotation.Rule; 
    import org.nuclos.api.exception.BusinessException;
    import org.nuclos.api.provider.StatemodelProvider;
    import org.nuclet.statemodel.AM3AufgabeSM;
    
    /** @name        
      * @description 
      * @usage       
      * @change      
    */
    
    @Rule(name="AM3Statuswechselerledigt", description="aktive Aufgabe auf erledigt (numeral=99) setzen")
    public class AM3Aufgabeerledigen implements UpdateFinalRule {
    
    	public void updateFinal(UpdateContext context) throws BusinessException { 
        
            AM3Aufgabe curAufg = context.getBusinessObject(AM3Aufgabe.class);
            StatemodelProvider.changeState(cur.Aufg, AM3AufgabeSM.State_99);
        }
    }
Ansicht von 4 Beiträgen - 1 bis 4 (von insgesamt 4)