reports-service запускалки... Ещё доделать осталось.

This commit is contained in:
AKurakin 2022-12-30 19:53:56 +03:00
parent 9e9229588c
commit fa5d6fbcc6
8 changed files with 120 additions and 7 deletions

View file

@ -12,6 +12,7 @@ import ru.spcex.clearing.reports.services.ReportsService;
import ru.spcex.clearing.reports.services.builders.XMLReportBuilder;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.io.File;
import java.time.LocalDate;
import java.util.Map;
@ -32,7 +33,8 @@ public class ReportsServiceApplication {
log.info("Report types: {}", allReports);
for (ReportDataCollector collector : allReports.values()) {
log.info("Make report {}", collector);
XMLReportBuilder xmlReportBuilder = new XMLReportBuilder(collector.getReportClass());
File outPath=new File(".");
XMLReportBuilder xmlReportBuilder = new XMLReportBuilder(collector.getReportClass(), outPath);
LocalDate date2 = LocalDate.now();
LocalDate date1 = LocalDate.of(date2.getYear(), date2.getMonth(), 1);//date2.minusMonths(1);
AbstractReport report = collector.collectReportWithPeriod(date1, date2);

View file

@ -19,6 +19,7 @@ public class ReportsServiceSettings {
private HazelcastClientParams hazelcast;
private KafkaConsumerSettings kafkaConsumer;
private KafkaProducerSettings kafkaProducer;
private String reportModuleOut;
public HazelcastClientParams getHazelcast() {
return hazelcast;
@ -43,4 +44,12 @@ public class ReportsServiceSettings {
public void setKafkaProducer(KafkaProducerSettings kafkaProducer) {
this.kafkaProducer = kafkaProducer;
}
public String getReportModuleOut() {
return reportModuleOut;
}
public void setReportModuleOut(String reportModuleOut) {
this.reportModuleOut = reportModuleOut;
}
}

View file

@ -41,4 +41,7 @@ public abstract class AbstractReport {
abstract public String getReportName(LocalDateTime reportDateTime);
public ReportId getReportId() {
return reportId;
}
}

View file

@ -7,11 +7,13 @@ import org.springframework.beans.factory.InitializingBean;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportWithPeriodRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.reports.config.element.ReportsServiceSettings;
import ru.spcex.clearing.reports.reports.AbstractReport;
import ru.spcex.clearing.reports.reports.ReportId;
import ru.spcex.clearing.reports.services.builders.XMLReportBuilder;
import ru.spcex.platform.enumeration.Task;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.log.ExceptionUtils;
import java.io.File;
import java.io.IOException;
@ -24,13 +26,22 @@ public class QCommandExecutor extends QueueConsumer implements InitializingBean
private final Logger log = LoggerFactory.getLogger(getClass());
private final Map<ReportId, ReportDataCollector> collectorForReport = new HashMap<>();
// private final ImdgId idGenerator;
// private final ImdgId idGenerator;
// private final KafkaSender kafkaReqProducer;
ReportsServiceCommand reportsServiceCommand;
ReportsServiceSettings config;
public QCommandExecutor(Consumer<String, Object> kafkaQueue, ImdgProvider imdgProvider,
List<ReportDataCollector> listOfCollectors) {
List<ReportDataCollector> listOfCollectors,
ReportsServiceCommand reportsServiceCommand,
ReportsServiceSettings config) {
super(kafkaQueue);
for (ReportDataCollector<?> collector : listOfCollectors) {
ReportId rId = collector.getReportId();
collectorForReport.put(rId, collector);
}
this.reportsServiceCommand = reportsServiceCommand;
this.config = config;
}
@Override
@ -59,12 +70,14 @@ public class QCommandExecutor extends QueueConsumer implements InitializingBean
LocalDate endDate = request.getEndDate();
if (startDate.isAfter(endDate)) throw new IllegalStateException("StartDate > EndDate");
XMLReportBuilder reportBuilder = new XMLReportBuilder(reportDataCollector.getReportClass());
File outPath = new File(config.getReportModuleOut());
XMLReportBuilder reportBuilder = new XMLReportBuilder(reportDataCollector.getReportClass(), outPath);
AbstractReport report = reportDataCollector.collectReportWithPeriod(startDate, endDate);
File reportFile = null;
try {
reportFile = reportBuilder.createReport(report);
} catch (IOException e) {
log.error("Error create report {}: {}", request.getReportId(), ExceptionUtils.getStackTrace(e));
}
if (reportFile != null) {

View file

@ -3,8 +3,11 @@ package ru.spcex.clearing.reports.services;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.spcex.clearing.reports.reports.AbstractReport;
import ru.spcex.clearing.reports.reports.ReportId;
import ru.spcex.platform.utils.time.TimeUtil;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.Instant;
@ -37,6 +40,25 @@ public abstract class ReportDataCollector<T extends AbstractReport> {
abstract public Class<T> getReportClass();
public ReportId getReportId() {
Class<T> theClass = getReportClass();
Constructor[] constructors = theClass.getConstructors(); // getConstructors - public, getDeclaredConstructors - all
Constructor<T> useConstructor = null;
for (int i = 0; i < constructors.length; i++) {
if (useConstructor == null || useConstructor.getParameterCount() > constructors[i].getParameterCount()) {
useConstructor = constructors[i];
}
}
Object[] cArg = new Object[useConstructor.getParameterCount()]; // all null
try {
T object = useConstructor.newInstance(cArg);
ReportId theId = object.getReportId();
return theId;
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException("Can not found ReportId from class " + theClass.getName(), e);
}
}
protected void validateDateRange(LocalDate startDate, LocalDate endDate) throws IllegalArgumentException {
if (startDate.isAfter(endDate)) {
throw new IllegalArgumentException("startDate(" + startDate + ") > endDate(" + endDate + ")");

View file

@ -21,6 +21,7 @@ import ru.spcex.clearing.reports.reports.bt_17_5.*;
import java.time.LocalDate;
import java.time.LocalTime;
@Deprecated
public class ReportsService {
private final Logger log = LoggerFactory.getLogger(getClass());

View file

@ -0,0 +1,61 @@
package ru.spcex.clearing.reports.services;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import ru.spcex.clearing.reports.config.element.ReportsServiceSettings;
import ru.spcex.clearing.reports.reports.AbstractReport;
import ru.spcex.clearing.reports.services.builders.XMLReportBuilder;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.util.Map;
/**
* Исполняет создание отчётов.
* @see QCommandExecutor
*/
@Service
public class ReportsServiceCommand implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
protected ReportsServiceSettings settings;
protected ImdgProvider imdg;
protected Map<String, ReportDataCollector> allReports;
@Autowired
public ReportsServiceCommand(ImdgProvider imdg, Map<String, ReportDataCollector> allReports, ReportsServiceSettings settings) {
this.imdg = imdg;
this.allReports = allReports; // allReports = context.getBeansOfType(ReportDataCollector.class);
this.settings = settings;
}
public void writeAllXML() throws IOException {
log.info("Report types: {}", allReports);
for (ReportDataCollector collector : allReports.values()) {
log.info("Make report {}", collector);
File outPath = new File(settings.getReportModuleOut());
XMLReportBuilder xmlReportBuilder = new XMLReportBuilder(collector.getReportClass(), outPath);
LocalDate date2 = LocalDate.now();
LocalDate date1 = LocalDate.of(date2.getYear(), date2.getMonth(), 1);//date2.minusMonths(1);
AbstractReport report = collector.collectReportWithPeriod(date1, date2);
xmlReportBuilder.createReport(report);
}
log.info("Shutdown application after work");
}
public void writeAllDocx() {
log.info("TODO write docx"); // todo write docx
}
@Override
public void afterPropertiesSet() {
log.info("Wait IMDG...");
imdg.waitAvailable();
log.info("Report generator ready. Available reports: {}", allReports.keySet());
}
}

View file

@ -15,11 +15,13 @@ import java.time.LocalDateTime;
public class XMLReportBuilder extends FileReportBuilder {
private final Logger log = LoggerFactory.getLogger(getClass());
protected final XStream xStream;
protected final File outFolder;
public XMLReportBuilder(Class<? extends AbstractReport> reportClass) {
public XMLReportBuilder(Class<? extends AbstractReport> reportClass, File outFolder) {
super(reportClass);
this.xStream = new XStream(new XppDriver(new NoNameCoder()));
xStream.processAnnotations(reportClass);
this.outFolder = outFolder;
}
@Override
@ -27,7 +29,7 @@ public class XMLReportBuilder extends FileReportBuilder {
String reportName = report.getReportName(LocalDateTime.now());
String reportFileName = makeFileName(reportName, ".xml");
File reportFile = new File(reportFileName);
File reportFile = new File(outFolder, reportFileName);
if (reportFile.exists()) {
if (reportFile.isFile()) {
log.warn("Файл {} существует и будет перезаписан", reportFileName);