BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 21 дек 2024, 19:15

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 108 ]  На страницу Пред.  1, 2, 3, 4
Автор Сообщение
СообщениеДобавлено: 29 апр 2013, 14:57 
Jimm писал(а):
с субдоговорами разобрался, теперь при нажатии на вкладку "Иерархия договоров" подсвечивает все активные/неактивные договора соответствующими цветами. кому интересно, код могу показать.

Интересно. Можете показать код?


Вернуться к началу
  
 
СообщениеДобавлено: 29 апр 2013, 15:02 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
2 nik247
Отвечу за автора:

Код:
package ru.dsi.bgbilling.kernel.scripts.action;
import bitel.billing.common.TimeUtils;
import org.w3c.dom.Element;
import ru.bitel.bgbilling.common.BGException;
import ru.bitel.common.Utils;
import ru.bitel.common.XMLUtils;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

public class ActionContractInfo extends bitel.billing.server.contract.hierarchy.action.ActionContractInfo
{
    @Override
    public void doAction() throws SQLException, BGException
    {
        super.doAction();
        for ( Element itemElement : XMLUtils.selectElements( rootNode, "/data/contract/sub" ) )
        {
            Date date2=null;
            Date date1=null;
            int cid = Utils.parseInt(itemElement.getAttribute( "id" ));
            String query ="select date1, date2, status from contract where id="+cid;
            PreparedStatement ps = con.prepareStatement(query);
            ps.executeQuery();
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                date1 = rs.getDate(1);
                date2 = rs.getDate(2);
            }
            Date today = new Date(System.currentTimeMillis());
            ps.close();
            String color = (date2 == null || TimeUtils.dateBeforeOrEq(today, date2)) ? "black" : "gray";
            itemElement.setAttribute("title", "<html><font style='color: " + color + ";'>" + itemElement.getAttribute( "title" )+"</font> <font style='color: #8080C0;' size='2'>("+(date1==null ? "..." : TimeUtils.format(date1, "dd.MM.yyyy"))+" - "+(date2==null ? "..." : TimeUtils.format(date2, "dd.MM.yyyy"))+")</font></html>");
        }

    }
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 апр 2013, 15:13 
to Cromeshnic - Спасибо.
А не подскажете, как вывести дополнительный параметр в результат строки поиска?


Вернуться к началу
  
 
СообщениеДобавлено: 29 апр 2013, 15:19 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Да так же, как и здесь. В данном случае выводятся date1 и date2.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 апр 2013, 15:35 
Не в сети
Разработчик

Зарегистрирован: 07 апр 2007, 23:51
Сообщения: 4493
Откуда: Уфа, Россия
Карма: 187
код не очень оптимален, если результат поиска много строк:
1) todate хорошобы вынести за цикл
2) отдельный sql запрос на каждую строку не есть гуд, правильнее было бы собрать строку с id всех договоров и одним запросов выбрать данные для всех договоров, правда код будет раза в два длинее, но работать должно быстрее.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 апр 2013, 16:03 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Это к Jimm, хотя он вряд ли тут появится...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 май 2016, 18:56 
А для 6.2 (7.0) никто не переделывал раскраску поиска через dynservice?


Вернуться к началу
  
 
СообщениеДобавлено: 17 май 2016, 19:08 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
А мне вообще интересно что в 7.0 за кнопочка и что с ней можно сделать.
Изображение

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 май 2016, 20:44 
Не в сети
Разработчик

Зарегистрирован: 07 апр 2007, 23:51
Сообщения: 4493
Откуда: Уфа, Россия
Карма: 187
Phricker писал(а):
А мне вообще интересно что в 7.0 за кнопочка и что с ней можно сделать.


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 май 2016, 00:28 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
skn писал(а):
Phricker писал(а):
А мне вообще интересно что в 7.0 за кнопочка и что с ней можно сделать.


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

А было бы удобно, что то сделать.
Т.к. дебаг лог показывает что там все равно куча параметров дергается, просто не выводится
Код:
<return id="155760" title="testtesttest">
<balanceLimit>-50.00</balanceLimit>
<balanceMode>1</balanceMode>
<balanceSubMode>0</balanceSubMode>
<comment/>
<dateFrom>2014-08-04T00:00:00+04:00</dateFrom>
<dependSubList/>
<groups>32</groups>
<hidden>false</hidden>
<paramGroupId>2</paramGroupId>
<password>123</password>
<personType>0</personType>
<status>0</status>
<statusTimeChange>2016-01-29T00:00:00+03:00</statusTimeChange>
<superCid>0</superCid>
<titlePatternId>1</titlePatternId>
</return>

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 май 2016, 19:07 
skn писал(а):
Phricker писал(а):
А мне вообще интересно что в 7.0 за кнопочка и что с ней можно сделать.

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

