Метки услуг
Материал из BiTel WiKi
Версия от 02:17, 10 апреля 2013; Cromeshnic (Обсуждение | вклад)
Содержание |
Описание
Для отчётов полезно иметь группировку услуг по типам вне зависимости от модуля. Например, группа услуг "Интернет" - туда могут входить как услуги трафиков модулей Inet, Dialup, IPN, так и абонплаты за интернет. Аналогично, "VPN"
Было решено сделать группировку аналогично меткам тарифов - в виде дерева меток.
Решение состоит из серверного API и клиентского интерфейса. Решение является упрощённой копипастой работы с метками тарифов.
Общие классы
Классы, которые должны быть как в серверных библиотеках, так и в клиентских
Во-первых, нам понадобится веб-сервис для работы с метками тарифов:
package ru.bitel.bgbilling.kernel.module.common.service; import ru.bitel.bgbilling.common.BGException; import ru.dsi.bgbilling.kernel.module.common.bean.ServiceItem; import ru.dsi.bgbilling.kernel.module.common.bean.ServiceLabelItem; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; import java.util.List; import java.util.Set; @WebService public abstract interface ServiceLabelService { @WebMethod public abstract List<ServiceLabelItem> getServiceLabelTreeItemList(@WebParam(name="serviceId") int serviceId) throws BGException; @WebMethod public abstract void setServiceLabelTreeItemList(@WebParam(name="serviceId") int serviceId, @WebParam(name="items") List<ServiceLabelItem> items) throws BGException; @WebMethod public abstract int updateServiceLabelTreeItem(@WebParam(name="serviceLabelItem") ServiceLabelItem serviceLabelItem) throws BGException; @WebMethod public abstract void removeServiceLabelTreeItem(@WebParam(name="serviceLabelItemId") int serviceLabelItemId) throws BGException; @WebMethod public abstract List<ServiceItem> getServiceList(@WebParam(name="moduleIds") Set<Integer> moduleIds, @WebParam(name="serviceLabelIds") List<Integer> serviceLabelIds) throws BGException; }
Элемент списка услуг для отображения:
package ru.dsi.bgbilling.kernel.module.common.bean; import ru.bitel.common.model.IdTitle; import javax.xml.bind.annotation.XmlAttribute; /** * Услуга, расширенная доп информацией */ public class ServiceItem extends IdTitle{ private int labelCount; private String moduleTitle; private int moduleId; private boolean using; @XmlAttribute public int getLabelCount() { return labelCount; } public void setLabelCount(int labelCount) { this.labelCount = labelCount; } @XmlAttribute public String getModuleTitle() { return moduleTitle; } public void setModuleTitle(String moduleTitle) { this.moduleTitle = moduleTitle; } @XmlAttribute public int getModuleId() { return this.moduleId; } public void setModuleId(int moduleId) { this.moduleId = moduleId; } @XmlAttribute public boolean isUsing() { return this.using; } public void setUsing(boolean used) { this.using = used; } }
Элемент дерева меток:
package ru.dsi.bgbilling.kernel.module.common.bean; import ru.bitel.common.model.IdTitle; import javax.xml.bind.annotation.XmlAttribute; public class ServiceLabelItem extends IdTitle { private int parentId = -1; private int serviceLinkCount = 0; private boolean selected = false; @XmlAttribute public int getParentId() { return this.parentId; } public void setParentId(int parentId) { this.parentId = parentId; } @XmlAttribute public int getServiceLinkCount() { return this.serviceLinkCount; } public void setServiceLinkCount(int serviceLinkCount) { this.serviceLinkCount = serviceLinkCount; } @XmlAttribute public boolean isSelected() { return this.selected; } public void setSelected(boolean selected) { this.selected = selected; } }
Renderer дерева меток:
package ru.dsi.bgbilling.kernel.module.common.bean; import ru.bitel.bgbilling.client.util.ClientUtils; import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreeCellRenderer; import java.awt.*; public class ServiceLabelTreeCellRenderer extends JPanel implements TreeCellRenderer { private JCheckBox check; private DefaultTreeCellRenderer label; public ServiceLabelTreeCellRenderer() { setLayout(new GridBagLayout()); add(this.check = new JCheckBox(), new GridBagConstraints(0, 0, 1, 1, 0.0D, 0.0D, 17, 0, new Insets(0, 0, 0, 0), 0, 0)); add(this.label = new DefaultTreeCellRenderer(), new GridBagConstraints(1, 0, 1, 1, 0.0D, 0.0D, 17, 0, new Insets(0, 0, 0, 0), 0, 0)); prepare(); setOpaque(false); this.label.setOpenIcon(ClientUtils.getIcon("node.png")); this.label.setClosedIcon(ClientUtils.getIcon("node.png")); this.label.setLeafIcon(ClientUtils.getIcon("leaf.png")); } public void setEnabled(boolean enabled) { super.setEnabled(enabled); this.check.setEnabled(enabled); } public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { prepare(); this.label.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); if ((value instanceof DefaultMutableTreeNode)) { setEnabled(tree.isEnabled()); this.check.setEnabled(true); DefaultMutableTreeNode serviceLabelTreeNode = (DefaultMutableTreeNode)value; Object userObject = serviceLabelTreeNode.getUserObject(); if ((userObject instanceof ServiceLabelItem)) { this.check.setSelected(((ServiceLabelItem)userObject).isSelected()); } this.check.setVisible(!serviceLabelTreeNode.isRoot()); } invalidate(); return this; } public final DefaultTreeCellRenderer getTreeCellRenderer() { return this.label; } private void prepare() { Color bColor = UIManager.getColor("Tree.textBackground"); setBackground(bColor); this.check.setBackground(bColor); this.label.setBackgroundNonSelectionColor(bColor); this.label.setBackgroundSelectionColor(bColor); this.label.setBackground(bColor); } }
Сервер
Таблицы mysql
Таблицы аналогичны таблицам меток тарифов tariff_label и tariff_label_link
CREATE TABLE `custom_service_label` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) NOT NULL DEFAULT '0', `title` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) CREATE TABLE `custom_service_label_link` ( `sid` int(11) NOT NULL DEFAULT '0', `label_id` int(11) NOT NULL DEFAULT '0', KEY `sid` (`sid`,`label_id`) )