This commit is contained in:
akulikov 2024-12-02 15:36:07 +03:00
parent 0c75d61840
commit f951575425
5 changed files with 395 additions and 1 deletions

View file

@ -0,0 +1,175 @@
package ru.spcex.clearing.reports.builders.bean;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.opencsv.bean.CsvBindByName;
import com.opencsv.bean.CsvBindByPosition;
import com.opencsv.bean.CsvDate;
import com.opencsv.bean.CsvNumber;
public class KSRepLccValueReport {
@CsvBindByName(column = "FIRM_ID")
@CsvBindByPosition(position = 0)
private String firmId;
@CsvBindByName(column = "REPORT_DATE")
@CsvBindByPosition(position = 1)
@CsvDate(value = "dd.MM.yyyy'T'HH:mm:ss")
private LocalDateTime reportDate;
@CsvBindByName(column = "TKR")
@CsvBindByPosition(position = 2)
private String tkr;
@CsvBindByName(column = "SUM_VALUE")
@CsvBindByPosition(position = 3)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal sumValue;
@CsvBindByName(column = "LOCK_VALUE")
@CsvBindByPosition(position = 4)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal lockValue;
@CsvBindByName(column = "FREE_VALUE")
@CsvBindByPosition(position = 5)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal freeValue;
@CsvBindByName(column = "SINGLE_LIMIT")
@CsvBindByPosition(position = 6)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal singleLimit;
@CsvBindByName(column = "CURRENCY")
@CsvBindByPosition(position = 7)
private String currency;
@CsvBindByName(column = "NCC_REAL_ACCOUNT")
@CsvBindByPosition(position = 8)
private String nccRealAccount;
@CsvBindByName(column = "QUANTITY")
@CsvBindByPosition(position = 9)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal quantity;
@CsvBindByName(column = "LOCK_QUANTITY")
@CsvBindByPosition(position = 10)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal lockQuantity;
@CsvBindByName(column = "FREE_QUANTITY")
@CsvBindByPosition(position = 10)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal freeQuantity;
@CsvBindByName(column = "VALUE")
@CsvBindByPosition(position = 11)
private BigDecimal value;
public String getFirmId() {
return firmId;
}
public void setFirmId(String firmId) {
this.firmId = firmId;
}
public LocalDateTime getReportDate() {
return reportDate;
}
public void setReportDate(LocalDateTime reportDate) {
this.reportDate = reportDate;
}
public String getTkr() {
return tkr;
}
public void setTkr(String tkr) {
this.tkr = tkr;
}
public BigDecimal getSumValue() {
return sumValue;
}
public void setSumValue(BigDecimal sumValue) {
this.sumValue = sumValue;
}
public BigDecimal getLockValue() {
return lockValue;
}
public void setLockValue(BigDecimal lockValue) {
this.lockValue = lockValue;
}
public BigDecimal getFreeValue() {
return freeValue;
}
public void setFreeValue(BigDecimal freeValue) {
this.freeValue = freeValue;
}
public BigDecimal getSingleLimit() {
return singleLimit;
}
public void setSingleLimit(BigDecimal singleLimit) {
this.singleLimit = singleLimit;
}
public String getCurrency() {
return currency;
}
public void setCurrency(String currency) {
this.currency = currency;
}
public String getNccRealAccount() {
return nccRealAccount;
}
public void setNccRealAccount(String nccRealAccount) {
this.nccRealAccount = nccRealAccount;
}
public BigDecimal getQuantity() {
return quantity;
}
public void setQuantity(BigDecimal quantity) {
this.quantity = quantity;
}
public BigDecimal getLockQuantity() {
return lockQuantity;
}
public void setLockQuantity(BigDecimal lockQuantity) {
this.lockQuantity = lockQuantity;
}
public BigDecimal getFreeQuantity() {
return freeQuantity;
}
public void setFreeQuantity(BigDecimal freeQuantity) {
this.freeQuantity = freeQuantity;
}
public BigDecimal getValue() {
return value;
}
public void setValue(BigDecimal value) {
this.value = value;
}
}

View file

