Дерево страниц

Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.

Если таблица содержит колонку с названием "contractId"Результаты действий мастера можно вывести в таблице. Для этого нужно добавить элемент "таблица" в редакторе мастера. В данном примере будет показан весь путь создания небольшого "мастера".

...

В обработчике мы можем получить введённые в мастере данные и произвести необходимые операции с ними. В данном примере показано, как можно получить данные и пример некоторых действий. 

Для того, чтобы передать список собственных классов в механизм создания таблицы, нужно передать полный путь до созданного класса, также нужно преобразовать список в формат JSON,

воспользовавшись методом mapperWrite( List<? extends FilterTableModel> data ) из класса ru.bitel.bgbilling.plugins.assistant.server.AssistantUtils 

Блок кода
languagejava
titleПример обработчика окна с таблицей.
linenumberstrue
collapsetrue
public class DebtorsTableResult
    extends AssistantActionBase
{
    @Override
    public AssistantResponse showAction( AssistantRequest assistantRequest1 )
    throws BGException, BGMessageException
    {
        this.assistantRequest = assistantRequest1;

		//получение введённых данных из предыдущего мастера
        JSONObject data = assistantRequest.getData().getJSONObject( "fields" );
        int balanceLimit = Integer.parseInt( data.getString( "correctSum" ) );
        LocalDate searchDate = LocalDate.parse( data.getString( "datePayment" ) );

		//передача данных в метод для работы с ними, который возвращает строкой JSON с пользовательскими объектами для отображения в таблице
        String result = getDataOfTable( balanceLimit, searchDate );
        assistantResponse.addFieldData( "debtorsTable", new AssistantKeyValue[]{ new AssistantKeyValue( "ru.bitel.bgbilling.assistant.contract.DebtorTableFilter", result )} );

        return super.showAction( assistantRequest );
    }

    private String getDataOfTable( int balanceLimit, LocalDate startSearchDate )
    {
        List<DebtorTableFilter> debtors = new ArrayList<>();
        Connection con = ServerContext.get( ServerContext.class ).getConnection();
        String query = "SELECT c.id, c.title, cp.dt FROM contract AS c "
                       + "LEFT JOIN contract_payment AS cp ON cp.cid=c.id WHERE cp.dt > ? GROUP BY cid ORDER BY cp.id DESC";

        try( PreparedStatement ps = con.prepareStatement( query ) )
        {
            ps.setDate( 1, Date.valueOf( startSearchDate ) );
            ResultSet rs = ps.executeQuery();

            while( rs.next() )
            {
                DebtorTableFilter debtor  = new DebtorTableFilter();
                debtor.setContractId( rs.getInt( "c.id" ) );
                debtor.setContractTitle( rs.getString( "c.title" ) );
                LocalDate localDate = rs.getDate( "cp.dt" ).toLocalDate();
                debtor.setLastPaymentDate( localDate.toString() );

                debtors.add( debtor );
            }
        }
        catch( SQLException e )
        {
            ClientUtilse.showErrorMessageDialogprintStackTrace( e );
        }

        //удаляем из результатов всех, у кого баланс выше заданного лимита
        BalanceUtils balanceUtils = new BalanceUtils( con );
        Iterator<DebtorTableFilter> iterator = debtors.iterator();
        while( iterator.hasNext() )
        {
            DebtorTableFilter deb = iterator.next();
            BigDecimal balance = balanceUtils.getBalance( new java.util.Date(  ), deb.getContractId() );
            if( balance.compareTo( new BigDecimal( balanceLimit ) ) >= 0 )
            {
                iterator.remove();
            }
            else
            {
                deb.setBalance( balance );
            }
        }

        //здесь остались только с отрицательным балансом и для всех договоров нужно взять почту и телефон
        for( DebtorTableFilter deb : debtors )
        {
            String query1 = "SELECT mail.email, phone.value FROM contract AS c LEFT JOIN contract_parameter_type_3 AS mail ON mail.cid=c.id LEFT JOIN contract_parameter_type_phone AS phone ON phone.cid=c.id WHERE c.id=?";
            try( PreparedStatement ps = con.prepareStatement(query1) )
            {
                ps.setInt(1, deb.getContractId() );

                ResultSet rs = ps.executeQuery();

                while( rs.next() )
                {
                    deb.setEmail( rs.getString( "mail.email" ) );
                    deb.setTelephone( rs.getString( "phone.value" ) );
                }
            }
            catch( SQLException ex )
            {
                ClientUtilse.showErrorMessageDialogprintStackTrace( ex );
            }
        }

		//с помощью этого метода мы можем сериализовать List объектов в строку JSON-формата 
        return AssistantUtils.mapperWrite( debtors );
    }
}

