RequirementAndObligationCreationCompoundAction
This commit is contained in:
parent
dff000b496
commit
a14ca74a69
1 changed files with 96 additions and 0 deletions
|
|
@ -0,0 +1,96 @@
|
||||||
|
package ru.spcex.clearing.session.state.action;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
|
||||||
|
import org.springframework.context.annotation.Scope;
|
||||||
|
import org.springframework.statemachine.StateContext;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import ru.clearing.classes.statics.data.execution.ExecutionCommon;
|
||||||
|
import ru.clearing.classes.statics.data.registry.Registry;
|
||||||
|
import ru.spcex.clearing.session.stage.TaskType;
|
||||||
|
import ru.spcex.clearing.session.state.DataEnum;
|
||||||
|
import ru.spcex.clearing.session.state.SsnEvent;
|
||||||
|
import static ru.spcex.clearing.util.ComparatorUtil.*;
|
||||||
|
import ru.spcex.platform.classes.base.interfaces.ExecutionType;
|
||||||
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
import ru.spcex.platform.utils.collection.Pair;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
|
||||||
|
public class RequirementAndObligationCreationCompoundAction extends RequirementAndObligationCreationAction {
|
||||||
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public RequirementAndObligationCreationCompoundAction(ImdgProvider imdgProvider) {
|
||||||
|
super(imdgProvider);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
public void actualExecute(StateContext<TaskType, SsnEvent> ctx) {
|
||||||
|
Long sessionId = ctx.getExtendedState().get(DataEnum.sessionId, Long.class);
|
||||||
|
List<ExecutionCommon> tmpList = new ArrayList<>(Arrays.asList(new ExecutionCommon[2]));
|
||||||
|
List<ExecutionCommon> executionFond = ctx.getExtendedState().get(DataEnum.dealsPreparedFond, List.class);
|
||||||
|
List<ExecutionCommon> executionCurrency = ctx.getExtendedState().get(DataEnum.dealsPreparedDeposit, List.class);
|
||||||
|
List<ExecutionCommon> executionDeposit = ctx.getExtendedState().get(DataEnum.dealsPreparedCurrency, List.class);
|
||||||
|
Map<Long, Registry> newRgss = storageMap(executionFond, executionCurrency, executionDeposit);
|
||||||
|
Stream.of(executionFond, executionCurrency, executionDeposit).forEach(c -> c.sort(tradeTimeComparator.thenComparing(execIdComparator).thenComparing(execMarketComparator)));
|
||||||
|
|
||||||
|
int efs = executionFond.size();
|
||||||
|
int eds = executionDeposit.size();
|
||||||
|
int ecs = executionCurrency.size();
|
||||||
|
|
||||||
|
int[] ief = {0}, ied = {0}, iec = {0};
|
||||||
|
while (ief[0] < efs || ied[0] < eds || iec[0] < ecs) {
|
||||||
|
Pair<ExecutionCommon, ExecutionCommon> pair = getMinTimeExecutions(
|
||||||
|
safeMatch(executionFond, ief),
|
||||||
|
safeMatch(executionDeposit, ied),
|
||||||
|
safeMatch(executionCurrency, iec)
|
||||||
|
);
|
||||||
|
if (pair == null) continue;
|
||||||
|
if (pair.getFirst().type().equals(ExecutionType.ExecutionFond)) ief[0] += 2;
|
||||||
|
if (pair.getFirst().type().equals(ExecutionType.ExecutionDeposit)) ied[0] += 2;
|
||||||
|
if (pair.getFirst().type().equals(ExecutionType.ExecutionCurrency)) iec[0] += 2;
|
||||||
|
pair.map(f -> tmpList.set(0, f), s -> tmpList.set(1, s));
|
||||||
|
createRegisters(tmpList, sessionId, newRgss);
|
||||||
|
}
|
||||||
|
log.info("batch insert {} registries into map", newRgss.size());
|
||||||
|
registryImdg.putAll(newRgss);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Map<Long, Registry> storageMap(List<ExecutionCommon> executionFond, List<ExecutionCommon> executionCurrency, List<ExecutionCommon> executionDeposit) {
|
||||||
|
int depSize = executionDeposit.size() * 4;
|
||||||
|
int othersSize = Math.max(executionFond.size() * 2, executionCurrency.size() * 2);
|
||||||
|
int capacity = calcMapCapacity(Math.max(depSize, othersSize));
|
||||||
|
return new HashMap<>(capacity, 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Pair<ExecutionCommon, ExecutionCommon> safeMatch(List<ExecutionCommon> l, int[] i) {
|
||||||
|
Pair<ExecutionCommon, ExecutionCommon> pair = matchExecutions(l, i[0]);
|
||||||
|
if (pair == null) {
|
||||||
|
i[0]++;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// i[0] += 2;
|
||||||
|
return pair;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Pair<ExecutionCommon, ExecutionCommon> getMinTimeExecutions(
|
||||||
|
Pair<ExecutionCommon, ExecutionCommon> fond,
|
||||||
|
Pair<ExecutionCommon, ExecutionCommon> deposit,
|
||||||
|
Pair<ExecutionCommon, ExecutionCommon> currency) {
|
||||||
|
|
||||||
|
return Stream.of(fond, deposit, currency)
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.min((p1, p2) -> tradeTimeComparator.compare(p1.getFirst(), p2.getFirst())).orElse(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue