This commit is contained in:
ialbert 2023-08-10 16:18:42 +03:00
parent 0e4acc54fa
commit 5ed3f63e91
17 changed files with 137 additions and 16 deletions

View file

@ -0,0 +1,50 @@
package ru.spcex.clearing.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.sdf.SDf14;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.importexport.SwtExporterRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.platform.enumeration.SdfResult;
import ru.spcex.platform.enumeration.SwtTable;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.time.Instant;
import java.time.format.DateTimeFormatter;
@Component
public class Sdf14Sender {
private final ImdgId idGenerator;
private final Imdg<SDf14> sDf14Imdg;
private final KafkaSender kafkaSender;
private static DateTimeFormatter tmTimeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
private final Logger log = LoggerFactory.getLogger(getClass());
@Autowired
public Sdf14Sender(ImdgProvider imdgProvider, KafkaSender kafkaSender) {
this.idGenerator = imdgProvider.getImdgIdGenerator();
this.sDf14Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf14, SDf14.class);
this.kafkaSender = kafkaSender;
}
public void sendSdf14(Long sessionId) {
SDf14 sDf14 = new SDf14();
sDf14.setId(idGenerator.nextId());
sDf14.setResult(SdfResult.OK.getKey());
sDf14.setGenerationTime(Instant.now());
sDf14.setGenerationId(idGenerator.nextId());
SwtExporterRequest swtReq = new SwtExporterRequest();
swtReq.setGroupId(sDf14.getGenerationId());
swtReq.setType(SwtTable.SDF_14.getKey());
swtReq.setSessionId(sessionId);
kafkaSender.sendRequestToQueue(Consts.SWT_EXPORTER, swtReq);
log.info("created sdf14.id {}, sent request to export", sDf14.getId());
}
}

View file

@ -298,7 +298,7 @@ public class Sdf01Executor extends AbstractExecutor<SDf01> {
sDf02.setInSDfId(sdf01.getId());
sDf02.setGenerationId(generationIdForGroup);
sDf02.setGenerationTime(Instant.now());
sDf02.setResult("OK");
sDf02.setResult(SdfResult.OK.getKey());
return sDf02;
}

View file

@ -300,7 +300,7 @@ public class Sdf08Executor extends AbstractExecutor<SDf08> {
sDf09.setClientName(sdf08.getClientName());
sDf09.setGenerationId(generationIdForGroup);
sDf09.setGenerationTime(Instant.now());
sDf09.setResult("OK");
sDf09.setResult(SdfResult.OK.getKey());
return sDf09;
}

View file

@ -103,7 +103,7 @@ public class Sdf10Executor {
for (SDf10 sdf10 : sdfs) {
SDf11 sdf11 = createSdf11(sdf10, now);
sdf11.setGenerationId(sdf11GroupId);
sdf11.setResult("OK");
sdf11.setResult(SdfResult.OK.getKey());
sdf11Imdg.insert(sdf11);
log.debug("sdf10.id={} created sdf11.id={}", sdf10.getId(), sdf11.getId());
}

View file

@ -94,6 +94,7 @@ public class PrimaryAuctionB0Session extends AbstractSession implements Initiali
dealsPrepare.addExecutionFondCondition(execFondPb.in("market", marketCodes.get().toArray(new String[0])));
inclusionObligations.setSessionType(sessionType());
inspectionObligations.setSection(section());
finishingSession.setSection(section());
imdgProvider.waitAvailable();
initSessionIfPresent();
}

View file

@ -95,6 +95,7 @@ public class PrimaryAuctionBnSession extends AbstractSession implements Initiali
dealsPrepare.addExecutionFondCondition(execFondPb.in("market", marketCodes.get().toArray(new String[0])));
inclusionObligations.setSessionType(sessionType());
inspectionObligations.setSection(section());
finishingSession.setSection(section());
imdgProvider.waitAvailable();
initSessionIfPresent();
}

View file

@ -95,6 +95,7 @@ public class PrimaryAuctionT0Session extends AbstractSession implements Initiali
dealsPrepare.addExecutionFondCondition(execFondPb.in("market", marketCodes.get().toArray(new String[0])));
inclusionObligations.setSessionType(sessionType());
inspectionObligations.setSection(section());
finishingSession.setSection(section());
imdgProvider.waitAvailable();
initSessionIfPresent();
}

View file

