Импорт старой схемы рассылок баланса в Dispatch
Материал из BiTel WiKi
До версии 5.2 работала старая схема рассылок, реализованная в ядре: http://bgbilling.ru/v5.1/doc/ch01s24s07.html В версии 5.2 эта схема перестала работать, вместо неё предлагается использовать плагин dispatch: http://bgbilling.ru/v5.2/doc/ch30.html
Ниже приводится скрипт, импортирующий старые рассылки баланса в модуль disptch.
Перед запуском необходимо создать в плагине dispatch тип контактов "E-mail" рассылку "Рассылка баланса": В тексте письма указываем подстановку: $${class:ru.bitel.bgbilling.plugins.dispatch.server.bean.message.DispatchBalanceMessage}
Затем запускаем глобальный скрипт в динамическом коде, который из таблицы user_dispatch, содержащей старые рассылки, создаёт контакты и подписки на рассылки. В полях CONTACT_TYPE_ID и DISPATCH_ID указываем id созданных выше типа контактов и рассылки. В OUT будут созданные рассылки, в ошибках появятся необработанные записи.
package ru.dsi.bgbilling.kernel.scripts.global; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import java.util.Vector; import java.util.regex.Pattern; import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase; import ru.bitel.bgbilling.plugins.dispatch.common.bean.Contact; import ru.bitel.bgbilling.plugins.dispatch.common.bean.Dispatch; import ru.bitel.bgbilling.plugins.dispatch.common.bean.Subscription; import ru.bitel.bgbilling.plugins.dispatch.server.dao.ContactDao; import ru.bitel.bgbilling.plugins.dispatch.server.dao.DispatchDao; import ru.bitel.bgbilling.plugins.dispatch.server.dao.SubscriptionDao; import ru.bitel.bgbilling.server.util.Setup; import ru.bitel.common.Preferences; import ru.bitel.common.Utils; import ru.bitel.common.model.ScheduleTime; import ru.bitel.common.sql.ConnectionSet; public class Test extends GlobalScriptBase { @Override public void execute( Setup setup1, ConnectionSet connectionSet ) throws Exception { int CONTACT_TYPE_ID = 1; int DISPATCH_ID = 1; Connection con = connectionSet.getConnection(); SubscriptionDao sm = new SubscriptionDao(con); ContactDao cm = new ContactDao(con); DispatchDao dm = new DispatchDao(con); Dispatch dispatch = dm.get(DISPATCH_ID); //Перебираем все рассылки из user_dispatch: PreparedStatement ps = con.prepareStatement("SELECT user_dispatch.* FROM " + " user_dispatch INNER JOIN " + " contract ON user_dispatch.cid=contract.id AND contract.date1<=CURDATE() AND (contract.date2 IS NULL OR contract.date2>=CURDATE()) AND contract.del=0 " + "WHERE " + " user_dispatch.type=1"); ResultSet rs = ps.executeQuery(); while(rs.next()){ int id = 0; try{ id = rs.getInt("id"); int cid = rs.getInt("cid"); String mails = rs.getString("mails"); //String title = rs.getString("title"); boolean status = rs.getBoolean("status"); String paramsString = rs.getString("params"); this.print("id="+id+"; cid="+cid+"; mails="+mails+"; status="+status+"; params="+paramsString); Map<String, String> params = getParams(paramsString); Preferences prefs = new Preferences(); String balance_limit = params.get("balance_limit"); if(null!=balance_limit){ prefs.set("0.to_balance", balance_limit); } ScheduleTime time = new ScheduleTime(); String dw = params.get("dw"); if(null!=dw){ time.setDayOfWeek(Integer.valueOf(dw)); } //Создаём контакты Vector<String> emails = splitEmails(mails); List<Contact> contacts = new ArrayList<Contact>(); for(String email: emails){ Contact contact = new Contact(); contact.setContactTypeId(CONTACT_TYPE_ID); contact.setContractId(cid); contact.setValue(email); cm.update(contact); contacts.add(contact); } //Создаём dispatch_subscription Subscription subscription = new Subscription(); subscription.setActive(status); subscription.setComment(mails); subscription.setContacts(contacts); subscription.setContractId(cid); subscription.setDispatch(dispatch); subscription.setPreferences(prefs); subscription.setRepeatTime(time); sm.update(subscription); }catch(Exception e){ this.error("Error on user_dispatch.id = "+id+" :"); this.error(e); } } rs.close(); ps.close(); } //Парсим user.dispatch.params : "dw%v%127%p%balance_limit%v%30.0" -> {dw='127', balance_limit='30'} private Map<String, String> getParams(String paramsString) throws SQLException { Map<String, String> result = new HashMap<String, String>(); if(paramsString==null){return result;} Pattern pt = Pattern.compile("%p%"); Pattern pt_v = Pattern.compile("%v%"); String[] pairs = pt.split(paramsString); for (int i = 0; i < pairs.length; i++) { String[] pair_value = pt_v.split(pairs[i]); if ((pair_value == null) || (pair_value.length != 2)) continue; result.put(pair_value[0], pair_value[1]); } return result; } public Float getBalanceLimit(Map<String, String> params) { String bl = params.get("balance_limit"); return bl != null ? new Float(Utils.parseFloat(bl, 0.0F)) : null; } public long getDaysOfWeek(Map<String, String> params) { return Utils.parseLong(params.get("dw"), 0L); } private Vector<String> splitEmails(String mails){ Vector<String> result = new Vector<String>(); if(null==mails){ return result; } StringTokenizer st = new StringTokenizer(mails, ",;\r\n "); while (st.hasMoreTokens()) { String token = st.nextToken().trim(); result.add(token); } return result; } }
В дополнение прилагаю xsl-файл рассылки баланса, форматированный в старом стиле:
GeSHi Error: GeSHi could not find the language xsl (using path /home/user/wiki.bitel.ru/mediawiki-1.15.1/extensions/SyntaxHighlight_GeSHi/geshi/geshi/) (code 2)
Вы должны указать язык следующим образом: <source lang="html">...</source>
Поддерживаемые языки:
abap, actionscript, ada, apache, applescript, asm, asp, autoit, bash, basic4gl, blitzbasic, bnf, c, c_mac, caddcl, cadlisp, cfdg, cfm, cpp, cpp-qt, csharp, css, d, delphi, diff, div, dos, dot, eiffel, fortran, freebasic, genero, gml, groovy, haskell, html4strict, idl, ini, inno, io, java, java5, javascript, latex, lisp, lua, m68k, matlab, mirc, mpasm, mysql, nsis, objc, ocaml, ocaml-brief, oobas, oracle8, pascal, per, perl, php, php-brief, plsql, python, qbasic, rails, reg, robots, ruby, sas, scheme, sdlbasic, smalltalk, smarty, sql, tcl, text, thinbasic, tsql, vb, vbnet, vhdl, visualfoxpro, winbatch, xml, xpp, z80
--Cromeshnic 02:36, 6 апреля 2012 (UTC)