Дерево страниц
Перейти к концу метаданных
Переход к началу метаданных

Вы просматриваете старую версию данной страницы. Смотрите текущую версию.

Сравнить с текущим просмотр истории страницы

« Предыдущий Версия 9 Следующий »

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

Допустим, что нужен мастер, который отображает в таблице список абонентов с отрицательным балансом, и пополнение счёта от которых не было более 2 месяцев


Пример обработчика окна с вводом параметров
public class FindDebetorsForm
    extends AssistantActionBase
{
    @Override
    public AssistantResponse doAction( AssistantRequest assistantRequest )
    throws BGException, BGMessageException
    {
        assistantResponse.setNextActionId( "debtorsTable" ); //указываем Action ID дочернего мастера, в обработчик которого будет переданы данные из текущего
        return super.doAction( assistantRequest );
    }

    @Override
    public AssistantResponse showAction( AssistantRequest assistantRequest )
    throws BGException, BGMessageException
    {
        this.assistantRequest = assistantRequest;
        return assistantResponse;
    }

    @Override
    public void doButton1()
    {
       super.doButton1();
    }

    @Override
    public void doButton2()
    {
        try
        {
            doAction( assistantRequest );
        }
        catch( BGException e )
        {
            e.printStackTrace();
        }
    }
}

Создаём окно с таблицей, указывая Action ID: debtorsTable

Добавим элемент "таблица" с ключем: debtorsTable (ключ может быть любой. Если таблиц несколько, то у каждой должен быть свой уникальный ключ )

При запуске мастера "Поиск должников", появится такое окно для задания условий.

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

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. 

Для того, чтобы передать список собственных классов в механизм создания таблицы, нужно передать полный путь до созданного класса, также нужно преобразовать список в формат 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 )} );

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

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

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

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


  • Нет меток