Для того, чтобы данные корректно отобразились в таблице, необходимо в дин.коде создать собственный класс, который должен быть наследником абстрактного класса  ru.bitel.bgbilling.plugins.assistant.common.bean.FilterTableModel. 

Для того, чтобы передать список собственных классов в механизм создания таблицы, нужно передать полный путь до созданного класса, также нужно преобразовать список в формат JSON,

воспользовавшись методом mapperWrite( List<? extends FilterTableModel> data ) из класса ru.bitel.bgbilling.plugins.assistant.server.AssistantUtils 

Пример того, как это можно сделать показан на скриншоте выше.  assistantResponse.addFieldData( "debtorsTable", new AssistantKeyValue[]{ new AssistantKeyValue( "ru.bitel.bgbilling.assistant.contract.DebtorTableFilter", result )} );

Блок кода
languagejava
titleПример пользовательского класса, который будет отображён в таблице
linenumberstrue
collapsetrue
@JsonAutoDetect
public class DebtorsTableResultDebtorTableFilter
    extends AssistantActionBaseFilterTableModel
{
    @Overrideprivate int contractId;
  public AssistantResponse showAction(private AssistantRequestString assistantRequest1contractTitle;
)    private throwsString BGException,telephone;
BGMessageException    private {String email;
    private   this.assistantRequest = assistantRequest1String lastPaymentDate;
    private     JSONObject data = assistantRequest.getData().getJSONObject( "fields" )BigDecimal balance;

    @Override
  int balanceLimit = Integer.parseInt( data.getString( "correctSum" ) );public String getCorrectTitleColumn( int columnId )
    {
   LocalDate searchDate = LocalDate.parse( data.getString( "datePayment"  switch( columnId )
);        {
 String result = getDataOfTable( balanceLimit, searchDate );     case 0: return "ID assistantResponse.addFieldData( "debtorsTable", new AssistantKeyValue[]{ new AssistantKeyValue( "ru.bitel.bgbilling.assistant.contract.DebtorTableFilter", result )} );";
            case 1:    return super.showAction( assistantRequest )"Название";
    }      private String getDataOfTable(case int2: balanceLimit, LocalDate startSearchDate )return "Телефон";
      {      case 3:  List<DebtorTableFilter> debtors = new ArrayList<>()return "Почта";
        Connection con = ServerContext.get( ServerContext.class ).getConnection();
        String query = "SELECT c.id, c.title, cp.dt FROM contract AS c " case 4: return "Последняя оплата";
            case 5: return         + "LEFT JOIN contract_payment AS cp ON cp.cid=c.id WHERE cp.dt > ? GROUP BY cid ORDER BY cp.id DESC"Текущий баланс";
            default: return "<Неизвестный столбец>";
        }
try( PreparedStatement ps = con.prepareStatement(}
query
) )   @Override
    public {
            ps.setDate( 1, Date.valueOf( startSearchDate ) );String getCorrectData( int columnId )
    {
        ResultSet rs = ps.executeQuery()return null;
    }

    public int  while( rs.next(getContractId()
)             {
                DebtorTableFilter debtor  = new DebtorTableFilter()return contractId;
    }

    public void     debtor.setContractId( rs.getInt( "c.id"int contractId )
);    {
            debtor.setContractTitle( rs.getString( "c.title" ) )this.contractId = contractId;
    }

    public      LocalDate localDate = rs.getDate( "cp.dt" ).toLocalDate();String getContractTitle()
    {
           debtor.setLastPaymentDate( localDate.toString() )return contractTitle;
    }

    public void setContractTitle( String    debtors.add( debtor );contractTitle )
    {
       } this.contractTitle = contractTitle;
     }

    public String  catch( SQLException e getTelephone()
        {
            ClientUtils.showErrorMessageDialog( e )return telephone;
        }

    public void setTelephone( String //удаляемtelephone из)
результатов всех, у кого баланс{
выше заданного лимита         BalanceUtils balanceUtils = new BalanceUtils( con )this.telephone = telephone;
    }

  Iterator<DebtorTableFilter> iterator = debtors.iterator();
        while( iterator.hasNext() )public String getEmail()
         {
            DebtorTableFilter deb = iterator.next()return email;
    }

    public  BigDecimal balance = balanceUtils.getBalancevoid setEmail( new java.util.Date(  ), deb.getContractId() );String email )
    {
         if( balance.compareTo( new BigDecimal( balanceLimit ) ) >= 0 )this.email = email;
    }

    public String getLastPaymentDate()
     {
                iterator.remove()return lastPaymentDate;
            }

    public void setLastPaymentDate( String lastPaymentDate )
 else             {
                deb.setBalance( balance )this.lastPaymentDate = lastPaymentDate;
            }

    public BigDecimal getBalance()
}    {
     //здесь остались только сreturn отрицательнымbalance;
балансом и для всех договоров}
нужно
взять почту и телефон public        forvoid setBalance( DebtorTableFilterBigDecimal debbalance : debtors )
        {
        this.balance = balance;
 String query1 = "SELECT mail.email, phone.value FROM contract AS c LEFT JOIN contract_parameter_type_3 AS mail ON mail.cid=c.id LEFT JOIN contract_parameter_type_phone AS phone ON phone.cid=c.id WHERE c.id=?";
            try( PreparedStatement ps = con.prepareStatement(query1) )
            }
}


При необходимости, можно реализовать абстрактный метод  getCorrectData() и передать в таблицу данные для определённого столбца. Например, есть необходимость показать в таблицы текущий статус для договоров, с помощью этого метода, можно подменить число статуса на более понятный "Активен". Если нет необходимости  в "подмене" данных, метод должен возвращать null.

Второй метод getCorrectTitleColumn() из родительского FilterTableModel должен возвращать корректное название для колонок таблицы. 

Итоговый результат работы мастера показан ниже

Image Added

Если таблица содержит колонку с названием "contractId", "cid" , "idContract" или "ID Договора", то при клике на строке, будет выполняться поиск договора с таким id  в БД, если договор будет найден, он будет открыт.


Есть возможность передать выбранную строку в таблице в обработчик следующего Мастера. Для этого нужно выбрать в таблице строку, при клике правой кнопкой мыши появится меню с пунктом "Сохранить строку для обработчика следующего Мастера", при клике данные буду сохранены и будет возможность получить их в следующем обработчике. Пример получения показан ниже

Блок кода
languagejava
titleПример получения выбранных в таблице данных
linenumberstrue
collapsetrue
public class TestViewSelectedRowData
    extends AssistantActionBase
{
    @Override
    public AssistantResponse showAction( AssistantRequest assistantRequest1 )
    throws BGException, BGMessageException
    {
        this.assistantRequest = assistantRequest1;

		// получение всех  ps.setInt(1, deb.getContractId() );

 данных с предыдущей формы в переменную data
        JSONObject      ResultSet rs data = psassistantRequest.executeQuerygetData();

.getJSONObject( "fields" );
               whileif( rsdata.nexthas( "debtorsTable" ) )
        {
			// получение выбранных в таблице данных в {формате Json
            JSONObject selected =     deb.setEmaildata.getJSONObject( rs.getString( "mail.email"debtorsTable" ) );

			// получение каких-либо необходимых данных для дальнейшего взаимодействия.
           deb.setTelephone( rs.getString String contractTitle = (String)selected.get( "phone.valuecontractTitle" ) );
            BigDecimal balance = new }
   BigDecimal( selected.get( "balance" ).toString() );
        }    String email =       catch( SQLException ex )
            {
                ClientUtils.showErrorMessageDialog( ex(String)selected.get( "email" );
            }

       } 
        return AssistantUtilssuper.mapperWriteshowAction( debtorsassistantRequest );
    }
}

При необходимости, можно реализовать абстрактный метод  getCorrectData() и передать в таблицу данные для определённого столбца. Например, есть необходимость показать в таблицы текущий статус для договоров, с помощью этого метода, можно подменить число статуса на более понятный "Активен". Если нет необходимости  в "подмене" данных, метод должен возвращать null.

Второй метод getCorrectTitleColumn() из родительского FilterTableModel должен возвращать корректное название для колонок таблицы. 

Итоговый результат работы мастера показан ниже

Image Removed

Если таблица содержит колонку с названием "contractId", "cid" или "idContract", то при клике на строке, будет выполняться поиск договора с таким id  в БД, если договор будет найден, он будет открытВыбранная в таблице строка будет сохранена под ключом самой таблицы, в данном примере ключом является строка "debtorsTable". Конкретные данные для выбранной в таблице строки сохраняются под ключом поля объекта, который был представлен в таблице. В данном случае в объекте DebtorTableFilter есть поля: contractTitle, balance и email. Используя названия этих полей как ключи, можно получить значения.