From 83463a1ebe01f07904b595bc3d7e35e3a136fd16 Mon Sep 17 00:00:00 2001 From: akurakin Date: Sun, 3 Jul 2022 23:06:54 +0300 Subject: [PATCH] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-1=20DDL=20?= =?UTF-8?q?=D0=BF=D0=B0=D0=BC=D1=81=D1=82=D0=BE=D1=80=D1=8B=20=D0=B3=D0=BE?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=D1=8B=20=D0=BD=D0=B0=2095%?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StaticData/Company/CompanyUpdate.java | 11 ++ .../StaticData/Profile/CompanyInfo.java | 4 +- .../classes/objects/BusinessEvent.java | 19 ++- .../compile/default-compile/createdFiles.lst | 15 +-- .../storage/base/BusinessEventMapStore.java | 21 ---- .../businessevent/CompanyUpdateMapStore.java | 117 ++++++++++++++++++ .../businessobject/CompanyMapStore.java | 86 ++++++++++++- .../config/HazelcastConfiguration.java | 2 +- .../storage/config/PoolMapConfigs.java | 7 ++ .../storage/utils/IMDGDistributedNames.java | 5 +- 10 files changed, 239 insertions(+), 48 deletions(-) create mode 100644 storage/src/main/java/ru/spcex/clearing/storage/businessevent/CompanyUpdateMapStore.java diff --git a/clearing-classes/src/main/java/ru/clearing/classes/StaticData/Company/CompanyUpdate.java b/clearing-classes/src/main/java/ru/clearing/classes/StaticData/Company/CompanyUpdate.java index 7ba10f879..188bcf9a4 100644 --- a/clearing-classes/src/main/java/ru/clearing/classes/StaticData/Company/CompanyUpdate.java +++ b/clearing-classes/src/main/java/ru/clearing/classes/StaticData/Company/CompanyUpdate.java @@ -11,4 +11,15 @@ import ru.clearing.classes.objects.BusinessObject; public class CompanyUpdate extends BusinessEvent { private static final long serialVersionUID = ConstSerializable.serialVersionUID; + private Company object; + + @Override + public Company getObject() { + return object; + } + + @Override + public void setObject(Company object) { + this.object = object; + } } \ No newline at end of file diff --git a/clearing-classes/src/main/java/ru/clearing/classes/StaticData/Profile/CompanyInfo.java b/clearing-classes/src/main/java/ru/clearing/classes/StaticData/Profile/CompanyInfo.java index 1209a957f..7ae5569e6 100644 --- a/clearing-classes/src/main/java/ru/clearing/classes/StaticData/Profile/CompanyInfo.java +++ b/clearing-classes/src/main/java/ru/clearing/classes/StaticData/Profile/CompanyInfo.java @@ -10,8 +10,8 @@ import ru.clearing.classes.objects.ObjectBase; public class CompanyInfo extends ObjectBase { private static final long serialVersionUID = ConstSerializable.serialVersionUID; - private Long companyId; // Company.CompanyInfo.companyId = CompanyInfo.id - private String clearingMemberCategory; // ref CHAR(4), + private Long companyId; // Company.CompanyInfo.companyId = CompanyInfo.id todo company_id=id - эти поля можно не добавлять в объект, их администрирует мапстор. И в базе получается они задублируются-лишнее поле company_id. + private String clearingMemberCategory; // ref CHAR(4), todo такие ссылки на словари - не понял нужны как строки или нужны как ID? Зависит от политики обновления словарей. private String corporationSoleType; // ref CHAR(4), private String countryCode; //ref CHAR(4), private String description; diff --git a/clearing-classes/src/main/java/ru/clearing/classes/objects/BusinessEvent.java b/clearing-classes/src/main/java/ru/clearing/classes/objects/BusinessEvent.java index 4367ac92e..72a280d3c 100644 --- a/clearing-classes/src/main/java/ru/clearing/classes/objects/BusinessEvent.java +++ b/clearing-classes/src/main/java/ru/clearing/classes/objects/BusinessEvent.java @@ -2,7 +2,7 @@ package ru.clearing.classes.objects; import ru.clearing.classes.ConstSerializable; -import java.util.Date; +import java.time.Instant; /** * Журнал изменения таблиц с BusinessObject @@ -10,18 +10,17 @@ import java.util.Date; public abstract class BusinessEvent extends ObjectBase { static final long serialVersionUID = ConstSerializable.serialVersionUID; - private Date eventTime; + private Instant eventTime; private Long userId; // event_user_id - private T object; public BusinessEvent() { } - public Date getEventTime() { + public Instant getEventTime() { return eventTime; } - public void setEventTime(Date eventTime) { + public void setEventTime(Instant eventTime) { this.eventTime = eventTime; } @@ -33,20 +32,16 @@ public abstract class BusinessEvent extends ObjectBase this.userId = userId; } - public T getObject() { - return object; - } + public abstract T getObject(); - public void setObject(T object) { - this.object = object; - } + public abstract void setObject(T object); @Override public String toString() { return getClass().getSimpleName() + "{" + "eventTime=" + eventTime + ", userId=" + userId + - ", object=" + object + + ", object=" + getObject() + '}'; } } \ No newline at end of file diff --git a/clearing-classes/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/clearing-classes/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index 13612d0a7..f347cacf4 100644 --- a/clearing-classes/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/clearing-classes/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -1,12 +1,13 @@ -ru\clearing\classes\StaticData\Profile\Contact.class -ru\clearing\classes\objects\ObjectBase.class -ru\clearing\classes\ConstSerializable.class ru\clearing\classes\StaticData\Company\CompanyRoleSet.class -ru\clearing\classes\StaticData\Profile\ProfileDocument.class -ru\clearing\classes\objects\BusinessEvent.class -ru\clearing\classes\StaticData\Company\Company.class -ru\clearing\classes\StaticData\User\ClearingUser.class ru\clearing\classes\StaticData\Company\CompanySymbols.class ru\clearing\common\interfaces\WithId.class ru\clearing\classes\objects\BusinessObject.class ru\clearing\classes\StaticData\Profile\CompanyInfo.class +ru\clearing\classes\StaticData\Profile\Contact.class +ru\clearing\classes\objects\ObjectBase.class +ru\clearing\classes\ConstSerializable.class +ru\clearing\classes\StaticData\Profile\ProfileDocument.class +ru\clearing\classes\objects\BusinessEvent.class +ru\clearing\classes\StaticData\Company\Company.class +ru\clearing\classes\StaticData\User\ClearingUser.class +ru\clearing\classes\StaticData\Company\CompanyUpdate.class diff --git a/storage/src/main/java/ru/spcex/clearing/storage/base/BusinessEventMapStore.java b/storage/src/main/java/ru/spcex/clearing/storage/base/BusinessEventMapStore.java index 84b7d83c7..c5292f32c 100644 --- a/storage/src/main/java/ru/spcex/clearing/storage/base/BusinessEventMapStore.java +++ b/storage/src/main/java/ru/spcex/clearing/storage/base/BusinessEventMapStore.java @@ -37,25 +37,4 @@ public abstract class BusinessEventMapStore extends Obj return Collections.emptyMap(); } - /** - * Заполняет поля:
- * uuid
- * eventTime
- * ownerId
- * eventTypeId - * - * @param businessEvent объект для заполнения - * @param rs resultSet для выгрузки - */ - public void fillBusinessEventFields(BusinessEvent businessEvent, ResultSet rs) throws SQLException { - businessEvent.setEventTime(TimeUtil.toUtilDate(rs.getDate("eventtime"))); - businessEvent.setId(getLong(rs, "id")); - } - - public void fillBusinessObjectFieds(BusinessObject businessObject, ResultSet rs) throws SQLException { - businessObject.setId(rs.getObject("orderbondid", Long.class)); - businessObject.setUpdated(TimeUtil.fromDate(rs.getDate("updated"))); - businessObject.setCreated(TimeUtil.fromDate(rs.getDate("created"))); - } - } diff --git a/storage/src/main/java/ru/spcex/clearing/storage/businessevent/CompanyUpdateMapStore.java b/storage/src/main/java/ru/spcex/clearing/storage/businessevent/CompanyUpdateMapStore.java new file mode 100644 index 000000000..fff46939c --- /dev/null +++ b/storage/src/main/java/ru/spcex/clearing/storage/businessevent/CompanyUpdateMapStore.java @@ -0,0 +1,117 @@ +package ru.spcex.clearing.storage.businessevent; + +import org.springframework.dao.support.DataAccessUtils; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.lang.NonNull; +import org.springframework.stereotype.Component; +import ru.clearing.classes.StaticData.Company.Company; +import ru.clearing.classes.StaticData.Company.CompanyUpdate; +import ru.clearing.classes.StaticData.Profile.CompanyInfo; +import ru.spcex.clearing.storage.base.BusinessEventMapStore; +import ru.spcex.clearing.storage.utils.DbUtilsHelper; +import ru.spcex.clearing.storage.utils.TimeUtil; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +@Component +public class CompanyUpdateMapStore extends BusinessEventMapStore { + + public CompanyUpdateMapStore(JdbcTemplate jdbcTemplate) { + super(jdbcTemplate); + } + + @Override + public String getTableName() { + return "COMPANY_UPDATE"; + } + + @Override + public String[] getFields() { + return new String[]{ + "id", "event_time", "event_user_id", + "company_id", "created_at", "updated_at", "status", "clearing_code", "exchange_code" + }; + } + + public String[] getFieldsForCompanyInfo() { + return new String[]{ + "id", "event_time", "event_user_id", + + "company_info_id", "company_id", "clearing_member_category", "corporation_sole_type", "country_code", "description", + "professional_sign", "legal_kind", "organization_type", "residence", "short_name", "full_name", + "short_name_eng", "full_name_eng" + }; + } + + protected final String insertStatement = DbUtilsHelper.createUpdateOrInsert(getTableName(), getFields(), "id"); + protected final String insertCompanyInfoStatement = DbUtilsHelper.createUpdateOrInsert("COMPANY_INFO", getFieldsForCompanyInfo(), "id"); + + @Override + public void store(Map map) { + List batchArgs = new ArrayList<>(); + List batchCompanyInfoArgs = new ArrayList<>(); + + for (Map.Entry entry : map.entrySet()) { + CompanyUpdate companyUpdate = entry.getValue(); + Company company = companyUpdate.getObject(); + + Object[] args = new Object[]{ + companyUpdate.getId(), + TimeUtil.fromInstant(companyUpdate.getEventTime()), + companyUpdate.getUserId(), + + company.getId(), // company_id + TimeUtil.fromInstant(company.getCreated()), + TimeUtil.fromInstant(company.getUpdated()), + company.getStatusId(), + company.getClearingCode(), + company.getExchangeCode() + }; + batchArgs.add(args); + if (company.getProfile() != null) { + company.getProfile().setId(company.getId());//todo для точного соответствия id = company.id + company.getProfile().setCompanyId(company.getId()); + List companyInfoArgs = new ArrayList<>(); + companyInfoArgs.addAll(companyInfoToSQLArgs(company.getProfile(), companyUpdate)); + + batchCompanyInfoArgs.add(companyInfoArgs.toArray()); + } + } + batchInsertUpdate(insertStatement, batchArgs); + batchInsertUpdate(insertCompanyInfoStatement, batchCompanyInfoArgs); + } + + /** + * Перечисление значений полей CompanyInfo. + * См. insertCompanyInfoStatement + * + * @param companyInfo должен быть заполнен id, company_id = company.id + * @return + */ + protected List companyInfoToSQLArgs(@NonNull CompanyInfo companyInfo, CompanyUpdate rootUpdate) { + List companyInfoArgs = new ArrayList<>(Arrays.asList( + rootUpdate.getId(), + TimeUtil.fromInstant(rootUpdate.getEventTime()), + rootUpdate.getUserId(), + + companyInfo.getId(), // company_info_id + companyInfo.getCompanyId(), + companyInfo.getClearingMemberCategory(), + companyInfo.getCorporationSoleType(), + companyInfo.getCountryCode(), + companyInfo.getDescription(), + companyInfo.getProfessionalSign(), + companyInfo.getLegalKind(), + companyInfo.getOrganizationType(), + companyInfo.getResidence(), + companyInfo.getShortName(), + companyInfo.getFullName(), + companyInfo.getShortNameEng(), + companyInfo.getFullNameEng() + )); + return companyInfoArgs; + } +} diff --git a/storage/src/main/java/ru/spcex/clearing/storage/businessobject/CompanyMapStore.java b/storage/src/main/java/ru/spcex/clearing/storage/businessobject/CompanyMapStore.java index 3831ea57b..243f07a11 100644 --- a/storage/src/main/java/ru/spcex/clearing/storage/businessobject/CompanyMapStore.java +++ b/storage/src/main/java/ru/spcex/clearing/storage/businessobject/CompanyMapStore.java @@ -1,6 +1,8 @@ package ru.spcex.clearing.storage.businessobject; +import org.springframework.dao.support.DataAccessUtils; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.lang.NonNull; import org.springframework.stereotype.Component; import ru.clearing.classes.StaticData.Company.Company; import ru.clearing.classes.StaticData.Profile.CompanyInfo; @@ -29,7 +31,16 @@ public class CompanyMapStore extends BusinessObjectMapStore { }; } + public String[] getFieldsForCompanyInfo() { + return new String[]{ + "id", "company_id", "clearing_member_category", "corporation_sole_type", "country_code", "description", + "professional_sign", "legal_kind", "organization_type", "residence", "short_name", "full_name", + "short_name_eng", "full_name_eng" + }; + } + protected final String insertStatement = DbUtilsHelper.createUpdateOrInsert(getTableName(), getFields(), "id"); + protected final String insertCompanyInfoStatement = DbUtilsHelper.createUpdateOrInsert("COMPANY_INFO", getFieldsForCompanyInfo(), "id"); @Override public Collection load(Collection keys) { @@ -42,8 +53,7 @@ public class CompanyMapStore extends BusinessObjectMapStore { company.setStatusId(resultSet.getObject("status", Long.class)); company.setClearingCode(resultSet.getObject("clearing_code", String.class)); company.setExchangeCode(resultSet.getObject("exchange_code", String.class)); - company.setProfile(new CompanyInfo()); - //todo Company loader CompanyInfo! + company.setProfile(getCompanyInfo(company.getId())); return company; }); } @@ -51,12 +61,12 @@ public class CompanyMapStore extends BusinessObjectMapStore { @Override public void store(Map map) { List batchArgs = new ArrayList<>(); + List batchCompanyInfoArgs = new ArrayList<>(); for (Map.Entry entry : map.entrySet()) { Company company = entry.getValue(); Object[] args = new Object[]{ - company.getId(), company.getId(), TimeUtil.fromInstant(company.getCreated()), TimeUtil.fromInstant(company.getUpdated()), @@ -65,9 +75,77 @@ public class CompanyMapStore extends BusinessObjectMapStore { company.getExchangeCode() }; batchArgs.add(args); - company.getProfile();//todo Company loader Profile! + if (company.getProfile() != null) { + company.getProfile().setId(company.getId());//todo для точного соответствия id = company.id + company.getProfile().setCompanyId(company.getId()); + List companyInfoArgs = new ArrayList<>(); + companyInfoArgs.addAll(companyInfoToSQLArgs(company.getProfile())); + + batchCompanyInfoArgs.add(companyInfoArgs.toArray()); + } } batchInsertUpdate(insertStatement, batchArgs); + batchInsertUpdate(insertCompanyInfoStatement, batchCompanyInfoArgs); } + + protected CompanyInfo getCompanyInfo(Long id) { + if (id == null) + return null; + List results = jdbcTemplate.query( + "SELECT * FROM COMPANY_INFO WHERE id = ?", new Object[]{id}, // todo id=comapny.id? Или сделать отдельный ID? + (rs, rowNum) -> { + CompanyInfo companyInfo = new CompanyInfo(); + companyInfo.setId(rs.getObject("Id", Long.class)); + companyInfo.setCompanyId(rs.getObject("CompanyId", Long.class)); + companyInfo.setClearingMemberCategory(rs.getString("ClearingMemberCategory")); + companyInfo.setCorporationSoleType(rs.getString("CorporationSoleType")); + companyInfo.setCountryCode(rs.getString("CountryCode")); + companyInfo.setDescription(rs.getString("Description")); + companyInfo.setProfessionalSign(rs.getString("ProfessionalSign")); + companyInfo.setLegalKind(rs.getString("LegalKind")); + companyInfo.setOrganizationType(rs.getString("OrganizationType")); + companyInfo.setResidence(rs.getString("Residence")); + companyInfo.setShortName(rs.getString("ShortName")); + companyInfo.setFullName(rs.getString("FullName")); + companyInfo.setShortNameEng(rs.getString("ShortNameEng")); + companyInfo.setFullNameEng(rs.getString("FullNameEng")); + return companyInfo; + } + ); + CompanyInfo onceObject = DataAccessUtils.singleResult(results); + if (onceObject == null) { + log.warn("No row in table COMPANY_INFO where id={}. Create empty ", id); + onceObject = new CompanyInfo(); + onceObject.setId(id); // чтобы не потерять id + } + return onceObject; + } + + /** + * Перечисление значений полей CompanyInfo. + * См. insertCompanyInfoStatement + * + * @param companyInfo должен быть заполнен id, company_id = company.id + * @return + */ + protected List companyInfoToSQLArgs(@NonNull CompanyInfo companyInfo) { + List companyInfoArgs = new ArrayList<>(Arrays.asList( + companyInfo.getId(), + companyInfo.getCompanyId(), + companyInfo.getClearingMemberCategory(), + companyInfo.getCorporationSoleType(), + companyInfo.getCountryCode(), + companyInfo.getDescription(), + companyInfo.getProfessionalSign(), + companyInfo.getLegalKind(), + companyInfo.getOrganizationType(), + companyInfo.getResidence(), + companyInfo.getShortName(), + companyInfo.getFullName(), + companyInfo.getShortNameEng(), + companyInfo.getFullNameEng() + )); + return companyInfoArgs; + } } diff --git a/storage/src/main/java/ru/spcex/clearing/storage/config/HazelcastConfiguration.java b/storage/src/main/java/ru/spcex/clearing/storage/config/HazelcastConfiguration.java index 99d66f2b3..5604eb7dc 100644 --- a/storage/src/main/java/ru/spcex/clearing/storage/config/HazelcastConfiguration.java +++ b/storage/src/main/java/ru/spcex/clearing/storage/config/HazelcastConfiguration.java @@ -78,7 +78,7 @@ public class HazelcastConfiguration { config.addMapConfig(poolMapConfigs.map_ProfileDocument()); config.addMapConfig(poolMapConfigs.map_Contact()); config.addMapConfig(poolMapConfigs.map_Company()); - //todo config.addMapConfig(poolMapConfigs.map_CompanyUpdate()); + config.addMapConfig(poolMapConfigs.map_CompanyUpdate()); return config; } diff --git a/storage/src/main/java/ru/spcex/clearing/storage/config/PoolMapConfigs.java b/storage/src/main/java/ru/spcex/clearing/storage/config/PoolMapConfigs.java index b7fa252f4..d2b2b5279 100644 --- a/storage/src/main/java/ru/spcex/clearing/storage/config/PoolMapConfigs.java +++ b/storage/src/main/java/ru/spcex/clearing/storage/config/PoolMapConfigs.java @@ -4,6 +4,7 @@ import com.hazelcast.config.*; import com.hazelcast.core.MapLoader; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; +import ru.spcex.clearing.storage.businessevent.CompanyUpdateMapStore; import ru.spcex.clearing.storage.businessobject.CompanyMapStore; import ru.spcex.clearing.storage.dictionary.*; import ru.spcex.clearing.storage.object.CompanyRoleSetMapStore; @@ -176,4 +177,10 @@ public class PoolMapConfigs { .addMapIndexConfig(makeMapIndexConfig("companyId")); } + @Autowired + private CompanyUpdateMapStore companyUpdateMapStore; + + public MapConfig map_CompanyUpdate() { + return makeDefaultMapConfig(IMDGDistributedNames.Map_CompanyUpdate, companyUpdateMapStore); + } } diff --git a/storage/src/main/java/ru/spcex/clearing/storage/utils/IMDGDistributedNames.java b/storage/src/main/java/ru/spcex/clearing/storage/utils/IMDGDistributedNames.java index f5ad0c543..65a4df1f0 100644 --- a/storage/src/main/java/ru/spcex/clearing/storage/utils/IMDGDistributedNames.java +++ b/storage/src/main/java/ru/spcex/clearing/storage/utils/IMDGDistributedNames.java @@ -6,9 +6,10 @@ public final class IMDGDistributedNames { } public static final String Map_Company = "Map_Company"; + public static final String Map_CompanyUpdate = "Map_CompanyUpdate"; public static final String Map_CompanyRoleSet = "Map_CompanyRoleSet"; public static final String Map_CompanySymbols = "Map_CompanySymbols"; - public static final String Map_CompanyInfo = "Map_CompanyInfo"; +// public static final String Map_CompanyInfo = "Map_CompanyInfo"; интегрировано в Map_Company public static final String Map_Contact = "Map_Contact"; public static final String Map_ProfileDocument = "Map_ProfileDocument"; @@ -24,4 +25,6 @@ public final class IMDGDistributedNames { public static final String Map_OrganizationTypeDictionary = "Map_OrganizationTypeDictionary"; public static final String Map_WorkflowStatusDictionary = "Map_WorkflowStatusDictionary"; + + public static final String MAP_SEQUENCE_NAME = "MAP_SEQUENCE_NAME"; // todo вынести idGenerator отдельно и завернуть в метод, чтобы не напрямую обращаться. }