Добавил не полную логику формирования строк файлов (необходимо изменение ТЗ).
This commit is contained in:
psemenkov 2023-05-11 13:49:48 +03:00
parent 9d7bb36da8
commit 9bba734885
4 changed files with 201 additions and 16 deletions

View file

@ -0,0 +1,46 @@
package ru.spcex.clearing.lim.exporter.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import ru.spcex.clearing.lim.exporter.config.settings.ExportLimServiceSettings;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
@Configuration
public class ImdgConfig {
private static ThreadPoolTaskExecutor createThreadPoolTaskExecutor(int maxPoolSz, boolean waitForCompletion) {
ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
if (maxPoolSz > 2) {
pool.setKeepAliveSeconds(60);
pool.setAllowCoreThreadTimeOut(true);
}
pool.setCorePoolSize(maxPoolSz);
pool.setWaitForTasksToCompleteOnShutdown(waitForCompletion);
return pool;
}
@Bean(name = "taskExecutorHazelcastClientInitializer")
public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() {
return createThreadPoolTaskExecutor(1, true);
}
@Bean(name = "taskExecutorIdGeneratorAwaiter")
public ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter() {
return createThreadPoolTaskExecutor(1, false);
}
@Autowired
@Bean
public ImdgProvider imdgProvider(
@Qualifier("taskExecutorHazelcastClientInitializer") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer,
@Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter,
ExportLimServiceSettings settings) {
return new HazelcastService(taskExecutorHazelcastClientInitializer,
taskExecutorIdGeneratorAwaiter,
settings.getHazelcast());
}
}

View file

