forum.bitel.ru
http://forum.bitel.ru/

Создание комментария при изменении сервиса [6.0]
http://forum.bitel.ru/viewtopic.php?f=44&t=10081
Страница 1 из 1

Автор:  vkulakov [ 15 янв 2015, 21:20 ]
Заголовок сообщения:  Создание комментария при изменении сервиса [6.0]

На событие "Изменяется сервис договора" повесил скрипт, в котором по данным сервиса генерирую комментарий. В скрипте к текущему комментарию добавляю свои данные.
В результате, если при сохранении сервиса в текущем комментарии указать что-нибудь, например, слово "тест", то после сохранения и открытия сервиса комментарий отображается нормально. Если при сохранении указать пустой комментарий, то после сохранения и открытия сервиса комментарий отображается серым цветом и курсивом, а при клике на комментарий он вовсе исчезает. Если закрыть/открыть договор, то комментарий отображается нормально и никуда не исчезает.

Собственно, что это? Курсивом показывает точно не мой скрипт.

Вложения:
Комментарий 2.png
Комментарий 2.png [ 3.12 КБ | Просмотров: 3612 ]
Комментарий 1.png
Комментарий 1.png [ 2.63 КБ | Просмотров: 3612 ]

Автор:  stark [ 16 янв 2015, 12:04 ]
Заголовок сообщения:  Re: Создание комментария при изменении сервиса [6.0]

не понял, как связан скрипт и сохранение .

Автор:  vkulakov [ 16 янв 2015, 12:10 ]
Заголовок сообщения:  Re: Создание комментария при изменении сервиса [6.0]

Скрипт повешен на событие "Изменяется сервис договора", которое вызывается при сохранении сервиса.

Автор:  stark [ 16 янв 2015, 12:39 ]
Заголовок сообщения:  Re: Создание комментария при изменении сервиса [6.0]

покажите код скрипта

Автор:  vkulakov [ 16 янв 2015, 13:41 ]
Заголовок сообщения:  Re: Создание комментария при изменении сервиса [6.0]

Код:
package ru.xxx.inet;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;

import bitel.billing.common.IPUtils;
import bitel.billing.server.contract.bean.Contract;
import bitel.billing.server.contract.bean.ContractManager;
import ru.bitel.bgbilling.kernel.script.server.dev.EventScript;
import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetDevice;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetDeviceType;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetInterface;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetServ;
import ru.bitel.bgbilling.modules.inet.api.server.bean.InetDeviceDao;
import ru.bitel.bgbilling.modules.inet.api.server.bean.InetDeviceTypeDao;
import ru.bitel.bgbilling.modules.inet.api.server.event.InetServChangingEvent;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.Utils;
import ru.bitel.common.sql.ConnectionSet;

/**
 * <p>Генерирует логин и комментарий для сервисов модуля Inet и IPoE.</p>
 * <p>Компилировать и запускать нужно из динамического кода клиента биллинга.
 * Динамический код нужно привязать к событиям "Модуль Интернет => Изменяется сервис договора" и
 * "Модуль IPoE => Изменяется сервис договора" на вкладке "Функции скриптов поведения".</p>
 * @author "vkulakov <vkulakov@xxx.ru>"
 */
public class LoginGenerator extends EventScriptBase<InetServChangingEvent> implements EventScript<InetServChangingEvent> {
   private Connection conn;

   private int SUBNET_TYPE_ID = 4;
   private int IPOE_MODULE_ID = 27;
   private String IPOE_PASSWORD = "xxx";