Так, а в 6.2 можно сделать раскраску поиска?
Сервис нашел, переопределил, но пишет или html теги, или пустые строки, хотя там данные есть.
Похоже форматирование сейчас на стороне клиента формируется.

P.S.
Нашел в клиенте 6.2 формирование поиска - bitel.billing.module.contract.ContractOpen.class
String titleComm = ((Contract)list.get(i)).getTitle() + " [ " + ((Contract)list.get(i)).getComment() + " ]";

P.S.
для 6.2 вопрос с раскраской решен - все раскрашивается, даже проще оказалось, чем для 6.0.


Вернуться к началу
  
 
СообщениеДобавлено: 19 май 2016, 04:25 
Не в сети
Клиент

Зарегистрирован: 03 авг 2010, 15:18
Сообщения: 357
Откуда: Камчатка
Карма: 8
Делаю через dynservice:ru.bitel.bgbilling.kernel.contract.api.ContractService

Я для своих подкрашиваю VIP-клиентов:

Код:
package ru.iks.dyn;

import java.sql.*;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;
import javax.jws.WebService;
import javax.xml.ws.Holder;
import java.sql.SQLException;
import org.apache.log4j.Logger;
 
import ru.bitel.bgbilling.common.BGException;
import ru.bitel.bgbilling.common.BGMessageException;
import ru.bitel.bgbilling.kernel.contract.api.common.service.ContractService;
import ru.bitel.common.Utils;
import bitel.billing.common.TimeUtils;
import ru.bitel.common.model.Page;
import bitel.billing.server.contract.bean.*;
import ru.bitel.oss.kernel.entity.common.bean.filter.FilterEntityAttr;
import ru.bitel.bgbilling.kernel.contract.api.common.bean.Contract;

@WebService(endpointInterface = "ru.bitel.bgbilling.kernel.contract.api.common.service.ContractService")
public class myContractServiceImpl
   extends ru.bitel.bgbilling.kernel.contract.api.server.service.ContractServiceImpl
   implements ContractService
{
   private static final Logger logger = Logger.getLogger( myContractServiceImpl.class );

   @Override
   public List<Contract> contractList(String title, String comment, int fc, long groupMask, List<FilterEntityAttr> entityFilter, boolean subContracts, boolean closed, boolean hidden, Holder<Page> pageHolder)
      throws BGException
   {
      List<Contract> list = super.contractList(title, comment, fc, groupMask, entityFilter, subContracts, closed, hidden, pageHolder);
      List<Integer> myCids = new ArrayList<Integer>();

        Page page;
        if(pageHolder == null || (page = (Page)pageHolder.value) == null)
            page = new Page(1, 25);

        StringBuilder sb = new StringBuilder(150);
        StringBuilder where = new StringBuilder("1=1");
        sb.append("select c.id FROM contract c left join contract_parameter_type_1 cpt1 on cpt1.cid=c.id and cpt1.pid=30 ");

        if(groupMask > 0L)
            where.append(" AND c.gr&?=?");
        if(closed)
            where.append(" AND (c.date2 IS NULL OR ?<=c.date2) ");
        if(title != null && title.trim().length() > 0)
            where.append(" AND (UPPER(c.title) REGEXP ? or cpt1.val REGEXP ?) ");
        if(comment != null && comment.trim().length() > 0)
            where.append(" AND UPPER(c.comment) REGEXP ?");
        if(fc == 1 || fc == 0)
            where.append(" AND c.fc=?");
        if(groupMask == 0L && title == null && comment == null && fc == -1)
            where.append(" AND c.gr=0");
        if(!subContracts)
            where.append(" AND c.scid IN ( 0, -1 )");
        if(where.length() > 0) {
            sb.append(" WHERE ");
            sb.append(where);
        }
        sb.append(" ORDER BY c.title");
        if(page.getPageSize() > 0)
            sb.append(" LIMIT ?, ?");

      int i = 1;
        try {
         PreparedStatement ps = (getConnection()).prepareStatement(sb.toString());
         if(groupMask > 0L) {
            ps.setLong(i++, groupMask);
            ps.setLong(i++, groupMask);
         }
         if(closed)
            ps.setDate(i++, TimeUtils.convertDateToSqlDate(new Date()));
         if(title != null && title.trim().length() > 0) {
            ps.setString(i++, title.toUpperCase());
            ps.setString(i++, title.toUpperCase());
         }
         if(comment != null && comment.trim().length() > 0)
            ps.setString(i++, comment.toUpperCase());
         if(fc == 1 || fc == 0)
            ps.setInt(i++, fc);
         if(page.getPageSize() > 0) {
            ps.setInt(i++, page.getPageFirstRecordNumber());
            ps.setInt(i++, page.getPageSize());
         }
         ResultSet rs;

         for( rs = ps.executeQuery(); rs.next(); )
            myCids.add(rs.getInt(1));

         rs.close();
         ps.close();
        }
        catch(SQLException e) {
         throw new BGException(e);
        }

      for( i=0; i<list.size(); i++ ) {
         if( myCids.contains(list.get(i).getId()) )
            myCids.remove((Integer)list.get(i).getId());
      }
      for( i=0; i<myCids.size(); i++ )
         list.add(contractGet(myCids.get(i)));

      for( i=0; i<list.size(); i++ ) {
         if( (list.get(i).getGroups() & Utils.enumToMask("53")) != 0L ) {
            String sTitle = list.get(i).getTitle();
            list.get(i).setTitle("<html><div style='color: red; font-weight: bold'>!!! VIP !!! " + sTitle);
         }
         list.get(i).setComment(list.get(i).getComment()+" {"+(new ContractParameterManager(getConnection())).getStringParam(list.get(i).getId(), 30)+"}");
      }
      return list;
   }
}