@ -1,5 +1,7 @@
package ru.spcex.clearing.lim.exporter.services;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.spcex.clearing.lim.exporter.config.SFTPConfig;
import java.io.File;
@ -11,7 +13,7 @@ import java.time.format.DateTimeFormatter;
import java.util.Collection;
public abstract class AbstractExporterService {
private final Logger log = LoggerFactory.getLogger(getClass());
private static final DateTimeFormatter dtFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
private final SFTPConfig.LimGateway gateway;
@ -21,7 +23,9 @@ public abstract class AbstractExporterService {
public abstract Collection<String> getLimFileRows();
public abstract String getTargetFileName();
public void process() {
log.debug("Start export {} Lim file", getTargetFileName());
String fileName = getTargetFileName();
File limFile = new File(fileName);
@ -29,8 +33,11 @@ public abstract class AbstractExporterService {
try {
Files.write(limFilePath, getLimFileRows());
gateway.sendToSftp(limFile);
log.debug("Successfully exported {} file", fileName);
Files.deleteIfExists(limFilePath);
} catch (IOException e) {
log.error("Failed export {} file", fileName);
throw new RuntimeException(e);
}
}

View file

@ -1,27 +1,104 @@
package ru.spcex.clearing.lim.exporter.services;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.lim.exporter.config.SFTPConfig;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.util.Arrays;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class MoneyExporterService extends AbstractExporterService {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<Registry> registryImdg;
private final List<String> validStatus = List.of("ACTV", "ROPN");
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
public MoneyExporterService(SFTPConfig.LimGateway gateway) {
public MoneyExporterService(SFTPConfig.LimGateway gateway, ImdgProvider imdgProvider) {
super(gateway);
}
@Override
public Collection<String> getLimFileRows(){
List<String> limFileRows = Arrays.asList("a", "b", "c");
return limFileRows;
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
}
@Override
public String getTargetFileName() {
return prepareFileName("money");
}
@Override
public Collection<String> getLimFileRows() {
log.debug("Started loading and formation of money file lines");
LocalDate currentDate = LocalDate.now();
List<String> limFileRows = new ArrayList<>();
Collection<Registry> registriesA = registryImdg.getCollectionObjectsByFieldValues(
Map.of("registryDesignation", "A",
"registryInstrumentType", "M",
"registryCode", "F",
"clearingDate", currentDate));
Collection<Registry> registriesD = registryImdg.getCollectionObjectsByFieldValues(
Map.of("registryDesignation", "D",
"registryInstrumentType", "M",
"registryCode", "T",
"clearingDate", currentDate));
Map<String, List<Registry>> byTcrA = registriesA.stream()
.collect(Collectors.groupingBy(Registry::getTradingClearingRegistry));
Map<String, List<Registry>> byTcrD = registriesD.stream()
.collect(Collectors.groupingBy(Registry::getTradingClearingRegistry));
for(Map.Entry<String, List<Registry>> entryA : byTcrA.entrySet()){
List<Registry> registriesListA = entryA.getValue();
List<Registry> registriesListB = byTcrD.get(entryA.getKey());
for (Registry registry : registriesListA){
if(checkNotBloked(registry)){
//из ТЗ пока не понятно как соотнести Registry из registriesListA и registriesListB по валюте(RUB, USD) и вычислить остаток на денежном счете
// limFileRows.add(getRow(...));
}
}
}
log.debug("Successfully completed the formation of rows: {} for export money", limFileRows.size());
return limFileRows;
}
private boolean checkNotBloked(Registry registry){
TradingClearingRegistry tradingClearingRegistry = tradingClearingRegistryImdg.getSingleObjectByID(registry.getTradingClearingRegistryId());
return validStatus.contains(tradingClearingRegistry.getStatus());
}
//поменяется при обновлении ТЗ
private String getRow(Registry registryA, Registry registryB){
StringBuilder row = new StringBuilder();
row.append("MONEY: FIRM_ID = ");
row.append(registryA.getTradingCode());
row.append("; TAG = SPVB");
row.append("; CURR_CODE = ");
// MoneyMarketSecurity mms = moneyMarketSecurityMap.getSingleObjectByFieldValues(Map.of("securityId", ));
row.append("; CLIENT_CODE = ");
row.append(registryA.getTradingClearingRegistry());
row.append("; OPEN_BALANCE = ");
BigDecimal balance = registryA.getBalance() != null ?
registryB.getBalance() != null ? registryA.getBalance().subtract(registryB.getBalance()) : registryA.getBalance() :
BigDecimal.ZERO;
row.append(balance);
row.append("; OPEN_LIMIT = 0.00");
row.append("; LIMIT_KIND = 0;");
return row.toString();
}
}

View file

@ -1,26 +1,81 @@
package ru.spcex.clearing.lim.exporter.services;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.lim.exporter.config.SFTPConfig;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.util.Arrays;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@Service
public class SecurityExporterService extends AbstractExporterService {
public SecurityExporterService(SFTPConfig.LimGateway gateway) {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<Registry> registryImdg;
public SecurityExporterService(SFTPConfig.LimGateway gateway, ImdgProvider imdgProvider) {
super(gateway);
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
}
@Override
public Collection<String> getLimFileRows(){
List<String> limFileRows = Arrays.asList("a", "b", "c");
return limFileRows;
}
@Override
public String getTargetFileName() {
return prepareFileName("security");
}
@Override
public Collection<String> getLimFileRows(){
log.debug("Started loading and formation of DEPO file lines");
LocalDate currentDate = LocalDate.now();
List<String> limFileRows = new ArrayList<>();
Collection<Registry> registries = registryImdg.getCollectionObjectsByFieldValues(
Map.of("registryDesignation", "A",
"registryInstrumentType", "S",
"registryCode", "T",
"clearingDate", currentDate));
for (Registry registry : registries){
limFileRows.add(getRow(registry));
}
log.debug("Successfully completed the formation of rows: {} for export DEPO", limFileRows.size());
return limFileRows;
}
private String getRow(Registry registry){
StringBuilder row = new StringBuilder();
row.append("DEPO: FIRM_ID = ");
row.append(registry.getTradingCode());
row.append("; SECCODE = ");
row.append(getSecurityShortName(registry));
row.append("; CLIENT_CODE = ");
row.append(registry.getTradingClearingRegistry());
row.append("; OPEN_BALANCE = ");
row.append(registry.getBalance());
row.append("; OPEN_LIMIT = 0");
row.append("; TRDACCID = ");
row.append(registry.getTradingClearingRegistry());
row.append("; LIMIT_KIND = 0;");
return row.toString();
}
//скорее всего в новой редакции ТЗ не понадобится
private String getSecurityShortName(Registry registry){
return null;
}
}