Ladies_Man

#sonic autoAssignReft almost merged

Sep 6th, 2016
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.99 KB | None | 0 0
  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. import java.util.Set;
  9.  
  10. import org.apache.commons.logging.Log;
  11. import org.apache.commons.logging.LogFactory;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13.  
  14. import ru.it.metasonic.ruspost.infopoint.utils.BOHelper;
  15. import ru.lbpm.metasonic.businessobjects.DbHelper;
  16. import ru.lbpm.metasonic.businessobjects.DbHelper.ValueWrapper;
  17.  
  18. import com.jcom1.api.constants.Constants.Storage.BusinessObject20;
  19. import com.jcom1.api.dto.interfaces.IStorageInstanceBean;
  20. import com.jcom1.api.dto.interfaces.ISubjectInstanceBean;
  21. import com.jcom1.api.dto.interfaces.storages.IStorageInstanceItemBeanReducedToId;
  22. import com.jcom1.api.interfaces.IAuthorizationAdministrationApi;
  23. import com.jcom1.api.interfaces.IAuthorizationApi;
  24. import com.jcom1.api.interfaces.IBo20AccessApi;
  25. import com.jcom1.api.interfaces.ICommonApi;
  26. import com.jcom1.api.util.IViewStorageInstanceItemPair;
  27. import com.jcom1.api.util.Pair;
  28. import com.jcom1.runtime.refinement.AbstractRefinement;
  29. import com.jcom1.runtime.refinement.FunctionStateRequest;
  30. import com.jcom1.runtime.refinement.FunctionStateResponse;
  31. import com.jcom1.runtime.refinement.RefinementGenerator;
  32. import com.jcom1.runtime.refinement.SendStateRequest;
  33. import com.jcom1.runtime.refinement.SendStateResponse;
  34.  
  35. import de.metasonic.businessobjects.model.interfaces.IView;
  36. import de.metasonic.refinement.global.api.ApiUtils;
  37.  
  38. /**
  39.  * @generated
  40.  */
  41. /**
  42.  * This method is called when the named function state is reached State: Поиск
  43.  * ответственного StateType: FUNCTION
  44.  *
  45.  * Return values "FunctionTransitionDescription_SPOzAXA_EealfcrKqoINvA" when
  46.  * result is "" to go to state Отправка ответственному
  47.  *
  48.  * @return return the id of the transition to follow e.g. // return new
  49.  *         FunctionStateResponse("transitionXXXXXXXX");
  50.  */
  51. @RefinementGenerator(id = "InternalSubjectDescription_MtoBEXAxEealfcrKqoINvA")
  52. public class Маршрутизатор_автоназначенияRefinement extends AbstractRefinement {
  53.  
  54.     @Autowired
  55.     ICommonApi commonApi;
  56.  
  57.     @Autowired
  58.     IBo20AccessApi accessApi;
  59.  
  60.     @Autowired
  61.     IAuthorizationApi authApi;
  62.  
  63.     @Autowired
  64.     IAuthorizationAdministrationApi administrationApi;
  65.  
  66.     final String decisionResponsibleSubjectDescId = "InternalSubjectDescription_xRtowSvvEea91xRuMXueEA";
  67.     final String transitionToFollowOnAssignation = "FunctionTransitionDescription_SPOzAXA_EealfcrKqoINvA";
  68.  
  69.     private final String DB_URL = "jdbc:hsqldb:hsql://localhost/jcom1";
  70.     private final String DB_USER = "sa";
  71.     private final String DB_PSW = "";
  72.  
  73.     private final String UFPS_INDEX = "UFPS_INDEX";
  74.     private final String UFPS_NAME = "UFPS_NAME";
  75.     private final String POSTAMT_INDEX = "POSTAMT_INDEX";
  76.     private final String POSTAMT_NAME = "POSTAMT_NAME";
  77.     private final String UM_GROUP = "UM_GROUP";
  78.     private final String UM_USER = "UM_USER";
  79.     private final String UM_GROUP_AS_POSTAMT_INDEX = "POSTAMT_INDEX";
  80.     private final String UM_GROUP_AS_RUSPOST_OPERATOR_GROUP_ID = "RUSPOST_OPERATOR_GROUP_ID";
  81.     private final String ID_AS_RUSPOST_OPERATOR_GROUP_ID = "RUSPOST_OPERATOR_GROUP_ID";
  82.     private final String RUSPOST_OPERATOR = "RUSPOST-OPERATOR";
  83.  
  84.     private final String ACTIVE_TASK_NUMBER = "ACTIVE_TASK_NUMBER";
  85.  
  86.     private int ruspostOperatorGroupId;
  87.  
  88.     /**
  89.      * @generated
  90.      */
  91.     private final static Log log = LogFactory
  92.             .getLog("com.jcom1.refinement.p02__обработка_инцидентов.маршрутизатор_автоназначенияrefinement");
  93.  
  94.     /**
  95.      * This method is called when the named function state is reached State:
  96.      * Поиск ответственного StateType: FUNCTION
  97.      *
  98.      * Return values "FunctionTransitionDescription_SPOzAXA_EealfcrKqoINvA" when
  99.      * result is "" to go to state Отправка ответственному
  100.      *
  101.      * @return return the id of the transition to follow e.g. // return new
  102.      *         FunctionStateResponse("transitionXXXXXXXX");
  103.      */
  104.     @RefinementGenerator(id = "FunctionStateDescription_Kii0I3A_EealfcrKqoINvA")
  105.     public FunctionStateResponse functionПоиск_ответственного(
  106.             FunctionStateRequest functionStateRequest) {
  107.         log.error("autoassign start");
  108.  
  109.         String ruspostOperatorGroupIdQuery =
  110.                 "SELECT ID AS RUSPOST_OPERATOR_GROUP_ID FROM UM_GROUP WHERE NAME = ?";
  111.  
  112.         String availableOperatorsQuery =
  113.                 "SELECT A.UM_GROUP AS POSTAMT_INDEX, A.UM_USER, B.UM_GROUP AS RUSPOST_OPERATOR_GROUP_ID "
  114.                         + "FROM UM_GROUP_UM_USER A "
  115.                         + "LEFT JOIN UM_GROUP_UM_USER B "
  116.                         + "ON A.UM_USER = B.UM_USER WHERE A.UM_GROUP = ? "
  117.                         + "     AND B.UM_GROUP = ?";
  118.  
  119.         String activeTasksQueryTemplate =
  120.                 "SELECT count(*) AS ACTIVE_TASK_NUMBER "
  121.                         + " FROM ((SELECT DROPPED, AVAILABLETRANSITIONS, RT_PROCDESC, RT_SUBDESC, UM_USER_EDITOR "
  122.                         + "         FROM RT_SUBINST "
  123.                         + "         WHERE DROPPED = 0 AND "
  124.                         + "             AVAILABLETRANSITIONS = 1 "
  125.                         + "             AND UM_USER_EDITOR = %s) A "
  126.                         + "         JOIN (SELECT ID, JPASS_ID, NAME "
  127.                         + "                 FROM RT_SUBDESC "
  128.                         + "                 WHERE JPASS_ID = '%s') B "
  129.                         + "         ON A.RT_SUBDESC = B.ID)";
  130.  
  131.  
  132.         try (final Connection connection = DbHelper
  133.                 .getConnection(DbHelper.PROP_DB_INT);) {
  134.             log.error("connection has been set");
  135.  
  136.            
  137.             // find ID for OPERATOR-IP
  138.             // form query as SELECT TOP 1 ID AS ...
  139.             ruspostOperatorGroupId = getRuspostOperatorGroupId(connection, ruspostOperatorGroupIdQuery);
  140.             log.error(RUSPOST_OPERATOR + "'s group ID: " + ruspostOperatorGroupId);
  141.  
  142.            
  143.             // retrieve current card's postamt info
  144.             IViewStorageInstanceItemPair primeIViewAndItemEventCard = getPrimeIViewAndItem(this
  145.                     .getSubjectInstance());
  146.             IView primeBOEventCard = (IView) primeIViewAndItemEventCard
  147.                     .getiView();
  148.  
  149.             if (null != primeBOEventCard) {
  150.                 log.error("retrieving postamt data for current EventCard");
  151.  
  152.                 String postamtIndex = (String) BOHelper.getAttribute(
  153.                         primeBOEventCard, "postamtIndex");
  154.                 String postamtName = (String) BOHelper.getAttribute(
  155.                         primeBOEventCard, "postamtName");
  156.                 log.error("     postamt: " + postamtIndex + "/" + postamtName);
  157.  
  158.                
  159.                 // get operators from postamts that belong to concrete ufps
  160.                 // form query as ... WHERE UM_GROUP = 123456 AND UM_GROUP = 10
  161.                 List<Integer> operatorUserIds = getAvailableRuspostOperators(
  162.                         connection, availableOperatorsQuery);
  163.  
  164.                
  165.                 // now as we got available operators, lets count number of their
  166.                 // tasks
  167.                 if (0 != operatorUserIds.size()) {
  168.                     log.error("iterating over [" + operatorUserIds.size()
  169.                             + "] available operators");
  170.                     log.error("executing: "
  171.                             + String.format(activeTasksQueryTemplate,
  172.                                     "<sampleUserId>",
  173.                                     "<sampleInternalSubjDesc>"));
  174.  
  175.  
  176.                     // iterate over operators and count number of their tasks
  177.                     String lazybonesId = null;
  178.                     int minTaskNum = Integer.MAX_VALUE;
  179.                     for (Integer u : operatorUserIds) {
  180.  
  181.                         String currUserId = p.getFirstElement();
  182.                         // count number of active tasks for user
  183.                         // form query as ... WHERE A.UM_USER_EDITOR = 1337 ...
  184.                         // WHERE B.JPASS_ID = 'InternalSubjDesc_322'
  185.                         String activeTasksQuery = String.format(
  186.                                 activeTasksQueryTemplate, currUserId,
  187.                                 decisionResponsibleSubjectDescId);
  188.                         int taskNum = countActiveTasks(connection,
  189.                                 activeTasksQuery);
  190.  
  191.                         log.error("id:taskNum  (" + currUserId + ":" + taskNum
  192.                                 + ")");
  193.                         if (taskNum < minTaskNum) {
  194.                             minTaskNum = taskNum;
  195.                             lazybonesId = currUserId;
  196.                         }
  197.                     }
  198.  
  199.                     log.error("operator to be assigned found: " + lazybonesId
  200.                             + ". attempting to set op into BO");
  201.                     BOHelper.setAttribute(primeBOEventCard, "assignedOperator",
  202.                             lazybonesId);
  203.  
  204.                     savePrimeIViewAndItem(this.getSubjectInstance(),
  205.                             primeIViewAndItemEventCard);
  206.                     log.error("op has been set");
  207.  
  208.                 } else {
  209.                     log.error("no availble " + RUSPOST_OPERATOR
  210.                             + "s were found by current postamt");
  211.                 }
  212.             } else {
  213.                 log.error("error retrieving primeBO");
  214.             }
  215.  
  216.             log.error("all done");
  217.             log.error("\n");
  218.  
  219.         } catch (Exception e) {
  220.             e.printStackTrace();
  221.         }
  222.  
  223.         return new FunctionStateResponse(transitionToFollowOnAssignation);
  224.     }
  225.  
  226.     private int getOperatorIpId(Connection connection, String query) {
  227.         int id = -1;
  228.  
  229.         try {
  230.             log.error("executing: " + query);
  231.             Statement stmt = connection.createStatement();
  232.             stmt.setMaxRows(1);
  233.  
  234.             ResultSet cgiSet = stmt.executeQuery(query);
  235.  
  236.             if (cgiSet.next())
  237.                 id = cgiSet.getInt(ID_AS_IP_ID);
  238.  
  239.             cgiSet.close();
  240.  
  241.         } catch (SQLException e) {
  242.             log.error("error fetching " + OPERATOR_IP + "'s ID");
  243.         }
  244.  
  245.         return id;
  246.     }
  247.  
  248.     private Pair[] getAvailableOperators(Connection connection, String query) {
  249.         List<Pair> userRolePairs = new ArrayList<Pair>();
  250.         try {
  251.             ResultSet result = connection.createStatement().executeQuery(query);
  252.             log.error("executing: " + query);
  253.  
  254.             while (result.next()) {
  255.  
  256.                 int umGroupAsIndex = result.getInt(UM_GROUP_AS_INDEX);
  257.                 int umUserAsId = result.getInt(UM_USER);
  258.                 int umGroupAsRole = result.getInt(UM_GROUP_AS_ROLE);
  259.                 log.error("  indx/id/role: " + umGroupAsIndex + " / "
  260.                         + umUserAsId + " / " + umGroupAsRole);
  261.  
  262.                 userRolePairs.add(new Pair(String.valueOf(umUserAsId), String
  263.                         .valueOf(umGroupAsRole)));
  264.             }
  265.             result.close();
  266.  
  267.         } catch (SQLException e) {
  268.             e.printStackTrace();
  269.         }
  270.         return userRolePairs.toArray(new Pair[0]);
  271.     }
  272.  
  273.     private int countActiveTasks(Connection connection, String query) {
  274.         int id = -1;
  275.  
  276.         try {
  277.             // log.error("executing: " + query);
  278.             Statement stmt = connection.createStatement();
  279.             stmt.setMaxRows(1);
  280.  
  281.             ResultSet cgiSet = stmt.executeQuery(query);
  282.  
  283.             if (cgiSet.next())
  284.                 id = cgiSet.getInt(ACTIVE_TASK_NUMBER);
  285.  
  286.             cgiSet.close();
  287.  
  288.         } catch (SQLException e) {
  289.             log.error("error fetching task number");
  290.         }
  291.  
  292.         return id;
  293.     }
  294.  
  295.     private IViewStorageInstanceItemPair getPrimeIViewAndItem(
  296.             ISubjectInstanceBean subjectInstanceBean) throws Exception {
  297.         IBo20AccessApi bo20AccessApi = ApiUtils.lookupBo20AccessApi();
  298.         Set<IStorageInstanceBean> storages = bo20AccessApi.getStorages(
  299.                 subjectInstanceBean, null);
  300.         IStorageInstanceBean storageInstanceBean = storages.iterator().next();
  301.         Set<IStorageInstanceItemBeanReducedToId> storageItems = bo20AccessApi
  302.                 .getItems(subjectInstanceBean, storageInstanceBean);
  303.         IStorageInstanceItemBeanReducedToId storageItem = storageItems
  304.                 .iterator().next();
  305.         String actionType = BusinessObject20.Action.READ;
  306.         IViewStorageInstanceItemPair iViewStorageInstanceItemPair = bo20AccessApi
  307.                 .getIViewAndItem(subjectInstanceBean, storageItem, actionType);
  308.         return iViewStorageInstanceItemPair;
  309.     }
  310.  
  311.     private void savePrimeIViewAndItem(
  312.             ISubjectInstanceBean subjectInstanceBean,
  313.             IViewStorageInstanceItemPair iViewStorageInstanceItemPair)
  314.             throws Exception {
  315.         IBo20AccessApi bo20AccessApi = ApiUtils.lookupBo20AccessApi();
  316.         bo20AccessApi.saveIView(subjectInstanceBean,
  317.                 iViewStorageInstanceItemPair);
  318.     }
  319.    
  320.    
  321.    
  322.     private int getRuspostOperatorGroupId(Connection connection, String query)
  323.             throws Exception {
  324.         log.error("getRuspostOperatorGroupId begin");
  325.        
  326.         List<ValueWrapper> valueWrappers = new ArrayList<ValueWrapper>();
  327.         valueWrappers.add(new ValueWrapper(RUSPOST_OPERATOR, String.class));
  328.        
  329.         int id = (int) DbHelper.executeQuery(connection, query, valueWrappers,
  330.                 true, new DbHelper.ResulSetHandler() {
  331.                     @Override
  332.                     public Object processResultSet(ResultSet rerSet)
  333.                             throws Exception {
  334.                        
  335.                         if (rerSet.next())
  336.                             return rerSet.getInt(ID_AS_RUSPOST_OPERATOR_GROUP_ID);
  337.  
  338.                         return -1;
  339.                     }
  340.                 });
  341.         log.error("getRuspostOperatorGroupId end");
  342.         return id;
  343.     }
  344.  
  345.     private List<Integer> getAvailableRuspostOperators(Connection connection, String query)
  346.             throws Exception {
  347.         log.error("getAvailableRuspostOperators begin");
  348.        
  349.         List<ValueWrapper> valueWrappers = new ArrayList<ValueWrapper>();
  350.        
  351.        
  352.         List<Integer> userIds = (List<Integer>) DbHelper.executeQuery(connection,
  353.                 query, valueWrappers, true, new DbHelper.ResulSetHandler() {
  354.                     @Override
  355.                     public Object processResultSet(ResultSet result)
  356.                             throws Exception {
  357.                         List<Integer> userIds = new ArrayList<Integer>();
  358.  
  359.                         while (result.next()) {
  360.  
  361.                             int umGroupAsPostamtIndex = result.getInt(UM_GROUP_AS_POSTAMT_INDEX);
  362.                             int umUser = result.getInt(UM_USER);
  363.                             int umGroupAsRuspostOperatorGroupId = result.getInt(UM_GROUP_AS_RUSPOST_OPERATOR_GROUP_ID);
  364.                             log.error("  indx/id/operGroupId: " + umGroupAsPostamtIndex
  365.                                     + " / " + umUser + " / "
  366.                                     + umGroupAsRuspostOperatorGroupId);
  367.  
  368.                             userIds.add(umUser);
  369.                         }
  370.  
  371.                         return userIds.toArray(new Pair[0]);
  372.                     }
  373.                 });
  374.        
  375.         log.error("getAvailableRuspostOperators end");
  376.         return userIds;
  377.     }
  378.  
  379.     /**
  380.      * This function provides the data to send in the named state. TransitionID
  381.      * SendTransitionDescription_hBDokXA_EealfcrKqoINvA State: Отправка
  382.      * ответственному MessageType: Инцидент TransitionType SEND Destination
  383.      * Subject Ответственный за решение
  384.      *
  385.      * @return // return the id of the transition to follow or null to stay in
  386.      *         this state e.g. // return new
  387.      *         SendStateResponse("transitionXXXXXXXX");
  388.      * @generated
  389.      */
  390.     @RefinementGenerator(id = "SendStateDescription_SPOzA3A_EealfcrKqoINvA")
  391.     public SendStateResponse sendStateОтправка_ответственному(
  392.             SendStateRequest sendStateRequest) {
  393.         de.metasonic.reftmpl.bo20automaticsend.runtime.Bo20AutomaticSendRuntime refinementRuntime = new de.metasonic.reftmpl.bo20automaticsend.runtime.Bo20AutomaticSendRuntime();
  394.         de.metasonic.support.context.ApplicationContextProvider.getInstance()
  395.                 .getApplicationContext().getAutowireCapableBeanFactory()
  396.                 .autowireBean(refinementRuntime);
  397.         refinementRuntime
  398.                 .setStateConfig(DATA_SendStateDescription_SPOzA3A_EealfcrKqoINvA);
  399.         try {
  400.             return (SendStateResponse) refinementRuntime.execute(
  401.                     getSubjectInstance(), getSubjectDescription(), getClass()
  402.                             .getClassLoader());
  403.         } catch (Exception ex) {
  404.             throw new RuntimeException(ex);
  405.         }
  406.     }
  407.  
  408.     /**
  409.      * @generated
  410.      */
  411.     private static final String DATA_SendStateDescription_SPOzA3A_EealfcrKqoINvA = "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29uZmlndXJhdGlvbj48U1RBVEVfSUQgdmFsdWU9IlNlbmRTdGF0ZURlc2NyaXB0aW9uX1NQT3pBM0FfRWVhbGZjcktxb0lOdkEiLz48Ym8yMF9maWVsZC5ibyB2YWx1ZT0icnUuaXQubWV0YXNvbmljLnJ1c3Bvc3QuaW5mb3BvaW50LmRhdGEuZXZlbnRjYXJkLkV2ZW50Q2FyZEluaXRWaWV3Ii8+PGJvMjBfZmllbGQuZmllbGQgdmFsdWU9ImFzc2lnbmVkT3BlcmF0b3IiLz48Ym8yMF9maWVsZC50eXBlIHZhbHVlPSJTVFJJTkciLz48dXNlck9yR3JvdXBfZmllbGQudmFsdWUgdmFsdWU9InVzZXJfaWQiLz48Ym8yMF9maWVsZC5tb2RlIHZhbHVlPSJzaW5nbGUiLz48Ym8yMF9maWVsZC5zdG9yYWdlIHZhbHVlPSJCT1N0b3JhZ2VEZXNjcmlwdGlvbl8xSHBnMERlX0VlYVFzcEtDTlFPU25BIi8+PC9jb25maWd1cmF0aW9uPg==";
  412. }
Advertisement
Add Comment
Please, Sign In to add comment