Merge branch 'Migrations' into develop

This commit is contained in:
2024-02-02 10:31:07 +01:00
29 changed files with 903 additions and 482 deletions

View File

@@ -900,6 +900,21 @@
<option name="PROGRAM_PARAMETERS" value="" />
</SHUTDOWN>
</ConfigurationWrapper>
<ConfigurationWrapper VM_VAR="JAVA_OPTS" RunnerId="JProfiler">
<option name="USE_ENV_VARIABLES" value="true" />
<STARTUP>
<option name="USE_DEFAULT" value="true" />
<option name="SCRIPT" value="" />
<option name="VM_PARAMETERS" value="" />
<option name="PROGRAM_PARAMETERS" value="" />
</STARTUP>
<SHUTDOWN>
<option name="USE_DEFAULT" value="true" />
<option name="SCRIPT" value="" />
<option name="VM_PARAMETERS" value="" />
<option name="PROGRAM_PARAMETERS" value="" />
</SHUTDOWN>
</ConfigurationWrapper>
<ConfigurationWrapper VM_VAR="JAVA_OPTS" RunnerId="Profile">
<option name="USE_ENV_VARIABLES" value="true" />
<STARTUP>

View File

@@ -0,0 +1,15 @@
package it.integry.ems.exception;
public class SystemNotInitializedException extends Exception {
private int statusCode;
public SystemNotInitializedException(int statusCode, String message) {
super(message);
this.statusCode = statusCode;
}
public int getStatusCode() {
return statusCode;
}
}

View File

