Переключение статуса процессов по наступлению момента времени
Материал из BiTel WiKi
Класс выбирает процессы, находящиеся в статусе PROCESS_STATUS_PAY_WAIT (ожидание оплаты) у которых прошла дата повторного звонка. Эти процесс вновь становятся открытыми.
Класс может быть запущен планировщиком либо командой консоли crm.sh runclass <className>.
package ru.bgcrm.dyn.sofit; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Date; import org.apache.log4j.Logger; import ru.bgcrm.struts.action.ProcessAction; import ru.bgcrm.struts.form.DynActionForm; import ru.bgcrm.util.Setup; import ru.bgcrm.util.sql.SQLUtils; import ru.bgcrm.dao.process.ProcessDAO; import ru.bgcrm.model.process.Process; import ru.bgcrm.model.process.StatusChange; import ru.bgcrm.model.user.User; import static ru.bgcrm.dao.process.Tables.*; import static ru.bgcrm.dao.Tables.*; public class KtvDebtWaitRestore implements Runnable { private static final Logger log = Logger.getLogger( KtvDebtWaitRestore.class ); private static final int PROCESS_TYPE_DEBTOR = 4; private static final int PROCESS_STATUS_OPEN = 2; private static final int PROCESS_STATUS_PAY_WAIT = 5; private static final int PROCESS_PARAM_DATE_RECALL = 2; @Override public void run() { Connection con = null; try { con = Setup.getSetup().getDBConnectionFromPool(); String query = "SELECT process.* FROM " + TABLE_PROCESS + " AS process " + "INNER JOIN " + TABLE_PARAM_DATE + " AS pd ON process.id=pd.id AND pd.param_id=? AND pd.value<=CURDATE() " + "WHERE close_dt IS NULL AND type_id=? AND status_id=?"; PreparedStatement ps = con.prepareStatement( query ); ps.setInt( 1, PROCESS_PARAM_DATE_RECALL ); ps.setInt( 2, PROCESS_TYPE_DEBTOR ); ps.setInt( 2, PROCESS_STATUS_PAY_WAIT ); ResultSet rs = ps.executeQuery(); while( rs.next() ) { Process process = ProcessDAO.getProcessFromRs( rs ); log.info( "Opening debt process: " + process.getId() ); StatusChange change = new StatusChange(); change.setProcessId( process.getId() ); change.setDate( new Date() ); change.setStatusId( PROCESS_STATUS_OPEN ); change.setUserId( User.USER_SYSTEM_ID ); change.setComment( "Настала дата повторного обзвона" ); ProcessAction.processStatusUpdate( DynActionForm.SERVER_FORM, con, process, change ); con.commit(); } ps.close(); } catch( Exception e ) { log.error( e.getMessage(), e ); } finally { SQLUtils.closeConnection( con ); } } }