Плюс там еще выводится в конце в фигурных скобках значение параметра договора с id=30, это у нас Лицевой счет.

Чтобы раскрашивать внутри договора:
dynaction:contract.ActionContractInfo=ru.iks.dyn.myContractInfo
Код:
package ru.iks.dyn;

import java.sql.*;
import org.w3c.dom.*;
import ru.bitel.common.*;
import java.util.Date;
import java.math.BigDecimal;
import bitel.billing.common.TimeUtils;
import ru.bitel.bgbilling.common.BGException;
import ru.bitel.bgbilling.modules.npay.server.bean.DebetStatusManageConfig;
import ru.bitel.bgbilling.server.util.Setup;
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.npay.bean.ServiceObjectManager;
import bitel.billing.server.contract.bean.*;

public class myContractInfo
    extends bitel.billing.server.contract.action.ActionContractInfo
{
    @Override
    public void doAction()
        throws SQLException, BGException
    {
        super.doAction();

      int NPAY_MID = 3;
      int NO_MONEY_STATUS_ID = 7;
      int W_TARIFF_NO_MONEY_STATUS_ID = 9;
      int F_TARIFF_NO_MONEY_STATUS_ID = 10;

      ContractManager cm = new ContractManager(con);
      Contract c = new Contract();

      Element itemElement = XMLUtils.selectElement( rootNode, (new StringBuilder("/data/info/modules/item[@id=")).append(3).append("]").toString() );
      if( itemElement != null ) {
         String status = itemElement.getAttribute("status");
         if( status.length() == 0 ) {
            DebetStatusManageConfig config = new DebetStatusManageConfig(Setup.getSetup().getModuleSetup(Integer.valueOf(NPAY_MID)));
            if(config.isEnable())
            {
               ContractManager contractManager = new ContractManager(con);
               Contract contract = contractManager.getContractById(super.cid);
               contractManager.recycle();
               if(config.isEnableForContract(contract) && (new ServiceObjectManager(con, NPAY_MID)).getServiceObjectList(cid, null).size() > 0)
               {
                  if( contract.getStatus() == W_TARIFF_NO_MONEY_STATUS_ID || contract.getStatus() == F_TARIFF_NO_MONEY_STATUS_ID ) {
                     contract.setStatus(NO_MONEY_STATUS_ID);
                  }
                  BigDecimal unlockSumm = config.getSummaForUnlock(con, NPAY_MID, contract);
                  if(unlockSumm != null)
                  {
                     itemElement.setAttribute( "status", unlockSumm.toString() );
                  }
               }
            }
         }
      }

      c = cm.getContractById(cid);
      cm.recycle();
      if( (c.getGroups() & Utils.enumToMask("53")) != 0L ) {

         Element itemElementVIPGroup = XMLUtils.selectElement( rootNode, (new StringBuilder("/data/info/groups/item[@id=")).append(53).append("]").toString() );
         if( itemElementVIPGroup != null ) {
            itemElementVIPGroup.setAttribute( "title", "<html><div style='color: red; font-weight: bold'>" + itemElementVIPGroup.getAttribute( "title" ) + "</div/></html>" );
         }

         Element itemElementVIPTitle = XMLUtils.selectElement( rootNode, "/data/contract" );
         if( itemElementVIPTitle != null ) {
            itemElementVIPTitle.setAttribute( "title", "<html><div style='color: red; font-weight: bold'>" + itemElementVIPTitle.getAttribute( "title" ) );
            itemElementVIPTitle.setAttribute( "comment", itemElementVIPTitle.getAttribute( "comment" ) + " ]</div/></html>" );
         }
      }
   }
}