@@ -1,6 +1,7 @@
package it.integry.ems.migration;
import com.annimon.stream.Stream;
import com.gentlyweb.utils.GeneralUtils;
import it.integry.annotations.PostContextAutowired;
import it.integry.annotations.PostContextConstruct;
import it.integry.ems.migration.model._base.MigrationModelInterface;
@@ -10,8 +11,11 @@ import it.integry.ems.settings.SettingsController;
import it.integry.ems.sync.MultiDBTransaction.AdvancedDataSource;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.utility.UtilityDebug;
import it.integry.ems_model.config.EmsRestConstants;
import it.integry.ems_model.entity.Azienda;
import it.integry.ems_model.entity.StbMigrationStatus;
import it.integry.ems_model.rulescompleting.DroolsDataCompleting;
import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.utility.UtilityDB;
import it.integry.ems_model.utility.UtilityServer;
import it.integry.ems_model.utility.UtilityString;
@@ -25,8 +29,10 @@ import java.lang.reflect.Modifier;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@Service
public class MigrationService {
@@ -48,11 +54,13 @@ public class MigrationService {
@PostContextAutowired
private MultiDBTransactionManager multiDBTransactionManager;
private List<Class<? extends MigrationModelInterface>> allMigrationsList;
@PostContextConstruct
public void init() {
Reflections reflections = new Reflections("it.integry.ems.migration.model");
List<Class<? extends MigrationModelInterface>> clssList = new ArrayList<>(Stream.of(reflections.getSubTypesOf(MigrationModelInterface.class))
allMigrationsList = new ArrayList<>(Stream.of(reflections.getSubTypesOf(MigrationModelInterface.class))
.map(x -> x)
.filter(x -> !Modifier.isAbstract(x.getModifiers()))
.sortBy(Class::getSimpleName)
@@ -72,70 +80,10 @@ public class MigrationService {
logger.error("MigrationService - Init", e);
}
//ArrayList<Runnable> calls = new ArrayList<>();
for (final AdvancedDataSource advancedDataSource : advancedDataSources) {
//calls.add(() -> {
try {
initLastVersionField(advancedDataSource);
for (Class<? extends MigrationModelInterface> migrationClass : clssList) {
try {
long migrationNumber = Long.parseLong(migrationClass.getSimpleName().replace("Migration_", ""));
long lastMigration = getLastMigrationFromDB(advancedDataSource);
if (migrationNumber <= lastMigration) continue;
executeMigration(migrationClass, advancedDataSource, settingsController, settingsModel, droolsDataCompleting);
updateLastMigrationIntoDB(advancedDataSource, migrationNumber);
advancedDataSource.getConnection().commit();
} catch (Exception e) {
e.printStackTrace();
logger.error("MigrationService (" + advancedDataSource.getProfileName() +")", e);
try {
advancedDataSource.getConnection().rollback();
} catch (Exception ex) {
ex.printStackTrace();
logger.error("MigrationService - Rollback", ex);
}
if(UtilityDebug.isDebugExecution() || UtilityDebug.isIntegryServer()) break;
try {
MultiDBTransactionManager multiDBTransactionManager = new MultiDBTransactionManager(settingsModel.getDefaultProfile());
Azienda azienda = Azienda.getDefaultAzienda(multiDBTransactionManager.getPrimaryConnection());
mailService.sendSystemWarningLog("[" + azienda.getNomeDitta() + "][" + UtilityServer.getHostName() + "] Aggiornamento sistema",
"anomalia durante l'aggiornamento",
"La migrazione " + migrationClass.getSimpleName() + " non è andata a buon fine sul DB " + advancedDataSource.getProfileName() + ". Controllare il log per ulteriori dettagli.",
e, new Date());
} catch (Exception ex) {
logger.error("MigrationService - Mail", e);
}
break;
}
}
} catch (Exception e) {
logger.error("MigrationService (" + advancedDataSource.getProfileName() + ")", e);
e.printStackTrace();
}
//});
executeMigrationGroup(advancedDataSource);
}
// try {
// UtilityThread.executeParallel(calls);
// } catch (Exception e) {
// logger.error("MigrationService", e);
// e.printStackTrace();
// }
}
private void initLastVersionField(AdvancedDataSource advancedDataSource) throws Exception {
@@ -162,6 +110,44 @@ public class MigrationService {
}
}
public void executeMigrationGroup(AdvancedDataSource advancedDataSource) {
try {
initLastVersionField(advancedDataSource);
for (Class<? extends MigrationModelInterface> migrationClass : allMigrationsList) {
long migrationNumber = Long.parseLong(migrationClass.getSimpleName().replace("Migration_", ""));
try {
long lastMigration = getLastMigrationFromDB(advancedDataSource);
if (migrationNumber <= lastMigration) continue;
executeMigration(migrationClass, advancedDataSource, settingsController, settingsModel, droolsDataCompleting);
updateLastMigrationIntoDB(advancedDataSource, migrationNumber);
advancedDataSource.getConnection().commit();
} catch (Exception e) {
try {
advancedDataSource.getConnection().rollback();
} catch (Exception ex) {
ex.printStackTrace();
logger.error("MigrationService - Rollback", ex);
}
trackMigrationError(advancedDataSource, migrationNumber, e);
break;
}
}
} catch (Exception e) {
logger.error("MigrationService (" + advancedDataSource.getProfileName() + ")", e);
e.printStackTrace();
}
}
private void executeMigration(Class<? extends MigrationModelInterface> migrationClass,
AdvancedDataSource advancedDataSource,
SettingsController settingsController,
@@ -183,13 +169,75 @@ public class MigrationService {
return Long.parseLong(lastMigration);
}
private void updateLastMigrationIntoDB(AdvancedDataSource advancedDataSource, long lastMigraton) throws Exception {
public void updateLastMigrationIntoDB(AdvancedDataSource advancedDataSource, long lastMigraton) throws Exception {
String updateSql = "UPDATE azienda SET last_migration = " + UtilityDB.valueToString(String.valueOf(lastMigraton));
PreparedStatement ps = advancedDataSource.getConnection().prepareStatement(updateSql);
ps.executeUpdate();
ps.close();
String sql = "SELECT * FROM " + StbMigrationStatus.ENTITY + " WHERE migration_code = " + lastMigraton;
StbMigrationStatus stbMigrationStatus = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(advancedDataSource.getConnection(), sql, StbMigrationStatus.class);
if (stbMigrationStatus == null) {
stbMigrationStatus = new StbMigrationStatus()
.setMigrationCode(lastMigraton)
.setCompleted(true)
.setSkipped(false);
stbMigrationStatus.setOperation(OperationType.INSERT);
} else {
stbMigrationStatus.setCompleted(true)
.setSkipped(false)
.setErrorMessage(EmsRestConstants.NULL);
stbMigrationStatus.setOperation(OperationType.UPDATE);
}
stbMigrationStatus.manageWithParentConnection(advancedDataSource.getConnection());
advancedDataSource.getConnection().commit();
}
public List<Long> getMigrationCodes() {
return allMigrationsList.stream()
.map(x -> Long.parseLong(x.getSimpleName().replace("Migration_", "")))
.sorted(Collections.reverseOrder())
.collect(Collectors.toList());
}
private void trackMigrationError(AdvancedDataSource advancedDataSource, long migrationCode, Exception e) throws Exception {
e.printStackTrace();
logger.error("MigrationService (" + advancedDataSource.getProfileName() + ")", e);
try (MultiDBTransactionManager multiDBTransactionManager = new MultiDBTransactionManager(advancedDataSource.getProfileName())) {
final String exceptionTraceAsString = GeneralUtils.getExceptionTraceAsString(e);
String sql = "SELECT * FROM " + StbMigrationStatus.ENTITY + " WHERE migration_code = " + migrationCode;
StbMigrationStatus stbMigrationStatus = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(multiDBTransactionManager.getPrimaryConnection(), sql, StbMigrationStatus.class);
if (stbMigrationStatus == null) {
stbMigrationStatus = new StbMigrationStatus();
stbMigrationStatus.setOperation(OperationType.INSERT);
} else {
stbMigrationStatus.setOperation(OperationType.UPDATE);
}
stbMigrationStatus
.setMigrationCode(migrationCode)
.setCompleted(false)
.setSkipped(false)
.setErrorMessage(e.getMessage() + "\n" + exceptionTraceAsString);
stbMigrationStatus.manageWithParentConnection(advancedDataSource.getConnection());
if (UtilityDebug.isDebugExecution() || UtilityDebug.isIntegryServer()) return;
Azienda azienda = Azienda.getDefaultAzienda(multiDBTransactionManager.getPrimaryConnection());
mailService.sendSystemWarningLog("[" + azienda.getNomeDitta() + "][" + UtilityServer.getHostName() + "] Aggiornamento sistema",
"anomalia durante l'aggiornamento",
"La migrazione " + migrationCode + " non è andata a buon fine sul DB " + advancedDataSource.getProfileName() + ". Controllare il log per ulteriori dettagli.",
e, new Date());
} catch (Exception ex) {
logger.error("MigrationService - Mail", e);
}
}
}

View File

@@ -0,0 +1,35 @@
package it.integry.ems.migration.controller;
import it.integry.ems.migration.service.MigrationSetupService;
import it.integry.ems.response.ServiceRestResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.web.bind.annotation.*;
@RestController
@Scope(value = "request")
@RequestMapping("system/migration/setup")
public class MigrationSetupController {
@Autowired
private MigrationSetupService migrationSetupService;
@RequestMapping(value = "", method = RequestMethod.GET)
public @ResponseBody ServiceRestResponse retrieveList() throws Exception {
return ServiceRestResponse.createPositiveResponse(migrationSetupService.retrieveAll());
}
@RequestMapping(value = "{migrationCode}/retry", method = RequestMethod.POST)
public @ResponseBody ServiceRestResponse retryMigration(@PathVariable long migrationCode) throws Exception {
migrationSetupService.retry(migrationCode);
return ServiceRestResponse.createPositiveResponse();
}
@RequestMapping(value = "{migrationCode}/skip", method = RequestMethod.POST)
public @ResponseBody ServiceRestResponse skipMigration(@PathVariable long migrationCode) throws Exception {
migrationSetupService.skip(migrationCode);
return ServiceRestResponse.createPositiveResponse();
}
}

View File

@@ -0,0 +1,45 @@
package it.integry.ems.migration.dto;
public class MigrationStatusDTO {
private long migrationCode;
private String profileDb;
private MigrationStatusEnum status;
private String errorMessage;
public long getMigrationCode() {
return migrationCode;
}
public MigrationStatusDTO setMigrationCode(long migrationCode) {
this.migrationCode = migrationCode;
return this;
}
public String getProfileDb() {
return profileDb;
}
public MigrationStatusDTO setProfileDb(String profileDb) {
this.profileDb = profileDb;
return this;
}
public MigrationStatusEnum getStatus() {
return status;
}
public MigrationStatusDTO setStatus(MigrationStatusEnum status) {
this.status = status;
return this;
}
public String getErrorMessage() {
return errorMessage;
}
public MigrationStatusDTO setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
return this;
}
}

View File

@@ -0,0 +1,32 @@
package it.integry.ems.migration.dto;
public enum MigrationStatusEnum {
COMPLETED(0),
PENDING(1),
SKIPPED(2),
ERROR(3);
private int tipo;
MigrationStatusEnum(int tipo) {
this.tipo = tipo;
}
public static MigrationStatusEnum fromString(String text) {
for (MigrationStatusEnum b : MigrationStatusEnum.values()) {
if (b.tipo == Integer.parseInt(text)) return b;
}
return null;
}
public int getTipo() {
return this.tipo;
}
@Override
public String toString() {
return super.toString();
}
}

View File

@@ -0,0 +1,30 @@
package it.integry.ems.migration.model;
import it.integry.ems.migration.model._base.BaseMigration;
import it.integry.ems.migration.model._base.MigrationModelInterface;
public class Migration_20240201160125 extends BaseMigration implements MigrationModelInterface {
@Override
public void up() throws Exception {
if (isHistoryDB())
return;
String createTable = "CREATE TABLE dbo.stb_migration_status\n" +
"(\n" +
" id BIGINT IDENTITY,\n" +
" migration_code BIGINT NOT NULL,\n" +
" error_message VARCHAR(MAX),\n" +
" completed BIT DEFAULT 0 NOT NULL,\n" +
" skipped BIT DEFAULT 0 NOT NULL\n" +
")";
executeStatement(advancedDataSource.getConnection(), createTable);
}
@Override
public void down() throws Exception {
}
}

View File

@@ -0,0 +1,127 @@
package it.integry.ems.migration.service;
import it.integry.ems.javabeans.RequestDataDTO;
import it.integry.ems.migration.MigrationService;
import it.integry.ems.migration.dto.MigrationStatusDTO;
import it.integry.ems.migration.dto.MigrationStatusEnum;
import it.integry.ems.service.EntityProcessor;
import it.integry.ems.settings.Model.AvailableConnectionsModel;
import it.integry.ems.settings.Model.SettingsModel;
import it.integry.ems.sync.MultiDBTransaction.AdvancedDataSource;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems_model.entity.StbMigrationStatus;
import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.utility.UtilityDB;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Service
@Scope("request")
public class MigrationSetupService {
private final Logger logger = LogManager.getLogger();
@Autowired
private SettingsModel settingsModel;
@Autowired
private MigrationService migrationService;
@Autowired
private EntityProcessor entityProcessor;
@Autowired
private RequestDataDTO requestDataDTO;
@Autowired
private MultiDBTransactionManager multiDBTransactionManager;
public List<MigrationStatusDTO> retrieveAll() throws Exception {
final List<Long> migrationCodes = migrationService.getMigrationCodes();
final List<MigrationStatusDTO> migrationStatuses = new ArrayList<>();
final List<AvailableConnectionsModel> databases = settingsModel.getAvailableConnections().stream()
.filter(AvailableConnectionsModel::getInternalDb)
.collect(Collectors.toList());
for (AvailableConnectionsModel availableConnectionsModel : databases) {
try (MultiDBTransactionManager multiDBTransactionManager = new MultiDBTransactionManager(availableConnectionsModel.getProfileName())) {
List<StbMigrationStatus> stbMigrationStatuses = retrieveStatuses(multiDBTransactionManager);
for (long migrationCode : migrationCodes) {
StbMigrationStatus stbMigrationStatus = stbMigrationStatuses.stream()
.filter(x -> x.getMigrationCode() == migrationCode)
.findFirst().orElse(null);
MigrationStatusEnum status = MigrationStatusEnum.PENDING;
if (migrationCode < 20240201160125L) //Ignoro le migration che esistono da prima di questo sistema
status = MigrationStatusEnum.COMPLETED;
String errorMessage = null;
if (stbMigrationStatus != null) {
if (stbMigrationStatus.isCompleted()) {
if (stbMigrationStatus.isSkipped()) status = MigrationStatusEnum.SKIPPED;
else status = MigrationStatusEnum.COMPLETED;
} else {
status = MigrationStatusEnum.ERROR;
}
errorMessage = stbMigrationStatus.getErrorMessage();
}
migrationStatuses.add(new MigrationStatusDTO()
.setStatus(status)
.setMigrationCode(migrationCode)
.setProfileDb(availableConnectionsModel.getProfileName())
.setErrorMessage(errorMessage));
}
}
}
return migrationStatuses;
}
private List<StbMigrationStatus> retrieveStatuses(MultiDBTransactionManager multiDBTransactionManager) throws Exception {
String sql = "SELECT * FROM " + StbMigrationStatus.ENTITY;
return UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, StbMigrationStatus.class);
}
public void retry(long migrationCode) throws Exception {
migrationService.executeMigrationGroup(multiDBTransactionManager.getActiveConnections().get(0));
}
public void skip(long migrationCode) throws Exception {
final AdvancedDataSource advancedDataSource = multiDBTransactionManager.getActiveConnections().get(0);
String sql = "SELECT * FROM " + StbMigrationStatus.ENTITY + " WHERE migration_code = " + migrationCode;
StbMigrationStatus stbMigrationStatus = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(multiDBTransactionManager.getPrimaryConnection(), sql, StbMigrationStatus.class);
if (stbMigrationStatus != null) {
stbMigrationStatus
.setMigrationCode(migrationCode)
.setCompleted(true)
.setSkipped(true);
stbMigrationStatus.setOperation(OperationType.UPDATE);
entityProcessor.processEntity(stbMigrationStatus, multiDBTransactionManager);
}
migrationService.updateLastMigrationIntoDB(advancedDataSource, migrationCode);
migrationService.executeMigrationGroup(advancedDataSource);
}
}

View File

@@ -26,7 +26,7 @@ import java.util.List;
@Service
@Scope("request")
public class MultiDBTransactionManager {
public class MultiDBTransactionManager implements AutoCloseable{
private final static Logger logger = LogManager.getLogger();
@@ -234,6 +234,11 @@ public class MultiDBTransactionManager {
}
}
@Override
public void close() throws Exception {
closeAll();
}
public void closeAll() throws Exception {
for (AdvancedDataSource advancedDataSource : dbDatasources) {
if (!advancedDataSource.isClosed()) {
@@ -244,6 +249,7 @@ public class MultiDBTransactionManager {
} else if (enableLog) {
logger.debug("Closing manually: " + advancedDataSource.getDataSource().getProfile() + " (#" + advancedDataSource.getDataSource().getSessionID() + ")");
}
advancedDataSource.commit();
advancedDataSource.close();
}
}
@@ -333,4 +339,5 @@ public class MultiDBTransactionManager {
!uri.contains("getOpenedSteps") &&
!uri.contains("getCurrentPrintQueue");
}
}

View File

@@ -1,5 +1,6 @@
package it.integry.ems.system;
import it.integry.ems.exception.SystemNotInitializedException;
import it.integry.ems.response.ServiceRestResponse;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -28,6 +29,11 @@ public class GlobalExceptionHandler {
@ExceptionHandler({Exception.class})
public @ResponseBody
ServiceRestResponse handleException(HttpServletRequest request, HttpServletResponse response, Exception ex) {
if (ex instanceof RuntimeException) {
if (ex.getCause() instanceof SystemNotInitializedException)
response.setStatus(((SystemNotInitializedException) ex.getCause()).getStatusCode());
}
logger.error(request.getRequestURI(), ex);
return ServiceRestResponse.createNegativeResponse(ex);
}

View File

@@ -5,6 +5,7 @@ import com.annimon.stream.Stream;
import it.integry.common.var.CommonConstants;
import it.integry.common.var.EmsDBConst;
import it.integry.ems._context.EmsCoreContext;
import it.integry.ems.exception.SystemNotInitializedException;
import it.integry.ems.settings.Model.AvailableConnectionsModel;
import it.integry.ems.settings.Model.SettingsModel;
import it.integry.ems_model.utility.UtilityHashMap;
@@ -48,8 +49,7 @@ public class SystemRequisiteCheckInterceptor extends HandlerInterceptorAdapter {
!serviceName.contains("favicon.ico")) {
if (!emsCoreContext.isContextInitialized()) {
response.sendError(551, "System not initialized yet");
return false;
throw new SystemNotInitializedException(551, "System not initialized yet");
}
}
@@ -79,6 +79,8 @@ public class SystemRequisiteCheckInterceptor extends HandlerInterceptorAdapter {
} catch (IOException e) {
e.printStackTrace();
return false;
} catch (Exception e) {
throw new RuntimeException(e);
}
return true;

View File

@@ -0,0 +1,79 @@
package it.integry.ems_model.entity;
import com.fasterxml.jackson.annotation.JsonTypeName;
import it.integry.ems_model.annotation.*;
import it.integry.ems_model.base.EntityBase;
import org.kie.api.definition.type.PropertyReactive;
@Master
@PropertyReactive
@Table(StbMigrationStatus.ENTITY)
@JsonTypeName(StbMigrationStatus.ENTITY)
public class StbMigrationStatus extends EntityBase {
public static final String ENTITY = "stb_migration_status";
private static final long serialVerionUID = 1L;
@PK
@Identity
@SqlField(value = "id", nullable = false)
private Long id;
@SqlField(value = "migration_code", nullable = false)
private Long migrationCode;
@SqlField(value = "error_message", nullable = true)
private String errorMessage;
@SqlField(value = "completed", nullable = false)
private boolean completed;
@SqlField(value = "skipped", nullable = false)
private boolean skipped;
public Long getId() {
return id;
}
public StbMigrationStatus setId(Long id) {
this.id = id;
return this;
}
public Long getMigrationCode() {
return migrationCode;
}
public StbMigrationStatus setMigrationCode(Long migrationCode) {
this.migrationCode = migrationCode;
return this;
}
public String getErrorMessage() {
return errorMessage;
}
public StbMigrationStatus setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
return this;
}
public boolean isCompleted() {
return completed;
}
public StbMigrationStatus setCompleted(boolean completed) {
this.completed = completed;
return this;
}
public boolean isSkipped() {
return skipped;
}
public StbMigrationStatus setSkipped(boolean skipped) {
this.skipped = skipped;
return this;
}
}

View File

@@ -27,43 +27,34 @@ public class AgribookActivityController {
@RequestMapping(value = "", method = RequestMethod.POST)
public @ResponseBody
ServiceRestResponse createActivity(HttpServletRequest request,
@RequestBody AgribookActivityPlanRequestDTO activityDTO) {
try {
AgribookActivityPlanResponseDTO response = null;
@RequestBody AgribookActivityPlanRequestDTO activityDTO) throws Exception {
AgribookActivityPlanResponseDTO response = null;
// new AgribookActivityResponseDTO()
// .setStbActivity(agribookActivityService.saveActivity(activityDTO.getStbActivity(), false));
return ServiceRestResponse.createPositiveResponse(response);
} catch (Exception e) {
logger.error(request.getRequestURI(), e);
return ServiceRestResponse.createNegativeResponse(e);
}
return ServiceRestResponse.createPositiveResponse(response);
}
@RequestMapping(value = "plan", method = RequestMethod.POST)
public @ResponseBody
ServiceRestResponse planActivity(HttpServletRequest request,
@RequestBody AgribookActivityPlanRequestDTO activityDTO) {
try {
AgribookActivityPlanResponseDTO response =
new AgribookActivityPlanResponseDTO()
.setStbActivity(
agribookActivityService.planActivity(
activityDTO.getCodAnag(),
activityDTO.getCodVdes(),
activityDTO.getCodMart(),
activityDTO.getPartitaMag(),
activityDTO.getUserName(),
activityDTO.getPlanDate(),
activityDTO.getNote()
)
);
@RequestBody AgribookActivityPlanRequestDTO activityDTO) throws Exception {
return ServiceRestResponse.createPositiveResponse(response);
} catch (Exception e) {
logger.error(request.getRequestURI(), e);
return ServiceRestResponse.createNegativeResponse(e);
}
AgribookActivityPlanResponseDTO response =
new AgribookActivityPlanResponseDTO()
.setStbActivity(
agribookActivityService.planActivity(
activityDTO.getCodAnag(),
activityDTO.getCodVdes(),
activityDTO.getCodMart(),
activityDTO.getPartitaMag(),
activityDTO.getUserName(),
activityDTO.getPlanDate(),
activityDTO.getNote()
)
);
return ServiceRestResponse.createPositiveResponse(response);
}
@RequestMapping(value = "", method = RequestMethod.GET)
@@ -74,44 +65,29 @@ public class AgribookActivityController {
@RequestParam(required = false, name = "codVdes[]") List<String> codVdes,
@RequestParam(required = false) String codMart,
@RequestParam(required = false) String partitaMag,
@RequestParam(required = false) String username) {
try {
return ServiceRestResponse.createPositiveResponse(agribookActivityService.retrieveActivity(activityId, codAnag, codVdes, codMart, partitaMag, username));
} catch (Exception e) {
logger.error(request.getRequestURI(), e);
return ServiceRestResponse.createNegativeResponse(e);
}
@RequestParam(required = false) String username) throws Exception {
return ServiceRestResponse.createPositiveResponse(agribookActivityService.retrieveActivity(activityId, codAnag, codVdes, codMart, partitaMag, username));
}
@RequestMapping(value = "{id}", method = RequestMethod.PATCH)
public @ResponseBody
ServiceRestResponse updateActivity(HttpServletRequest request,
@PathVariable(value = "id") String activityId,
@RequestBody AgribookActivityUpdateRequestDTO activityDTO) {
try {
agribookActivityService.updateActivity(activityId,
activityDTO.getUserName(),
activityDTO.getPlanDate(),
activityDTO.getNote());
@RequestBody AgribookActivityUpdateRequestDTO activityDTO) throws Exception {
agribookActivityService.updateActivity(activityId,
activityDTO.getUserName(),
activityDTO.getPlanDate(),
activityDTO.getNote());
return ServiceRestResponse.createPositiveResponse();
} catch (Exception e) {
logger.error(request.getRequestURI(), e);
return ServiceRestResponse.createNegativeResponse(e);
}
return ServiceRestResponse.createPositiveResponse();
}
@RequestMapping(value = "{id}", method = RequestMethod.DELETE)
public @ResponseBody
ServiceRestResponse deleteActivity(HttpServletRequest request,
@PathVariable(value = "id") String activityId) {
try {
return ServiceRestResponse.createEntityPositiveResponse(
agribookActivityService.deleteActivity(activityId)
);
} catch (Exception e) {
logger.error(request.getRequestURI(), e);
return ServiceRestResponse.createNegativeResponse(e);
}
@PathVariable(value = "id") String activityId) throws Exception {
return ServiceRestResponse.createEntityPositiveResponse(
agribookActivityService.deleteActivity(activityId)
);
}
}

View File

@@ -1 +1 @@
import{_ as b,d as C,q as v,X as w,u as k,c as n,w as L,b as h,e as s,g as y,h as g,A as _,r as d,o as l,B as f,a as S,i as B}from"./index.e3ffa8b5.js";import{D}from"./DynamicForm.3e07ffe1.js";const N=C({name:"SchedulerCreate",components:{DynamicForm:D},setup(){const e=v(),m=w(),t=k(),o=n(()=>e.params.type);L(o,()=>r());function r(){t.dispatch("scheduler/setCurrentCategory",o.value)}r();const p=n(()=>t.getters["scheduler/getCurrentCategory"]),i=n(()=>t.getters["main/isLoading"]),a=n(()=>t.getters["scheduler/getError"]);async function c(u){await t.dispatch("scheduler/saveAutomation",{category:o.value,...u}),a.value||await m.push({name:"scheduler.show",params:{type:o.value}})}return{type:o,currentCategory:p,onSubmit:c,isLoading:i,error:a}}}),R={class:"intro-y flex items-center mt-8"},V={class:"text-lg font-medium mr-auto"},$={key:0,class:"alert alert-danger show my-2",role:"alert"},A={class:"text-right mt-5"},F=["disabled","onClick"],E=["disabled"],I=B(" Salva ");function q(e,m,t,o,r,p){const i=d("RouterLink"),a=d("LoadingIcon"),c=d("DynamicForm");return l(),h("div",null,[s("div",R,[s("h2",V," Nuova Pianificata "+y(e.type),1)]),g(c,{fields:e.currentCategory,onSubmit:e.onSubmit,class:"intro-y"},{default:_(()=>[e.error?(l(),h("div",$,y(e.error.message),1)):f("",!0),s("div",A,[g(i,{to:{name:"scheduler.show",params:{type:e.type}},custom:""},{default:_(({navigate:u})=>[s("button",{type:"button",class:"btn btn-outline-secondary w-24 mr-1",disabled:e.isLoading,onClick:u}," Annulla ",8,F)]),_:1},8,["to"]),s("button",{type:"submit",class:"btn btn-primary w-24",disabled:e.isLoading},[I,e.isLoading?(l(),S(a,{key:0,icon:"oval",color:"white",class:"w-4 h-4 ml-2"})):f("",!0)],8,E)])]),_:1},8,["fields","onSubmit"])])}const X=b(N,[["render",q]]);export{X as default};
import{_ as b,d as C,q as v,X as w,u as k,c as n,w as L,b as h,e as s,g as y,h as g,A as _,r as d,o as l,B as f,a as S,i as B}from"./index.bdc6f486.js";import{D}from"./DynamicForm.4466a530.js";const N=C({name:"SchedulerCreate",components:{DynamicForm:D},setup(){const e=v(),m=w(),t=k(),o=n(()=>e.params.type);L(o,()=>r());function r(){t.dispatch("scheduler/setCurrentCategory",o.value)}r();const p=n(()=>t.getters["scheduler/getCurrentCategory"]),i=n(()=>t.getters["main/isLoading"]),a=n(()=>t.getters["scheduler/getError"]);async function c(u){await t.dispatch("scheduler/saveAutomation",{category:o.value,...u}),a.value||await m.push({name:"scheduler.show",params:{type:o.value}})}return{type:o,currentCategory:p,onSubmit:c,isLoading:i,error:a}}}),R={class:"intro-y flex items-center mt-8"},V={class:"text-lg font-medium mr-auto"},$={key:0,class:"alert alert-danger show my-2",role:"alert"},A={class:"text-right mt-5"},F=["disabled","onClick"],E=["disabled"],I=B(" Salva ");function q(e,m,t,o,r,p){const i=d("RouterLink"),a=d("LoadingIcon"),c=d("DynamicForm");return l(),h("div",null,[s("div",R,[s("h2",V," Nuova Pianificata "+y(e.type),1)]),g(c,{fields:e.currentCategory,onSubmit:e.onSubmit,class:"intro-y"},{default:_(()=>[e.error?(l(),h("div",$,y(e.error.message),1)):f("",!0),s("div",A,[g(i,{to:{name:"scheduler.show",params:{type:e.type}},custom:""},{default:_(({navigate:u})=>[s("button",{type:"button",class:"btn btn-outline-secondary w-24 mr-1",disabled:e.isLoading,onClick:u}," Annulla ",8,F)]),_:1},8,["to"]),s("button",{type:"submit",class:"btn btn-primary w-24",disabled:e.isLoading},[I,e.isLoading?(l(),S(a,{key:0,icon:"oval",color:"white",class:"w-4 h-4 ml-2"})):f("",!0)],8,E)])]),_:1},8,["fields","onSubmit"])])}const X=b(N,[["render",q]]);export{X as default};

View File

@@ -1 +1 @@
import{_ as S,d as B,q as D,X as N,u as E,c as a,w as g,v as R,b as y,e as n,g as v,h as _,A as b,r as l,o as m,B as C,a as V,i as $}from"./index.e3ffa8b5.js";import{D as F}from"./DynamicForm.3e07ffe1.js";const I=B({name:"SchedulerEdit",components:{DynamicForm:F},setup(){const e=D(),h=N(),t=E(),o=a(()=>e.params.type);g(o,()=>i()),i();async function p(){await t.dispatch("scheduler/fetchAutomations",o.value)}p();function i(){t.dispatch("scheduler/setCurrentCategory",o.value)}const c=a(()=>t.getters["scheduler/getCurrentCategory"]),s=a(()=>e.params.id);g(s,()=>r());const u=a(()=>e.name);function r(){t.dispatch("scheduler/setCurrentAutomation",s.value)}r();const w=a(()=>t.getters["scheduler/getCurrentAutomation"]),d=R(w.value);d.value&&u.value==="scheduler.duplicate"&&(d.value.id=void 0);const A=a(()=>t.getters["main/isLoading"]),f=a(()=>t.getters["scheduler/getError"]);async function k(L){await t.dispatch("scheduler/saveAutomation",{category:o.value,...L}),f.value||await h.push({name:"scheduler.show",params:{type:o.value}})}return{type:o,id:s,currentCategory:c,currentAutomation:d,onSubmit:k,isLoading:A,error:f}}}),q={class:"intro-y flex items-center mt-8"},M={class:"text-lg font-medium mr-auto"},P={key:0,class:"alert alert-danger show my-2",role:"alert"},T={class:"text-right mt-5"},X=["disabled","onClick"],j=["disabled"],z=$(" Salva ");function G(e,h,t,o,p,i){const c=l("RouterLink"),s=l("LoadingIcon"),u=l("DynamicForm");return m(),y("div",null,[n("div",q,[n("h2",M," Modifica Pianificata "+v(e.currentAutomation.name),1)]),_(u,{fields:e.currentCategory,"initial-values":e.currentAutomation,onSubmit:e.onSubmit,class:"intro-y"},{default:b(()=>[e.error?(m(),y("div",P,v(e.error.message),1)):C("",!0),n("div",T,[_(c,{to:{name:"scheduler.show",params:{type:e.type}},custom:""},{default:b(({navigate:r})=>[n("button",{type:"button",class:"btn btn-outline-secondary w-24 mr-1",disabled:e.isLoading,onClick:r}," Annulla ",8,X)]),_:1},8,["to"]),n("button",{type:"submit",class:"btn btn-primary w-24",disabled:e.isLoading},[z,e.isLoading?(m(),V(s,{key:0,icon:"oval",color:"white",class:"w-4 h-4 ml-2"})):C("",!0)],8,j)])]),_:1},8,["fields","initial-values","onSubmit"])])}const K=S(I,[["render",G]]);export{K as default};
import{_ as S,d as B,q as D,X as N,u as E,c as a,w as g,v as R,b as y,e as n,g as v,h as _,A as b,r as l,o as m,B as C,a as V,i as $}from"./index.bdc6f486.js";import{D as F}from"./DynamicForm.4466a530.js";const I=B({name:"SchedulerEdit",components:{DynamicForm:F},setup(){const e=D(),h=N(),t=E(),o=a(()=>e.params.type);g(o,()=>i()),i();async function p(){await t.dispatch("scheduler/fetchAutomations",o.value)}p();function i(){t.dispatch("scheduler/setCurrentCategory",o.value)}const c=a(()=>t.getters["scheduler/getCurrentCategory"]),s=a(()=>e.params.id);g(s,()=>r());const u=a(()=>e.name);function r(){t.dispatch("scheduler/setCurrentAutomation",s.value)}r();const w=a(()=>t.getters["scheduler/getCurrentAutomation"]),d=R(w.value);d.value&&u.value==="scheduler.duplicate"&&(d.value.id=void 0);const A=a(()=>t.getters["main/isLoading"]),f=a(()=>t.getters["scheduler/getError"]);async function k(L){await t.dispatch("scheduler/saveAutomation",{category:o.value,...L}),f.value||await h.push({name:"scheduler.show",params:{type:o.value}})}return{type:o,id:s,currentCategory:c,currentAutomation:d,onSubmit:k,isLoading:A,error:f}}}),q={class:"intro-y flex items-center mt-8"},M={class:"text-lg font-medium mr-auto"},P={key:0,class:"alert alert-danger show my-2",role:"alert"},T={class:"text-right mt-5"},X=["disabled","onClick"],j=["disabled"],z=$(" Salva ");function G(e,h,t,o,p,i){const c=l("RouterLink"),s=l("LoadingIcon"),u=l("DynamicForm");return m(),y("div",null,[n("div",q,[n("h2",M," Modifica Pianificata "+v(e.currentAutomation.name),1)]),_(u,{fields:e.currentCategory,"initial-values":e.currentAutomation,onSubmit:e.onSubmit,class:"intro-y"},{default:b(()=>[e.error?(m(),y("div",P,v(e.error.message),1)):C("",!0),n("div",T,[_(c,{to:{name:"scheduler.show",params:{type:e.type}},custom:""},{default:b(({navigate:r})=>[n("button",{type:"button",class:"btn btn-outline-secondary w-24 mr-1",disabled:e.isLoading,onClick:r}," Annulla ",8,X)]),_:1},8,["to"]),n("button",{type:"submit",class:"btn btn-primary w-24",disabled:e.isLoading},[z,e.isLoading?(m(),V(s,{key:0,icon:"oval",color:"white",class:"w-4 h-4 ml-2"})):C("",!0)],8,j)])]),_:1},8,["fields","initial-values","onSubmit"])])}const K=S(I,[["render",G]]);export{K as default};

View File

@@ -1 +1 @@
import{_ as s,d as n,u as r,c as i,w as u,a as d,o as p,r as l}from"./index.e3ffa8b5.js";const h=n({name:"SchedulerIndex",setup(){const e=r(),o=i(()=>e.getters["scheduler/getAutomationCategories"]);e.dispatch("scheduler/initStore"),u(()=>o.value,()=>{e.dispatch("main/clearMenuButton",{button:"Pianificate",child:!0}),Object.keys(o.value).forEach(t=>{e.dispatch("main/addMenuButton",{child:"Pianificate",button:{title:t,icon:"ActivityIcon",routeName:"scheduler.show",params:{type:t},child:[{routeName:"scheduler.create",params:{type:t}}]}})})})}});function m(e,o,a,t,_,f){const c=l("router-view");return p(),d(c)}const w=s(h,[["render",m]]);export{w as default};
import{_ as s,d as n,u as r,c as i,w as u,a as d,o as p,r as l}from"./index.bdc6f486.js";const h=n({name:"SchedulerIndex",setup(){const e=r(),o=i(()=>e.getters["scheduler/getAutomationCategories"]);e.dispatch("scheduler/initStore"),u(()=>o.value,()=>{e.dispatch("main/clearMenuButton",{button:"Pianificate",child:!0}),Object.keys(o.value).forEach(t=>{e.dispatch("main/addMenuButton",{child:"Pianificate",button:{title:t,icon:"ActivityIcon",routeName:"scheduler.show",params:{type:t},child:[{routeName:"scheduler.create",params:{type:t}}]}})})})}});function m(e,o,a,t,_,f){const c=l("router-view");return p(),d(c)}const w=s(h,[["render",m]]);export{w as default};

View File

@@ -0,0 +1 @@
.status-badge{border-radius:2px;padding:.25em .5rem;text-transform:uppercase;font-weight:700;font-size:12px;letter-spacing:.3px}.status-badge.completed{background-color:#c8e6c9;color:#256029}.status-badge.pending{background-color:#b3e5fc;color:#23547b}.status-badge.skipped{background-color:#a6a6a6;color:#fff}.status-badge.error{background-color:#ffcdd2;color:#c63737}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{a8 as a,a9 as r}from"./index.bdc6f486.js";import{a8 as o}from"./index.bdc6f486.js";a.register(...r);export{o as default};

View File

@@ -1 +0,0 @@
import{a7 as a,a8 as r}from"./index.e3ffa8b5.js";import{a7 as o}from"./index.e3ffa8b5.js";a.register(...r);export{o as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -17,8 +17,8 @@
/>
<!-- <link rel="preload" href="/font/Inter-italic.var.woff2" as="font" type="font/woff2" crossorigin="anonymous"> -->
<link rel="stylesheet" href="./font/inter.css"/>
<script type="module" crossorigin src="./assets/index.e3ffa8b5.js"></script>
<link rel="stylesheet" href="./assets/index.9a08ebf5.css">
<script type="module" crossorigin src="./assets/index.bdc6f486.js"></script>
<link rel="stylesheet" href="./assets/index.d9568127.css">
</head>
<body>

View File

@@ -11,7 +11,9 @@ import org.kie.api.definition.type.PropertyReactive;
@Table(${NAME}.ENTITY)
@JsonTypeName(${NAME}.ENTITY)
public class ${NAME} extends EntityBase {
public static final String ENTITY = "${TABLE}";
#[[$END$]]#
private static final long serialVerionUID = 1L;
}