http://jira.mfd.msk:8088/browse/CLS-839 Большие Notification.comment 4000. Будет разбивать сообщения при привышении 2500 символов.

This commit is contained in:
AKurakin 2025-05-12 18:44:34 +03:00
parent 0d877eed76
commit 46ce383b1b
4 changed files with 133 additions and 17 deletions

View file

@ -3881,7 +3881,7 @@ GRANT ALL PRIVILEGES ON TABLE PAYMENT_INSTRUCTION TO clearing;
-- notification - Сообщения
DROP TABLE IF EXISTS NOTIFICATION;
CREATE TABLE NOTIFICATION(ID bigint PRIMARY KEY, CLEARING_DATE date, CREATED_AT timestamp, UPDATED_AT timestamp, SENDER_ID bigint, ADDRESSEE_ID bigint, OBJECT_TYPE varchar(4), OBJECT_ID bigint, NOTIFICATION_STATUS varchar(4), COMMENT varchar(255), PRIORITY varchar(4));
CREATE TABLE NOTIFICATION(ID bigint PRIMARY KEY, CLEARING_DATE date, CREATED_AT timestamp, UPDATED_AT timestamp, SENDER_ID bigint, ADDRESSEE_ID bigint, OBJECT_TYPE varchar(4), OBJECT_ID bigint, NOTIFICATION_STATUS varchar(4), COMMENT varchar(4000), PRIORITY varchar(4));
COMMENT ON TABLE NOTIFICATION IS 'Сообщения';
COMMENT ON COLUMN NOTIFICATION.ID IS 'Идентификатор записи';
@ -3911,7 +3911,7 @@ GRANT ALL PRIVILEGES ON TABLE NOTIFICATION TO clearing;
-- History log of notification - Сообщения
DROP TABLE IF EXISTS NOTIFICATION_HISTORY;
CREATE TABLE NOTIFICATION_HISTORY(NOTIFICATION_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), ID bigint PRIMARY KEY, CLEARING_DATE date, CREATED_AT timestamp, UPDATED_AT timestamp, SENDER_ID bigint, ADDRESSEE_ID bigint, OBJECT_TYPE varchar(4), OBJECT_ID bigint, NOTIFICATION_STATUS varchar(4), COMMENT varchar(255), PRIORITY varchar(4));
CREATE TABLE NOTIFICATION_HISTORY(NOTIFICATION_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), ID bigint PRIMARY KEY, CLEARING_DATE date, CREATED_AT timestamp, UPDATED_AT timestamp, SENDER_ID bigint, ADDRESSEE_ID bigint, OBJECT_TYPE varchar(4), OBJECT_ID bigint, NOTIFICATION_STATUS varchar(4), COMMENT varchar(4000), PRIORITY varchar(4));
COMMENT ON TABLE NOTIFICATION_HISTORY IS 'История изменений таблицы notification';
COMMENT ON COLUMN NOTIFICATION_HISTORY.NOTIFICATION_ID IS 'Идентификатор записи в таблице NOTIFICATION';
COMMENT ON COLUMN NOTIFICATION_HISTORY.EVENT_TIME IS 'Дата и время изменения';

View file

@ -16,4 +16,7 @@ COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.COMMENT IS '
COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.CLIENT_CODE IS 'Êîä êëèåíòà';
COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.LINKED_EXCHANGE_EXECUTION_ID IS 'Íîìåð âèòðèííîé ñäåëêè';
ALTER TABLE NOTIFICATION ALTER COLUMN COMMENT VARCHAR(4000);
ALTER TABLE NOTIFICATION_HISTORY ALTER COLUMN COMMENT VARCHAR(4000);
INSERT INTO DB_VERSION(ID, VERSION) values (1, '3.17') ON CONFLICT (ID) DO UPDATE SET VERSION = EXCLUDED.VERSION

View file