В последнем коде у меня там еще суммы разблокировки для дебет-договоров со статусами 9 и 10 выводятся, я не стал это убирать, как для примера может кому пригодиться.

Код писал для 5.2 и с небольшими изменениями он кочует по всем версиям. Сегодня проверил на 7.0 - работает.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 май 2016, 14:56 
Bazhutyan писал(а):
Делаю через dynservice:ru.bitel.bgbilling.kernel.contract.api.ContractService
....
Код писал для 5.2 и с небольшими изменениями он кочует по всем версиям. Сегодня проверил на 7.0 - работает.

Спасибо за пример. Держите "+".
Я таким же способом решил для 6.2
Вот только меня смущает, что переопределяя глобально contractList в ContractService, точнее меняем в нем "title" и "comment", не вылезет ли это в других местах где-то боком?


Вернуться к началу
  
 
СообщениеДобавлено: 19 май 2016, 15:44 
Не в сети

Зарегистрирован: 07 май 2008, 13:34
Сообщения: 594
Откуда: Москва
Карма: 27
nik247 писал(а):
Вот только меня смущает, что переопределяя глобально contractList в ContractService, точнее меняем в нем "title" и "comment", не вылезет ли это в других местах где-то боком?

Есть подозрения что "вылезет" в новом личном кабинете, который JavaEE.
Наверно правильнее все же наладить обновление клиенских third-party jar и глобального клиентского конфига (где будут строчки с dynservice) и править GUI интерфейс таки с клиентской стороны, а не перекрывая webservices api.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 май 2016, 16:04 
Jimson писал(а):
nik247 писал(а):
Вот только меня смущает, что переопределяя глобально contractList в ContractService, точнее меняем в нем "title" и "comment", не вылезет ли это в других местах где-то боком?

Есть подозрения что "вылезет" в новом личном кабинете, который JavaEE.
Наверно правильнее все же наладить обновление клиентских third-party jar и глобального клиентского конфига (где будут строчки с dynservice) и править GUI интерфейс таки с клиентской стороны, а не перекрывая webservices api.

И я вот так тоже думаю, что может вылезти "боком" не только в кабинете....
В 6.0 там было понятно...
Интересно, а что скажут разработчики?
Конечно, было бы правильнее переопределить со стороны клинета, вопрос только как?


Вернуться к началу
  
 
СообщениеДобавлено: 19 апр 2017, 09:21 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Только сейчас прочитал, дико плюсую все вопросы и фичу.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 сен 2017, 12:56 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Я так понимаю, собственная раскраска в поиске через переопределённый dynservice не работает для табличного режима.

Вообще, табличный режим поиска - круто.
Но я удивлён, что список полей жёстко зашит в клиенте.
Просьба к разработчикам: сделайте более кастомизируемый табличный поиск:
- кастомный список полей (как со стороны клиента, так и сервера)
- раскраска некоторых полей разными цветами (текста/фона)

При этом, чтобы не ломать стандартный веб-сервис поиска через переопределение (мало ли где может использоваться ещё), можно предусмотреть отдельный пользовательский метод или класс (через динкод), возвращающий массив полей с форматированием.
А в конфиге сервера, скажем, включать его.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 сен 2017, 13:57 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Немного наврал - в табличном режиме тоже раскраска через переопределённый динсервис работает, нужно было правильно подобрать html-теги.
Но свой вопрос не снимаю :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 108 ]  На страницу Пред.  1, 2, 3, 4

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
POWERED_BY
Русская поддержка phpBB
[ Time : 0.054s | 42 Queries | GZIP : On ]