Импорт старой схемы рассылок баланса в 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" рассылку "Рассылка баланса": Файл:dispatch_balance.jpg В тексте письма указываем подстановку: $${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)

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