diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java index 643b8f596..c6862616f 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java @@ -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); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/element/ReportsServiceSettings.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/element/ReportsServiceSettings.java index d3aa03d8a..c8d0d3ad3 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/element/ReportsServiceSettings.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/element/ReportsServiceSettings.java @@ -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; + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/AbstractReport.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/AbstractReport.java index 8a1293fb1..27c7072af 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/AbstractReport.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/AbstractReport.java @@ -41,4 +41,7 @@ public abstract class AbstractReport { abstract public String getReportName(LocalDateTime reportDateTime); + public ReportId getReportId() { + return reportId; + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java index 3d5e55548..c185fda56 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java @@ -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 collectorForReport = new HashMap<>(); -// private final ImdgId idGenerator; + // private final ImdgId idGenerator; // private final KafkaSender kafkaReqProducer; - + ReportsServiceCommand reportsServiceCommand; + ReportsServiceSettings config; public QCommandExecutor(Consumer kafkaQueue, ImdgProvider imdgProvider, - List listOfCollectors) { + List 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) { diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java index 6914c414e..dcb12b510 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java @@ -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 { abstract public Class getReportClass(); + public ReportId getReportId() { + Class theClass = getReportClass(); + Constructor[] constructors = theClass.getConstructors(); // getConstructors - public, getDeclaredConstructors - all + Constructor 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 + ")"); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsService.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsService.java index f0ba2a4a7..c6f0a6eb5 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsService.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsService.java @@ -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()); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsServiceCommand.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsServiceCommand.java new file mode 100644 index 000000000..0325f791b --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsServiceCommand.java @@ -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 allReports; + + @Autowired + public ReportsServiceCommand(ImdgProvider imdg, Map 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()); + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java index 61995cab6..2dd5e8546 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java @@ -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 reportClass) { + public XMLReportBuilder(Class 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);