@ -145,21 +145,54 @@ public class AmatAmafChecker extends QueueConsumer implements InitializingBean {
sendMessage(makeSuccessMessage(checkTime), Priority.LOW);
} else {
log.debug("Check registry result: not match");
sendMessage(makeErrorMessage(checkTime, mismatch), Priority.HIGH);
List<String> msgs = makeErrorMessage(checkTime, mismatch);
for (String msg : msgs)
sendMessage(msg, Priority.HIGH);
}
}
String makeSuccessMessage(LocalDateTime checkTime) {
return String.format("Проведена сверка по регистрам AMAT/AMAF.\r\n%s.\r\nРезультат сверки: расхождения отсутствуют.",
MESSAGE_TIME_FORMATTER.format(checkTime));
}
String makeErrorMessage(LocalDateTime checkTime, List<String> mismatch) {
/**
* Формирует сообщение об ошибке.
* В случае если сообщение слишком большое, делает несколько сообщений (делит на части)
*
* @param checkTime
* @param mismatch
* @return
*/
List<String> makeErrorMessage(LocalDateTime checkTime, List<String> mismatch) {
assert !mismatch.isEmpty();
String msgItems = mismatch.stream().collect(Collectors.joining("; \r\n"));
return String.format("Проведена сверка по регистрам AMAT/AMAF.\r\n%s.\r\nРезультат сверки: %s.",
MESSAGE_TIME_FORMATTER.format(checkTime), msgItems);
final int MAX_COMMENT_SIZE = 2500; // max 4000
final String MSG_TEMPLATE = "Проведена сверка по регистрам AMAT/AMAF.\r\n%s.\r\nРезультат сверки: %s.";
final String msgDate = MESSAGE_TIME_FORMATTER.format(checkTime);
List<String> msgs = new ArrayList<>();
List<String> inOneMsg = new ArrayList<>();
for (String itm : mismatch) {
if (inOneMsg.isEmpty()) {
inOneMsg.add(itm);
} else {
List<String> nextMsgs = new ArrayList<>(inOneMsg);
nextMsgs.add(itm);
String newMsg = String.format(MSG_TEMPLATE, msgDate, String.join("; \r\n", nextMsgs));
if (newMsg.length() > MAX_COMMENT_SIZE) {
String oldMsg = String.format(MSG_TEMPLATE, msgDate, String.join("; \r\n", inOneMsg));
msgs.add(oldMsg);
inOneMsg.clear();
}
inOneMsg.add(itm);
}
}
if (!inOneMsg.isEmpty()) {
String newMsg = String.format(MSG_TEMPLATE, msgDate, String.join("; \r\n", inOneMsg));
msgs.add(newMsg);
}
assert !msgs.isEmpty();
return msgs;
}
protected List<String> checkRegisters(Collection<Registry> checkRegistries) {

View file

@ -81,11 +81,11 @@ class AmatAmafCheckerTest {
errors.toString());
// next test makeErrorMessage:
assertEquals("Проведена сверка по регистрам AMAT/AMAF.\r\n" +
assertEquals("[Проведена сверка по регистрам AMAT/AMAF.\r\n" +
"2025.05.05 12:37:56.\r\n" +
"Результат сверки: по ТКР 0004CAV00003 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму 100; \r\nпо ТКР 0482CAT00001 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму -89.75.",
"Результат сверки: по ТКР 0004CAV00003 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму 100; \r\nпо ТКР 0482CAT00001 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму -89.75.]",
checker.makeErrorMessage(
LocalDateTime.of(2025, 5, 5, 12, 37, 56), errors));
LocalDateTime.of(2025, 5, 5, 12, 37, 56), errors).toString());
}
@Test
@ -210,14 +210,15 @@ class AmatAmafCheckerTest {
List<String> errors = checker.checkRegisters(regSrc);
// assertEquals(2, errors.size());
assertEquals("Проведена сверка по регистрам AMAT/AMAF.\r\n" +
assertEquals("[Проведена сверка по регистрам AMAT/AMAF.\r\n" +
"2025.05.05 12:37:56.\r\n" +
"Результат сверки:" +
" по ТКР 0620CAV00001 выявлено расхождение на регистрах AMAT/AMAF по CNY на сумму 678.00; \r\n" +
"по ТКР 0620CAV00001 выявлено расхождение на регистрах AMAT/AMAF по BYN на сумму 95.00; \r\n" +
"по ТКР null выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму 233184292.44.",
"по ТКР null выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму 233184292.44.]",
checker.makeErrorMessage(
LocalDateTime.of(2025, 5, 5, 12, 37, 56), errors));
LocalDateTime.of(2025, 5, 5, 12, 37, 56), errors)
.toString());
}
@Test
@ -233,17 +234,96 @@ class AmatAmafCheckerTest {
void makeErrorMessage() {
AmatAmafChecker checker = instance();
assertEquals("Проведена сверка по регистрам AMAT/AMAF.\r\n" +
assertEquals("[Проведена сверка по регистрам AMAT/AMAF.\r\n" +
"2025.05.05 12:37:56.\r\n" +
"Результат сверки: по ТКР 0004CAV00003 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму 100; \r\n" +
"по ТКР 0482CAT00001 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму -89.75.",
"по ТКР 0482CAT00001 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму -89.75.]",
checker.makeErrorMessage(
LocalDateTime.of(2025, 5, 5, 12, 37, 56),
Arrays.asList(
"по ТКР 0004CAV00003 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму 100",
"по ТКР 0482CAT00001 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму -89.75"
)
));
).toString());
}
@Test
void makeErrorMessageLarge() {
AmatAmafChecker checker = instance();
List<String> inErrors=Arrays.asList(
"по ТКР 0004CAV00003 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму 100",
"по ТКР 0482CAT00001 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму -89.75",
"по ТКР 0482CAT00002 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму -100.22",
"по ТКР 0482CAT00003 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму -1000.22",
"по ТКР 0482CAT00004 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму -10000.22",
"Очень длинный текст 1. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.",
"Очень длинный текст 2. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.",
"Очень длинный текст 3. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.",
"Очень длинный текст 4. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.",
"Очень длинный текст 5. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.",
"Очень длинный текст 6. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.",
"Очень длинный текст 7. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.",
"Очень длинный текст 8. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.",
"Очень длинный текст 9. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.",
"Очень длинный текст 10. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.",
"Очень длинный текст 11. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.",
"Очень длинный текст 12. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.",
"Очень длинный текст 13. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.",
"Очень длинный текст 14. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.",
"Очень длинный текст 15. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.",
"Очень длинный текст 16. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.",
"Очень длинный текст 17. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.",
"по ТКР 0482CAT00005 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму -100000.22",
"по ТКР 0482CAT00006 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму -1000000.22",
"по ТКР 0482CAT00007 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму -10000000.22",
"по ТКР 0482CAT00107 выявлено расхождение... Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.",
"по ТКР 0482CAT00008 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму 100000.22",
"по ТКР 0482CAT00009 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму 1000000.22",
"по ТКР 0482CAT00010 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму 100000.22"
);
List<String> errMsgs = checker.makeErrorMessage(
LocalDateTime.of(2025, 5, 5, 12, 37, 56),
inErrors
);
for (String part : inErrors) {
assertTrue(errMsgs.toString().contains(part), "Lost part: " + part);
}
assertEquals(2, errMsgs.size());
assertEquals("[Проведена сверка по регистрам AMAT/AMAF.\r\n" +
"2025.05.05 12:37:56.\r\n" +
"Результат сверки: по ТКР 0004CAV00003 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму 100; \r\n" +
"по ТКР 0482CAT00001 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму -89.75; \r\n" +
"по ТКР 0482CAT00002 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму -100.22; \r\n" +
"по ТКР 0482CAT00003 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму -1000.22; \r\n" +
"по ТКР 0482CAT00004 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму -10000.22; \r\n" +
"Очень длинный текст 1. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.; \r\n" +
"Очень длинный текст 2. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.; \r\n" +
"Очень длинный текст 3. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.; \r\n" +
"Очень длинный текст 4. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.; \r\n" +
"Очень длинный текст 5. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.; \r\n" +
"Очень длинный текст 6. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.; \r\n" +
"Очень длинный текст 7. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.; \r\n" +
"Очень длинный текст 8. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.; \r\n" +
"Очень длинный текст 9. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.; \r\n" +
"Очень длинный текст 10. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.; \r\n" +
"Очень длинный текст 11. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.., Проведена сверка по регистрам AMAT/AMAF.\r\n" +
"2025.05.05 12:37:56.\r\n" +
"Результат сверки: Очень длинный текст 12. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.; \r\n" +
"Очень длинный текст 13. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.; \r\n" +
"Очень длинный текст 14. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.; \r\n" +
"Очень длинный текст 15. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.; \r\n" +
"Очень длинный текст 16. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.; \r\n" +
"Очень длинный текст 17. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.; \r\n" +
"по ТКР 0482CAT00005 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму -100000.22; \r\n" +
"по ТКР 0482CAT00006 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму -1000000.22; \r\n" +
"по ТКР 0482CAT00007 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму -10000000.22; \r\n" +
"по ТКР 0482CAT00107 выявлено расхождение... Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст. Очень длинный текст.; \r\n" +
"по ТКР 0482CAT00008 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму 100000.22; \r\n" +
"по ТКР 0482CAT00009 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму 1000000.22; \r\n" +
"по ТКР 0482CAT00010 выявлено расхождение на регистрах AMAT/AMAF по RUB на сумму 100000.22.]",
errMsgs.toString());
}