package net.conselldemallorca.helium.v3.core.service;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.simple.JSONArray;
import org.json.simple.JSONValue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.codahale.metrics.Counter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.Timer;
import net.conselldemallorca.helium.core.helper.DocumentHelperV3;
import net.conselldemallorca.helium.core.helper.ExpedientHelper;
import net.conselldemallorca.helium.core.helper.IndexHelper;
import net.conselldemallorca.helium.core.helper.MailHelper;
import net.conselldemallorca.helium.core.helper.MessageHelper;
import net.conselldemallorca.helium.core.helper.PermisosHelper;
import net.conselldemallorca.helium.core.helper.PluginHelper;
import net.conselldemallorca.helium.core.helper.TascaHelper;
import net.conselldemallorca.helium.core.helperv26.MesuresTemporalsHelper;
import net.conselldemallorca.helium.core.model.hibernate.DefinicioProces;
import net.conselldemallorca.helium.core.model.hibernate.Document;
import net.conselldemallorca.helium.core.model.hibernate.ExecucioMassiva;
import net.conselldemallorca.helium.core.model.hibernate.ExecucioMassiva.ExecucioMassivaTipus;
import net.conselldemallorca.helium.core.model.hibernate.ExecucioMassivaExpedient;
import net.conselldemallorca.helium.core.model.hibernate.ExecucioMassivaExpedient.ExecucioMassivaEstat;
import net.conselldemallorca.helium.core.model.hibernate.Expedient;
import net.conselldemallorca.helium.core.model.hibernate.ExpedientTipus;
import net.conselldemallorca.helium.core.model.hibernate.Persona;
import net.conselldemallorca.helium.core.util.EntornActual;
import net.conselldemallorca.helium.core.util.GlobalProperties;
import net.conselldemallorca.helium.jbpm3.integracio.JbpmHelper;
import net.conselldemallorca.helium.jbpm3.integracio.JbpmTask;
import net.conselldemallorca.helium.v3.core.api.dto.ExecucioMassivaDto;
import net.conselldemallorca.helium.v3.core.api.dto.ExpedientDocumentDto;
import net.conselldemallorca.helium.v3.core.api.dto.ExpedientTascaDto;
import net.conselldemallorca.helium.v3.core.api.dto.InstanciaProcesDto;
import net.conselldemallorca.helium.v3.core.api.dto.PermisDto;
import net.conselldemallorca.helium.v3.core.api.dto.PrincipalTipusEnumDto;
import net.conselldemallorca.helium.v3.core.api.dto.TascaDocumentDto;
import net.conselldemallorca.helium.v3.core.api.exception.ExecucioMassivaException;
import net.conselldemallorca.helium.v3.core.api.exception.NoTrobatException;
import net.conselldemallorca.helium.v3.core.api.exception.ValidacioException;
import net.conselldemallorca.helium.v3.core.api.service.ExecucioMassivaService;
import net.conselldemallorca.helium.v3.core.api.service.ExpedientService;
import net.conselldemallorca.helium.v3.core.api.service.TascaService;
import net.conselldemallorca.helium.v3.core.repository.DefinicioProcesRepository;
import net.conselldemallorca.helium.v3.core.repository.DocumentRepository;
import net.conselldemallorca.helium.v3.core.repository.ExecucioMassivaExpedientRepository;
import net.conselldemallorca.helium.v3.core.repository.ExecucioMassivaRepository;
import net.conselldemallorca.helium.v3.core.repository.ExpedientRepository;
import net.conselldemallorca.helium.v3.core.repository.ExpedientTipusRepository;
import net.conselldemallorca.helium.v3.core.repository.PersonaRepository;
/**
* Servei per a gestionar la tramitació massiva d'expedients.
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Service("execucioMassivaServiceV3")
@Transactional(noRollbackForClassName = "java.lang.Exception")
public class ExecucioMassivaServiceImpl implements ExecucioMassivaService {
@Resource
private ExecucioMassivaExpedientRepository execucioMassivaExpedientRepository;
@Resource
private DefinicioProcesRepository definicioProcesRepository;
@Resource
private ExecucioMassivaRepository execucioMassivaRepository;
@Resource
private ExpedientTipusRepository expedientTipusRepository;
@Resource
private ExpedientRepository expedientRepository;
@Resource
private DocumentRepository documentRepository;
@Resource
private PersonaRepository personaRepository;
@Resource
private ExpedientHelper expedientHelper;
@Resource
private JbpmHelper jbpmHelper;
@Resource
private TascaHelper tascaHelper;
@Resource
private MessageHelper messageHelper;
@Resource
private PluginHelper pluginHelper;
@Resource
private DocumentHelperV3 documentHelperV3;
@Autowired
private MetricRegistry metricRegistry;
@Resource
private MesuresTemporalsHelper mesuresTemporalsHelper;
@Resource
private MailHelper mailHelper;
@Resource
private IndexHelper indexHelper;
@Resource(name = "permisosHelperV3")
private PermisosHelper permisosHelper;
@Autowired
private TascaService tascaService;
@Autowired
private ExpedientService expedientService;
@Transactional
@Override
public void crearExecucioMassiva(ExecucioMassivaDto dto) {
if ((dto.getExpedientIds() != null && !dto.getExpedientIds().isEmpty()) ||
(dto.getTascaIds() != null && dto.getTascaIds().length > 0) ||
(dto.getProcInstIds() != null && !dto.getProcInstIds().isEmpty())) {
String log = "Creació d'execució massiva (dataInici=" + dto.getDataInici();
if (dto.getExpedientTipusId() != null) log += ", expedientTipusId=" + dto.getExpedientTipusId();
log += ", numExpedients=";
if (dto.getExpedientIds() != null) log += dto.getExpedientIds().size();
else if (dto.getProcInstIds() != null) log += dto.getProcInstIds().size();
else log += "0";
log += ")";
logger.debug(log);
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
ExecucioMassiva execucioMassiva = new ExecucioMassiva(
auth.getName(),
ExecucioMassivaTipus.valueOf(dto.getTipus().toString()));
if (dto.getDataInici() == null) {
execucioMassiva.setDataInici(new Date());
} else {
execucioMassiva.setDataInici(dto.getDataInici());
}
execucioMassiva.setEnviarCorreu(dto.getEnviarCorreu());
execucioMassiva.setParam1(dto.getParam1());
execucioMassiva.setParam2(dto.getParam2());
ExpedientTipus expedientTipus = null;
if (dto.getExpedientTipusId() != null) {
expedientTipus = expedientTipusRepository.findById(dto.getExpedientTipusId());
execucioMassiva.setExpedientTipus(expedientTipus);
}
int ordre = 0;
boolean expedients = false;
if (dto.getExpedientIds() != null) {
for (Long expedientId: dto.getExpedientIds()) {
Expedient expedient = expedientRepository.findOne(expedientId);
ExecucioMassivaExpedient eme = new ExecucioMassivaExpedient(
execucioMassiva,
expedient,
ordre++);
execucioMassiva.addExpedient(eme);
expedients = true;
if (expedientTipus == null && expedient != null)
expedientTipus = expedient.getTipus();
}
} else if (dto.getTascaIds() != null) {
for (String tascaId: dto.getTascaIds()) {
JbpmTask task = tascaHelper.getTascaComprovacionsTramitacio(
tascaId,
false,
false);
Expedient expedient = expedientHelper.findExpedientByProcessInstanceId(
task.getProcessInstanceId());
ExecucioMassivaExpedient eme = new ExecucioMassivaExpedient(
execucioMassiva,
expedient,
tascaId,
ordre++);
execucioMassiva.addExpedient(eme);
expedients = true;
if (expedientTipus == null && expedient != null)
expedientTipus = expedient.getTipus();
}
} else if (dto.getProcInstIds() != null) {
for (String procinstId: dto.getProcInstIds()) {
ExecucioMassivaExpedient eme = new ExecucioMassivaExpedient(
execucioMassiva,
procinstId,
ordre++);
execucioMassiva.addExpedient(eme);
expedients = true;
if (expedientTipus == null) {
Expedient expedient = expedientHelper.findExpedientByProcessInstanceId(procinstId);
if (expedient != null)
expedientTipus = expedient.getTipus();
}
}
}
execucioMassiva.setEntorn(EntornActual.getEntornId());
if (expedients) {
execucioMassiva.setRols(getRols(auth, expedientTipus));
// logger.info(">> EXEC:MASS - Parametres: ");
// logger.info(">>>>> usuari: " + execucioMassiva.getUsuari());
// logger.info(">>>>> rols: " + execucioMassiva.getRols());
// logger.info(">>>>> entorn: " + execucioMassiva.getEntorn());
// logger.info(">>>>> dat_ini: " + execucioMassiva.getDataInici());
// logger.info(">>>>> dat_fi: " + execucioMassiva.getDataFi());
// if (execucioMassiva.getExpedientTipus() != null)
// logger.info(">>>>> tip_exp: " + execucioMassiva.getExpedientTipus().getCodi());
// logger.info(">>>>> tipus: " + execucioMassiva.getTipus());
// logger.info(">>>>> env_cor: " + (execucioMassiva.getEnviarCorreu() != null ? (execucioMassiva.getEnviarCorreu() ? "SI" : "NO") : "NO"));
// logger.info(">>>>> param1: " + execucioMassiva.getParam1());
execucioMassivaRepository.save(execucioMassiva);
} else
throw new ValidacioException("S'ha intentat crear una execució massiva sense assignar expedients.");
}
}
private String getRols(Authentication auth, ExpedientTipus expedientTipus) {
String rols = "";
// Rols usuari
List<String> rolsUsuari = new ArrayList<String>();
if (auth != null && auth.getAuthorities() != null) {
for (GrantedAuthority gauth : auth.getAuthorities()) {
rolsUsuari.add(gauth.getAuthority());
}
}
// Rols tipus expedient
List<String> rolsTipusExpedient = new ArrayList<String>();
rolsTipusExpedient.add("ROLE_ADMIN");
rolsTipusExpedient.add("ROLE_USER");
rolsTipusExpedient.add("ROLE_WS");
if (expedientTipus != null) {
List<PermisDto> permisos = permisosHelper.findPermisos(
expedientTipus.getId(),
ExpedientTipus.class);
if (permisos != null)
for (PermisDto permis: permisos) {
if (PrincipalTipusEnumDto.ROL.equals(permis.getPrincipalTipus()))
rolsTipusExpedient.add(permis.getPrincipalNom());
}
}
rolsUsuari.retainAll(rolsTipusExpedient);
for (String rol : rolsUsuari) {
rols += rol + ",";
}
if (rols.length() > 0) {
rols = rols.substring(0, rols.length() - 1);
logger.info(">>> EXECUCIÓ MASSIVA - ROLS Reals: " + rols);
if (rols.length() > 2000) {
rols = rols.substring(0, 2000);
rols = rols.substring(0, rols.lastIndexOf(","));
}
} else {
rols = null;
}
logger.info(">>> EXECUCIÓ MASSIVA - ROLS Finals: " + rols);
return rols;
}
@Transactional
@Override
public void cancelarExecucio(Long id) {
ExecucioMassivaExpedient eme = null;
try {
eme = execucioMassivaExpedientRepository.findOne(id);
eme.setEstat(ExecucioMassivaEstat.ESTAT_CANCELAT);
eme.setDataFi(new Date());
execucioMassivaExpedientRepository.save(eme);
} catch (Exception ex) {
logger.error("OPERACIO:" + id + ". No s'ha pogut canviar el estat del procés", ex);
throw new ValidacioException("OPERACIO:" + id + ". No s'ha pogut canviar el estat del procés", ex);
}
}
@SuppressWarnings("unchecked")
@Transactional(readOnly = true)
@Override
public String getJsonExecucionsMassivesByUser(int results, boolean viewAll) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
int page = results < 0 ? 0 : results;
Pageable paginacio = new PageRequest(page,10, Direction.DESC, "dataInici");
List<ExecucioMassiva> execucions = null;
if (viewAll){
execucions = execucioMassivaRepository.findByEntornOrderByDataIniciDesc(EntornActual.getEntornId(), paginacio);
}else{
execucions = execucioMassivaRepository.findByUsuariAndEntornOrderByDataIniciDesc(auth.getName(), EntornActual.getEntornId(), paginacio);
}
//Recuperem els resultats
final int ID = 0;
final int ERROR = 1;
final int PENDENT = 2;
final int TOTAL = 3;
JSONArray ljson = new JSONArray();
if (!execucions.isEmpty()) {
List<Object[]> comptadorsExecucions = execucioMassivaExpedientRepository.findResultatsExecucionsMassives(execucions);
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
for (ExecucioMassiva execucio: execucions) {
Object[] comptadorTrobat = null;
for (Object[] comptadorsExecucio: comptadorsExecucions) {
if (execucio.getId().equals(comptadorsExecucio[ID])) {
comptadorTrobat = comptadorsExecucio;
break;
}
}
if (comptadorTrobat != null) {
JSONArray ljson_exp = new JSONArray();
String tasca = "";
Long id = (Long)comptadorTrobat[ID];
Long error = (Long)comptadorTrobat[ERROR];
Long pendent = (Long)comptadorTrobat[PENDENT];
Long total = (Long)comptadorTrobat[TOTAL];
Long ok = (total - error - pendent);
Map<String, Serializable> mjson = new LinkedHashMap<String, Serializable>();
mjson.put("id", id);
mjson.put("text", JSONValue.escape(getTextExecucioMassiva(execucio, tasca)));
mjson.put("error", error);
mjson.put("pendent", pendent);
mjson.put("ok", ok);
mjson.put("total", total);
mjson.put("executades", getPercent((total - pendent), total));
mjson.put("data", sdf.format(execucio.getDataInici()));
if (execucio.getDataFi() != null)
mjson.put("dataFi", sdf.format(execucio.getDataFi()));
mjson.put("tasca", tasca);
mjson.put("expedients", ljson_exp);
String nomSencer = "";
try {
nomSencer = pluginHelper.personaFindAmbCodi(execucio.getUsuari()).getNomSencer();
} catch (Exception e) {
logger.error(e);
e.printStackTrace();
}
mjson.put("usuari", nomSencer);
ljson.add(mjson);
}
}
}
String ojson = JSONValue.toJSONString(ljson);
return ojson;
}
@Override
public Object deserialize(byte[] bytes) {
Object obj = null;
if (bytes != null) {
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
try {
ObjectInputStream ois = new ObjectInputStream(bis);
obj = ois.readObject();
} catch (IOException e) {
logger.error(e);
e.printStackTrace();
} catch (ClassNotFoundException e) {
logger.error(e);
e.printStackTrace();
}
}
return obj;
}
@Override
public byte[] serialize(Object obj){
byte[] bytes = null;
if (obj != null) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(obj);
oos.flush();
oos.close();
bos.close();
} catch (IOException e) {
logger.error(e);
e.printStackTrace();
}
bytes = bos.toByteArray();
}
return bytes;
}
@SuppressWarnings("unchecked")
@Transactional(readOnly = true)
@Override
public String getExecucioMassivaDetall(Long execucioMassivaId) {
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
ExecucioMassiva execucio = execucioMassivaRepository.findOne(execucioMassivaId);
if (execucio == null)
throw new NoTrobatException(ExecucioMassiva.class, execucioMassivaId);
List<ExecucioMassivaExpedient> expedients = execucio.getExpedients();
JSONArray ljson_exp = new JSONArray();
String tasca = "";
Long success = 0L;
Long danger = 0L;
Long pendent = 0L;
if (!expedients.isEmpty()) {
ExecucioMassivaExpedient em = expedients.get(0);
if (em.getTascaId() != null) {
JbpmTask task = jbpmHelper.getTaskById(em.getTascaId());
if (task != null){
if (task.isCacheActiu())
tasca = task.getFieldFromDescription("titol");
else
tasca = task.getTaskName();
}
}
for (ExecucioMassivaExpedient expedient: expedients) {
Expedient exp = expedient.getExpedient();
String titol = "";
if (exp != null) {
if (exp.getNumero() != null)
titol = "[" + exp.getNumero() + "]";
if (exp.getTitol() != null)
titol += (titol.length() > 0 ? " " : "") + exp.getTitol();
if (titol.length() == 0)
titol = exp.getNumeroDefault();
} else {
titol = messageHelper.getMessage("expedient.massiva.actualitzar.dp") + " " + expedient.getExecucioMassiva().getParam1();
}
Map<String, Object> mjson_exp = new LinkedHashMap<String, Object>();
mjson_exp.put("id", expedient.getId());
mjson_exp.put("titol", titol);
mjson_exp.put("estat", expedient.getEstat().name());
if (expedient.getDataFi() != null){
mjson_exp.put("dataFi", sdf.format(expedient.getDataFi()));
}
String error = expedient.getError();
if (error != null) {
error = error.replace("'", "’").replace("\"", "“");
danger++;
} else if (expedient.getDataFi() == null && ExecucioMassivaEstat.ESTAT_PENDENT.equals(expedient.getEstat())){
pendent++;
} else {
success++;
}
mjson_exp.put("error", JSONValue.escape(error));
ljson_exp.add(mjson_exp);
}
}
Map<String, Serializable> mjson = new LinkedHashMap<String, Serializable>();
mjson.put("id", execucio.getId());
mjson.put("text", JSONValue.escape(getTextExecucioMassiva(execucio, tasca)));
long total = (long) expedients.size();
mjson.put("error", danger);
mjson.put("pendent", pendent);
mjson.put("ok", success);
mjson.put("total", total);
mjson.put("data", sdf.format(execucio.getDataInici()));
mjson.put("executades", getPercent((total - pendent), total));
if (execucio.getDataFi() != null) {
mjson.put("dataFi", sdf.format(execucio.getDataFi()));
}
mjson.put("tasca", tasca);
mjson.put("expedients", ljson_exp);
String nomSencer = "";
nomSencer = pluginHelper.personaFindAmbCodi(execucio.getUsuari()).getNomSencer();
mjson.put("usuari", nomSencer);
String ojson = JSONValue.toJSONString(mjson);
return ojson;
}
@Transactional(readOnly = true)
private DefinicioProces getDefinicioProces(ExecucioMassiva exe) {
DefinicioProces definicioProces = null;
try {
Object obj = (Object)deserialize(exe.getParam2());
Long dfId = null;
if (obj instanceof Long) {
dfId = (Long)obj;
} else {
Object[] arobj = (Object[]) deserialize(exe.getParam2());
if (arobj[0] instanceof Long) {
dfId = (Long)arobj[0];
}
}
if (dfId != null)
definicioProces = definicioProcesRepository.findById(dfId);
} catch (Exception ex) {
logger.error("OPERACIO:" + exe.getId() + ". No s'ha pogut obtenir la definicioProces del procés", ex);
}
return definicioProces;
}
private String getTextExecucioMassiva(ExecucioMassiva execucioMassiva, String tasca) {
String label = null;
ExecucioMassivaTipus tipus = execucioMassiva.getTipus();
if (tipus.equals(ExecucioMassivaTipus.EXECUTAR_TASCA)){
label = messageHelper.getMessage("expedient.massiva.tasca") + " " + tasca + ": ";
String param = execucioMassiva.getParam1();
Object param2 = deserialize(execucioMassiva.getParam2());
if (param.equals("Guardar")) {
label += messageHelper.getMessage("expedient.massiva.tasca.guardar");
} else if (param.equals("Validar")) {
label += messageHelper.getMessage("expedient.massiva.tasca.validar");
} else if (param.equals("Completar")) {
label += messageHelper.getMessage("expedient.massiva.tasca.completar");
} else if (param.equals("Restaurar")) {
label += messageHelper.getMessage("expedient.massiva.tasca.restaurar");
} else if (param.equals("Accio")) {
label += messageHelper.getMessage("expedient.massiva.tasca.accio") + (param2 == null ? "" : " ‘" + ((Object[])param2)[1] + "’");
} else if (param.equals("DocGuardar")) {
label += messageHelper.getMessage("expedient.massiva.tasca.doc.guardar") + (param2 == null ? "" : " ‘'" + ((Object[])param2)[1] + "’");
} else if (param.equals("DocEsborrar")) {
label += messageHelper.getMessage("expedient.massiva.tasca.doc.borrar") + (param2 == null ? "" : " ‘" + ((Object[])param2)[1] + "’");
} else if (param.equals("DocGenerar")) {
label += messageHelper.getMessage("expedient.massiva.tasca.doc.generar") + (param2 == null ? "" : " ‘'" + ((Object[])param2)[1] + "’");
} else if (param.equals("RegEsborrar")) {
label += messageHelper.getMessage("expedient.massiva.tasca.reg.borrar") + (param2 == null ? "" : " ‘" + ((Object[])param2)[1] + "’");
} else if (param.equals("RegGuardar")) {
label += messageHelper.getMessage("expedient.massiva.tasca.reg.guardar") + (param2 == null ? "" : " ‘" + ((Object[])param2)[1] + "’");
}
} else if (tipus.equals(ExecucioMassivaTipus.ACTUALITZAR_VERSIO_DEFPROC)){
if (execucioMassiva.getExpedientTipus() == null && execucioMassiva.getParam1() != null) {
String versio = "";
try { versio += (Integer)deserialize(execucioMassiva.getParam2()); } catch (Exception e){}
label = messageHelper.getMessage("expedient.massiva.actualitzar") + " (" + execucioMassiva.getParam1() + " v." + versio + ")";
} else {
DefinicioProces definicioProces = getDefinicioProces(execucioMassiva);
label = messageHelper.getMessage("expedient.massiva.actualitzar") + (definicioProces == null ? "" : " (" + definicioProces.getJbpmKey() + " v." + definicioProces.getVersio() + ")");
}
} else if (tipus.equals(ExecucioMassivaTipus.EXECUTAR_SCRIPT)){
String script = "";
if (execucioMassiva.getParam2() != null) {
try {
Object param2 = deserialize(execucioMassiva.getParam2());
if (param2 instanceof Object[]) {
script = (String)((Object[])param2)[0];
} else if (param2 instanceof String) {
script = (String)param2;
} else {
script = param2.toString();
}
script = script.replace("'", "'").replace("\"", """);
} catch (Exception ex) {
logger.error("OPERACIO:" + execucioMassiva.getId() + ". No s'ha pogut obtenir la operació", ex);
}
}
//String script = ((String) deserialize(execucioMassiva.getParam2())).replace("'", "'").replace("\"", """);
label = messageHelper.getMessage("expedient.massiva.executarScriptMas") + " " + (script.length() > 20 ? script.substring(0,20) : script);
} else if (tipus.equals(ExecucioMassivaTipus.EXECUTAR_ACCIO)){
String accio = "";
if (execucioMassiva.getParam2() != null) {
try {
Object param2 = deserialize(execucioMassiva.getParam2());
if (param2 instanceof Object[]) {
accio = (String)((Object[])param2)[0];
} else {
accio = (String) param2;
}
} catch (Exception ex) {
logger.error("OPERACIO:" + execucioMassiva.getId() + ". No s'ha pogut obtenir la operació", ex);
}
}
label = messageHelper.getMessage("expedient.massiva.accions") + " " + accio;
} else if (tipus.equals(ExecucioMassivaTipus.ATURAR_EXPEDIENT)){
String motiu = ((String) deserialize(execucioMassiva.getParam2()));
label = messageHelper.getMessage("expedient.massiva.aturar")+ (motiu == null ? "" : ": "+ (motiu.length() > 20 ? motiu.substring(0,20) : motiu));
} else if (tipus.equals(ExecucioMassivaTipus.MODIFICAR_VARIABLE)){
label = messageHelper.getMessage("expedient.massiva.modificar_variables") + " " + execucioMassiva.getParam1();
} else if (tipus.equals(ExecucioMassivaTipus.MODIFICAR_DOCUMENT)){
label = messageHelper.getMessage("expedient.massiva.documents");
} else if (tipus.equals(ExecucioMassivaTipus.REINDEXAR)){
label = messageHelper.getMessage("expedient.eines.reindexar.expedients");
} else if (tipus.equals(ExecucioMassivaTipus.BUIDARLOG)){
label = messageHelper.getMessage("expedient.eines.buidarlog.expedients");
} else if (tipus.equals(ExecucioMassivaTipus.REPRENDRE_EXPEDIENT)){
label = messageHelper.getMessage("expedient.eines.reprendre_expedient");
} else if (tipus.equals(ExecucioMassivaTipus.REASSIGNAR)){
label = messageHelper.getMessage("expedient.eines.reassignar.expedients");
} else {
label = tipus.name();
}
return label;
}
@Override
public Long getExecucionsMassivesActiva(Long ultimaExecucioMassiva) {
Date ara = new Date();
Long execucioMassivaExpedientId = null;
Boolean nextFound = false;
if (ultimaExecucioMassiva != null) {
Long nextMassiu = execucioMassivaRepository.getNextMassiu(ultimaExecucioMassiva, ara);
if (nextMassiu != null) {
nextFound = true;
execucioMassivaExpedientId = execucioMassivaExpedientRepository.findNextExecucioMassivaExpedient(nextMassiu);
}
}
if (execucioMassivaExpedientId == null && !nextFound)
execucioMassivaExpedientId = execucioMassivaExpedientRepository.findExecucioMassivaExpedientId(ara);
if (execucioMassivaExpedientId == null) {
// Comprobamos si es una ejecución masiva sin expedientes asociados. En ese caso actualizamos la fecha de fin
Long mas = execucioMassivaRepository.getMinExecucioMassiva(ara);
if (mas != null) {
ExecucioMassiva massiva = execucioMassivaRepository.findOne(mas);
if (massiva != null) {
massiva.setDataFi(new Date());
execucioMassivaRepository.saveAndFlush(massiva);
}
}
}
return execucioMassivaExpedientId;
}
@Override
public void executarExecucioMassiva(Long ome_id) {
ExecucioMassivaExpedient ome = execucioMassivaExpedientRepository.findOne(ome_id);
if (ome == null)
throw new NoTrobatException(ExecucioMassivaExpedient.class, ome_id);
Expedient expedient;
if (ome.getExpedient() != null) {
expedient = ome.getExpedient();
} else {
expedient = expedientHelper.findExpedientByProcessInstanceId(ome.getProcessInstanceId());
}
logger.debug(
"Executant la acció massiva (" +
"expedientTipusId=" + expedient.getTipus() + ", " +
"dataInici=" + ome.getDataInici() + ", " +
"expedient=" + ome.getId() + ", " +
"acció=" + ome.getExecucioMassiva().getTipus());
final Timer timerTotal = metricRegistry.timer(
MetricRegistry.name(
ExecucioMassivaService.class,
"executar"));
final Timer.Context contextTotal = timerTotal.time();
Counter countTotal = metricRegistry.counter(
MetricRegistry.name(
ExecucioMassivaService.class,
"executar.count"));
countTotal.inc();
final Timer timerEntorn = metricRegistry.timer(
MetricRegistry.name(
ExecucioMassivaService.class,
"executar",
expedient.getEntorn().getCodi()));
final Timer.Context contextEntorn = timerEntorn.time();
Counter countEntorn = metricRegistry.counter(
MetricRegistry.name(
ExecucioMassivaService.class,
"executar.count",
expedient.getEntorn().getCodi()));
countEntorn.inc();
final Timer timerTipexp = metricRegistry.timer(
MetricRegistry.name(
ExecucioMassivaService.class,
"completar",
expedient.getEntorn().getCodi(),
expedient.getTipus().getCodi()));
final Timer.Context contextTipexp = timerTipexp.time();
Counter countTipexp = metricRegistry.counter(
MetricRegistry.name(
ExecucioMassivaService.class,
"completar.count",
expedient.getEntorn().getCodi(),
expedient.getTipus().getCodi()));
countTipexp.inc();
try {
ExecucioMassivaTipus tipus = ome.getExecucioMassiva().getTipus();
Authentication orgAuthentication = SecurityContextHolder.getContext().getAuthentication();
// final String user = ome.getExecucioMassiva().getUsuari();
// Principal principal = new Principal() {
// public String getName() {
// return user;
// }
// };
Authentication authentication = new UsernamePasswordAuthenticationToken (
ome.getExecucioMassiva().getAuthenticationPrincipal(),
"N/A", // ome.getExecucioMassiva().getAuthenticationCredentials(),
ome.getExecucioMassiva().getAuthenticationRoles());
SecurityContextHolder.getContext().setAuthentication(authentication);
String expedient_s = null;
if (MesuresTemporalsHelper.isActiu())
expedient_s = expedient.getTipus().getNom();
if (tipus == ExecucioMassivaTipus.EXECUTAR_TASCA){
gestioTasca(ome);
} else if (tipus == ExecucioMassivaTipus.ACTUALITZAR_VERSIO_DEFPROC){
mesuresTemporalsHelper.mesuraIniciar("Actualitzar", "massiva", expedient_s);
actualitzarVersio(ome);
mesuresTemporalsHelper.mesuraCalcular("Actualitzar", "massiva", expedient_s);
} else if (tipus == ExecucioMassivaTipus.EXECUTAR_SCRIPT){
mesuresTemporalsHelper.mesuraIniciar("Executar script", "massiva", expedient_s);
executarScript(ome);
mesuresTemporalsHelper.mesuraCalcular("Executar script", "massiva", expedient_s);
} else if (tipus == ExecucioMassivaTipus.EXECUTAR_ACCIO){
mesuresTemporalsHelper.mesuraIniciar("Executar accio", "massiva", expedient_s);
executarAccio(ome);
mesuresTemporalsHelper.mesuraCalcular("Executar accio", "massiva", expedient_s);
} else if (tipus == ExecucioMassivaTipus.ATURAR_EXPEDIENT){
mesuresTemporalsHelper.mesuraIniciar("Aturar expedient", "massiva", expedient_s);
aturarExpedient(ome);
mesuresTemporalsHelper.mesuraCalcular("Aturar expedient", "massiva", expedient_s);
} else if (tipus == ExecucioMassivaTipus.MODIFICAR_VARIABLE){
mesuresTemporalsHelper.mesuraIniciar("Modificar variable", "massiva", expedient_s);
modificarVariable(ome);
mesuresTemporalsHelper.mesuraCalcular("Modificar variable", "massiva", expedient_s);
} else if (tipus == ExecucioMassivaTipus.MODIFICAR_DOCUMENT){
mesuresTemporalsHelper.mesuraIniciar("Modificar document", "massiva", expedient_s);
modificarDocument(ome);
mesuresTemporalsHelper.mesuraCalcular("Modificar document", "massiva", expedient_s);
} else if (tipus == ExecucioMassivaTipus.REINDEXAR){
mesuresTemporalsHelper.mesuraIniciar("Reindexar", "massiva", expedient_s);
reindexarExpedient(ome);
mesuresTemporalsHelper.mesuraCalcular("Reindexar", "massiva", expedient_s);
} else if (tipus == ExecucioMassivaTipus.BUIDARLOG){
mesuresTemporalsHelper.mesuraIniciar("Buidar log", "massiva", expedient_s);
buidarLogExpedient(ome);
mesuresTemporalsHelper.mesuraCalcular("Buidar log", "massiva", expedient_s);
} else if (tipus == ExecucioMassivaTipus.REPRENDRE_EXPEDIENT){
mesuresTemporalsHelper.mesuraIniciar("desfer fi process instance", "massiva", expedient_s);
reprendreExpedient(ome);
mesuresTemporalsHelper.mesuraCalcular("desfer fi process instance", "massiva", expedient_s);
} else if (tipus == ExecucioMassivaTipus.REPRENDRE){
mesuresTemporalsHelper.mesuraIniciar("reprendre tramitació process instance", "massiva", expedient_s);
reprendreTramitacio(ome);
mesuresTemporalsHelper.mesuraCalcular("reprendre tramitació process instance", "massiva", expedient_s);
} else if (tipus == ExecucioMassivaTipus.REASSIGNAR){
mesuresTemporalsHelper.mesuraIniciar("Reassignar", "massiva", expedient_s);
//reassignarExpedient(ome);
reassignarTasca(ome);
mesuresTemporalsHelper.mesuraCalcular("Reassignar", "massiva", expedient_s);
}
SecurityContextHolder.getContext().setAuthentication(orgAuthentication);
} catch (Exception ex) {
logger.error("Error al executar la acció massiva (expedientTipusId=" + expedient.getTipus() + ", dataInici=" + ome.getDataInici() + ", expedient=" + expedient.getId() + ", acció=" + ome, ex);
TascaProgramadaServiceImpl.saveError(ome_id, ex);
throw new ExecucioMassivaException(
expedient.getEntorn().getId(),
expedient.getEntorn().getCodi(),
expedient.getEntorn().getNom(),
expedient.getId(),
expedient.getTitol(),
expedient.getNumero(),
expedient.getTipus().getId(),
expedient.getTipus().getCodi(),
expedient.getTipus().getNom(),
ome.getExecucioMassiva().getId(),
ome.getId(),
"Error al executar la acció massiva",
ex);
} finally {
contextTotal.stop();
contextEntorn.stop();
contextTipexp.stop();
}
}
@Override
public void actualitzaUltimaOperacio(Long ome_id) {
ExecucioMassivaExpedient ome = execucioMassivaExpedientRepository.findOne(ome_id);
if (ome == null)
throw new NoTrobatException(ExecucioMassivaExpedient.class, ome_id);
if(ome.getExecucioMassiva().getExpedients().size() == ome.getOrdre() + 1) {
try {
ExecucioMassiva em = ome.getExecucioMassiva();
em.setDataFi(new Date());
execucioMassivaRepository.save(em);
} catch (Exception ex) {
logger.error("EXPEDIENTMASSIU:" + ome.getExecucioMassiva().getId() + ". No s'ha pogut finalitzar l'expedient massiu", ex);
throw new ExecucioMassivaException(
ome.getExpedient().getEntorn().getId(),
ome.getExpedient().getEntorn().getCodi(),
ome.getExpedient().getEntorn().getNom(),
ome.getExpedient().getId(),
ome.getExpedient().getTitol(),
ome.getExpedient().getNumero(),
ome.getExpedient().getTipus().getId(),
ome.getExpedient().getTipus().getCodi(),
ome.getExpedient().getTipus().getNom(),
ome.getExecucioMassiva().getId(),
ome.getId(),
"EXPEDIENTMASSIU: No s'ha pogut finalitzar l'expedient massiu",
ex);
}
try {
if (ome.getExecucioMassiva().getEnviarCorreu()) {
// Correu
List<String> emailAddresses = new ArrayList<String>();
Persona persona = personaRepository.findByCodi(ome.getExecucioMassiva().getUsuari());
emailAddresses.add(persona.getEmail());
mailHelper.send(
GlobalProperties.getInstance().getProperty("app.correu.remitent"),
emailAddresses,
null,
null,
"Execució massiva",
"L'execució massiva ha finalitzat.");
}
} catch (Exception ex) {
logger.error("EXPEDIENTMASSIU: No s'ha pogut enviar el correu de finalització", ex);
throw new ExecucioMassivaException(
ome.getExpedient().getEntorn().getId(),
ome.getExpedient().getEntorn().getCodi(),
ome.getExpedient().getEntorn().getNom(),
ome.getExpedient().getId(),
ome.getExpedient().getTitol(),
ome.getExpedient().getNumero(),
ome.getExpedient().getTipus().getId(),
ome.getExpedient().getTipus().getCodi(),
ome.getExpedient().getTipus().getNom(),
ome.getExecucioMassiva().getId(),
ome.getId(),
"EXPEDIENTMASSIU: No s'ha pogut enviar el correu de finalització",
ex);
}
}
}
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void generaInformeError(Long ome_id, String error) {
ExecucioMassivaExpedient ome = execucioMassivaExpedientRepository.findOne(ome_id);
if (ome == null)
throw new NoTrobatException(ExecucioMassivaExpedient.class, ome_id);
Date ara = new Date();
ome.setDataInici(new Date());
ome.setDataFi(ara);
ome.setEstat(ExecucioMassivaEstat.ESTAT_ERROR);
ome.setError(error);
execucioMassivaExpedientRepository.save(ome);
}
@SuppressWarnings("unchecked")
private void gestioTasca(ExecucioMassivaExpedient ome) {
String tascaId = ome.getTascaId();
String accio = ome.getExecucioMassiva().getParam1();
String tasca = null;
String expedient = null;
if (MesuresTemporalsHelper.isActiu()) {
ExpedientTascaDto task = tascaService.findAmbIdPerTramitacio(tascaId);
if (task != null) tasca = task.getTascaNom();
expedient = ome.getExpedient().getTipus().getNom();
}
try {
ome.setDataInici(new Date());
if ("Guardar".equals(accio)) {
mesuresTemporalsHelper.mesuraIniciar("Guardar", "massiva_tasca", expedient, tasca);
Object[] param2 = (Object[])deserialize(ome.getExecucioMassiva().getParam2());
Map<String, Object> valors = (Map<String, Object>)param2[1];
tascaService.guardar(tascaId, valors);
mesuresTemporalsHelper.mesuraCalcular("Guardar", "massiva_tasca", expedient, tasca);
} else if ("Validar".equals(accio)) {
mesuresTemporalsHelper.mesuraIniciar("Validar", "massiva_tasca", expedient, tasca);
Object[] param2 = (Object[])deserialize(ome.getExecucioMassiva().getParam2());
Map<String, Object> valors = (Map<String, Object>)param2[1];
tascaService.validar(tascaId, valors);
mesuresTemporalsHelper.mesuraCalcular("Validar", "massiva_tasca", expedient, tasca);
} else if ("Completar".equals(accio)) {
mesuresTemporalsHelper.mesuraIniciar("Completar", "massiva_tasca", expedient, tasca);
Object[] param2 = (Object[])deserialize(ome.getExecucioMassiva().getParam2());
Long entornId = (Long)param2[0];
String transicio = (String)param2[1];
Long ea = EntornActual.getEntornId();
EntornActual.setEntornId(entornId);
tascaService.completar(tascaId, transicio);
EntornActual.setEntornId(ea);
mesuresTemporalsHelper.mesuraCalcular("Completar", "massiva_tasca", expedient, tasca);
} else if ("Restaurar".equals(accio)) {
mesuresTemporalsHelper.mesuraIniciar("Restaurar", "massiva_tasca", expedient, tasca);
tascaService.restaurar(tascaId);
mesuresTemporalsHelper.mesuraCalcular("Restaurar", "massiva_tasca", expedient, tasca);
} else if ("Accio".equals(accio)) {
mesuresTemporalsHelper.mesuraIniciar("Executar accio", "massiva_tasca", expedient, tasca);
Object[] param2 = (Object[])deserialize(ome.getExecucioMassiva().getParam2());
String accio_exec = (String)param2[1];
tascaService.executarAccio(tascaId, accio_exec);
mesuresTemporalsHelper.mesuraCalcular("Executar accio", "massiva_tasca", expedient, tasca);
} else if ("DocGuardar".equals(accio)) {
mesuresTemporalsHelper.mesuraIniciar("Guardar document", "massiva_tasca", expedient, tasca);
Object[] param2 = (Object[])deserialize(ome.getExecucioMassiva().getParam2());
Long entornId = (Long)param2[0];
String codi = (String)param2[1];
Date data = (Date)param2[2];
byte[] contingut = (byte[])param2[3];
String nomArxiu = (String)param2[4];
if (tascaService.isTascaValidada(tascaId)) {
tascaService.guardarDocumentTasca(entornId, tascaId, codi, data, nomArxiu, contingut, ome.getExecucioMassiva().getUsuari());
} else {
throw new ValidacioException("OPERACIO:" + ome.getId() + ". No s'ha pogut guardar el document a la tasca. Perquè la tasca no està validada");
}
mesuresTemporalsHelper.mesuraCalcular("Guardar document", "massiva_tasca", expedient, tasca);
} else if ("DocEsborrar".equals(accio)) {
mesuresTemporalsHelper.mesuraIniciar("Esborrar document", "massiva_tasca", expedient, tasca);
Object[] param2 = (Object[])deserialize(ome.getExecucioMassiva().getParam2());
String codi = (String)param2[1];
if (tascaService.isTascaValidada(tascaId)) {
tascaService.esborrarDocument(tascaId, codi, ome.getExecucioMassiva().getUsuari());
} else {
throw new ValidacioException("OPERACIO:" + ome.getId() + ". No s'ha pogut esborrar el document a la tasca perquè la tasca no està validada");
}
mesuresTemporalsHelper.mesuraCalcular("Esborrar document", "massiva_tasca", expedient, tasca);
} else if ("DocGenerar".equals(accio)) {
mesuresTemporalsHelper.mesuraIniciar("Generar document", "massiva_tasca", expedient, tasca);
Object[] param2 = (Object[])deserialize(ome.getExecucioMassiva().getParam2());
Long documentId = (Long)param2[1];
TascaDocumentDto document = tascaService.findDocument(tascaId, documentId);
expedientService.generarDocumentAmbPlantillaTasca(tascaId, document.getDocumentCodi());
mesuresTemporalsHelper.mesuraCalcular("Generar document", "massiva_tasca", expedient, tasca);
}
ome.setEstat(ExecucioMassivaEstat.ESTAT_FINALITZAT);
ome.setDataFi(new Date());
execucioMassivaExpedientRepository.save(ome);
} catch (Exception ex) {
logger.error("OPERACIO:" + ome.getId() + ". No s'ha pogut executar '" + accio + "' de la tasca.", ex);
throw new ExecucioMassivaException(
ome.getExpedient().getEntorn().getId(),
ome.getExpedient().getEntorn().getCodi(),
ome.getExpedient().getEntorn().getNom(),
ome.getExpedient().getId(),
ome.getExpedient().getTitol(),
ome.getExpedient().getNumero(),
ome.getExpedient().getTipus().getId(),
ome.getExpedient().getTipus().getCodi(),
ome.getExpedient().getTipus().getNom(),
ome.getExecucioMassiva().getId(),
ome.getId(),
"OPERACIO:" + ome.getId() + ". No s'ha pogut executar '" + accio + "' de la tasca.",
ex);
}
}
private void actualitzarVersio(ExecucioMassivaExpedient ome) throws Exception {
try {
ome.setDataInici(new Date());
if (ome.getExpedient() != null) {
Expedient exp = ome.getExpedient();
Object[] param2 = (Object[])deserialize(ome.getExecucioMassiva().getParam2());
// Proces principal
Long definicioProcesId = (Long)param2[0];
Long expedientProcesInstanceId = Long.parseLong(exp.getProcessInstanceId());
InstanciaProcesDto instanciaProces = expedientService.getInstanciaProcesById(exp.getProcessInstanceId());
DefinicioProces definicioProces = definicioProcesRepository.findOne(definicioProcesId);
int versioActual = instanciaProces.getDefinicioProces().getVersio();
int versioNova = definicioProces.getVersio();
if (versioActual != versioNova)
expedientService.procesDefinicioProcesActualitzar(exp.getProcessInstanceId(), definicioProces.getVersio());
// Subprocessos
Long[] subProcesIds = (Long[])param2[1];
if (subProcesIds != null) {
String[] keys = (String[])param2[2];
List<InstanciaProcesDto> arbreProcessos = expedientService.getArbreInstanciesProces(expedientProcesInstanceId);
for (InstanciaProcesDto ip : arbreProcessos) {
int versio = findVersioDefProcesActualitzar(keys, subProcesIds, ip.getDefinicioProces().getJbpmKey());
if (versio != -1 && versio != ip.getDefinicioProces().getVersio())
expedientService.procesDefinicioProcesActualitzar(ip.getId(), versio);
}
}
} else {
Integer versio = (Integer)deserialize(ome.getExecucioMassiva().getParam2());
Expedient expedient = expedientHelper.findExpedientByProcessInstanceId(ome.getProcessInstanceId());
ome.setExpedient(expedient);
expedientService.procesDefinicioProcesActualitzar(ome.getProcessInstanceId(), versio);
}
ome.setEstat(ExecucioMassivaEstat.ESTAT_FINALITZAT);
ome.setDataFi(new Date());
execucioMassivaExpedientRepository.save(ome);
} catch (Exception ex) {
logger.error("OPERACIO:" + ome.getId() + ". No s'ha pogut canviar la versió del procés", ex);
throw ex;
}
}
private int findVersioDefProcesActualitzar(String[] keys, Long[] defProces, String key) {
int versio = -1;
int i = 0;
while (i < keys.length && !keys[i].equals(key))
i++;
if (i < keys.length && defProces[i] != null) {
DefinicioProces definicioProces = definicioProcesRepository.findOne(defProces[i]);
if (definicioProces != null)
versio = definicioProces.getVersio();
}
return versio;
}
private void executarScript(ExecucioMassivaExpedient ome) throws Exception {
Expedient exp = ome.getExpedient();
try {
ome.setDataInici(new Date());
Object param2 = deserialize(ome.getExecucioMassiva().getParam2());
String script = "";
if (param2 instanceof Object[]) {
script = (String)((Object[])param2)[0];
} else {
script = (String)param2;
}
expedientService.procesScriptExec(
exp.getId(),
exp.getProcessInstanceId(),
script);
ome.setEstat(ExecucioMassivaEstat.ESTAT_FINALITZAT);
ome.setDataFi(new Date());
execucioMassivaExpedientRepository.save(ome);
} catch (Exception ex) {
logger.error("OPERACIO:" + ome.getId() + ". No s'ha pogut executar l'script", ex);
throw ex;
}
}
private void executarAccio(ExecucioMassivaExpedient ome) throws Exception {
Expedient exp = ome.getExpedient();
try {
ome.setDataInici(new Date());
Object param2 = deserialize(ome.getExecucioMassiva().getParam2());
Long accioId;
if (param2 instanceof Object[]) {
accioId = (Long)((Object[])param2)[0];
} else {
accioId = (Long)param2;
}
expedientService.accioExecutar(exp.getId(), exp.getProcessInstanceId(), accioId);
ome.setEstat(ExecucioMassivaEstat.ESTAT_FINALITZAT);
ome.setDataFi(new Date());
execucioMassivaExpedientRepository.save(ome);
} catch (Exception ex) {
logger.error("OPERACIO:" + ome.getId() + ". No s'ha pogut executar l'accio", ex);
throw ex;
}
}
private void aturarExpedient(ExecucioMassivaExpedient ome) throws Exception {
Expedient exp = ome.getExpedient();
try {
ome.setDataInici(new Date());
String motiu = (ome.getExecucioMassiva().getParam2() == null ? null : (String)deserialize(ome.getExecucioMassiva().getParam2()));
if (!exp.isAturat()) {
expedientService.aturar(exp.getId(), motiu);
ome.setEstat(ExecucioMassivaEstat.ESTAT_FINALITZAT);
} else {
ome.setError( messageHelper.getMessage("error.expedient.ja.aturat"));
ome.setEstat(ExecucioMassivaEstat.ESTAT_ERROR);
}
ome.setDataFi(new Date());
execucioMassivaExpedientRepository.save(ome);
} catch (Exception ex) {
logger.error("OPERACIO:" + ome.getId() + ". No s'ha pogut aturar l'expedient", ex);
throw ex;
}
}
private void modificarVariable(ExecucioMassivaExpedient ome) throws Exception {
Expedient exp = ome.getExpedient();
try {
ome.setDataInici(new Date());
String var = ome.getExecucioMassiva().getParam1();
Object[] params = (Object[])deserialize(ome.getExecucioMassiva().getParam2());
String idPI = exp.getProcessInstanceId();
if (idPI != null) {
expedientService.updateVariable(exp.getId(), idPI, var, params[2]);
} else {
tascaService.updateVariable(exp.getId(), (String)params[1], var, params[2]);
}
ome.setEstat(ExecucioMassivaEstat.ESTAT_FINALITZAT);
ome.setDataFi(new Date());
execucioMassivaExpedientRepository.save(ome);
} catch (Exception ex) {
logger.error("OPERACIO:" + ome.getId() + ". No s'ha pogut modificat la variable", ex);
throw ex;
}
}
private void modificarDocument(ExecucioMassivaExpedient ome) throws Exception {
Expedient exp = ome.getExpedient();
try {
ome.setDataInici(new Date());
String fileName = ome.getExecucioMassiva().getParam1();
// Paràmetres
Object[] params = (Object[])deserialize(ome.getExecucioMassiva().getParam2());
Date data = null;
String nom = null;
byte[] contingut = null;
Long docId = null;
if (params[0] != null) docId = (Long)params[0];
if (params[1] != null) data = (Date)params[1];
if (params[2] != null) nom = (String)params[2];
if (params[3] != null) contingut = (byte[])params[3];
Document aux = null;
ExpedientDocumentDto doc = null;
if (docId != null) {
aux = documentRepository.findOne(docId);
doc = documentHelperV3.findDocumentPerInstanciaProces(exp.getProcessInstanceId(), null, aux.getCodi());
}
if (contingut == null) {
// Autogenerar
if (nom.equals("generate")) {
mesuresTemporalsHelper.mesuraIniciar("Autogenerar document", "massiva", exp.getTipus().getNom());
if (doc == null || (!doc.isSignat() && !doc.isRegistrat())) {
expedientService.generarDocumentAmbPlantillaProces(exp.getId(), exp.getProcessInstanceId(), aux.getCodi());
} else if (doc.isSignat()) {
throw new Exception("Document signat: no es pot modificar");
} else if (doc.isRegistrat()) {
throw new Exception("Document registrat: no es pot modificar");
}
mesuresTemporalsHelper.mesuraCalcular("Autogenerar document", "massiva", exp.getTipus().getNom());
// Esborrar
} else if (nom.equals("delete")) {
mesuresTemporalsHelper.mesuraIniciar("Esborrar document", "massiva", exp.getTipus().getNom());
if (doc == null) {
throw new Exception("Document inexistent: no es pot esborrar");
} else if (!doc.isSignat() && !doc.isRegistrat()) {
documentHelperV3.esborrarDocument(null, exp.getProcessInstanceId(), aux.getCodi());
} else if (doc.isSignat()) {
throw new Exception("Document signat: no es pot esborrar");
} else if (doc.isRegistrat()) {
throw new Exception("Document registrat: no es pot esborrar");
}
mesuresTemporalsHelper.mesuraCalcular("Esborrar document", "massiva", exp.getTipus().getNom());
// Modificar data
} else if (nom.equals("date")) {
mesuresTemporalsHelper.mesuraIniciar("Canviar data de document", "massiva", exp.getTipus().getNom());
if (doc == null) {
throw new Exception("Document inexistent: no es pot modificar");
} else if (!doc.isSignat() && !doc.isRegistrat()) {
expedientService.crearModificarDocument(
exp.getId(),
exp.getProcessInstanceId(),
null,
doc.getDocumentNom(),
doc.getArxiuNom(),
docId,
null,
data);
} else if (doc.isSignat()) {
throw new Exception("Document signat: no es pot modificar");
} else if (doc.isRegistrat()) {
throw new Exception("Document registrat: no es pot modificar");
}
mesuresTemporalsHelper.mesuraCalcular("Canviar data de document", "massiva", exp.getTipus().getNom());
}
} else {
// Adjuntar document
if (docId == null) {
mesuresTemporalsHelper.mesuraIniciar("Adjuntar document", "massiva", exp.getTipus().getNom());
expedientService.crearModificarDocument(
exp.getId(),
exp.getProcessInstanceId(),
null,
nom,
fileName,
null,
contingut,
data);
mesuresTemporalsHelper.mesuraCalcular("Adjuntar document", "massiva", exp.getTipus().getNom());
// Modificar document
} else {
mesuresTemporalsHelper.mesuraIniciar("Modificar document", "massiva", exp.getTipus().getNom());
if (doc == null || (!doc.isSignat() && !doc.isRegistrat())) {
expedientService.crearModificarDocument(
exp.getId(),
exp.getProcessInstanceId(),
null,
nom,
fileName,
docId,
contingut,
data);
} else if (doc.isSignat()) {
throw new Exception("Document signat: no es pot modificar");
} else if (doc.isRegistrat()) {
throw new Exception("Document registrat: no es pot modificar");
}
mesuresTemporalsHelper.mesuraCalcular("Modificar document", "massiva", exp.getTipus().getNom());
}
}
ome.setEstat(ExecucioMassivaEstat.ESTAT_FINALITZAT);
ome.setDataFi(new Date());
execucioMassivaExpedientRepository.save(ome);
} catch (Exception ex) {
logger.error("OPERACIO:" + ome.getId() + ". No s'ha pogut modificar el document", ex);
throw ex;
}
}
private void reindexarExpedient(ExecucioMassivaExpedient ome) throws Exception {
Expedient exp = ome.getExpedient();
try {
ome.setDataInici(new Date());
indexHelper.expedientIndexLuceneUpdate(exp.getProcessInstanceId());
// expedientService.luceneReindexarExpedient(exp.getId());
ome.setEstat(ExecucioMassivaEstat.ESTAT_FINALITZAT);
ome.setDataFi(new Date());
execucioMassivaExpedientRepository.save(ome);
} catch (Exception ex) {
logger.error("OPERACIO:" + ome.getId() + ". No s'ha pogut reindexar l'expedient", ex);
throw ex;
}
}
private void reprendreExpedient(ExecucioMassivaExpedient ome) throws Exception {
Expedient exp = ome.getExpedient();
try {
ome.setDataInici(new Date());
expedientService.desfinalitzar(exp.getId());
ome.setEstat(ExecucioMassivaEstat.ESTAT_FINALITZAT);
ome.setDataFi(new Date());
execucioMassivaExpedientRepository.save(ome);
} catch (Exception ex) {
logger.error("OPERACIO:" + ome.getId() + ". No s'ha pogut desfer la finalització de l'expedient", ex);
throw ex;
}
}
private void reprendreTramitacio(ExecucioMassivaExpedient ome) throws Exception {
Expedient exp = ome.getExpedient();
try {
ome.setDataInici(new Date());
expedientService.reprendre(exp.getId());
ome.setEstat(ExecucioMassivaEstat.ESTAT_FINALITZAT);
ome.setDataFi(new Date());
execucioMassivaExpedientRepository.save(ome);
} catch (Exception ex) {
logger.error("OPERACIO:" + ome.getId() + ". No s'ha pogut reprendre la tramitació de l'expedient", ex);
throw ex;
}
}
private void buidarLogExpedient(ExecucioMassivaExpedient ome) throws Exception {
Expedient exp = ome.getExpedient();
try {
ome.setDataInici(new Date());
expedientService.registreBuidarLog(
exp.getId());
ome.setEstat(ExecucioMassivaEstat.ESTAT_FINALITZAT);
ome.setDataFi(new Date());
execucioMassivaExpedientRepository.save(ome);
} catch (Exception ex) {
logger.error("OPERACIO:" + ome.getId() + ". No s'ha pogut eliminar la informació de registre de l'expedient", ex);
throw ex;
}
}
private void reassignarTasca(ExecucioMassivaExpedient ome) throws Exception {
String tascaId = ome.getTascaId();
try {
ome.setDataInici(new Date());
// Obtenim la tasca
// ExpedientTascaDto tasca = tascaService.findAmbIdPerTramitacio(tascaId);
JbpmTask tasca = tascaHelper.getTascaComprovacionsTramitacio(tascaId, false, false);
if (tasca != null && tasca.isOpen()) {
// Reassignam la tasca
expedientService.reassignarTasca(tasca.getId(), ome.getExecucioMassiva().getParam1());
}
if (tasca == null) {
ome.setEstat(ExecucioMassivaEstat.ESTAT_ERROR);
ome.setError(messageHelper.getMessage("tasca.massiva.reassignar.buit"));
} else {
ome.setEstat(ExecucioMassivaEstat.ESTAT_FINALITZAT);
}
ome.setDataFi(new Date());
execucioMassivaExpedientRepository.save(ome);
} catch (Exception ex) {
logger.error("OPERACIO:" + ome.getId() + ". No s'ha pogut reassignar la tasca", ex);
throw ex;
}
}
private double getPercent(Long value, Long total) {
if (total == 0)
return 100L;
else if (value == 0L)
return 0L;
return Math.round(value * 100 / total);
}
private static final Log logger = LogFactory.getLog(ExecucioMassivaService.class);
}