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

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

Ключ

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

...

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

Блок кода
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" ) );

...



        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 )

...


        {

...


            ClientUtils.showErrorMessageDialog( 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 )

...


            {

...


                ClientUtils.showErrorMessageDialog( ex );

...


            }

...


        }

...



        return AssistantUtils.mapperWrite( debtors );

...


    }

...


}

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

...

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

Image Removed

Блок кода
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" ) );

        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 )
        {
            ClientUtils.showErrorMessageDialog( 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 )
            {
                ClientUtils.showErrorMessageDialog( ex );
            }
        }

        return AssistantUtils.mapperWrite( debtors );
    }
}


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

...