@ -0,0 +1,157 @@
package ru.spcex.clearing.reports.builders.ks;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.security.Rates;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.builders.CSVReportBuilder;
import ru.spcex.clearing.reports.builders.EmptyParams;
import ru.spcex.clearing.reports.builders.bean.KSRepLccValueReport;
import ru.spcex.platform.enumeration.ReportBuilderType;
import ru.spcex.platform.enumeration.ReportKeys;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@Component
public class KSRepLccValueReportBuilder extends CSVReportBuilder<EmptyParams, KSRepLccValueReport> {
private final Imdg<Registry> registryImdg;
private final Imdg<Rates> ratesImdg;
private List<KSRepLccValueReport> rows = null;
public KSRepLccValueReportBuilder(ImdgProvider imdgProvider) {
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
ratesImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Rates, Rates.class);
}
@Override
protected List<KSRepLccValueReport> getRows() {
return rows;
}
@Override
public ReportBuilderType getReportType() {
return ReportBuilderType.KS_REP_LCC_NETTO;
}
@Override
public ReportKeys getReportKey() {
return ReportKeys.KS_REP_LCC_NETTO_REPORT;
}
@Override
public Class<EmptyParams> getParamsClass() {
return EmptyParams.class;
}
@Override
public Class<KSRepLccValueReport> getReportClass() {
return KSRepLccValueReport.class;
}
@Override
protected void collect(EmptyParams params) {
// ImdgPredicateBuilder registryPB = registryImdg.predicateBuilder();
// ImdgPredicate baseRegistriesPredicate = RegistryCodeSqlBuilder.getInstance(
// RegistryTradingParams.AM_F,
// RegistryTradingParams.OM_T,
// RegistryTradingParams.TM_T
// ).buildPredicate(registryPB);
// Collection<Registry> baseRegistries = registryImdg.getCollectionObjectsByPredicate(baseRegistriesPredicate);
//
// Map<Long, List<Registry>> groupedByTKR = baseRegistries.stream()
// .filter(registry -> {
// if (registry.getTradingClearingRegistryId() == null) {
// log.warn("Skip registry (id = {}): empty trading_clearing_registry_id", registry.getId());
// return false;
// }
// if (registry.getSecurityId() == null) {
// log.warn("Skip registry (id = {}): empty security_id", registry.getId());
// return false;
// }
// return true;
// })
// .collect(Collectors.groupingBy(Registry::getTradingClearingRegistryId));
//
// Map<Long, Rates> currencyRates = new HashMap<>();
// LocalDateTime nowTime = LocalDateTime.now();
// LocalDate now = LocalDate.now();
// for (Map.Entry<Long, List<Registry>> entryTKR : groupedByTKR.entrySet()) {
// Long tradingClearingRegistryId = entryTKR.getKey();
// List<Registry> registriesForTKR = entryTKR.getValue();
//
// Registry sampleRegistry = registriesForTKR.iterator().next();
// String firmId = sampleRegistry.getTradingCode();
// String tkr = sampleRegistry.getTradingClearingRegistry();
// BigDecimal sumValue = BigDecimal.ZERO;
// for (Registry registry : registriesForTKR) {
// if (
// registry.getRegistryDesignation().equals(RegistryDesignation.A.getKey()) &&
// registry.getRegistryInstrumentType().equals(RegistryInstrumentType.M.getKey()) &&
// registry.getRegistryUnit().equals(RegistryUnit.F.getKey())
// ) {
// if (registry.getBalance() == null) continue;
// Long securityId = registry.getSecurityId();
// Rates currencyRate = currencyRates.get(securityId);
// if (currencyRate == null) {
// ImdgPredicateBuilder ratesPB = ratesImdg.predicateBuilder();
// Collection<Rates> rates = ratesImdg.getCollectionObjectsByPredicate(
// ratesPB.and(
// ratesPB.equals("currency_id", securityId),
// ratesPB.notNull("value"),
// ratesPB.equals("value_date", now)
// )
// );
// if (!rates.isEmpty()) {
// currencyRate = rates.iterator().next();
// } else {
// currencyRate = new Rates();
// currencyRate.setValue(BigDecimal.ONE);
// };
// currencyRates.put(securityId, currencyRate);
// }
// sumValue = sumValue.add(registry.getBalance().multiply(currencyRate.getValue()));
// }
// }
//
// Map<Long, List<Registry>> registriesForSecurityId = registriesForTKR.stream().collect(
// Collectors.groupingBy(Registry::getSecurityId)
// );
//
// List<KSRepLccValueReport> rowsForGroup = new ArrayList<>();
// for (Map.Entry<Long, List<Registry>> entrySecurityId : registriesForSecurityId.entrySet()) {
// KSRepLccValueReport ksRepLccValueReport = new KSRepLccValueReport();
// ksRepLccValueReport.setFirmId(firmId);
// ksRepLccValueReport.setReportDate(nowTime);
// ksRepLccValueReport.setTkr(tkr);
// ksRepLccValueReport.setSumValue(sumValue);
//
// Long securityId = entrySecurityId.getKey();
// List<Registry> registries = entrySecurityId.getValue();
// BigDecimal demandMoney = BigDecimal.ZERO;
// BigDecimal obligMoney = BigDecimal.ZERO;
// BigDecimal posMoney = BigDecimal.ZERO;
// for (Registry registry : registries) {
// if (
// List.of(RegistryStatus.PROC, RegistryStatus.MNG).contains(
// IEnumKey.getEnumByKey(RegistryStatus.class, registry.getRegistryStatus())
// ) &&
// registry.getRegistryInstrumentType().equals(RegistryInstrumentType.M.getKey()) &&
// registry.getRegistryUnit().equals(RegistryUnit.T.getKey())
// ) {
// }
// }
//
// rowsForGroup.add(ksRepLccValueReport);
// }
//
// }
//
rows = new ArrayList<>();
}
}