@ -91,6 +91,7 @@ public class SecondaryAuctionT0Session extends AbstractSession implements Initia
dealsPrepare.addExecutionFondCondition(execFondPb.in("market", marketCodes.get().toArray(new String[0])));
inclusionObligations.setSessionType(sessionType());
inspectionObligations.setSection(section());
finishingSession.setSection(section());
imdgProvider.waitAvailable();
initSessionIfPresent();
}

View file

@ -14,12 +14,14 @@ import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWith
import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithSessionId;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.service.Sdf05Sender;
import ru.spcex.clearing.service.Sdf14Sender;
import ru.spcex.clearing.session.stage.ISessionStage;
import ru.spcex.clearing.session.stage.StageResult;
import ru.spcex.clearing.session.stage.Task;
import ru.spcex.clearing.session.stage.task.FinishingSessionPayload;
import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.Section;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
@ -43,15 +45,22 @@ public class FinishingSession implements ISessionStage {
private final KafkaSender kafkaSender;
private final IMessageResolver msgResolver;
private final Sdf05Sender sdf05Sender;
private final Sdf14Sender sdf14Sender;
private Section section;
@Autowired
public FinishingSession(ImdgProvider imdgProvider, KafkaSender kafkaSender, IMessageResolver msgResolver, Sdf05Sender sdf05Sender) {
public FinishingSession(ImdgProvider imdgProvider, KafkaSender kafkaSender, IMessageResolver msgResolver, Sdf05Sender sdf05Sender, Sdf14Sender sdf14Sender) {
this.imdgProvider = imdgProvider;
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.sDf05Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf05, SDf05.class);
this.kafkaSender = kafkaSender;
this.msgResolver = msgResolver;
this.sdf05Sender = sdf05Sender;
this.sdf14Sender = sdf14Sender;
}
public void setSection(Section section) {
this.section = section;
}
@Override
@ -89,6 +98,9 @@ public class FinishingSession implements ISessionStage {
}
}
sdf05Sender.sendSdf05(pr);
if (Section.FOND.equals(section)) {
sdf14Sender.sendSdf14(sessionId);
}
StageResult<Collection<Registry>> res = new StageResult<>(null, true);
return res;
}

View file

