Пример автоматизации подключения новых клиентов
Материал из BiTel WiKi
Lda (Обсуждение | вклад) (Новая: Приведу пример автоматизации работ, связанных с подключением новых абонентов. '''Общая схема работы.''...) |
Lda (Обсуждение | вклад) |
||
Строка 12: | Строка 12: | ||
+ | |||
+ | |||
+ | Событие "Договор создан" (Создание персонального тарифа на подключение) | ||
+ | <source lang="java"> | ||
+ | |||
+ | import java.sql.*; | ||
+ | import java.util.*; | ||
+ | import java.util.regex.Matcher; | ||
+ | import java.util.regex.Pattern; | ||
+ | |||
+ | import bitel.billing.server.contract.bean.*; | ||
+ | import bitel.billing.server.tariff.*; | ||
+ | import bitel.billing.server.util.*; | ||
+ | import bitel.billing.server.script.bean.event.*; | ||
+ | import bitel.billing.server.service.bean.*; | ||
+ | import bitel.billing.server.contract.bean.*; | ||
+ | |||
+ | RSCM_ID = 9; // код модуля RSCM | ||
+ | VPN_ID = 1; // код модуля VPN | ||
+ | IPN_ID = 4; // код модуля IPN | ||
+ | PHONE_ID = 5; // код модуля Телефония | ||
+ | |||
+ | INTERNET_COST_NODE = 12293;// код узла, где хранится цена за подключение Интернета | ||
+ | PHONE_COST_NODE = 12295; // код узла, где хранится цена за подключение Телефона | ||
+ | INTERNET_SERVICE_ID = 17; // код услуги "Подключение - Интернет" | ||
+ | PHONE_SERVICE_ID = 29; // код услуги "Подключение - Телефон" | ||
+ | PID_CONNECT_COST = 46; // код параметра договора "Стоимость подключения" | ||
+ | |||
+ | createPT(title, cost_node, service_id) | ||
+ | { | ||
+ | print("Start creating tariff [" + title + "]"); | ||
+ | |||
+ | // создать ПТ | ||
+ | pt = new PersonalTariff(); | ||
+ | pt.setContractId(cid); | ||
+ | pt.setTitle(title); | ||
+ | ptm.updatePersonalTariff(pt); | ||
+ | |||
+ | // получить treeID | ||
+ | tid = pt.getId(); | ||
+ | pt = ptm.getPersonalTariff(tid); | ||
+ | treeId = pt.getTreeId(); | ||
+ | print("Tariff created. TreeId: " + String.valueOf(treeId) ); | ||
+ | |||
+ | // сгенерировать lm | ||
+ | lm = new Date().getTime(); | ||
+ | |||
+ | // добавить запись в module_tariff_tree и получить ее Id | ||
+ | ps = con.prepareStatement( "INSERT INTO module_tariff_tree (mid, tree_id, lm) VALUES (?, ?, ?)" ); | ||
+ | ps.setInt( 1, RSCM_ID ); | ||
+ | ps.setInt( 2, treeId ); | ||
+ | ps.setLong( 3, lm ); | ||
+ | rs = ps.executeUpdate(); | ||
+ | print("INSERT INTO module_tariff_tree (mid, tree_id)" + | ||
+ | "VALUES (" + String.valueOf(RSCM_ID) + "," + String.valueOf(treeId) +")"); | ||
+ | rs = con.prepareStatement( "select LAST_INSERT_ID()" ).executeQuery(); | ||
+ | rs.next(); | ||
+ | mttId = rs.getInt(1); | ||
+ | print("mtree_id: " + String.valueOf(mttId)); | ||
+ | |||
+ | // получить максимальное значение pos из mtree_node | ||
+ | ps = con.prepareStatement( "SELECT MAX(pos) FROM mtree_node" ); | ||
+ | rs = ps.executeQuery(); | ||
+ | rs.next(); | ||
+ | newpos = rs.getInt(1) + 1; | ||
+ | print("mtree_node.pos: " + String.valueOf(newpos)); | ||
+ | |||
+ | // корневая запись запись в mtree_node | ||
+ | ps = con.prepareStatement( "insert into mtree_node (parent_node, mtree_id, type, pos) values (0, ?, 'root', ?)" ); | ||
+ | ps.setInt( 1, mttId ); | ||
+ | ps.setInt( 2, newpos ); | ||
+ | rs = ps.executeUpdate(); | ||
+ | print("insert into mtree_node (parent_node, mtree_id, type, pos)" + | ||
+ | "VALUES (0," + String.valueOf(mttId) + ",'root'," + String.valueOf(newpos) +")"); | ||
+ | |||
+ | // услуга | ||
+ | ps = con.prepareStatement( "insert into mtree_node (parent_node, mtree_id, type, data) values (LAST_INSERT_ID(), ?, 'service', ?)" ); | ||
+ | ps.setInt( 1, mttId ); | ||
+ | ps.setInt( 2, service_id ); | ||
+ | rs = ps.executeUpdate(); | ||
+ | print("insert into mtree_node (parent_node, mtree_id, type, data)" + | ||
+ | "values (LAST_INSERT_ID()," + String.valueOf(mttId) + ",'service'," + String.valueOf(INTERNET_SERVICE_ID) +")"); | ||
+ | |||
+ | cid = event.getContractID(); | ||
+ | cm = new ContractManager(con); | ||
+ | contract = cm.getContractByID(cid); | ||
+ | cpu = new ContractParamUtils( con ); | ||
+ | |||
+ | // Получить стоимость из глобального тарифного плана "_Подключение", если физик | ||
+ | if (contract.getFc() == 0) | ||
+ | { | ||
+ | ps = con.prepareStatement( "SELECT data FROM mtree_node WHERE id=?" ); | ||
+ | ps.setInt( 1, cost_node ); | ||
+ | rs = ps.executeQuery(); | ||
+ | rs.next(); | ||
+ | cost = rs.getString(1); | ||
+ | } | ||
+ | // стоимость равна нулю, если юрик | ||
+ | else | ||
+ | { | ||
+ | cost = "cost&0.0%col&1"; | ||
+ | } | ||
+ | |||
+ | // Установить стоимость | ||
+ | ps = con.prepareStatement( "insert into mtree_node (parent_node, mtree_id, type, data) values (LAST_INSERT_ID(), ?, 'cost', ?)" ); | ||
+ | ps.setInt( 1, mttId ); | ||
+ | ps.setString( 2, cost ); | ||
+ | rs = ps.executeUpdate(); | ||
+ | print("insert into mtree_node (parent_node, mtree_id, type, data)" + | ||
+ | "values (LAST_INSERT_ID()," + String.valueOf(mttId) + ",'cost','" + String.valueOf(cost) +"')"); | ||
+ | |||
+ | // Прописать стоимость в параметре договора | ||
+ | Pattern pattern = Pattern.compile("cost&(\\d+)\\.\\d+%"); | ||
+ | Matcher matcher = pattern.matcher(cost); | ||
+ | try{ | ||
+ | if (matcher.find()) | ||
+ | { | ||
+ | costValue = matcher.group(1); | ||
+ | cpu.setStringParam( cid, PID_CONNECT_COST, costValue ); | ||
+ | } | ||
+ | } catch (Exception exception) { | ||
+ | error("Get connection cost:" + exception.getMessage()); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // проверить, подключена ли указанная услуга | ||
+ | isServicePresent(sid) | ||
+ | { | ||
+ | found = false; | ||
+ | serviceList = csm.getContractServiceList( cid, null ); | ||
+ | for( Iterator it = serviceList.iterator(); it.hasNext() && (found == false); ) | ||
+ | { | ||
+ | service = (ContractService)it.next(); | ||
+ | id = service.getServiceID(); | ||
+ | |||
+ | if( id == sid ) | ||
+ | { | ||
+ | found = true; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | return found; | ||
+ | } | ||
+ | |||
+ | //_________________________________________________________________________________________________________ | ||
+ | |||
+ | |||
+ | cid = event.getContractID(); | ||
+ | |||
+ | |||
+ | ptm = new PersonalTariffManager( con ); | ||
+ | csm = new ContractServiceManager( con ); | ||
+ | msu = new ModuleAndServiceUtils( con ); | ||
+ | |||
+ | // ищем услуги в модуле RSCM | ||
+ | inetConnect = false; | ||
+ | phoneConnect = false; | ||
+ | services = msu.getContractService(cid, RSCM_ID); | ||
+ | for ( int i = 0; i < services.size() ; i++ ) | ||
+ | { | ||
+ | service = services.get(i); | ||
+ | if (service.getId() == INTERNET_SERVICE_ID) | ||
+ | { | ||
+ | inetConnect = true; | ||
+ | } | ||
+ | if (service.getId() == PHONE_SERVICE_ID) | ||
+ | { | ||
+ | phoneConnect = true; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Интернет | ||
+ | if (inetConnect) | ||
+ | { | ||
+ | createPT("Подключение - Интернет", INTERNET_COST_NODE, INTERNET_SERVICE_ID); | ||
+ | } | ||
+ | |||
+ | // Телефон | ||
+ | if (phoneConnect) | ||
+ | { | ||
+ | createPT("Подключение - Телефон", PHONE_COST_NODE, PHONE_SERVICE_ID); | ||
+ | } | ||
+ | |||
+ | |||
+ | print("executed"); | ||
+ | |||
+ | </source> | ||
Продолжение следует... | Продолжение следует... |
Версия 13:49, 20 апреля 2009
Приведу пример автоматизации работ, связанных с подключением новых абонентов.
Общая схема работы.
Оператор заключает договора на интернет или телефонию.
При создании договора, стоимость подключения автоматически прописывается в параметре договора и в персональном тарифе. Стоимость подключения, указанная в параметре договора, используется при печати договора и при определении определении минимальной суммы оплаты, после которой начнется процедура подключения. Стоимость подключения, указанная в персональном тарифе, списывается со счета абонента после окончания процедуры подключения.
Для физических лиц, стоимость подключения берется из глобального тарифа для услуг RSCM с кодами 17("Подключение - Интернет") и 29 ("Подключение - Телефонии"). А для юридических лиц всегда 0 р. Оператор, при необходимости, может изменить стоимость подключения.
Событие "Договор создан" (Создание персонального тарифа на подключение)
import java.sql.*; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import bitel.billing.server.contract.bean.*; import bitel.billing.server.tariff.*; import bitel.billing.server.util.*; import bitel.billing.server.script.bean.event.*; import bitel.billing.server.service.bean.*; import bitel.billing.server.contract.bean.*; RSCM_ID = 9; // код модуля RSCM VPN_ID = 1; // код модуля VPN IPN_ID = 4; // код модуля IPN PHONE_ID = 5; // код модуля Телефония INTERNET_COST_NODE = 12293;// код узла, где хранится цена за подключение Интернета PHONE_COST_NODE = 12295; // код узла, где хранится цена за подключение Телефона INTERNET_SERVICE_ID = 17; // код услуги "Подключение - Интернет" PHONE_SERVICE_ID = 29; // код услуги "Подключение - Телефон" PID_CONNECT_COST = 46; // код параметра договора "Стоимость подключения" createPT(title, cost_node, service_id) { print("Start creating tariff [" + title + "]"); // создать ПТ pt = new PersonalTariff(); pt.setContractId(cid); pt.setTitle(title); ptm.updatePersonalTariff(pt); // получить treeID tid = pt.getId(); pt = ptm.getPersonalTariff(tid); treeId = pt.getTreeId(); print("Tariff created. TreeId: " + String.valueOf(treeId) ); // сгенерировать lm lm = new Date().getTime(); // добавить запись в module_tariff_tree и получить ее Id ps = con.prepareStatement( "INSERT INTO module_tariff_tree (mid, tree_id, lm) VALUES (?, ?, ?)" ); ps.setInt( 1, RSCM_ID ); ps.setInt( 2, treeId ); ps.setLong( 3, lm ); rs = ps.executeUpdate(); print("INSERT INTO module_tariff_tree (mid, tree_id)" + "VALUES (" + String.valueOf(RSCM_ID) + "," + String.valueOf(treeId) +")"); rs = con.prepareStatement( "select LAST_INSERT_ID()" ).executeQuery(); rs.next(); mttId = rs.getInt(1); print("mtree_id: " + String.valueOf(mttId)); // получить максимальное значение pos из mtree_node ps = con.prepareStatement( "SELECT MAX(pos) FROM mtree_node" ); rs = ps.executeQuery(); rs.next(); newpos = rs.getInt(1) + 1; print("mtree_node.pos: " + String.valueOf(newpos)); // корневая запись запись в mtree_node ps = con.prepareStatement( "insert into mtree_node (parent_node, mtree_id, type, pos) values (0, ?, 'root', ?)" ); ps.setInt( 1, mttId ); ps.setInt( 2, newpos ); rs = ps.executeUpdate(); print("insert into mtree_node (parent_node, mtree_id, type, pos)" + "VALUES (0," + String.valueOf(mttId) + ",'root'," + String.valueOf(newpos) +")"); // услуга ps = con.prepareStatement( "insert into mtree_node (parent_node, mtree_id, type, data) values (LAST_INSERT_ID(), ?, 'service', ?)" ); ps.setInt( 1, mttId ); ps.setInt( 2, service_id ); rs = ps.executeUpdate(); print("insert into mtree_node (parent_node, mtree_id, type, data)" + "values (LAST_INSERT_ID()," + String.valueOf(mttId) + ",'service'," + String.valueOf(INTERNET_SERVICE_ID) +")"); cid = event.getContractID(); cm = new ContractManager(con); contract = cm.getContractByID(cid); cpu = new ContractParamUtils( con ); // Получить стоимость из глобального тарифного плана "_Подключение", если физик if (contract.getFc() == 0) { ps = con.prepareStatement( "SELECT data FROM mtree_node WHERE id=?" ); ps.setInt( 1, cost_node ); rs = ps.executeQuery(); rs.next(); cost = rs.getString(1); } // стоимость равна нулю, если юрик else { cost = "cost&0.0%col&1"; } // Установить стоимость ps = con.prepareStatement( "insert into mtree_node (parent_node, mtree_id, type, data) values (LAST_INSERT_ID(), ?, 'cost', ?)" ); ps.setInt( 1, mttId ); ps.setString( 2, cost ); rs = ps.executeUpdate(); print("insert into mtree_node (parent_node, mtree_id, type, data)" + "values (LAST_INSERT_ID()," + String.valueOf(mttId) + ",'cost','" + String.valueOf(cost) +"')"); // Прописать стоимость в параметре договора Pattern pattern = Pattern.compile("cost&(\\d+)\\.\\d+%"); Matcher matcher = pattern.matcher(cost); try{ if (matcher.find()) { costValue = matcher.group(1); cpu.setStringParam( cid, PID_CONNECT_COST, costValue ); } } catch (Exception exception) { error("Get connection cost:" + exception.getMessage()); } } // проверить, подключена ли указанная услуга isServicePresent(sid) { found = false; serviceList = csm.getContractServiceList( cid, null ); for( Iterator it = serviceList.iterator(); it.hasNext() && (found == false); ) { service = (ContractService)it.next(); id = service.getServiceID(); if( id == sid ) { found = true; } } return found; } //_________________________________________________________________________________________________________ cid = event.getContractID(); ptm = new PersonalTariffManager( con ); csm = new ContractServiceManager( con ); msu = new ModuleAndServiceUtils( con ); // ищем услуги в модуле RSCM inetConnect = false; phoneConnect = false; services = msu.getContractService(cid, RSCM_ID); for ( int i = 0; i < services.size() ; i++ ) { service = services.get(i); if (service.getId() == INTERNET_SERVICE_ID) { inetConnect = true; } if (service.getId() == PHONE_SERVICE_ID) { phoneConnect = true; } } // Интернет if (inetConnect) { createPT("Подключение - Интернет", INTERNET_COST_NODE, INTERNET_SERVICE_ID); } // Телефон if (phoneConnect) { createPT("Подключение - Телефон", PHONE_COST_NODE, PHONE_SERVICE_ID); } print("executed");
Продолжение следует...