View file

@ -23,6 +23,7 @@ import ru.spcex.clearing.reports.builders.ks.KSRepDepoRegisterQuantitiesReportBu
import ru.spcex.clearing.reports.builders.ks.KSRepDepoRegistersReportBuilder;
import ru.spcex.clearing.reports.builders.ks.KSRepLccNettoReportBuilder;
import ru.spcex.clearing.reports.builders.ks.KSRepLccTradesReportBuilder;
import ru.spcex.clearing.reports.builders.ks.KSRepLccValueReportBuilder;
import ru.spcex.clearing.reports.builders.ks.KSRepTradesReportBuilder;
import ru.spcex.clearing.reports.builders.ks.KSSessionListReportBuilder;
import ru.spcex.platform.enumeration.ReportBuilderType;
@ -40,7 +41,8 @@ public class ReportBuildersConfig {
KSSessionListReportBuilder ksSessionListReportBuilder,
KSCommissionTradesReportBuilder ksCommissionTradesReportBuilder,
KSRepLccTradesReportBuilder ksRepLccTradesReportBuilder,
KSRepLccNettoReportBuilder ksRepLccNettoReportBuilder
KSRepLccNettoReportBuilder ksRepLccNettoReportBuilder,
KSRepLccValueReportBuilder ksRepLccValueReportBuilder
) {
Map<ReportBuilderType, List<CSVReportBuilder<EmptyParams, ?>>> resultMap = new HashMap<>();
resultMap.put(ReportBuilderType.KS_REP_CASH_REGISTERS, List.of(ksRepCashRegistersReportBuilder));
@ -52,6 +54,7 @@ public class ReportBuildersConfig {
resultMap.put(ReportBuilderType.KS_COMMISSION_TRADES, List.of(ksCommissionTradesReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_LCC_TRADES, List.of(ksRepLccTradesReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_LCC_NETTO, List.of(ksRepLccNettoReportBuilder));
resultMap.put(ReportBuilderType.KS_REP_LCC_VALUE, List.of(ksRepLccValueReportBuilder));
return resultMap;
}
@ -162,4 +165,14 @@ public class ReportBuildersConfig {
return resultMap;
}
@Bean("reportBuildersForCX84")
public Map<ReportBuilderType, List<CSVReportBuilder<?, ?>>> reportBuildersForCX84(
KSRepLccValueReportBuilder ksRepLccValueReportBuilder
) {
Map<ReportBuilderType, List<CSVReportBuilder<?, ?>>> resultMap = new HashMap<>();
resultMap.put(ReportBuilderType.KS_REP_LCC_VALUE, List.of(ksRepLccValueReportBuilder));
return resultMap;
}
}

View file

@ -173,6 +173,25 @@ public class ValidationConfig {
);
};
}
// todo оставил бин валидатора на будущее, если в дальнейшем придется проверять запрос. в текущей версии, по факту,
// запрос не проверяется: в случае если sessionId не указан отчеты не строятся
@Bean("reportRequestCX84Validator")
public Function<LauncherCommandRequest, IValidator> reportRequestCX84Validator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
) {
return launcherCommandRequest -> {
ImdgValidationContext<LauncherCommandRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(launcherCommandRequest);
return new ValidatorImpl<>(context,
FieldRequiredRule.instance(
"sessionId",
LauncherCommandRequest::getSessionId,
ReportError.RequiredFieldEmpty,
false)
);
};
}
}

View file

