From 0def756f087cfef4290e5d6a99c44a6e3b674a2e Mon Sep 17 00:00:00 2001 From: ialbert Date: Thu, 30 Apr 2026 16:03:10 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-989 --- .../service/executors/Sdf55Executor.java | 6 +- .../clearing/service/registry/DmiService.java | 93 ++++++++++++------- .../validation/Sdf55ValidationRule.java | 5 +- 3 files changed, 68 insertions(+), 36 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf55Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf55Executor.java index f7ac9ec83..5dd4a02cd 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf55Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf55Executor.java @@ -69,7 +69,11 @@ public class Sdf55Executor { pmt.setUpdated(Instant.now()); pmtImdg.update(pmt); String curr = TextUtil.isEmpty(sDf55.getPay_val()) ? CurrencyCode.RUB.getKey() : sDf55.getPay_val(); - dmiService.setContract(tcr.getId(), curr, sDf54.getDocnm_ref(), sDf55.getDocnmprev()); + if (tcr != null) { + dmiService.setContract(tcr.getId(), curr, sDf54.getDocnm_ref(), sDf55.getDocnmprev()); + } else { + dmiService.setContractByAcc(pmt.getCreditLeg_accountId(), curr, sDf54.getDocnm_ref(), sDf55.getDocnmprev()); + } assets.process(assetTrio.a__b(), assetTrio.a__t(), assetTrio.a__f(), diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/DmiService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/DmiService.java index 72581f901..16daa75ab 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/DmiService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/DmiService.java @@ -92,42 +92,55 @@ public class DmiService { String securitySymbol, String comment, String contract) { - findDmiByComment(tcrId, securitySymbol, comment).ifPresentOrElse(d__i -> { - d__i.setContract(contract); - d__i.setUpdated(Instant.now()); - try { - Long dbfId = Long.valueOf(contract); - SDf57 sdf57 = sDf57Imdg.getFirstObjectBySQL("dbfId=%d".formatted(dbfId)); - if (sdf57 != null) { - ImdgPredicateBuilder pb = statementImdg.predicateBuilder(); - ImdgPredicate stmtPrdct = pb.and( - pb.equals("inSDfId", sdf57.getId()), - pb.equals("inOutSDfType", InOutSDfType.type57.getKey()) - ); - Statement stmt = statementImdg.getFirstObjectByPredicate(stmtPrdct); - if (stmt != null && OperationStatus.Executed.equalsByKey(stmt.getOperationStatus())) { - d__i.setRegistryStatus(RegistryStatus.OK.getKey()); - } else { - log.warn("tcrId={} securitySymbol={} comment={} sdf57 dbfId={} found, stmt.id={} status {}. d**i status will not be updated", - tcrId, - securitySymbol, - comment, - dbfId, - stmt != null ? stmt.getId() : null, - stmt != null ? stmt.getOperationStatus() : null); - } - } - } catch (Throwable e) { - log.error("sdf57 search by {}: error {}", - contract, - ExceptionUtils.getStackTrace(e)); - } - rgsImdg.update(d__i); - log.trace("set {}.id={} contract {}", d__i.getRegistryCode(), d__i.getId(), contract); - }, () -> log.trace("didn't find DM*I by tcr.id={} securitySymbol={} comment={}", + findDmiByComment(tcrId, securitySymbol, comment).ifPresentOrElse( + (d__i) -> updateD__i(d__i, contract, securitySymbol, comment), + () -> log.trace("didn't find DM*I by tcr.id={} securitySymbol={} comment={}", tcrId, securitySymbol, comment)); } + public void setContractByAcc(Long accId, + String securitySymbol, + String comment, + String contract) { + findDmiByCommentAcc(accId, securitySymbol, comment).ifPresentOrElse( + (d__i) -> updateD__i(d__i, contract, securitySymbol, comment), + () -> log.trace("didn't find DM*I by acc.id={} securitySymbol={} comment={}", + accId, securitySymbol, comment)); + } + + private void updateD__i(Registry d__i, String contract, String securitySymbol, String comment) { + d__i.setContract(contract); + d__i.setUpdated(Instant.now()); + try { + Long dbfId = Long.valueOf(contract); + SDf57 sdf57 = sDf57Imdg.getFirstObjectBySQL("dbfId=%d".formatted(dbfId)); + if (sdf57 != null) { + ImdgPredicateBuilder pb = statementImdg.predicateBuilder(); + ImdgPredicate stmtPrdct = pb.and( + pb.equals("inSDfId", sdf57.getId()), + pb.equals("inOutSDfType", InOutSDfType.type57.getKey()) + ); + Statement stmt = statementImdg.getFirstObjectByPredicate(stmtPrdct); + if (stmt != null && OperationStatus.Executed.equalsByKey(stmt.getOperationStatus())) { + d__i.setRegistryStatus(RegistryStatus.OK.getKey()); + } else { + log.warn("securitySymbol={} comment={} sdf57 dbfId={} found, stmt.id={} status {}. d**i status will not be updated", + securitySymbol, + comment, + dbfId, + stmt != null ? stmt.getId() : null, + stmt != null ? stmt.getOperationStatus() : null); + } + } + } catch (Throwable e) { + log.error("sdf57 search by {}: error {}", + contract, + ExceptionUtils.getStackTrace(e)); + } + rgsImdg.update(d__i); + log.trace("set {}.id={} contract {}", d__i.getRegistryCode(), d__i.getId(), contract); + } + /** * ищем D**I по tcrId/security/contract @@ -178,6 +191,20 @@ public class DmiService { return Optional.ofNullable(d__i); } + private Optional findDmiByCommentAcc(Long accId, String securitySymbol, String comment) { + ImdgPredicateBuilder pb = rgsImdg.predicateBuilder(); + RegistryTradingParams rgsCde = RegistryTradingParams.D__I; + ImdgPredicate prdct = pb.and( + pb.sql(RegistryCodeSqlBuilder.getInstance(rgsCde).build()), + pb.equals("accountId", accId), + pb.equals("securitySymbol", securitySymbol), + pb.equals("comment", comment) + ); + log.trace("searching D**I by {}", prdct); + Registry d__i = rgsImdg.getFirstObjectByPredicate(prdct); + return Optional.ofNullable(d__i); + } + public Optional createDmi(Long tcrId, String securitySymbol, BigDecimal summ) { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf55ValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf55ValidationRule.java index 58d8f2978..16a1b5d14 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf55ValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf55ValidationRule.java @@ -104,9 +104,10 @@ public enum Sdf55ValidationRule implements IValidationRule