package com.qcadoo.mes.materialFlowResources.hooks;
import static com.qcadoo.mes.materialFlowResources.constants.MaterialFlowResourcesConstants.MODEL_PALLET_STORAGE_STATE_DTO;
import static com.qcadoo.mes.materialFlowResources.constants.PalletStorageStateDtoFields.LOCATION_NUMBER;
import static com.qcadoo.mes.materialFlowResources.constants.PalletStorageStateDtoFields.PALLET_NUMBER;
import static com.qcadoo.mes.materialFlowResources.constants.PalletStorageStateDtoFields.STORAGE_LOCATION_NUMBER;
import static com.qcadoo.mes.materialFlowResources.constants.PalletStorageStateDtoFields.TYPE_OF_PALLET;
import static java.util.Comparator.comparing;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import com.google.common.collect.Maps;
import com.qcadoo.mes.materialFlowResources.constants.MaterialFlowResourcesConstants;
import com.qcadoo.mes.materialFlowResources.dto.MovedPalletDto;
import com.qcadoo.model.api.DataDefinitionService;
import com.qcadoo.model.api.Entity;
import com.qcadoo.view.api.ViewDefinitionState;
import com.qcadoo.view.api.components.FormComponent;
public abstract class PalletStorageStateHooks {
protected static final String L_PALLET_STORAGE_STATE_DTOS = "palletStorageStateDtos";
private static final String L_PALLET_NUMBER = "palletNumber";
protected final DataDefinitionService dataDefinitionService;
@Autowired
private NamedParameterJdbcTemplate jdbcTemplate;
public PalletStorageStateHooks(DataDefinitionService dataDefinitionService) {
this.dataDefinitionService = dataDefinitionService;
}
public final void onBeforeRender(final ViewDefinitionState view) throws JSONException {
FormComponent form = (FormComponent) view.getComponentByReference("form");
JSONObject context = view.getJsonContext();
Set<Long> palletIds = Arrays.stream(
context.getString("window.mainTab.helper.gridLayout.selectedEntities").replaceAll("[\\[\\]]", "").split(","))
.map(Long::valueOf).collect(Collectors.toSet());
String palletNumberFilter = context.getString("window.mainTab.helper.gridLayout.palletNumberFilter");
Entity helper = form.getEntity();
if (helper.getHasManyField(L_PALLET_STORAGE_STATE_DTOS).isEmpty()) {
List<Entity> generatedEntities = createHelperEntities(palletIds);
if (isNotBlank(palletNumberFilter) && !palletNumberFilter.equals("NULL")) {
List<String> numbersOrder = Arrays.asList(palletNumberFilter.replaceAll("[\\[\\]]", "").split(","));
generatedEntities.sort(comparing(ge -> numbersOrder.indexOf(ge.getStringField(L_PALLET_NUMBER))));
}
helper.setField(L_PALLET_STORAGE_STATE_DTOS, generatedEntities);
form.setEntity(helper);
setStorageLocationFilters(view);
}
}
public List<Entity> createHelperEntities(final Set<Long> palletIds) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT palletNumber, storageLocationNumber, locationNumber, typeOfPallet ");
sql.append("FROM materialflowresources_palletstoragestatedto ");
sql.append("WHERE id IN (:ids)");
Map<String, Object> params = Maps.newHashMap();
params.put("ids", palletIds);
List<MovedPalletDto> result = jdbcTemplate.query(sql.toString(), params, new BeanPropertyRowMapper(MovedPalletDto.class));
return result.stream().map(this::mapDtoToEntity).collect(Collectors.toList());
}
private Entity mapDtoToEntity(final MovedPalletDto dto) {
Entity entity = dataDefinitionService
.get(MaterialFlowResourcesConstants.PLUGIN_IDENTIFIER, MODEL_PALLET_STORAGE_STATE_DTO).create();
entity.setField(PALLET_NUMBER, dto.getPalletNumber());
entity.setField(STORAGE_LOCATION_NUMBER, dto.getStorageLocationNumber());
entity.setField(LOCATION_NUMBER, dto.getLocationNumber());
entity.setField(TYPE_OF_PALLET, dto.getTypeOfPallet());
return entity;
}
protected abstract void setStorageLocationFilters(final ViewDefinitionState view);
}