Добавил не полную логику формирования строк файлов (необходимо изменение ТЗ).
This commit is contained in:
parent
9d7bb36da8
commit
9bba734885
4 changed files with 201 additions and 16 deletions
|
|
@ -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());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
package ru.spcex.clearing.lim.exporter.services;
|
package ru.spcex.clearing.lim.exporter.services;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import ru.spcex.clearing.lim.exporter.config.SFTPConfig;
|
import ru.spcex.clearing.lim.exporter.config.SFTPConfig;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
@ -11,7 +13,7 @@ import java.time.format.DateTimeFormatter;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
public abstract class AbstractExporterService {
|
public abstract class AbstractExporterService {
|
||||||
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
private static final DateTimeFormatter dtFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
|
private static final DateTimeFormatter dtFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
|
||||||
private final SFTPConfig.LimGateway gateway;
|
private final SFTPConfig.LimGateway gateway;
|
||||||
|
|
||||||
|
|
@ -21,7 +23,9 @@ public abstract class AbstractExporterService {
|
||||||
|
|
||||||
public abstract Collection<String> getLimFileRows();
|
public abstract Collection<String> getLimFileRows();
|
||||||
public abstract String getTargetFileName();
|
public abstract String getTargetFileName();
|
||||||
|
|
||||||
public void process() {
|
public void process() {
|
||||||
|
log.debug("Start export {} Lim file", getTargetFileName());
|
||||||
String fileName = getTargetFileName();
|
String fileName = getTargetFileName();
|
||||||
File limFile = new File(fileName);
|
File limFile = new File(fileName);
|
||||||
|
|
||||||
|
|
@ -29,8 +33,11 @@ public abstract class AbstractExporterService {
|
||||||
try {
|
try {
|
||||||
Files.write(limFilePath, getLimFileRows());
|
Files.write(limFilePath, getLimFileRows());
|
||||||
gateway.sendToSftp(limFile);
|
gateway.sendToSftp(limFile);
|
||||||
|
|
||||||
|
log.debug("Successfully exported {} file", fileName);
|
||||||
Files.deleteIfExists(limFilePath);
|
Files.deleteIfExists(limFilePath);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
log.error("Failed export {} file", fileName);
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,27 +1,104 @@
|
||||||
package ru.spcex.clearing.lim.exporter.services;
|
package ru.spcex.clearing.lim.exporter.services;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.stereotype.Service;
|
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.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.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class MoneyExporterService extends AbstractExporterService {
|
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);
|
super(gateway);
|
||||||
}
|
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||||
|
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
|
||||||
@Override
|
|
||||||
public Collection<String> getLimFileRows(){
|
|
||||||
List<String> limFileRows = Arrays.asList("a", "b", "c");
|
|
||||||
return limFileRows;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getTargetFileName() {
|
public String getTargetFileName() {
|
||||||
return prepareFileName("money");
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,26 +1,81 @@
|
||||||
package ru.spcex.clearing.lim.exporter.services;
|
package ru.spcex.clearing.lim.exporter.services;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.stereotype.Service;
|
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.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.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class SecurityExporterService extends AbstractExporterService {
|
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);
|
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
|
@Override
|
||||||
public String getTargetFileName() {
|
public String getTargetFileName() {
|
||||||
return prepareFileName("security");
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue