diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java index 7c67f6866..392dc6062 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java @@ -172,6 +172,44 @@ public class ValidationConfig { }; } + // todo оставил бин валидатора на будущее, если в дальнейшем придется проверять запрос. в текущей версии, по факту, + // запрос не проверяется: в случае если sessionId не указан отчеты не строятся + @Bean("reportRequestGRET") + public Function reportRequestGRETValidator( + Map> imdgForValidation + ) { + return launcherCommandRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(launcherCommandRequest); + return new ValidatorImpl<>(context, + FieldRequiredRule.instance( + "sessionId", + LauncherCommandRequest::getSessionId, + ReportError.RequiredFieldEmpty, + false) + ); + }; + } + + // todo оставил бин валидатора на будущее, если в дальнейшем придется проверять запрос. в текущей версии, по факту, + // запрос не проверяется: в случае если sessionId не указан отчеты не строятся + @Bean("reportRequestGREF") + public Function reportRequestGREFValidator( + Map> imdgForValidation + ) { + return launcherCommandRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(launcherCommandRequest); + return new ValidatorImpl<>(context, + FieldRequiredRule.instance( + "sessionId", + LauncherCommandRequest::getSessionId, + ReportError.RequiredFieldEmpty, + false) + ); + }; + } + } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoNettoReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoNettoReportBuilder.java index 238b04f31..96f09745b 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoNettoReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ks/KSRepDepoNettoReportBuilder.java @@ -49,7 +49,7 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder reportRequestWithSessionIdListValidator; private final Function reportRequestWithPeriodValidator; private final Function reportRequestGREPValidator; + private final Function reportRequestGRETValidator; + private final Function reportRequestGREFValidator; private final Map>> reportBuildersWithoutParams; private final Map>> reportBuildersWithSessionIdParam; private final Map>> reportBuildersWithSessionIdListParam; @@ -72,7 +74,11 @@ public class ReportService extends QueueConsumer implements InitializingBean { @Qualifier("reportRequestWithPeriodValidator") Function reportRequestWithPeriodValidator, @Qualifier("reportRequestGREP") - Function reportRequestGREPValidator) { + Function reportRequestGREPValidator, + @Qualifier("reportRequestGRET") + Function reportRequestGRETValidator, + @Qualifier("reportRequestGREF") + Function reportRequestGREFValidator) { super(kafkaQueue, kafkaResponseQueue); this.userRoleVerification = userRoleVerification; this.validationHelper = validationHelper; @@ -85,6 +91,8 @@ public class ReportService extends QueueConsumer implements InitializingBean { this.reportBuildersWithSessionIdListParam = reportBuildersWithSessionIdListParam; this.reportBuildersWithPeriodParams = reportBuildersWithPeriodParams; this.reportRequestGREPValidator = reportRequestGREPValidator; + this.reportRequestGRETValidator = reportRequestGRETValidator; + this.reportRequestGREFValidator = reportRequestGREFValidator; this.outFolder = new File(reportsServiceSettings.getReportModuleOut()); assert outFolder.isDirectory(); } @@ -106,6 +114,12 @@ public class ReportService extends QueueConsumer implements InitializingBean { callback(LauncherCommandRequest.class) .setFunction(this::createReportForGREP) .forDestination(Task.createReport_GREP.topic(), callbacks::put); + callback(LauncherCommandRequest.class) + .setFunction(this::createReportForGRET) + .forDestination(Task.createDealsReport_GRET.topic(), callbacks::put); + callback(LauncherCommandRequest.class) + .setFunction(this::createReportForGREF) + .forDestination(Task.createDealsReport_GREF.topic(), callbacks::put); init(); } @@ -257,7 +271,7 @@ public class ReportService extends QueueConsumer implements InitializingBean { } public RequestInfoUpdate createReportForGREP(BaseRequest userRequest) { - log.debug("ReportRequestWithPeriod received"); + log.debug("GREP task received"); RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); if (requestInfoUpdate != null) return null; @@ -289,9 +303,12 @@ public class ReportService extends QueueConsumer implements InitializingBean { Collection>> buildersWithSessionIdParam = reportBuildersWithSessionIdParam.values(); for (List> builderList : buildersWithSessionIdParam) { for (CSVReportBuilder builder : builderList) { + // todo возможно, для тасков GRET/GREP/GREF стоит сделать отдельные коллекции с билдерами, чтобы не проверять эти условия if ( builder.getReportType() == ReportType.OPERATIONAL_MONEY_CHANGE || - builder.getReportType() == ReportType.OPERATIONAL_LIABILITIES_CLAIMS + builder.getReportType() == ReportType.OPERATIONAL_LIABILITIES_CLAIMS || + builder.getReportType() == ReportType.UNFULFILLED_DEAL_REPORT || + builder.getReportType() == ReportType.EXECUTED_DEAL_REPORT ) { continue; } @@ -347,6 +364,122 @@ public class ReportService extends QueueConsumer implements InitializingBean { return null; } + public RequestInfoUpdate createReportForGRET(BaseRequest userRequest) { + log.debug("GRET task received"); + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); + if (requestInfoUpdate != null) return null; + + requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestGRETValidator); + if (requestInfoUpdate != null) return null; + + Long sessionId = userRequest.getRequestPayload().getSessionId(); + + logUnknownProperties(userRequest); + + int cntErrors = 0; + List outFilenames = new ArrayList<>(); + + if (sessionId != null) { + + Collection>> buildersWithSessionIdParam = reportBuildersWithSessionIdParam.values(); + for (List> builderList : buildersWithSessionIdParam) { + for (CSVReportBuilder builder : builderList) { + // todo возможно, для тасков GRET/GREP/GREF стоит сделать отдельные коллекции с билдерами, чтобы не проверять эти условия + if ( + builder.getReportType() != ReportType.UNFULFILLED_DEAL_REPORT && + builder.getReportType() != ReportType.EXECUTED_DEAL_REPORT + ) { + continue; + } + SessionIdParam sessionIdParam = new SessionIdParam(); + sessionIdParam.setSessionId(sessionId); + File outFile = builder.createReport(sessionIdParam, outFolder); + if (outFile == null) { + log.warn("Something wrong, report type: {}", builder.getReportType().getKey()); + cntErrors++; + continue; + } + outFilenames.add(outFile.getAbsolutePath()); + } + } + } + + if (cntErrors == 0) log.debug("All reports successfully created. Output files: {}", String.join(", ", outFilenames)); + else log.debug("Some reports ({}) create failed. Output files: {}", cntErrors, String.join(", ", outFilenames)); + + return null; + } + + public RequestInfoUpdate createReportForGREF(BaseRequest userRequest) { + log.debug("GREF task received"); + + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); + if (requestInfoUpdate != null) return null; + + requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestGREFValidator); + if (requestInfoUpdate != null) return null; + + Long sessionId = userRequest.getRequestPayload().getSessionId(); + + logUnknownProperties(userRequest); + + int cntErrors = 0; + List outFilenames = new ArrayList<>(); + + Collection>> buildersWithoutParams = reportBuildersWithoutParams.values(); + for (List> builderList : buildersWithoutParams) { + for (CSVReportBuilder builder : builderList) { + // todo возможно, для тасков GRET/GREP/GREF стоит сделать отдельные коллекции с билдерами, чтобы не проверять эти условия + if ( + builder.getReportType() != ReportType.KS_REP_CASH_REGISTERS && + builder.getReportType() != ReportType.KS_REP_CASH_REGISTER_SUMS && + builder.getReportType() != ReportType.KS_REP_DEPO_REGISTERS && + builder.getReportType() != ReportType.KS_REP_DEPO_REGISTER_QUANTITIES && + builder.getReportType() != ReportType.KS_REP_TRADES && + builder.getReportType() != ReportType.KS_REP_FIRM_DETAILS + ) { + continue; + } + File outFile = builder.createReport(new EmptyParams(), outFolder); + if (outFile == null) { + log.warn("Something wrong, report type: {}", builder.getReportType().getKey()); + cntErrors++; + continue; + } + outFilenames.add(outFile.getAbsolutePath()); + } + } + + if (sessionId != null) { + Collection>> buildersWithSessionIdParam = reportBuildersWithSessionIdParam.values(); + for (List> builderList : buildersWithSessionIdParam) { + for (CSVReportBuilder builder : builderList) { + // todo возможно, для тасков GRET/GREP/GREF стоит сделать отдельные коллекции с билдерами, чтобы не проверять эти условия + if ( + builder.getReportType() != ReportType.KS_REP_CASH_NETTO && + builder.getReportType() != ReportType.KS_REP_DEPO_NETTO + ) { + continue; + } + SessionIdParam sessionIdParam = new SessionIdParam(); + sessionIdParam.setSessionId(sessionId); + File outFile = builder.createReport(sessionIdParam, outFolder); + if (outFile == null) { + log.warn("Something wrong, report type: {}", builder.getReportType().getKey()); + cntErrors++; + continue; + } + outFilenames.add(outFile.getAbsolutePath()); + } + } + } + + if (cntErrors == 0) log.debug("All reports successfully created. Output files: {}", String.join(", ", outFilenames)); + else log.debug("Some reports ({}) create failed. Output files: {}", cntErrors, String.join(", ", outFilenames)); + + return null; + } + private void logUnknownProperties(BaseRequest request) { Map unknownProperties = request.getUnknownProperties(); for (Map.Entry unknownProperty : unknownProperties.entrySet()) {