Если таблица содержит колонку с названием "contractId"Результаты действий мастера можно вывести в таблице. Для этого нужно добавить элемент "таблица" в редакторе мастера. В данном примере будет показан весь путь создания небольшого "мастера".
...
В обработчике мы можем получить введённые в мастере данные и произвести необходимые операции с ними. В данном примере показано, как можно получить данные и пример некоторых действий.
Для того, чтобы передать список собственных классов в механизм создания таблицы, нужно передать полный путь до созданного класса, также нужно преобразовать список в формат JSON,
воспользовавшись методом mapperWrite( List<? extends FilterTableModel> data ) из класса ru.bitel.bgbilling.plugins.assistant.server.AssistantUtils
Блок кода | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
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 )} );
Блок кода | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
@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 должен возвращать корректное название для колонок таблицы.
Итоговый результат работы мастера показан ниже
Если таблица содержит колонку с названием "contractId", "cid" , "idContract" или "ID Договора", то при клике на строке, будет выполняться поиск договора с таким id в БД, если договор будет найден, он будет открыт.
Есть возможность передать выбранную строку в таблице в обработчик следующего Мастера. Для этого нужно выбрать в таблице строку, при клике правой кнопкой мыши появится меню с пунктом "Сохранить строку для обработчика следующего Мастера", при клике данные буду сохранены и будет возможность получить их в следующем обработчике. Пример получения показан ниже
Блок кода | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
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 должен возвращать корректное название для колонок таблицы.
Итоговый результат работы мастера показан ниже
Если таблица содержит колонку с названием "contractId", "cid" или "idContract", то при клике на строке, будет выполняться поиск договора с таким id в БД, если договор будет найден, он будет открытВыбранная в таблице строка будет сохранена под ключом самой таблицы, в данном примере ключом является строка "debtorsTable". Конкретные данные для выбранной в таблице строки сохраняются под ключом поля объекта, который был представлен в таблице. В данном случае в объекте DebtorTableFilter есть поля: contractTitle, balance и email. Используя названия этих полей как ключи, можно получить значения.