diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/execution/ExecutionDeposit.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/execution/ExecutionDeposit.java
index 0d80e74c0..5327b6ca6 100644
--- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/execution/ExecutionDeposit.java
+++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/execution/ExecutionDeposit.java
@@ -1,12 +1,13 @@
package ru.clearing.classes.statics.data.execution;
import ru.clearing.classes.objects.BusinessObject;
+import ru.spcex.platform.classes.base.interfaces.IExecution;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
-public class ExecutionDeposit extends BusinessObject {
+public class ExecutionDeposit extends BusinessObject implements IExecution {
private Long exchangeExecutionId;
private Instant exchangeExecutionTime;
private LocalDate tradingDate;
diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/execution/ExecutionFond.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/execution/ExecutionFond.java
index 8cc9e76f9..44d95e590 100644
--- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/execution/ExecutionFond.java
+++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/execution/ExecutionFond.java
@@ -2,6 +2,7 @@ package ru.clearing.classes.statics.data.execution;
import ru.clearing.classes.ConstSerializable;
import ru.clearing.classes.objects.BusinessObject;
+import ru.spcex.platform.classes.base.interfaces.IExecution;
import java.math.BigDecimal;
import java.time.Instant;
@@ -12,7 +13,7 @@ import java.time.LocalDate;
*
* DB table: EXECUTION_FOND
**/
-public class ExecutionFond extends BusinessObject {
+public class ExecutionFond extends BusinessObject implements IExecution {
private static final long serialVersionUID = ConstSerializable.serialVersionUID;
private LocalDate clearingDate;
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/ISessionStage.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/ISessionStage.java
index 9370c2483..232e4c6dd 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/ISessionStage.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/ISessionStage.java
@@ -1,6 +1,6 @@
package ru.spcex.clearing.session.stage;
public interface ISessionStage {
- StageResult submit(Task> task);
+ StageResult> submit(Task> task);
// StageStatus getInitStatus(); пока не нужно
}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/StageResult.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/StageResult.java
index d657fa905..b3f68e3c2 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/StageResult.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/StageResult.java
@@ -2,9 +2,10 @@ package ru.spcex.clearing.session.stage;
import ru.spcex.platform.utils.enumeration.EnumMessage;
-public class StageResult {
+public class StageResult {
EnumMessage error;
boolean success;
+ T stageResult;
public StageResult(EnumMessage error, boolean success) {
this.error = error;
@@ -26,4 +27,12 @@ public class StageResult {
public void setSuccess(boolean success) {
this.success = success;
}
+
+ public T getStageResult() {
+ return stageResult;
+ }
+
+ public void setStageResult(T stageResult) {
+ this.stageResult = stageResult;
+ }
}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java
index b3dac4698..86b6b740d 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java
@@ -1,6 +1,15 @@
package ru.spcex.clearing.session.stage;
public enum TaskType {
+ /**
+ * step 0
+ */
StartRevise,
- ContinueRevise
+ ContinueRevise,
+
+ /**
+ * step 1
+ */
+ DealsPrepare,
+
}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java
index 1ddf9a63c..4614f2276 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java
@@ -52,7 +52,7 @@ public class BalanceRevise implements ISessionStage {
}
@Override
- public StageResult submit(Task> task) {
+ public StageResult> submit(Task> task) {
switch (task.getTaskType()) {
case StartRevise -> {
return sendSdfs();
@@ -66,7 +66,7 @@ public class BalanceRevise implements ISessionStage {
}
- private StageResult sendSdfs() {
+ private StageResult> sendSdfs() {
Collection currencies = currencyImdg.projectSingleAttribute("id");
Statement statement = statementImdg.aggregateByMax("created", StatementRevisePredicate.get(statementImdg, currencies));
@@ -81,12 +81,12 @@ public class BalanceRevise implements ISessionStage {
Long msgKey = kafkaSender.sendRequestToQueue(Consts.SDF56_PROCESS, sdf56Request);
if (msgKey == null) {
log.error("failed to put SDF56 request to kafka queue");
- return new StageResult(new EnumMessage(SessionGeneralError), false);
+ return new StageResult<>(new EnumMessage(SessionGeneralError), false);
}
- return new StageResult(null, true);
+ return new StageResult<>(null, true);
}
- private StageResult cashFlow() {
+ private StageResult> cashFlow() {
String statementSQL = String.format("inOutSDfType = %s and operationStatus = %s and statementType = %s",
InOutSDfType.type57.getKey(), OperationStatus.Pending.getKey(), StatementType.incr.getKey());
Collection stmts = statementImdg.getCollectionObjectsBySQL(statementSQL);
@@ -141,10 +141,10 @@ public class BalanceRevise implements ISessionStage {
//todo create if needed?
}
//todoSdf1
- return new StageResult(null, true);
+ return new StageResult<>(null, true);
}
- private StageResult revise() {
+ private StageResult> revise() {
String statementSQL = String.format("inOutSDfType = %s and operationStatus = %s and statementType = %s",
InOutSDfType.type1.getKey(), OperationStatus.Pending.getKey(), StatementType.full.getKey());
Collection stmts = statementImdg.getCollectionObjectsBySQL(statementSQL);
@@ -164,7 +164,7 @@ public class BalanceRevise implements ISessionStage {
rgsAMT.setCheckBalance(stmt.getAmount());
rgsAMT.setDiffBalance(safeBD(rgsAMT.getBalance()).subtract(safeBD(rgsAMT.getCheckBalance())));
}
- return new StageResult(null, true);
+ return new StageResult<>(null, true);
}
private BigDecimal safeBD(BigDecimal value) {
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/DealsPrepare.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/DealsPrepare.java
new file mode 100644
index 000000000..7189e13c2
--- /dev/null
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/DealsPrepare.java
@@ -0,0 +1,80 @@
+package ru.spcex.clearing.session.stage.impl;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
+import ru.clearing.classes.statics.data.execution.ExecutionFond;
+import ru.spcex.clearing.imdg.IMDGDistributedNames;
+import ru.spcex.clearing.session.stage.ISessionStage;
+import ru.spcex.clearing.session.stage.StageResult;
+import ru.spcex.clearing.session.stage.Task;
+import ru.spcex.clearing.session.stage.task.DealsPreparePayload;
+import ru.spcex.platform.classes.base.interfaces.IExecution;
+import ru.spcex.platform.classes.base.interfaces.WithExchangeExecutionId;
+import ru.spcex.platform.imdg.api.Imdg;
+import ru.spcex.platform.imdg.api.ImdgProvider;
+
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.List;
+import java.util.function.Function;
+import java.util.stream.Stream;
+
+@Service
+public class DealsPrepare implements ISessionStage {
+ private final Logger log = LoggerFactory.getLogger(getClass());
+ private final Imdg executionDepositImdg;
+ private final Imdg executionFondImdg;
+
+ @Autowired
+ public DealsPrepare(ImdgProvider imdgProvider) {
+ this.executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class);
+ this.executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
+ }
+
+ @Override
+ public StageResult> submit(Task> task) {
+ DealsPreparePayload payload = (DealsPreparePayload) task.getData();
+ switch (task.getTaskType()) {
+ case DealsPrepare -> {
+ return prepareDeals(payload.getSessionId(), payload.getCompanyId(), payload.getSecurityId());
+ }
+ default -> {
+ throw new IllegalStateException("Unknown task type: " + task.getTaskType());
+ }
+ }
+ }
+
+ private StageResult> prepareDeals(Long sessionId, Long companyId, Long securityId) {
+ StringBuilder executionDepositSQL = new StringBuilder("sessionId = null");
+ if (companyId != null) {
+ executionDepositSQL.append(" and companyId = ").append(companyId);
+ }
+ if (securityId != null) {
+ executionDepositSQL.append(" and securityId = ").append(securityId);
+ }
+ Collection excDpsts = executionDepositImdg.getCollectionObjectsBySQL(executionDepositSQL.toString());
+ Collection excFonds = executionFondImdg.getCollectionObjectsBySQL(executionDepositSQL.toString());
+ List excs = Stream.concat(excDpsts.stream().map(execToInterface()),
+ excFonds.stream().map(execToInterface()))
+ .sorted(Comparator.comparing(WithExchangeExecutionId::getExchangeExecutionId))
+ .toList();
+ for (IExecution exc : excs) {
+ exc.setSessionId(sessionId);
+ if (exc instanceof ExecutionDeposit) {
+ executionDepositImdg.update((ExecutionDeposit) exc);
+ } else if (exc instanceof ExecutionFond) {
+ executionFondImdg.update((ExecutionFond) exc);
+ }
+ }
+ StageResult> res = new StageResult<>(null, true);
+ res.setStageResult(excs);
+ return res;
+ }
+
+ private static Function execToInterface() {
+ return (e) -> e;
+ }
+}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/DealsPreparePayload.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/DealsPreparePayload.java
new file mode 100644
index 000000000..d71c7e8d7
--- /dev/null
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/DealsPreparePayload.java
@@ -0,0 +1,31 @@
+package ru.spcex.clearing.session.stage.task;
+
+public class DealsPreparePayload {
+ private Long sessionId;
+ private Long companyId;
+ private Long securityId;
+
+ public Long getSessionId() {
+ return sessionId;
+ }
+
+ public void setSessionId(Long sessionId) {
+ this.sessionId = sessionId;
+ }
+
+ public Long getCompanyId() {
+ return companyId;
+ }
+
+ public void setCompanyId(Long companyId) {
+ this.companyId = companyId;
+ }
+
+ public Long getSecurityId() {
+ return securityId;
+ }
+
+ public void setSecurityId(Long securityId) {
+ this.securityId = securityId;
+ }
+}
diff --git a/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/IExecution.java b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/IExecution.java
new file mode 100644
index 000000000..62c4060b7
--- /dev/null
+++ b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/IExecution.java
@@ -0,0 +1,4 @@
+package ru.spcex.platform.classes.base.interfaces;
+
+public interface IExecution extends WithSessionId, WithExchangeExecutionId {
+}
diff --git a/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithExchangeExecutionId.java b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithExchangeExecutionId.java
new file mode 100644
index 000000000..e0ad65433
--- /dev/null
+++ b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithExchangeExecutionId.java
@@ -0,0 +1,5 @@
+package ru.spcex.platform.classes.base.interfaces;
+
+public interface WithExchangeExecutionId {
+ Long getExchangeExecutionId();
+}
diff --git a/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithSessionId.java b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithSessionId.java
new file mode 100644
index 000000000..0b5c9f38b
--- /dev/null
+++ b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithSessionId.java
@@ -0,0 +1,6 @@
+package ru.spcex.platform.classes.base.interfaces;
+
+public interface WithSessionId {
+ Long getSessionId();
+ void setSessionId(Long sessionId);
+}