@ -55,6 +55,7 @@ public class ReportService extends QueueConsumerV2 implements InitializingBean {
private final Function<LauncherCommandRequest, IValidator> reportRequestGRETValidator;
private final Function<LauncherCommandRequest, IValidator> reportRequestGREFValidator;
private final Function<LauncherCommandRequest, IValidator> reportRequestGRECValidator;
private final Function<LauncherCommandRequest, IValidator> reportRequestCX84Validator;
private final Map<ReportBuilderType, List<CSVReportBuilder<EmptyParams, ?>>> reportBuildersWithoutParams;
private final Map<ReportBuilderType, List<CSVReportBuilder<SessionIdParam, ?>>> reportBuildersWithSessionIdParam;
@ -62,6 +63,7 @@ public class ReportService extends QueueConsumerV2 implements InitializingBean {
private final Map<ReportBuilderType, List<CSVReportBuilder<?, ?>>> reportBuildersForGREF;
private final Map<ReportBuilderType, List<CSVReportBuilder<?, ?>>> reportBuildersForGRET;
private final Map<ReportBuilderType, List<CSVReportBuilder<?, ?>>> reportBuildersForGREC;
private final Map<ReportBuilderType, List<CSVReportBuilder<?, ?>>> reportBuildersForCX84;
private final Imdg<Session> sessionImdg;
@ -88,6 +90,8 @@ public class ReportService extends QueueConsumerV2 implements InitializingBean {
Map<ReportBuilderType, List<CSVReportBuilder<?, ?>>> reportBuildersForGRET,
@Qualifier("reportBuildersForGREC")
Map<ReportBuilderType, List<CSVReportBuilder<?, ?>>> reportBuildersForGREC,
@Qualifier("reportBuildersForCX84")
Map<ReportBuilderType, List<CSVReportBuilder<?, ?>>> reportBuildersForCX84,
@Qualifier("reportRequestValidator")
Function<ReportRequest, IValidator> reportRequestValidator,
@ -102,6 +106,9 @@ public class ReportService extends QueueConsumerV2 implements InitializingBean {
Function<LauncherCommandRequest, IValidator> reportRequestGREFValidator,
@Qualifier("reportRequestGREFValidator")
Function<LauncherCommandRequest, IValidator> reportRequestGRECValidator,
@Qualifier("reportRequestCX84Validator")
Function<LauncherCommandRequest, IValidator> reportRequestCX84Validator,
ImdgProvider imdgProvider,
SFTPReportsConfig.ReportsGateway reportsSftpGateway
@ -117,10 +124,12 @@ public class ReportService extends QueueConsumerV2 implements InitializingBean {
this.reportRequestGRETValidator = reportRequestGRETValidator;
this.reportRequestGREFValidator = reportRequestGREFValidator;
this.reportRequestGRECValidator = reportRequestGRECValidator;
this.reportRequestCX84Validator = reportRequestCX84Validator;
this.reportBuildersForGREP = reportBuildersForGREP;
this.reportBuildersForGREF = reportBuildersForGREF;
this.reportBuildersForGRET = reportBuildersForGRET;
this.reportBuildersForGREC = reportBuildersForGREC;
this.reportBuildersForCX84 = reportBuildersForCX84;
this.reportsSftpGateway = reportsSftpGateway;
this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
this.outFolder = new File(reportsServiceSettings.getReportsStore().getLocalTempDir());
@ -154,6 +163,9 @@ public class ReportService extends QueueConsumerV2 implements InitializingBean {
callback(LauncherCommandRequest.class)
.setFunction(this::createReportForGREC)
.forDestination(Task.createReport_GREC.topic(), callbacks::put);
callback(LauncherCommandRequest.class)
.setFunction(this::createReportForCX84)
.forDestination(Task.CX84.topic(), callbacks::put);
init();
}
@ -342,6 +354,24 @@ public class ReportService extends QueueConsumerV2 implements InitializingBean {
return null;
}
public RequestInfoUpdate createReportForCX84(BaseRequest<LauncherCommandRequest> userRequest) {
log.debug("CX84 task received");
try {
RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestCX84Validator);
if (requestInfoUpdate != null) return null;
logUnknownProperties(userRequest);
Map<File, ReportInfo> outFiles = createReportsForTask(List.of(), reportBuildersForCX84.values());
sendReportsToGateway(List.of(), outFiles, ReportType.REPORT_KS_LCC.getKey());
sendFilesToSftp(outFiles.keySet());
} catch (Exception e) {
log.error("Unexpected exception", e);
}
return null;
}
private Map<File, ReportInfo> createReportsForTask(List<Long> sessionIds, Collection<List<CSVReportBuilder<?, ?>>> buildersForTask) {
Map<File, ReportInfo> outFiles = new HashMap<>();
int cntErrors = 0;