   @Override
   public void onEvent(InetServChangingEvent event, Setup setup, ConnectionSet connectionSet) throws Exception {
      conn = connectionSet.getConnection();

      ContractManager cm = new ContractManager(conn);

      Contract contract = cm.getContractById(event.getContractId());
      InetServ service = event.getInetServ();

      cm.recycle();

      String login = service.getLogin();
      if(event.getModuleId() != IPOE_MODULE_ID && service.getTypeId() != SUBNET_TYPE_ID && (login.isEmpty() || login.equals("999999"))) {
         String prefix = contract.getTitle();
         login = prefix;

         PreparedStatement ps = connectionSet.getConnection().prepareStatement("SELECT id FROM inet_serv_" + event.getModuleId() + " WHERE login = ?");
         for(int i = 0; true; i++, login = prefix + "_" + i) {
            ps.setString(1, login);
            ResultSet rs = ps.executeQuery();

            if(!rs.first() || rs.getInt("id") == service.getId()) {
               service.setLogin(login);
               break;
            }
         }

         return;
      }

      if(event.getModuleId() == IPOE_MODULE_ID) {
         InetDeviceDao dd = new InetDeviceDao(conn, event.getModuleId());
         InetDeviceTypeDao td = new InetDeviceTypeDao(conn, event.getModuleId());

         InetDevice device = dd.get(service.getDeviceId());
         InetDeviceType deviceType = td.get(device.getDeviceTypeId());

         td.recycle();
         dd.recycle();

         InetInterface iface = null;
         for(InetInterface i : deviceType.getInterfaceList()) {
            if(i.getId() == service.getInterfaceId()) {
               iface = i;
               break;
            }
         }

         StringBuilder sb = new StringBuilder("nas-port");

         sb.append(":");
         sb.append(device.getHost().split(":")[0]);

         if(iface == null) {
            event.setError("Не задан интерфейс для сервиса");
            return;
         }
         sb.append(":");
         sb.append(iface.getTitle());

         List<String> identifiers = service.getIdentifierList();
         if(identifiers == null || identifiers.isEmpty()) {
            event.setError("Не заданы VLAN'ы для сервиса");
            return;
         }
         if(identifiers.size() > 1) {
            event.setError("Задано слишком много VLAN'ов для сервиса");
            return;
         }
         sb.append("/");
         sb.append(identifiers.get(0));

         PreparedStatement ps = conn.prepareStatement(""
               + "SELECT"
               + "     id"
               + " FROM"
               + "     inet_serv_" + event.getModuleId()
               + " WHERE"
               + "     deviceId = ? AND"
               + "     interfaceId = ? AND"
               + "     identifier = ?");
         ps.setInt(1, service.getDeviceId());
         ps.setInt(2, service.getInterfaceId());
         ps.setString(3, identifiers.get(0));

         ResultSet rs = ps.executeQuery();
         if(rs.first() && rs.getInt("id") != service.getId()) {
            event.setError("Сервис с такими VLAN'ами уже существует: " + contract.getTitle());
            return;
         }            

         String c = service.getComment();

         StringBuilder comment;
         if(Utils.isBlankString(c)) {
            comment = new StringBuilder("");
         } else {
            comment = new StringBuilder(c.replaceAll("(?s)---.*?IP.*?Маска.*?Шлюз.*?DNS.*?---\\s*", "").trim());
         }

         int addressFrom = Utils.convertBytesToInt(service.getAddressFrom());
         int addressTo = Utils.convertBytesToInt(service.getAddressTo());
         if(addressTo - addressFrom < 3) {
            event.setError("Задана слишком маленькая подсеть для сервиса");
            return;
         }

         comment.append("\n---\n");

         comment.append("IP: ");
         if(addressTo - addressFrom == 3) {
            comment.append(IPUtils.convertIpToString(addressFrom + 2));
         } else {
            comment.append(IPUtils.convertIpToString(addressFrom + 2));
            comment.append(" - ");
            comment.append(IPUtils.convertIpToString(addressTo - 1));            
         }
         comment.append("\n");

         comment.append("Маска: ");
         comment.append(IPUtils.convertIpToString(~(addressFrom ^ addressTo)));
         comment.append("\n");

         comment.append("Шлюз: ");
         comment.append(IPUtils.convertIpToString(addressFrom + 1));
         comment.append("\n");

         comment.append("DNS: ");
         comment.append("x.x.x.x, x.x.x.x");
         comment.append("\n");

         comment.append("---");         
         comment.append("\n");

         if(comment.length() > 250) {
            event.setError("Задан слишком длинный комментарий для сервиса - " + comment.length());
            return;
         }

         service.setLogin(sb.toString());
         service.setPassword(IPOE_PASSWORD);
         service.setComment(comment.toString());

         return;
      }
   }
}

Автор:  vkulakov [ 16 янв 2015, 16:43 ]
Заголовок сообщения:  Re: Создание комментария при изменении сервиса [6.0]

Что скажете?

Автор:  Amir [ 16 янв 2015, 19:11 ]
Заголовок сообщения:  Re: Создание комментария при изменении сервиса [6.0]

Похоже, проблема в самом компоненте отображения. Исправим в ближайшее время.

Автор:  Amir [ 23 янв 2015, 18:39 ]
Заголовок сообщения:  Re: Создание комментария при изменении сервиса [6.0]

В следующем билде должно быть нормально.

Автор:  vkulakov [ 27 янв 2015, 13:17 ]
Заголовок сообщения:  Re: Создание комментария при изменении сервиса [6.0]

Спасибо, если не забуду - проверю.

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/