From a7e2929cdbb03e717dcb15c8569fb87d291323b7 Mon Sep 17 00:00:00 2001 From: ialbert Date: Tue, 16 May 2023 13:41:36 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-290 --- .../clearing/error/ClearingErrorInternal.java | 1 + .../clearing/session/stage/ISessionStage.java | 6 + .../clearing/session/stage/SessionStage.java | 9 ++ .../clearing/session/stage/StageResult.java | 29 ++++ .../clearing/session/stage/StageStatus.java | 5 + .../ru/spcex/clearing/session/stage/Task.java | 19 +++ .../clearing/session/stage/TaskType.java | 6 + .../session/stage/impl/BalanceRevise.java | 145 ++++++++++++++++++ .../platform/enumeration/InOutSDfType.java | 2 +- .../platform/enumeration/RegistryUnit.java | 2 + 10 files changed, 223 insertions(+), 1 deletion(-) create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/ISessionStage.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SessionStage.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/StageResult.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/StageStatus.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/Task.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingErrorInternal.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingErrorInternal.java index f7052004c..c1d029a7e 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingErrorInternal.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingErrorInternal.java @@ -7,6 +7,7 @@ public enum ClearingErrorInternal implements IErrorEnumId { AccountNotActive(5415L), CompanyNotActive(5411L), FinancialObligationNotSatisfied(4L), + SessionGeneralError(2L); ; private final Long id; 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 new file mode 100644 index 000000000..9370c2483 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/ISessionStage.java @@ -0,0 +1,6 @@ +package ru.spcex.clearing.session.stage; + +public interface ISessionStage { + StageResult submit(Task task); +// StageStatus getInitStatus(); пока не нужно +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SessionStage.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SessionStage.java new file mode 100644 index 000000000..b01429c24 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SessionStage.java @@ -0,0 +1,9 @@ +package ru.spcex.clearing.session.stage; + +public enum SessionStage { + BalanceRevise, + DealsPrepare, + ObligationCalculate, + ObligationAdmittance, + //... +} 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 new file mode 100644 index 000000000..d657fa905 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/StageResult.java @@ -0,0 +1,29 @@ +package ru.spcex.clearing.session.stage; + +import ru.spcex.platform.utils.enumeration.EnumMessage; + +public class StageResult { + EnumMessage error; + boolean success; + + public StageResult(EnumMessage error, boolean success) { + this.error = error; + this.success = success; + } + + public EnumMessage getError() { + return error; + } + + public void setError(EnumMessage error) { + this.error = error; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/StageStatus.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/StageStatus.java new file mode 100644 index 000000000..2377b924f --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/StageStatus.java @@ -0,0 +1,5 @@ +package ru.spcex.clearing.session.stage; + +public enum StageStatus { + IDLE, PROCESSING +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/Task.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/Task.java new file mode 100644 index 000000000..28ebcb2f2 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/Task.java @@ -0,0 +1,19 @@ +package ru.spcex.clearing.session.stage; + +public class Task { + private TaskType taskType; + private T data; + + public Task(TaskType taskType, T data) { + this.taskType = taskType; + this.data = data; + } + + public TaskType getTaskType() { + return taskType; + } + + public T getData() { + return data; + } +} 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 new file mode 100644 index 000000000..b3dac4698 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java @@ -0,0 +1,6 @@ +package ru.spcex.clearing.session.stage; + +public enum TaskType { + StartRevise, + ContinueRevise +} 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 new file mode 100644 index 000000000..a9600ce2c --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java @@ -0,0 +1,145 @@ +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.misc.Currency; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.clearing.classes.statics.data.statement.Statement; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.clearing.Sdf56Request; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.clearing.session.stage.ISessionStage; +import ru.spcex.clearing.session.stage.StageResult; +import ru.spcex.clearing.session.stage.Task; +import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgId; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.specific.StatementRevisePredicate; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IEnumKey; +import ru.spcex.platform.utils.time.TimeUtil; + +import java.math.BigDecimal; +import java.time.Instant; +import java.time.LocalDate; +import java.time.Month; +import java.util.Collection; +import java.util.function.UnaryOperator; + +import static ru.spcex.clearing.error.ClearingErrorInternal.SessionGeneralError; + +@Service +public class BalanceRevise implements ISessionStage { + private final Logger log = LoggerFactory.getLogger(getClass()); + //todo remove (set all in single method setImdg(provider -> setImdg1();setIdGenerator();...) + private ImdgProvider imdgProvider; + private ImdgId idGenerator; + private Imdg statementImdg; + private Imdg registryImdg; + private Imdg currencyImdg; + private KafkaSender kafkaSender; + + @Autowired + public BalanceRevise(ImdgProvider imdgProvider) { + this.imdgProvider = imdgProvider; + this.idGenerator = imdgProvider.getImdgIdGenerator(); + this.statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class); + this.currencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, Currency.class); + this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + } + + @Override + public StageResult submit(Task task) { + switch (task.getTaskType()) { + case StartRevise -> { + return sendSdfs(); + } + case ContinueRevise -> { + return revise(); //((SdfClearingRequest) task.getData()).getGroupId() if needed + } + } + return null; + } + + + private StageResult sendSdfs() { + Collection currencies = currencyImdg.projectSingleAttribute("id"); + Statement statement = statementImdg.aggregateByMax("created", StatementRevisePredicate.get(statementImdg, currencies)); + + Sdf56Request sdf56Request = new Sdf56Request(); + sdf56Request.setNumber(idGenerator.nextId()); //fixme day scope id generator + sdf56Request.setsDateTime(statement != null ? + statement.getCreated() : TimeUtil.localDateToInstant(LocalDate.of(2023, Month.JANUARY, 1))); //fixme default sDate + sdf56Request.seteDateTime(Instant.now()); + 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(null, true); + } + + private StageResult revise() { + Collection stmts; + String statementSQL = String.format("inOutSDfType = %s and operationStatus = %s and statementType = %s", + InOutSDfType.type57, OperationStatus.Pending.getKey(), StatementType.incr.getKey()); + stmts = statementImdg.getCollectionObjectsBySQL(statementSQL); + + for (Statement stmt : stmts) { + String unformatted = "registry_designation = '%s' " + + "and registry_instrument_type = '%s' " + + "and registry_unit = '%s' " + + "and account = '%s' " + + "and securityId = %d"; + String registrySqlAMT = String.format(unformatted, + RegistryDesignation.A.getKey(), + RegistryInstrumentType.M.getKey(), + RegistryUnit.T.getKey(), + stmt.getAccount(), + stmt.getSecurityId() + ); + String registrySqlAMF = String.format(unformatted, + RegistryDesignation.A.getKey(), + RegistryInstrumentType.M.getKey(), + RegistryUnit.F.getKey(), + stmt.getAccount(), + stmt.getSecurityId() + ); + String registrySqlAMB = String.format(unformatted, + RegistryDesignation.A.getKey(), + RegistryInstrumentType.M.getKey(), + RegistryUnit.B.getKey(), + stmt.getAccount(), + stmt.getSecurityId() + ); + Registry rgsAMT = registryImdg.getSingleObjectBySQL(registrySqlAMT); + Registry rgsAMF = registryImdg.getSingleObjectBySQL(registrySqlAMF); + Registry rgsAMB = registryImdg.getSingleObjectBySQL(registrySqlAMB); + InOutDirection direction = IEnumKey.getEnumByKey(InOutDirection.class, stmt.getInOutDirection()); + UnaryOperator safe = (BigDecimal value) -> value != null ? value : BigDecimal.ZERO; + if (direction == null) throw new IllegalStateException("null direction"); + switch (direction) { + case out -> { + rgsAMT.setBalance(safe.apply(rgsAMT.getBalance()).subtract(safe.apply(stmt.getAmount()))); + rgsAMT.setDebit(safe.apply(rgsAMT.getDebit()).add(safe.apply(stmt.getAmount()))); + } + case in -> { + rgsAMT.setBalance(safe.apply(rgsAMT.getBalance()).add(safe.apply(stmt.getAmount()))); + rgsAMT.setCredit(safe.apply(rgsAMT.getCredit()).add(safe.apply(stmt.getAmount()))); + } + default -> {throw new IllegalStateException("null direction");} + } + rgsAMF.setBalance(safe.apply(rgsAMT.getBalance()).subtract(safe.apply(rgsAMB.getBalance()))); + registryImdg.update(rgsAMT); + registryImdg.update(rgsAMF); + registryImdg.update(rgsAMB); + //todo create if needed? + } + //todoSdf1 + return new StageResult(null, true); + } +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/InOutSDfType.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/InOutSDfType.java index 496c5befb..e7d4e2f88 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/InOutSDfType.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/InOutSDfType.java @@ -3,7 +3,7 @@ package ru.spcex.platform.enumeration; import ru.spcex.platform.utils.enumeration.IEnumKey; public enum InOutSDfType implements IEnumKey { - type1("0102"), type16("1617"), type9("0910"); + type1("0102"), type16("1617"), type9("0910"), type57("57"); private final String key; diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryUnit.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryUnit.java index e0d9856bb..9fe5baa20 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryUnit.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryUnit.java @@ -6,6 +6,8 @@ public enum RegistryUnit implements IEnumKey { T("T"), A("A"), R("R"), + F("F"), + B("B"), ; private final String key;