Merge branch 'master' into develop

# Conflicts:
#	backend/pom.xml
#	distribution/pom.xml
#	frontend/pom.xml
#	pom.xml
#	resources/pom.xml
This commit is contained in:
Zaripov Emil 2024-11-05 12:40:23 +03:00
commit 14387e18b6
18 changed files with 90 additions and 87 deletions

View file

@ -5,7 +5,7 @@
<parent>
<groupId>ru.micord.ervu.lkrp</groupId>
<artifactId>fl</artifactId>
<version>1.9.1-SNAPSHOT</version>
<version>1.9.1</version>
</parent>
<groupId>ru.micord.ervu.lkrp.fl</groupId>
<artifactId>backend</artifactId>

View file

@ -1,11 +1,16 @@
import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.ResourceHttpMessageConverter;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* Root application context
@ -30,10 +35,15 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@EnableAspectJAutoProxy(proxyTargetClass = true)
@EnableWebMvc
@EnableScheduling
public class AppConfig {
public class AppConfig implements WebMvcConfigurer {
@Bean
public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer(){
return new PropertySourcesPlaceholderConfigurer();
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new ResourceHttpMessageConverter());
}
}

View file

@ -31,7 +31,7 @@ public class ErvuDataController {
public ErvuDataController(
JwtTokenService jwtTokenService,
@Qualifier("subpoena") ReplyingKafkaService<Object, Bytes> replyingKafkaService,
@Qualifier("recruit") ReplyingKafkaService<Object, Bytes> replyingKafkaService,
SummonsResponseDataConverter converter) {
this.jwtTokenService = jwtTokenService;
this.replyingKafkaService = replyingKafkaService;

View file

@ -1,26 +1,30 @@
package ru.micord.ervu.service.rpc;
package ru.micord.ervu.controller;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import com.google.protobuf.InvalidProtocolBufferException;
import org.apache.kafka.common.utils.Bytes;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import ru.micord.ervu.dto.FileData;
import ru.micord.ervu.dto.ExtractRequestDto;
import org.springframework.core.io.InputStreamResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import rtl.pgs.ervu.proto.ExtractRegistry;
import rtl.pgs.ervu.proto.ResponseData;
import ru.micord.ervu.dto.ExtractRequestDto;
import ru.micord.ervu.kafka.service.ReplyingKafkaService;
import ru.micord.ervu.security.webbpm.jwt.service.JwtTokenService;
import ru.cg.webbpm.modules.standard_annotations.validation.NotNull;
import ru.cg.webbpm.modules.webkit.annotations.RpcCall;
import ru.cg.webbpm.modules.webkit.annotations.RpcService;
import ru.cg.webbpm.modules.webkit.beans.Behavior;
/**
* @author gulnaz
*/
@RpcService
public class ExtractRpcService extends Behavior {
@RestController
public class ExtractController {
private final JwtTokenService jwtTokenService;
private final ReplyingKafkaService<Object, Bytes> replyingKafkaService;
@ -30,20 +34,15 @@ public class ExtractRpcService extends Behavior {
@Value("${ervu.kafka.registry.extract.reply.topic}")
private String registryExtractReplyTopic;
@NotNull()
public String formatExtractRegistry;
public ExtractRpcService(
JwtTokenService jwtTokenService,
@Qualifier("subpoena") ReplyingKafkaService<Object, Bytes> replyingKafkaService) {
public ExtractController(JwtTokenService jwtTokenService,
ReplyingKafkaService<Object, Bytes> replyingKafkaService) {
this.jwtTokenService = jwtTokenService;
this.replyingKafkaService = replyingKafkaService;
}
@RpcCall
public FileData getExtract() {
ExtractRequestDto request = new ExtractRequestDto(jwtTokenService.getErvuId(),
formatExtractRegistry);
@GetMapping(value = "/extract/{formatRegistry}")
public ResponseEntity<Resource> getExtract(@PathVariable String formatRegistry) {
ExtractRequestDto request = new ExtractRequestDto(jwtTokenService.getErvuId(), formatRegistry);
byte[] reply = replyingKafkaService.sendMessageAndGetReply(registryExtractRequestTopic,
registryExtractReplyTopic, request).get();
@ -51,8 +50,12 @@ public class ExtractRpcService extends Behavior {
ResponseData responseData = ResponseData.parseFrom(reply);
ExtractRegistry extractRegistry = responseData.getDataRegistryInformation()
.getExtractRegistry();
return new FileData(extractRegistry.getFileName(), extractRegistry.getFileType(),
extractRegistry.getFile().toByteArray());
String encodedFilename = URLEncoder.encode(extractRegistry.getFileName(), StandardCharsets.UTF_8);
InputStreamResource resource = new InputStreamResource(extractRegistry.getFile().newInput());
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''" + encodedFilename)
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(resource);
}
catch (InvalidProtocolBufferException e) {
throw new RuntimeException("Failed to parse data", e);

View file

@ -1,13 +1,10 @@
package ru.micord.ervu.converter;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import ru.micord.ervu.dto.SubpoenaResponseDto;
import ru.micord.ervu.util.DateUtil;
import org.springframework.stereotype.Component;
import proto.ervu.rp.summons.MeasuresTemporary;
import proto.ervu.rp.summons.ResponseDataAddress;
@ -16,6 +13,7 @@ import proto.ervu.rp.summons.SummonsResponseData;
import static ru.micord.ervu.util.DateUtil.convertToLocalDate;
import static java.util.Objects.requireNonNull;
import static ru.micord.ervu.util.DateUtil.getDaysTill;
/**
* @author gulnaz
@ -48,6 +46,8 @@ public class SummonsResponseDataConverter {
if (summonsInfoOpt.isPresent()) {
SummonsInfo summonsInfo = summonsInfoOpt.get();
String estimatedDate = summonsInfo.getEstimatedDateSummons();
builder.seriesAndNumber(summonsInfo.getSummonsSeries(), summonsInfo.getSummonsNumber())
.visitDateTime(summonsInfo.getVisitDate(), summonsInfo.getVisitTime())
.militaryCommissariatName(summonsInfo.getMilitaryCommissariatName())
@ -60,12 +60,11 @@ public class SummonsResponseDataConverter {
.reasonName(summonsInfo.getReasonName())
.summonsStatusName(summonsInfo.getSummonsStatusName())
.deliveryTypeSummonsName(summonsInfo.getDeliveryTypeSummonsName())
.estimatedDateSummons(summonsInfo.getEstimatedDateSummons())
.estimatedDateSummons(estimatedDate)
.recruitmentStatusCode(
Integer.parseInt(responseData.getRecruitmentInfo().getRecruitmentStatusCode()))
.recruitmentStartDate(responseData.getRecruitmentInfo().getRecruitmentStart())
.daysToAppearance((int) ChronoUnit.DAYS.between(
LocalDate.now(), DateUtil.convertToLocalDate(summonsInfo.getEstimatedDateSummons())))
.daysToAppearance(getDaysTill(convertToLocalDate(estimatedDate)))
.otherRestrictionCount(-1);
summonsInfo.getMeasuresTemporaryPackagesList()

View file

@ -1,7 +0,0 @@
package ru.micord.ervu.dto;
/**
* @author gulnaz
*/
public record FileData(String fileName, String fileType, byte[] file) {
}

View file

@ -147,7 +147,7 @@ public class ReplyingKafkaConfig {
return replyingKafkaTemplate;
}
@Bean("subpoena")
@Bean("recruit")
public ReplyingKafkaTemplate<String, Object, Bytes> subpoenaReplyingKafkaTemplate(
ProducerFactory<String, Object> subpoenaProducerFactory,
ConcurrentMessageListenerContainer<String, Bytes> subpoenaReplyContainer) {

View file

@ -16,7 +16,7 @@ import ru.micord.ervu.dto.SubpoenaRequestDto;
* @author gulnaz
*/
@Service
@Qualifier("subpoena")
@Qualifier("recruit")
public class SubpoenaReplyingKafkaService extends BaseReplyingKafkaService<Object, Bytes> {
private final ReplyingKafkaTemplate<String, Object, Bytes> replyingKafkaTemplate;
@ -26,7 +26,7 @@ public class SubpoenaReplyingKafkaService extends BaseReplyingKafkaService<Objec
@Value("${ervu.kafka.extract.header.class}")
private String extractHeaderClass;
public SubpoenaReplyingKafkaService(@Qualifier("subpoena")
public SubpoenaReplyingKafkaService(@Qualifier("recruit")
ReplyingKafkaTemplate<String, Object, Bytes> replyingKafkaTemplate) {
this.replyingKafkaTemplate = replyingKafkaTemplate;
}

View file

@ -2,6 +2,7 @@ package ru.micord.ervu.util;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import org.springframework.util.StringUtils;
@ -27,4 +28,9 @@ public final class DateUtil {
public static String convertToString(LocalDate date, DateTimeFormatter formatter) {
return date == null ? "" : date.format(formatter);
}
public static int getDaysTill(LocalDate end) {
return (int) ChronoUnit.DAYS.between(
LocalDate.now(), end == null ? LocalDate.now() : end);
}
}

View file

@ -29,8 +29,8 @@ ERVU_KAFKA_RECRUIT_REPLY_TOPIC=ervu.recruit.info.response
ERVU_KAFKA_RECRUIT_HEADER_CLASS=Request@urn://rostelekom.ru/RP-SummonsTR/1.0.5
ERVU_KAFKA_REGISTRY_EXTRACT_REQUEST_TOPIC=ervu.extract.info.request
ERVU_KAFKA_REGISTRY_EXTRACT_REPLY_TOPIC=ervu.extract.info.response
ERVU_KAFKA_EXTRACT_HEADER_CLASS=Request@urn://rostelekom.ru/ERVU-extractFromRegistryTR/1.0.3
ERVU_KAFKA_EXTRACT_HEADER_CLASS=request@urn://rostelekom.ru/ERVU-extractFromRegistryTR/1.0.3
ERVU_KAFKA_DOC_LOGIN_MODULE=org.apache.kafka.common.security.scram.ScramLoginModule
ESIA_TOKEN_CLEAR_CRON=0 0 */1 * * *
COOKIE_PATH=/fl
COOKIE_PATH=/fl

View file

@ -4,7 +4,7 @@
<parent>
<groupId>ru.micord.ervu.lkrp</groupId>
<artifactId>fl</artifactId>
<version>1.9.1-SNAPSHOT</version>
<version>1.9.1</version>
</parent>
<groupId>ru.micord.ervu.lkrp.fl</groupId>

View file

@ -4,7 +4,7 @@
<parent>
<groupId>ru.micord.ervu.lkrp</groupId>
<artifactId>fl</artifactId>
<version>1.9.1-SNAPSHOT</version>
<version>1.9.1</version>
</parent>
<groupId>ru.micord.ervu.lkrp.fl</groupId>

View file

@ -530,6 +530,10 @@
margin-top: 16px;
}
.webbpm.ervu_lkrp_fl #restriction in-memory-static-grid .ag-header {
display: none;
}
@media only screen and (max-width: 480px) {
.webbpm.ervu_lkrp_fl .warning-text .horizontal-container {
flex-wrap: wrap !important;

View file

@ -187,12 +187,15 @@ body.webbpm.ervu_lkrp_fl {
bottom: 0;
}
.webbpm.ervu_lkrp_fl .container-inside {
display: flex;
flex-direction: column;
font-family: 'Inter';
height: 100%;
padding: 0;
overflow: auto;
}
.webbpm.ervu_lkrp_fl .container-inside > div {
flex: 1;
padding: var(--indent-huge) var(--w-screen);
}

View file

@ -3,9 +3,10 @@ import {
AnalyticalScope,
Behavior,
Event,
NotNull,
Visible
} from "@webbpm/base-package";
import {ExtractRpcService} from "../../../generated/ru/micord/ervu/service/rpc/ExtractRpcService";
import {HttpClient} from "@angular/common/http";
@AnalyticalScope(AbstractButton)
export class ExtractLoadService extends Behavior {
@ -14,34 +15,34 @@ export class ExtractLoadService extends Behavior {
public successEvent: Event<boolean> = new Event<boolean>();
@Visible("false")
public errorEvent: Event<boolean> = new Event<boolean>();
@NotNull()
public formatRegistry: string;
private button: AbstractButton;
private rpc: ExtractRpcService;
private httpClient: HttpClient;
private onClickFunction: Function;
initialize() {
super.initialize();
this.button = this.getScript(AbstractButton);
this.rpc = this.getScript(ExtractRpcService);
this.httpClient = this.injector.get(HttpClient);
this.onClickFunction = () => {
this.rpc.getExtract()
.then(fileData => {
const newBlob = new Blob([fileData['file']],
{ type: fileData['fileType'] });
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveBlob(newBlob);
}
else {
const data = window.URL.createObjectURL(newBlob);
const link = document.createElement("a");
link.href = data;
link.download = fileData['fileName'];
link.click();
URL.revokeObjectURL(data);
link.remove();
this.successEvent.trigger();
}
this.httpClient.get('extract/' + this.formatRegistry, {
responseType: 'blob',
observe: 'response'
}).toPromise()
.then((response) => {
const data = window.URL.createObjectURL(response.body);
const link = document.createElement("a");
link.href = data;
const contentDisposition = response.headers.get('Content-Disposition');
const fileNameMatch = contentDisposition.match(/filename\*=?UTF-8''(.+)/i);
link.download = decodeURIComponent(fileNameMatch[1].replace(/\+/g, '%20'));
document.body.appendChild(link);
link.click();
window.URL.revokeObjectURL(data);
link.remove();
this.successEvent.trigger();
})
.catch(() => {
this.errorEvent.trigger();

View file

@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>ru.micord.ervu.lkrp</groupId>
<artifactId>fl</artifactId>
<version>1.9.1-SNAPSHOT</version>
<version>1.9.1</version>
<packaging>pom</packaging>
<modules>
<module>backend</module>

View file

@ -4,7 +4,7 @@
<parent>
<groupId>ru.micord.ervu.lkrp</groupId>
<artifactId>fl</artifactId>
<version>1.9.1-SNAPSHOT</version>
<version>1.9.1</version>
</parent>
<groupId>ru.micord.ervu.lkrp.fl</groupId>

View file

@ -1797,17 +1797,9 @@
</classRef>
<enabled>true</enabled>
<expanded>true</expanded>
</scripts>
<scripts id="3380990f-3be0-442d-af4e-d31c8da7d39e">
<classRef type="JAVA">
<className>ExtractRpcService</className>
<packageName>ru.micord.ervu.service.rpc</packageName>
</classRef>
<enabled>true</enabled>
<expanded>true</expanded>
<properties>
<entry>
<key>formatExtractRegistry</key>
<key>formatRegistry</key>
<value>
<simple>"1"</simple>
</value>
@ -4942,17 +4934,9 @@
</classRef>
<enabled>true</enabled>
<expanded>true</expanded>
</scripts>
<scripts id="b821375f-f5a9-4a85-8b0a-2fff5e2da2a5">
<classRef type="JAVA">
<className>ExtractRpcService</className>
<packageName>ru.micord.ervu.service.rpc</packageName>
</classRef>
<enabled>true</enabled>
<expanded>true</expanded>
<properties>
<entry>
<key>formatExtractRegistry</key>
<key>formatRegistry</key>
<value>
<simple>"2"</simple>
</value>