package jnpf.elnService.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import jnpf.audit.model.AuditEventDTO; import jnpf.elnEntity.field.ElnFieldDefEntity; import jnpf.elnEntity.field.ElnFieldForms; import jnpf.elnEntity.field.ElnFieldVersionEntity; import jnpf.elnEntity.field.ElnFieldVos; import jnpf.elnService.ElnFieldProviderCatalog; import jnpf.exception.DataException; import org.junit.Test; import org.springframework.dao.DuplicateKeyException; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Supplier; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; public class ElnFieldCatalogServiceImplTest { @Test public void createsGlobalIdentityWithVersionOneDraftAndAudit() { Fixture fixture = new Fixture(); ElnFieldVos.Detail detail = fixture.service.create(textField("检验依据")); assertEquals("GLOBAL", detail.getZuoyongFanwei()); assertEquals("enabled", detail.getBizEnabled()); assertTrue(detail.getZiduanBianma().matches("jianyan_yiju_[a-z0-9]{8}")); assertEquals(1, detail.getVersions().size()); assertEquals(Integer.valueOf(1), detail.getVersions().get(0).getBanbenHao()); assertEquals("DRAFT", detail.getVersions().get(0).getBizStatus()); assertNull(detail.getDangqianZiduanBanbenId()); assertEquals(Arrays.asList("ELN_FIELD_CREATE", "ELN_FIELD_VERSION_CREATE"), fixture.auditActions()); } @Test public void createsGlobalCheckboxWithDefaultSelectionGroupRecommendation() { Fixture fixture = new Fixture(); ElnFieldForms.Create form = checkboxField("复核结论"); form.setRecommendedCheckboxGroupCode("review_result"); ElnFieldVos.Version version = fixture.service.create(form).getVersions().get(0); assertEquals("review_result", version.getRecommendedCheckboxGroupCode()); assertEquals(Integer.valueOf(0), version.getRecommendedCheckboxMinSelected()); assertEquals(Integer.valueOf(1), version.getRecommendedCheckboxMaxSelected()); } @Test public void supportsArbitraryAndUnlimitedSelectionRecommendations() { Fixture fixture = new Fixture(); ElnFieldForms.Create bounded = checkboxField("多项结论"); bounded.setRecommendedCheckboxGroupCode("multi_result"); bounded.setRecommendedCheckboxMinSelected(4); bounded.setRecommendedCheckboxMaxSelected(7); ElnFieldForms.Create unlimited = checkboxField("补充结论"); unlimited.setRecommendedCheckboxGroupCode("extra_result"); unlimited.setRecommendedCheckboxMinSelected(2); unlimited.setRecommendedCheckboxMaxSelected(null); ElnFieldVos.Version boundedVersion = fixture.service.create(bounded).getVersions().get(0); ElnFieldVos.Version unlimitedVersion = fixture.service.create(unlimited).getVersions().get(0); assertEquals(Integer.valueOf(4), boundedVersion.getRecommendedCheckboxMinSelected()); assertEquals(Integer.valueOf(7), boundedVersion.getRecommendedCheckboxMaxSelected()); assertEquals(Integer.valueOf(2), unlimitedVersion.getRecommendedCheckboxMinSelected()); assertNull(unlimitedVersion.getRecommendedCheckboxMaxSelected()); } @Test public void rejectsInvalidOrIneligibleSelectionRecommendations() { Fixture fixture = new Fixture(); ElnFieldForms.Create text = textField("文本"); text.setRecommendedCheckboxGroupCode("text_group"); expectDataException(() -> fixture.service.create(text)); ElnFieldForms.Create invalidCode = checkboxField("非法编码"); invalidCode.setRecommendedCheckboxGroupCode("中文组"); expectDataException(() -> fixture.service.create(invalidCode)); ElnFieldForms.Create negativeMin = checkboxField("非法最少数"); negativeMin.setRecommendedCheckboxGroupCode("negative_min"); negativeMin.setRecommendedCheckboxMinSelected(-1); expectDataException(() -> fixture.service.create(negativeMin)); ElnFieldForms.Create zeroMax = checkboxField("非法最多数"); zeroMax.setRecommendedCheckboxGroupCode("zero_max"); zeroMax.setRecommendedCheckboxMaxSelected(0); expectDataException(() -> fixture.service.create(zeroMax)); ElnFieldForms.Create inverted = checkboxField("倒置范围"); inverted.setRecommendedCheckboxGroupCode("inverted"); inverted.setRecommendedCheckboxMinSelected(3); inverted.setRecommendedCheckboxMaxSelected(2); expectDataException(() -> fixture.service.create(inverted)); ElnFieldForms.Create external = externalField("test.basis", "RECORD_PRIVATE"); external.setShujuLeixing("CHECKBOX"); external.setRecommendedCheckboxGroupCode("external_group"); expectDataException(() -> fixture.service.create(external)); } @Test public void copiesSelectionRecommendationIntoNewDraftVersion() { Fixture fixture = new Fixture(); ElnFieldForms.Create form = checkboxField("复核意见"); form.setRecommendedCheckboxGroupCode("review_options"); form.setRecommendedCheckboxMinSelected(1); form.setRecommendedCheckboxMaxSelected(4); ElnFieldVos.Detail created = fixture.service.create(form); String sourceId = created.getVersions().get(0).getId(); fixture.service.preRelease(sourceId); ElnFieldVos.Version copied = fixture.service.createVersion(created.getId(), copyOf(sourceId)); assertEquals("review_options", copied.getRecommendedCheckboxGroupCode()); assertEquals(Integer.valueOf(1), copied.getRecommendedCheckboxMinSelected()); assertEquals(Integer.valueOf(4), copied.getRecommendedCheckboxMaxSelected()); } @Test public void generatesDistinctBoundedCodesForEdgeCaseLabels() { Fixture fixture = new Fixture(); String first = fixture.service.create(textField("同名字段")).getZiduanBianma(); String second = fixture.service.create(textField("同名字段")).getZiduanBianma(); String longCode = fixture.service.create(textField(repeat("超长字段", 30))).getZiduanBianma(); String numericCode = fixture.service.create(textField("123温度")).getZiduanBianma(); String fallbackCode = fixture.service.create(textField("***")).getZiduanBianma(); assertNotEquals(first, second); assertTrue(longCode.length() <= 80); assertTrue(numericCode.startsWith("f_123_wendu_")); assertTrue(fallbackCode.startsWith("field_")); assertTrue(longCode.matches("[a-z][a-z0-9_]*")); } @Test public void retriesCodeCollisionAtMostThreeTimes() { Fixture fixture = new Fixture("same0001", "same0001", "next0002"); fixture.service.create(textField("字段")); ElnFieldVos.Detail second = fixture.service.create(textField("字段")); assertTrue(second.getZiduanBianma().endsWith("next0002")); } @Test public void publishesImmutableVersionAndSwitchesOnlyWithinIdentity() { Fixture fixture = new Fixture(); ElnFieldVos.Detail first = fixture.service.create(textField("观察结果")); String firstVersionId = first.getVersions().get(0).getId(); ElnFieldVos.Detail other = fixture.service.create(textField("结论")); fixture.service.preRelease(firstVersionId); fixture.service.publish(firstVersionId); fixture.service.switchCurrent(first.getId(), firstVersionId, "首次启用"); assertEquals(firstVersionId, fixture.service.detail(first.getId()).getDangqianZiduanBanbenId()); expectDataException(() -> fixture.service.updateDraft(firstVersionId, versionUpdate("修改"))); expectDataException(() -> fixture.service.switchCurrent( first.getId(), other.getVersions().get(0).getId(), "错误切换")); } @Test public void refusesAnUnpublishedPinnedRevisionEvenWhenThePropertyCodeExists() { Fixture fixture = new Fixture(); ElnFieldForms.Create form = externalField("test.basis", "RECORD_PRIVATE"); form.getBinding().getRead().setPropertyRevision(99); ElnFieldVos.Detail created = fixture.service.create(form); String versionId = created.getVersions().get(0).getId(); expectDataException(() -> fixture.service.preRelease(versionId)); assertEquals("DRAFT", fixture.service.detail(created.getId()).getVersions().get(0).getBizStatus()); } @Test public void rechecksPinnedSourceWhenPublishingAPreReleasedField() { Fixture fixture = new Fixture(); fixture.providerCatalog.properties.set(0, new ElnFieldProviderCatalog.Property( "LIMS_TASK", "test.basis", "Basis V1", "TEXT", true, 1, true)); ElnFieldForms.Create form = externalField("test.basis", "RECORD_PRIVATE"); form.getBinding().getRead().setPropertyRevision(1); ElnFieldVos.Detail created = fixture.service.create(form); String versionId = created.getVersions().get(0).getId(); fixture.service.preRelease(versionId); fixture.providerCatalog.properties.set(0, new ElnFieldProviderCatalog.Property( "LIMS_TASK", "test.basis", "Basis V1", "TEXT", true, 1, false)); expectDataException(() -> fixture.service.publish(versionId)); assertEquals("PRE_RELEASE", fixture.service.detail(created.getId()).getVersions().get(0).getBizStatus()); } @Test public void publishesABooleanCheckboxWithItsPinnedSourceRevision() { Fixture fixture = new Fixture(); fixture.providerCatalog.properties.set(0, new ElnFieldProviderCatalog.Property( "LIMS_TASK", "task.external", "External test", "BOOLEAN", true, 1, true)); ElnFieldForms.Create form = externalField("task.external", "RECORD_PRIVATE"); form.setShujuLeixing("CHECKBOX"); form.getBinding().getRead().setPropertyRevision(1); ElnFieldVos.Detail created = fixture.service.create(form); String versionId = created.getVersions().get(0).getId(); fixture.service.preRelease(versionId); fixture.service.publish(versionId); ElnFieldVos.Version published = fixture.service.detail(created.getId()).getVersions().get(0); assertEquals("PUBLISHED", published.getBizStatus()); assertEquals(Integer.valueOf(1), published.getBinding().getRead().getPropertyRevision()); } @Test public void revalidatesPublishedVersionBeforeSwitchingCurrent() { Fixture fixture = new Fixture(); ElnFieldVos.Detail created = fixture.service.create( externalField("test.basis", "RECORD_PRIVATE")); String versionId = created.getVersions().get(0).getId(); fixture.service.preRelease(versionId); fixture.service.publish(versionId); fixture.providerCatalog.available = false; expectDataException(() -> fixture.service.switchCurrent( created.getId(), versionId, "切换前重新校验")); assertNull(fixture.service.detail(created.getId()).getDangqianZiduanBanbenId()); } @Test public void copiesPublishedRulesWithoutMovingPointerAndNeverReusesVersionNumber() { Fixture fixture = new Fixture(); ElnFieldVos.Detail created = fixture.service.create(textField("温度")); String v1 = created.getVersions().get(0).getId(); fixture.service.preRelease(v1); fixture.service.publish(v1); fixture.service.switchCurrent(created.getId(), v1, "启用 V1"); ElnFieldVos.Version v2 = fixture.service.createVersion(created.getId(), copyOf(v1)); fixture.service.cancel(v2.getId(), "不再使用"); ElnFieldVos.Version v3 = fixture.service.createVersion(created.getId(), copyOf(v1)); assertEquals(Integer.valueOf(2), v2.getBanbenHao()); assertEquals(Integer.valueOf(3), v3.getBanbenHao()); assertEquals("温度", v3.getZiduanMingcheng()); assertEquals(v1, fixture.service.detail(created.getId()).getDangqianZiduanBanbenId()); } @Test public void disablesNewVersionsAndSwitchesButCanEnableAgain() { Fixture fixture = new Fixture(); ElnFieldVos.Detail created = fixture.service.create(textField("批号")); String versionId = created.getVersions().get(0).getId(); fixture.service.preRelease(versionId); fixture.service.publish(versionId); fixture.service.disable(created.getId(), "字段退役"); expectDataException(() -> fixture.service.createVersion(created.getId(), copyOf(versionId))); expectDataException(() -> fixture.service.switchCurrent(created.getId(), versionId, "停用后切换")); fixture.service.enable(created.getId(), "恢复使用"); fixture.service.switchCurrent(created.getId(), versionId, "恢复后启用"); assertEquals("enabled", fixture.service.detail(created.getId()).getBizEnabled()); } @Test public void createsTemplateFieldOnlyThroughTenantBoundInternalCommand() { Fixture fixture = new Fixture(); ElnFieldForms.TemplateFieldCreate command = new ElnFieldForms.TemplateFieldCreate(); command.setTenantId("tenant-1"); command.setTemplateCode("TPL-001"); command.setOperatorId("user-1"); command.setZiduanMingcheng("检验观察项"); command.setShujuLeixing("TEXTAREA"); ElnFieldVos.Detail detail = fixture.service.createTemplateFieldAndPreRelease(command); assertEquals("TEMPLATE", detail.getZuoyongFanwei()); assertEquals("TPL-001", detail.getMubanBianhao()); assertTrue(detail.getZiduanBianma(), detail.getZiduanBianma().matches( "p_jianyan_guancha_xiang_[a-z0-9]{8}")); assertEquals("PRE_RELEASE", detail.getVersions().get(0).getBizStatus()); assertEquals("NONE", detail.getVersions().get(0).getBinding().getRead().getSource()); command.setTenantId("tenant-2"); expectDataException(() -> fixture.service.createTemplateFieldAndPreRelease(command)); } @Test public void rejectsDuplicateEnabledTemplateFieldNameWithinTheSameTemplate() { Fixture fixture = new Fixture("first01", "second02"); ElnFieldForms.TemplateFieldCreate first = templateCommand(); ElnFieldForms.TemplateFieldCreate duplicate = templateCommand(); fixture.service.createTemplateFieldAndPreRelease(first); expectDataException(() -> fixture.service.createTemplateFieldAndPreRelease(duplicate)); } @Test public void allowsReusingTheNameOfADisabledTemplateField() { Fixture fixture = new Fixture("first01", "second02"); ElnFieldForms.TemplateFieldCreate first = templateCommand(); ElnFieldVos.Detail disabled = fixture.service.createTemplateFieldAndPreRelease(first); fixture.service.disable(disabled.getId(), "停用旧模板字段"); ElnFieldVos.Detail replacement = fixture.service.createTemplateFieldAndPreRelease( templateCommand()); assertNotEquals(disabled.getId(), replacement.getId()); } @Test public void rejectsFieldLevelSelectionRecommendationForTemplatePrivateField() { Fixture fixture = new Fixture(); ElnFieldForms.TemplateFieldCreate command = templateCommand(); command.setShujuLeixing("CHECKBOX"); command.setRecommendedCheckboxGroupCode("private_result"); expectDataException(() -> fixture.service.createTemplateFieldAndPreRelease(command)); } @Test public void promotesTemplateIdentityWithoutChangingCodeVersionsOrPointer() { Fixture fixture = new Fixture(); ElnFieldForms.TemplateFieldCreate command = templateCommand(); ElnFieldVos.Detail created = fixture.service.createTemplateFieldAndPreRelease(command); String code = created.getZiduanBianma(); String versionId = created.getVersions().get(0).getId(); fixture.service.publish(versionId); fixture.service.switchCurrent(created.getId(), versionId, "启用私有字段"); fixture.service.promoteToGlobal(created.getId(), "升级为公共字段"); ElnFieldVos.Detail promoted = fixture.service.detail(created.getId()); assertEquals("GLOBAL", promoted.getZuoyongFanwei()); assertNull(promoted.getMubanBianhao()); assertEquals(code, promoted.getZiduanBianma()); assertEquals(versionId, promoted.getDangqianZiduanBanbenId()); assertEquals(1, promoted.getVersions().size()); expectDataException(() -> fixture.service.promoteToGlobal(created.getId(), "重复升格")); } @Test public void rejectsPromotionWithoutPermissionAndPublicTemplateCreation() { Fixture fixture = new Fixture(); ElnFieldForms.Create publicForm = textField("非法私有字段"); publicForm.setZuoyongFanwei("TEMPLATE"); expectDataException(() -> fixture.service.create(publicForm)); ElnFieldVos.Detail template = fixture.service.createTemplateFieldAndPreRelease(templateCommand()); fixture.promoteAllowed = false; expectDataException(() -> fixture.service.promoteToGlobal(template.getId(), "无权限")); } @Test public void rejectsCatalogMaintenanceAndPrivateFieldReadsWithoutPermission() { Fixture fixture = new Fixture(); ElnFieldVos.Detail template = fixture.service.createTemplateFieldAndPreRelease( templateCommand()); fixture.maintainAllowed = false; expectDataException(() -> fixture.service.create(textField("无权限创建"))); expectDataException(() -> fixture.service.page(new ElnFieldForms.Query())); expectDataException(() -> fixture.service.detail(template.getId())); expectDataException(() -> fixture.service.publish( template.getVersions().get(0).getId())); } @Test public void validatesProviderPropertyScopeAndBatchModeBeforePreRelease() { Fixture fixture = new Fixture(); ElnFieldForms.Create invalidProperty = externalField("test.unknown", "RECORD_PRIVATE"); ElnFieldVos.Detail first = fixture.service.create(invalidProperty); expectDataException(() -> fixture.service.preRelease(first.getVersions().get(0).getId())); ElnFieldForms.Create invalidBatch = externalField("test.basis", "BATCH_SHARED"); ElnFieldVos.Detail second = fixture.service.create(invalidBatch); expectDataException(() -> fixture.service.preRelease(second.getVersions().get(0).getId())); ElnFieldForms.Create valid = externalField("test.basis", "RECORD_PRIVATE"); ElnFieldVos.Detail third = fixture.service.create(valid); fixture.service.preRelease(third.getVersions().get(0).getId()); assertEquals("PRE_RELEASE", fixture.service.detail(third.getId()).getVersions().get(0).getBizStatus()); } @Test public void validatesProviderTypeAndControlConfigBeforePreRelease() { Fixture fixture = new Fixture(); ElnFieldForms.Create invalidType = externalField( "test.basis", "RECORD_PRIVATE"); invalidType.setShujuLeixing("CHECKBOX"); ElnFieldVos.Detail first = fixture.service.create(invalidType); expectDataException(() -> fixture.service.preRelease( first.getVersions().get(0).getId())); ElnFieldVos.Detail second = fixture.service.create(textField("控件配置")); ElnFieldVersionEntity stored = fixture.store.findVersion( "tenant-1", second.getVersions().get(0).getId()); stored.setKongjianPeizhi("[]"); expectDataException(() -> fixture.service.preRelease(stored.getId())); } private static ElnFieldForms.Create textField(String name) { ElnFieldForms.Create form = new ElnFieldForms.Create(); form.setZiduanMingcheng(name); form.setShujuLeixing("TEXT"); form.setShifouBitian(0); form.setPiciMoshi("RECORD_PRIVATE"); form.setBinding(binding("NONE", null)); return form; } private static ElnFieldForms.Create checkboxField(String name) { ElnFieldForms.Create form = textField(name); form.setShujuLeixing("CHECKBOX"); return form; } private static ElnFieldForms.Create externalField(String property, String batchMode) { ElnFieldForms.Create form = textField("检验依据"); form.setPiciMoshi(batchMode); form.setBinding(binding("LIMS_TASK", property)); return form; } private static ElnFieldForms.Binding binding(String source, String property) { ElnFieldForms.Read read = new ElnFieldForms.Read(); read.setSource(source); read.setProperty(property); ElnFieldForms.Write write = new ElnFieldForms.Write(); write.setTarget("ELN_RECORD"); ElnFieldForms.Binding binding = new ElnFieldForms.Binding(); binding.setRead(read); binding.setWrite(write); return binding; } private static ElnFieldForms.VersionCreate copyOf(String sourceVersionId) { ElnFieldForms.VersionCreate form = new ElnFieldForms.VersionCreate(); form.setSourceVersionId(sourceVersionId); return form; } private static ElnFieldForms.VersionUpdate versionUpdate(String name) { ElnFieldForms.VersionUpdate form = new ElnFieldForms.VersionUpdate(); form.setZiduanMingcheng(name); form.setShujuLeixing("TEXT"); form.setShifouBitian(0); form.setPiciMoshi("RECORD_PRIVATE"); form.setBinding(binding("NONE", null)); return form; } private static ElnFieldForms.TemplateFieldCreate templateCommand() { ElnFieldForms.TemplateFieldCreate command = new ElnFieldForms.TemplateFieldCreate(); command.setTenantId("tenant-1"); command.setTemplateCode("TPL-001"); command.setOperatorId("user-1"); command.setZiduanMingcheng("模板字段"); command.setShujuLeixing("TEXT"); return command; } private static void expectDataException(Runnable action) { try { action.run(); fail("预期抛出 DataException"); } catch (DataException expected) { assertFalse(expected.getMessage().trim().isEmpty()); } } private static String repeat(String value, int count) { StringBuilder result = new StringBuilder(); for (int i = 0; i < count; i++) { result.append(value); } return result.toString(); } private static final class Fixture { private final MemoryStore store = new MemoryStore(); private final List audits = new ArrayList<>(); private final AtomicInteger ids = new AtomicInteger(); private final TestProviderCatalog providerCatalog = new TestProviderCatalog(); private boolean maintainAllowed = true; private boolean promoteAllowed = true; private final ElnFieldCatalogServiceImpl service; private Fixture(String... suffixes) { Supplier suffixSupplier = suffixSupplier(suffixes); service = new ElnFieldCatalogServiceImpl( store, providerCatalog, () -> new ElnFieldCatalogServiceImpl.UserContext("tenant-1", "user-1"), () -> "id-" + ids.incrementAndGet(), new ElnFieldCodeGenerator(suffixSupplier), audits::add, () -> maintainAllowed, () -> promoteAllowed); } private Fixture() { this(new String[0]); } private List auditActions() { List actions = new ArrayList<>(); for (AuditEventDTO event : audits) { actions.add(event.getActionCode()); } return actions; } private static Supplier suffixSupplier(String[] configured) { AtomicInteger sequence = new AtomicInteger(); return () -> { int index = sequence.getAndIncrement(); return index < configured.length ? configured[index] : String.format("s%07d", index + 1); }; } } private static final class TestProviderCatalog implements ElnFieldProviderCatalog { private boolean available = true; private final List properties = Arrays.asList( new Property("LIMS_TASK", "test.basis", "检验依据", "TEXT", true), new Property("SYSTEM", "current_user.id", "当前用户", "TEXT", true)); @Override public List list(String source) { List result = new ArrayList<>(); if (!available) { return result; } for (Property property : properties) { if (property.getSource().equals(source)) { result.add(property); } } return result; } @Override public boolean contains(String source, String property) { if (!available) { return false; } for (Property item : properties) { if (item.getSource().equals(source) && item.getProperty().equals(property)) { return true; } } return false; } } private static final class MemoryStore implements ElnFieldCatalogServiceImpl.FieldCatalogStore { private final Map definitions = new LinkedHashMap<>(); private final Map versions = new LinkedHashMap<>(); @Override public void insertDefinition(ElnFieldDefEntity entity) { for (ElnFieldDefEntity existing : definitions.values()) { if (existing.getFTenantId().equals(entity.getFTenantId()) && existing.getZiduanBianma().equals(entity.getZiduanBianma())) { throw new DuplicateKeyException("duplicate field code"); } } definitions.put(entity.getId(), entity); } @Override public void insertVersion(ElnFieldVersionEntity entity) { versions.put(entity.getId(), entity); } @Override public ElnFieldDefEntity findDefinition(String tenantId, String id, boolean forUpdate) { ElnFieldDefEntity entity = definitions.get(id); return entity != null && tenantId.equals(entity.getFTenantId()) ? entity : null; } @Override public ElnFieldVersionEntity findVersion(String tenantId, String id) { ElnFieldVersionEntity entity = versions.get(id); return entity != null && tenantId.equals(entity.getFTenantId()) ? entity : null; } @Override public List listVersions(String tenantId, String definitionId) { List result = new ArrayList<>(); for (ElnFieldVersionEntity version : versions.values()) { if (tenantId.equals(version.getFTenantId()) && definitionId.equals(version.getZiduanDingyiId())) { result.add(version); } } return result; } @Override public boolean hasEnabledTemplateFieldName(String tenantId, String templateCode, String fieldName) { for (ElnFieldDefEntity definition : definitions.values()) { if (!tenantId.equals(definition.getFTenantId()) || !"TEMPLATE".equals(definition.getZuoyongFanwei()) || !templateCode.equals(definition.getMubanBianhao()) || !"enabled".equals(definition.getBizEnabled())) { continue; } for (ElnFieldVersionEntity version : versions.values()) { if (tenantId.equals(version.getFTenantId()) && definition.getId().equals(version.getZiduanDingyiId()) && fieldName.equals(version.getZiduanMingcheng())) { return true; } } } return false; } @Override public IPage page(String tenantId, ElnFieldForms.Query query) { List result = new ArrayList<>(); for (ElnFieldDefEntity definition : definitions.values()) { if (tenantId.equals(definition.getFTenantId())) { result.add(definition); } } return new Page(query.getCurrentPage(), query.getPageSize()) .setRecords(result).setTotal(result.size()); } @Override public void updateDefinition(ElnFieldDefEntity entity) { definitions.put(entity.getId(), entity); } @Override public void updateVersion(ElnFieldVersionEntity entity) { versions.put(entity.getId(), entity); } } }