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<AuditEventDTO> 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<String> 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<String> auditActions() {
|
List<String> actions = new ArrayList<>();
|
for (AuditEventDTO event : audits) {
|
actions.add(event.getActionCode());
|
}
|
return actions;
|
}
|
|
private static Supplier<String> 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<Property> properties = Arrays.asList(
|
new Property("LIMS_TASK", "test.basis", "检验依据", "TEXT", true),
|
new Property("SYSTEM", "current_user.id", "当前用户", "TEXT", true));
|
|
@Override
|
public List<Property> list(String source) {
|
List<Property> 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<String, ElnFieldDefEntity> definitions = new LinkedHashMap<>();
|
private final Map<String, ElnFieldVersionEntity> 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<ElnFieldVersionEntity> listVersions(String tenantId, String definitionId) {
|
List<ElnFieldVersionEntity> 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<ElnFieldDefEntity> page(String tenantId, ElnFieldForms.Query query) {
|
List<ElnFieldDefEntity> result = new ArrayList<>();
|
for (ElnFieldDefEntity definition : definitions.values()) {
|
if (tenantId.equals(definition.getFTenantId())) {
|
result.add(definition);
|
}
|
}
|
return new Page<ElnFieldDefEntity>(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);
|
}
|
}
|
}
|