@ -2,6 +2,7 @@ package ru.spcex.clearing.swt.exporter.services;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.spcex.clearing.platform.messaging.domain.cud.importexport.SwtExporterRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.JournalEventExportedRequest;
import ru.spcex.clearing.platform.messaging.serialization.LogFormatter;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
@ -54,17 +55,17 @@ public abstract class AbstractExporterService<T extends SpcexObjectBase> {
protected abstract String typeForFileName();
protected abstract String sectionForFileName();
protected abstract String sectionForFileName(SwtExporterRequest req);
protected abstract String typeForHeader();
protected abstract SWTHeaderData getHeader(T record, int count);
public void process(Long groupId) {
public void process(SwtExporterRequest req) {
LocalDateTime exportAt = LocalDateTime.now();
String fileName = formatFileName(typeForFileName(), sectionForFileName(), exportAt);
Long groupId = req.getGroupId();
String fileName = formatFileName(typeForFileName(), sectionForFileName(req), exportAt);
log.debug("Start export {} Lim file", fileName);
try {

View file

@ -42,7 +42,7 @@ public class LauncherCommandReceiver extends QueueConsumer implements Initializi
for (AbstractExporterService exporter : exporterServices) {
log.debug("Export {}", exporter);
try {
exporter.process(-1L);
exporter.process(null);
} catch (Exception e) {
log.error("One of exporter has error: {}", ExceptionUtils.getStackTrace(e));
}
@ -57,7 +57,7 @@ public class LauncherCommandReceiver extends QueueConsumer implements Initializi
if (exporter.getType().getKey().equals(req.getType())) {
log.debug("Export {}", exporter);
try {
exporter.process(req.getGroupId());
exporter.process(req);
} catch (Exception e) {
log.error("Exporter has error: {}", ExceptionUtils.getStackTrace(e));
}

View file

@ -4,6 +4,7 @@ import com.hazelcast.aws.utility.StringUtil;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.sdf.SDf09;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.importexport.SwtExporterRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.swt.exporter.services.AbstractExporterService;
import ru.spcex.clearing.swt.exporter.services.FileStorage;
@ -35,7 +36,7 @@ public class DF09Exporter extends AbstractExporterService<SDf09> {
}
@Override
protected String sectionForFileName() {
protected String sectionForFileName(SwtExporterRequest req) {
return null;
}

View file

@ -4,6 +4,7 @@ import com.hazelcast.aws.utility.StringUtil;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.sdf.SDf11;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.importexport.SwtExporterRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.swt.exporter.services.AbstractExporterService;
import ru.spcex.clearing.swt.exporter.services.FileStorage;
@ -34,7 +35,7 @@ public class DF11Exporter extends AbstractExporterService<SDf11> {
}
@Override
protected String sectionForFileName() {
protected String sectionForFileName(SwtExporterRequest req) {
return null;
}

View file

@ -4,6 +4,7 @@ import com.hazelcast.aws.utility.StringUtil;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.sdf.SDf12;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.importexport.SwtExporterRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.swt.exporter.services.AbstractExporterService;
import ru.spcex.clearing.swt.exporter.services.FileStorage;
@ -35,7 +36,7 @@ public class DF12Exporter extends AbstractExporterService<SDf12> {
}
@Override
protected String sectionForFileName() {
protected String sectionForFileName(SwtExporterRequest req) {
return "bond"; // todo bond / fund
}

View file

@ -1,25 +1,33 @@
package ru.spcex.clearing.swt.exporter.services.exportimpl;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.sdf.SDf14;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.importexport.SwtExporterRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.swt.exporter.services.AbstractExporterService;
import ru.spcex.clearing.swt.exporter.services.FileStorage;
import ru.spcex.clearing.swt.exporter.util.ConvertionContext;
import ru.spcex.clearing.swt.exporter.util.SWTHeaderData;
import ru.spcex.platform.enumeration.Section;
import ru.spcex.platform.enumeration.SessionType;
import ru.spcex.platform.enumeration.SwtTable;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import java.io.PrintWriter;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.Objects;
@Service
public class DF14Exporter extends AbstractExporterService<SDf14> {
private static final String RESULT_CONST = "OK";
private final Imdg<Session> sessionImdg;
public DF14Exporter(FileStorage fileStorage,
KafkaSender kafkaSender,
@ -27,6 +35,7 @@ public class DF14Exporter extends AbstractExporterService<SDf14> {
super(fileStorage, kafkaSender, imdgProvider,
SwtTable.SDF_14,
IMDGDistributedNames.Map_SDf14, SDf14.class);
this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
}
@Override
@ -35,8 +44,20 @@ public class DF14Exporter extends AbstractExporterService<SDf14> {
}
@Override
protected String sectionForFileName() {
return "bond"; // todo bond / fund
protected String sectionForFileName(SwtExporterRequest req) {
Long sessionId = req.getSessionId();
Objects.requireNonNull(sessionId, "cannot process DF-14 without session id");
Session session = sessionImdg.getSingleObjectByID(sessionId);
Objects.requireNonNull(session, "cannot process DF-14: couldn't find session.id=%d".formatted(sessionId));
SessionType type = IEnumKey.getEnumByKey(SessionType.class, session.getSessionType());
Objects.requireNonNull(type, "cannot process DF-14: session.id=%d couldn't determine session type %s".formatted(sessionId, session.getSessionType()));
if (!Section.FOND.equalsByKey(session.getSection())) {
throw new IllegalStateException("DF-14 is only processed for FOND section");
}
if (type == SessionType.TRDT) {
return "fund";
}
return "bond";
}
@Override
@ -56,7 +77,7 @@ public class DF14Exporter extends AbstractExporterService<SDf14> {
@Override
protected String convertRecord(SDf14 record, ConvertionContext context) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(RESULT_CONST).append(SWTHeaderData.LINE_SEPARATOR);
stringBuilder.append(record.getResult()).append(SWTHeaderData.LINE_SEPARATOR);
return stringBuilder.toString();
}

View file

@ -0,0 +1,19 @@
package ru.spcex.platform.enumeration;
import ru.spcex.platform.utils.enumeration.IEnumKey;
public enum SdfResult implements IEnumKey {
OK("OK"),
;
private final String key;
SdfResult(String key) {
this.key = key;
}
@Override
public String getKey() {
return key;
}
}

View file

@ -9,6 +9,9 @@ public class SwtExporterRequest {
@JsonProperty
public Long groupId;
@JsonProperty
public Long sessionId;
public String getType() {
return type;
}
@ -24,4 +27,12 @@ public class SwtExporterRequest {
public void setGroupId(Long groupId) {
this.groupId = groupId;
}
public Long getSessionId() {
return sessionId;
}
public void setSessionId(Long sessionId) {
this.sessionId = sessionId;
}
}