Пример автоматизации подключения новых клиентов
Материал из BiTel WiKi
Lda (Обсуждение | вклад) |
Lda (Обсуждение | вклад) |
||
Строка 17: | Строка 17: | ||
'''Событие "Договор создан" (Создание персонального тарифа на подключение)''' | '''Событие "Договор создан" (Создание персонального тарифа на подключение)''' | ||
<source lang="java"> | <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) +")"); | "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) +")"); | "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()); | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
} | } | ||
+ | } | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
//_________________________________________________________________________________________________________ | //_________________________________________________________________________________________________________ | ||
- | + | 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); | ||
+ | } | ||
- | |||
</source> | </source> |
Версия 14:00, 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()); } } //_________________________________________________________________________________________________________ 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); }
Событие "Договор создан" (Приостановка договора)
import bitel.billing.server.script.bean.event.*; import bitel.billing.server.contract.bean.*; cid = event.getContractID(); contract = event.getContract(); print(contract); csm = new ContractStatusManager(con); cs = new ContractStatus(); cs.setContractId(cid); cs.setDate1(contract.getDate1()); cs.setStatus(4); csm.changeStatus(cs);
Продолжение следует...