Метки услуг

Материал из 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`)
)

Личные инструменты