From b80431f22e03d02ecfb624a9ec932288287e2503 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 19 May 2023 19:05:19 +0300 Subject: [PATCH] =?UTF-8?q?clearing-service=20CLS-290=20=D1=80=D0=B5=D1=84?= =?UTF-8?q?=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20stage=206,?= =?UTF-8?q?=208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stage/impl/FormingRegistersOnOS.java | 16 ++- .../session/stage/impl/UnlockResources.java | 107 +++++++++++------- .../task/FormingRegistersOnOSPayload.java | 5 + ...tionsAndSettlementRequirementsPayload.java | 31 ----- .../stage/task/UnlockResourcesPayload.java | 9 -- .../ImdgTransactionProviderHazelcast.java | 5 + 6 files changed, 80 insertions(+), 93 deletions(-) create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/FormingRegistersOnOSPayload.java delete mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/RegistryOnObligationsAndSettlementRequirementsPayload.java diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingRegistersOnOS.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingRegistersOnOS.java index 5204abe62..54b16f861 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingRegistersOnOS.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingRegistersOnOS.java @@ -9,7 +9,7 @@ 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.RegistryOnObligationsAndSettlementRequirementsPayload; +import ru.spcex.clearing.session.stage.task.FormingRegistersOnOSPayload; import ru.spcex.clearing.session.stage.util.RegistryUtil; import ru.spcex.platform.enumeration.RegistryDesignation; import ru.spcex.platform.enumeration.RegistryInstrumentType; @@ -39,10 +39,10 @@ public class FormingRegistersOnOS implements ISessionStage { @Override public StageResult submit(Task task) { - RegistryOnObligationsAndSettlementRequirementsPayload payload = (RegistryOnObligationsAndSettlementRequirementsPayload) task.getData(); + FormingRegistersOnOSPayload payload = (FormingRegistersOnOSPayload) task.getData(); switch (task.getTaskType()) { case FormingRegistersOnOS -> { - return createRegistryOnObligationsAndSettlementRequirements(payload.getSessionId()); + return createRegistryOnObligationsAndSettlementRequirements(); } default -> { throw new IllegalStateException("Unknown task type: " + task.getTaskType()); @@ -53,12 +53,10 @@ public class FormingRegistersOnOS implements ISessionStage { /** * Select Registry by: registryCode = [O/T][S/M][*][T] & registryStatus=OK * - * @param sessionId * @return */ - protected Collection selectRegistry(Long sessionId) { - String registrySQL = "sessionId = " + sessionId; - registrySQL += " and (registryDesignation=" + RegistryDesignation.O.getKey() + " or registryDesignation=" + RegistryDesignation.T.getKey() + ")"; + protected Collection selectRegistry() { + String registrySQL = "(registryDesignation=" + RegistryDesignation.O.getKey() + " or registryDesignation=" + RegistryDesignation.T.getKey() + ")"; registrySQL += " and (registryInstrumentType=" + RegistryInstrumentType.S.getKey() + " or registryInstrumentType=" + RegistryInstrumentType.M.getKey() + ")"; registrySQL += " and (registryUnit=" + RegistryUnit.T.getKey() + ")"; registrySQL += " and registryStatus=" + RegistryStatus.OK.getKey() + ")"; @@ -67,8 +65,8 @@ public class FormingRegistersOnOS implements ISessionStage { return result; } - protected StageResult createRegistryOnObligationsAndSettlementRequirements(Long sessionId) { - Collection forRegistries = selectRegistry(sessionId); + protected StageResult createRegistryOnObligationsAndSettlementRequirements() { + Collection forRegistries = selectRegistry(); ArrayList newRegistries = new ArrayList<>(); //todo oreder by обрабатываться группами по полю registry.groupId diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/UnlockResources.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/UnlockResources.java index c563c84b5..91c0a60f2 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/UnlockResources.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/UnlockResources.java @@ -15,6 +15,7 @@ import ru.spcex.platform.enumeration.RegistryInstrumentType; import ru.spcex.platform.enumeration.RegistryUnit; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.ImdgTransaction; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @@ -26,10 +27,12 @@ import java.util.Collection; public class UnlockResources implements ISessionStage { private final Logger log = LoggerFactory.getLogger(getClass()); + protected final ImdgProvider imdgProvider; private final Imdg registryImdg; @Autowired public UnlockResources(ImdgProvider imdgProvider) { + this.imdgProvider = imdgProvider; this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); } @@ -39,7 +42,7 @@ public class UnlockResources implements ISessionStage { switch (task.getTaskType()) { case UnlockResources -> { UnlockResourcesPayload payload = (UnlockResourcesPayload) task.getData(); - return unlockResources(payload.getSdfMode(), payload.getSessionId(), + return unlockResources(payload.getSdfMode(), payload.getAccount(), payload.getSecurityId(), payload.getFullNames(), @@ -52,26 +55,18 @@ public class UnlockResources implements ISessionStage { } } - /** - * Select Registry by: account; fullName* / securityId - */ - protected Collection selectRegistry(Long sessionId, String account, Long securityId, Collection fullNames) { + protected Collection selectRegistryForSDF04(String account, Collection fullNames) { ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); - ImdgPredicate queryPart; - if (securityId != null) { - queryPart = pb.in("securityId", securityId); - } else if (fullNames != null && !fullNames.isEmpty()) { - queryPart = pb.in("fullName", fullNames.toArray(new String[fullNames.size()])); - } else { - throw new IllegalArgumentException("Required securityId or fullNames"); - } ImdgPredicate query = pb.and( pb.and( - pb.equals("sessionId", sessionId), - pb.equals("registryDesignation", RegistryDesignation.A.getKey()) // не все нужны, только с этим кодом отфильтруем. + pb.equals("registryDesignation", RegistryDesignation.A.getKey()), + pb.equals("registryInstrumentType", RegistryInstrumentType.M.getKey()), + // pb.equals("registryCapacity", *), + pb.or(pb.equals("registryUnit", RegistryUnit.F.getKey()), + pb.equals("registryUnit", RegistryUnit.B.getKey())) ), pb.equals("account", account), - queryPart + pb.in("fullName", fullNames.toArray(new String[fullNames.size()])) ); Collection result = registryImdg.getCollectionObjectsByPredicate(query); @@ -79,50 +74,74 @@ public class UnlockResources implements ISessionStage { return result; } + /** + * Select Registry by: account; fullName* / securityId + */ + protected Collection selectRegistryForSDF12(String account, Long securityId) { + ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); + ImdgPredicate query = pb.and( + pb.and( + pb.equals("registryDesignation", RegistryDesignation.A.getKey()), + pb.equals("registryInstrumentType", RegistryInstrumentType.S.getKey()), + // pb.equals("registryCapacity", *), + pb.or(pb.equals("registryUnit", RegistryUnit.F.getKey()), + pb.equals("registryUnit", RegistryUnit.B.getKey())) + ), + pb.equals("account", account), + pb.in("securityId", securityId) + ); + + Collection result = registryImdg.getCollectionObjectsByPredicate(query); + log.trace("Selected {} registry's by sql: {}", result.size(), query); + return result; + } + + /** * @param sdfMode UnlockResourcesPayload.sdfMode - * @param sessionId * @param account * @param securityId * @param fullNames * @return */ - protected StageResult unlockResources(String sdfMode, Long sessionId, String account, Long securityId, Collection fullNames, BigDecimal value) { - Collection forRegistries = selectRegistry(sessionId, account, securityId, fullNames); + protected StageResult unlockResources(String sdfMode, String account, Long securityId, Collection fullNames, BigDecimal value) { + Collection forRegistries; - //todo при перезапуске после незапланированного завершения стадии: надо ли проверять уже созданные регистры и не создавать дубликаты? if (UnlockResourcesPayload.MODE_SDF04.equals(sdfMode)) { - forRegistries = forRegistries.stream().filter( - (Registry r) -> - RegistryDesignation.A.equalsByKey(r.getRegistryDesignation()) - && - RegistryInstrumentType.M.equalsByKey(r.getRegistryInstrumentType()) - && - (RegistryUnit.F.equalsByKey(r.getRegistryUnit()) || RegistryUnit.B.equalsByKey(r.getRegistryUnit())) - ).toList(); + forRegistries = selectRegistryForSDF04(account, fullNames); } else if (UnlockResourcesPayload.MODE_SDF12.equals(sdfMode)) { - forRegistries = forRegistries.stream().filter( - (Registry r) -> - RegistryDesignation.A.equalsByKey(r.getRegistryDesignation()) - && - RegistryInstrumentType.S.equalsByKey(r.getRegistryInstrumentType()) - && - (RegistryUnit.F.equalsByKey(r.getRegistryUnit()) || RegistryUnit.B.equalsByKey(r.getRegistryUnit())) - ).toList(); + forRegistries = selectRegistryForSDF12(account, securityId); } else { throw new IllegalArgumentException("Mode not support: " + sdfMode); } - for (Registry registry : forRegistries) { - boolean modified = unlockRegistry(registry, value); - if (modified) { - registry.setUpdated(Instant.now()); - registryImdg.update(registry); - log.trace("Registry {} changed; value +- registry", - registry.getId(), registry.getRegistryCode(), value); + ImdgTransaction tx = imdgProvider.newTransaction(); + boolean txOk = false; + try { + log.debug("Processing transaction {}, input {} registers.", tx, forRegistries.size()); + Imdg registryTxImdg = tx.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + int nUpdates = 0; + for (Registry registry : forRegistries) { + boolean modified = unlockRegistry(registry, value); + if (modified) { + registry.setUpdated(Instant.now()); + registryTxImdg.update(registry); + nUpdates++; + log.trace("Registry {} (registryCode={}) changed; value +- {}", + registry.getId(), registry.getRegistryCode(), value); + } + } + log.info("Updated {} registry's (under transaction {}", nUpdates, tx); + txOk = true; + } finally { + if (txOk) { + log.debug("Commit transaction {}.", tx); + tx.commitTransaction(); + } else { + log.info("Rollback transaction {}", tx); + tx.rollbackTransaction(); } } - //todo рекомендуется делать транзакцией. StageResult> res = new StageResult<>(null, true); res.setStageResult(forRegistries); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/FormingRegistersOnOSPayload.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/FormingRegistersOnOSPayload.java new file mode 100644 index 000000000..c09807ebb --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/FormingRegistersOnOSPayload.java @@ -0,0 +1,5 @@ +package ru.spcex.clearing.session.stage.task; + +public class FormingRegistersOnOSPayload { + +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/RegistryOnObligationsAndSettlementRequirementsPayload.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/RegistryOnObligationsAndSettlementRequirementsPayload.java deleted file mode 100644 index e0ddc15da..000000000 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/RegistryOnObligationsAndSettlementRequirementsPayload.java +++ /dev/null @@ -1,31 +0,0 @@ -package ru.spcex.clearing.session.stage.task; - -public class RegistryOnObligationsAndSettlementRequirementsPayload { - 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/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/UnlockResourcesPayload.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/UnlockResourcesPayload.java index 1b9525f23..fc16b5d2b 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/UnlockResourcesPayload.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/UnlockResourcesPayload.java @@ -12,8 +12,6 @@ public class UnlockResourcesPayload { */ private String sdfMode; - private Long sessionId; - /** * sDf04.c_acc_cred * sDf12.depoCodeSender @@ -46,13 +44,6 @@ public class UnlockResourcesPayload { } - public Long getSessionId() { - return sessionId; - } - - public void setSessionId(Long sessionId) { - this.sessionId = sessionId; - } public String getAccount() { return account; diff --git a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgTransactionProviderHazelcast.java b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgTransactionProviderHazelcast.java index 34e9ea3b1..e9d1d0380 100644 --- a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgTransactionProviderHazelcast.java +++ b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgTransactionProviderHazelcast.java @@ -68,4 +68,9 @@ public class ImdgTransactionProviderHazelcast implements ImdgTransaction { public void setHz(HazelcastInstance hz) { this.hz = hz; } + + @Override + public String toString() { + return "ImdgTransaction{" + (ctx == null ? null : ctx.getTxnId()) + "}"; + } }