SUPPORT-93339: Fix

This commit is contained in:
Eduard Tihomirov 2025-09-04 10:55:46 +03:00
parent 22ffb8a866
commit 007a06258b
2 changed files with 32 additions and 28 deletions

View file

@ -1,24 +1,26 @@
package ervu.service.fileupload; package ervu.service.fileupload;
import java.io.IOException; import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.time.Duration;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.Arrays;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.UUID;
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilderFactory;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.gson.Gson;
import ervu.client.fileupload.WebDavClient; import ervu.client.fileupload.WebDavClient;
import ervu.model.fileupload.*; import ervu.model.fileupload.DownloadResponse;
import ervu.model.fileupload.EmployeeInfoFileFormType;
import ervu.model.fileupload.EmployeeInfoKafkaMessage;
import ervu.model.fileupload.FileInfo;
import ervu.model.fileupload.FileStatus;
import ervu.model.fileupload.UploadOrgInfo;
import org.apache.http.HttpEntity; import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPost;
@ -40,8 +42,6 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.support.MessageSourceAccessor; import org.springframework.context.support.MessageSourceAccessor;
import org.springframework.kafka.annotation.KafkaListener; import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.core.KafkaTemplate; import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.support.Acknowledgment;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import org.w3c.dom.Document; import org.w3c.dom.Document;
@ -50,7 +50,6 @@ import ru.micord.ervu.audit.service.AuditService;
import ru.micord.ervu.exception.JsonParsingException; import ru.micord.ervu.exception.JsonParsingException;
import ru.micord.ervu.kafka.service.ReplyingKafkaService; import ru.micord.ervu.kafka.service.ReplyingKafkaService;
import ru.micord.ervu.security.esia.config.EsiaConfig; import ru.micord.ervu.security.esia.config.EsiaConfig;
import ru.micord.ervu.security.esia.exception.EsiaException;
import ru.micord.ervu.security.esia.model.EmployeeModel; import ru.micord.ervu.security.esia.model.EmployeeModel;
import ru.micord.ervu.security.esia.model.MchdInfoModel; import ru.micord.ervu.security.esia.model.MchdInfoModel;
import ru.micord.ervu.security.esia.model.PersonModel; import ru.micord.ervu.security.esia.model.PersonModel;
@ -66,7 +65,6 @@ import ru.cg.webbpm.modules.core.runtime.api.LocalizedException;
import ru.cg.webbpm.modules.core.runtime.api.MessageBundleUtils; import ru.cg.webbpm.modules.core.runtime.api.MessageBundleUtils;
import static ervu.enums.FileStatusCode.FILE_ACCEPTED; import static ervu.enums.FileStatusCode.FILE_ACCEPTED;
import static ervu.enums.FileStatusCode.FILE_CLEAN;
import static ervu.enums.FileStatusCode.FILE_INFECTED; import static ervu.enums.FileStatusCode.FILE_INFECTED;
import static ervu.enums.FileStatusCode.FILE_NOT_CHECKED; import static ervu.enums.FileStatusCode.FILE_NOT_CHECKED;
import static ervu.enums.FileStatusCode.FILE_UPLOADED; import static ervu.enums.FileStatusCode.FILE_UPLOADED;
@ -214,6 +212,8 @@ public class EmployeeInfoFileUploadService {
catch (JsonProcessingException e) { catch (JsonProcessingException e) {
fileStatus.setCode(FILE_NOT_CHECKED.getCode()); fileStatus.setCode(FILE_NOT_CHECKED.getCode());
fileStatus.setStatus("Невозможно проверить файл ЛК РП"); fileStatus.setStatus("Невозможно проверить файл ЛК РП");
fileStatus.setDescription(
"Невозможно проверить файл по причине недоступности или ошибки в работе антивируса");
interactionService.updateStatus(fileInfo.getFileId(), fileInfo.getFileStatus().getStatus(), interactionService.updateStatus(fileInfo.getFileId(), fileInfo.getFileStatus().getStatus(),
uploadOrgInfo.getOrgId() uploadOrgInfo.getOrgId()
); );
@ -228,6 +228,7 @@ public class EmployeeInfoFileUploadService {
catch (Exception e) { catch (Exception e) {
fileStatus.setCode(FILE_NOT_CHECKED.getCode()); fileStatus.setCode(FILE_NOT_CHECKED.getCode());
fileStatus.setStatus("Некорректная ЭП"); fileStatus.setStatus("Некорректная ЭП");
fileStatus.setDescription("Не пройдена проверка ЭП");
Arrays.stream(downloadResponse.filesInfo()) Arrays.stream(downloadResponse.filesInfo())
.forEach(fileInfo1 -> fileInfo1.setFileStatus(fileStatus)); .forEach(fileInfo1 -> fileInfo1.setFileStatus(fileStatus));
@ -241,8 +242,7 @@ public class EmployeeInfoFileUploadService {
} }
return validateSignerAndMchd(verifyDocumentSignResponse, chiefModel, uploadOrgInfo, return validateSignerAndMchd(verifyDocumentSignResponse, chiefModel, uploadOrgInfo,
mchdFile, accessToken, fileStatus, fileInfo, signFileInfo, mchdFileInfo, mchdFile, accessToken, fileStatus, fileInfo, signFileInfo, mchdFileInfo, ervuId, response
now, fio, ervuId, employeeInfoFileFormType, response
); );
} }
@ -314,8 +314,7 @@ public class EmployeeInfoFileUploadService {
private boolean validateSignerAndMchd(VerifyDocumentSignResponse verifyDocumentSignResponse, private boolean validateSignerAndMchd(VerifyDocumentSignResponse verifyDocumentSignResponse,
EmployeeModel chiefModel, UploadOrgInfo uploadOrgInfo, MultipartFile mchdFile, EmployeeModel chiefModel, UploadOrgInfo uploadOrgInfo, MultipartFile mchdFile,
String accessToken, FileStatus fileStatus, FileInfo fileInfo, FileInfo signFileInfo, String accessToken, FileStatus fileStatus, FileInfo fileInfo, FileInfo signFileInfo,
FileInfo mchdFileInfo, LocalDateTime now, String fio, String ervuId, FileInfo mchdFileInfo, String ervuId, String response) {
EmployeeInfoFileFormType formType, String response) {
String signerInfo = verifyDocumentSignResponse.getSignerInfo(); String signerInfo = verifyDocumentSignResponse.getSignerInfo();
Map<String, String> signerInfoMap = parseKeyValuePairs(signerInfo); Map<String, String> signerInfoMap = parseKeyValuePairs(signerInfo);
@ -330,13 +329,13 @@ public class EmployeeInfoFileUploadService {
signerInfoMap.get("O").equalsIgnoreCase(uploadOrgInfo.getOrgName()); signerInfoMap.get("O").equalsIgnoreCase(uploadOrgInfo.getOrgName());
if (isSignerValid) { if (isSignerValid) {
interactionService.updateStatus(fileInfo.getFileId(), "Направлено в ЕРВУ", ervuId);
sendMessage(response); sendMessage(response);
return true; return true;
} }
if (mchdFile == null) { if (mchdFile == null) {
handleMchdValidationError(fileStatus, uploadOrgInfo, fileInfo, signFileInfo, null, handleMchdValidationError(fileStatus, uploadOrgInfo, fileInfo, signFileInfo, null, ervuId, response
now, fio, ervuId, formType, response
); );
throw new LocalizedException("mchd_null", MESSAGE_SOURCE); throw new LocalizedException("mchd_null", MESSAGE_SOURCE);
} }
@ -345,28 +344,25 @@ public class EmployeeInfoFileUploadService {
validateMchd(mchdFile, accessToken, signerInfoMap.get("SN") + " " + signerInfoMap.get("G"), validateMchd(mchdFile, accessToken, signerInfoMap.get("SN") + " " + signerInfoMap.get("G"),
chiefFirstName, chiefLastName, chiefMiddleName chiefFirstName, chiefLastName, chiefMiddleName
); );
interactionService.updateStatus(fileInfo.getFileId(), "Направлено в ЕРВУ", ervuId);
sendMessage(response); sendMessage(response);
return true; return true;
} }
catch (Exception e) { catch (Exception e) {
handleMchdValidationError(fileStatus, uploadOrgInfo, fileInfo, signFileInfo, mchdFileInfo, handleMchdValidationError(fileStatus, uploadOrgInfo, fileInfo, signFileInfo, mchdFileInfo, ervuId, response
now, fio, ervuId, formType, response
); );
throw e; throw e;
} }
} }
private void handleMchdValidationError(FileStatus fileStatus, UploadOrgInfo uploadOrgInfo, private void handleMchdValidationError(FileStatus fileStatus, UploadOrgInfo uploadOrgInfo,
FileInfo fileInfo, FileInfo signFileInfo, FileInfo mchdFileInfo, LocalDateTime now, FileInfo fileInfo, FileInfo signFileInfo, FileInfo mchdFileInfo, String ervuId, String response) {
String fio, String ervuId, EmployeeInfoFileFormType formType, String response) {
fileStatus.setCode(FILE_NOT_CHECKED.getCode()); fileStatus.setCode(FILE_NOT_CHECKED.getCode());
fileStatus.setStatus("Некорректная МЧД"); fileStatus.setStatus("Некорректная МЧД");
fileStatus.setDescription("Проверка МЧД не пройдена");
interactionService.setStatus(fileInfo.getFileId(), fileStatus.getStatus(), interactionService.updateStatus(fileInfo.getFileId(), fileStatus.getStatus(), ervuId);
fileInfo.getFileName(), formType.getFilePatternCode(), Timestamp.valueOf(now),
fio, ervuId
);
FileInfo[] fileInfos = mchdFileInfo != null ? FileInfo[] fileInfos = mchdFileInfo != null ?
new FileInfo[] {fileInfo, signFileInfo, mchdFileInfo} : new FileInfo[] {fileInfo, signFileInfo, mchdFileInfo} :

View file

@ -1,4 +1,12 @@
kafka_reply_timeout=Превышено время ожидания ответа от сервера. kafka_reply_timeout=Превышено время ожидания ответа от сервера.
access_denied=Доступ запрещен. Пользователь должен быть включен в группу "Сотрудник, ответственный за военно-учетную работу" в ЕСИА access_denied=Доступ запрещен. Пользователь должен быть включен в группу "Сотрудник, ответственный за военно-учетную работу" в ЕСИА
login_attempts_exceeded=Слишком большое количество попыток авторизоваться в ЕСИА за короткий промежуток времени. Рекомендуем почистить cookie и cash браузера, после повторить авторизацию. login_attempts_exceeded=Слишком большое количество попыток авторизоваться в ЕСИА за короткий промежуток времени. Рекомендуем почистить cookie и cash браузера, после повторить авторизацию.
crl_certificate_expired=Превышено время ожидания ответа из ЕСИА crl_certificate_expired=Превышено время ожидания ответа из ЕСИА
file_sign_validate=Ошибка проверки файлов. Некорректная электронная подпись
mchd_validate_agent=Ошибка проверки файлов. Некорректная машиночитаемая доверенность. Представитель не совпадает с подписантом
mchd_null=Ошибка проверки файлов. Отсутствует машиночитаемая доверенность. Подписант не является руководителем организации
mchd_expired=Ошибка проверки файлов. Недействующая машиночитаемая доверенность.
mchd_tree_expired=Ошибка проверки файлов. Одна из родительский доверенностей недействующая.
mchd_validate_principal=Ошибка проверки файлов. Некорректная машиночитаемая доверенность. Доверитель не совпадает с руководителем организации
av_file_infected=Ошибка проверки файлов. Файлы заражены вирусом
mchd_cant_parse=Ошибка проверки файлов. Некорректный формат машиночитаемой доверенности