package jnpf.elnService.cross.impl;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import jnpf.elnEntity.field.ElnFieldVersionEntity;
|
import jnpf.elnEntity.template.ElnTemplateCrossReferenceEntity;
|
import jnpf.elnEntity.template.ElnTemplateVos;
|
import jnpf.elnMapper.ElnFieldVersionMapper;
|
import jnpf.elnMapper.ElnTemplateCrossReferenceMapper;
|
import jnpf.elnService.template.ElnTemplateBindingDependencyValidator;
|
import org.springframework.stereotype.Service;
|
|
import java.util.ArrayList;
|
import java.util.Collections;
|
import java.util.List;
|
import java.util.Set;
|
|
/** Keeps a cross-template rule attached to the PRIMARY binding it decorates. */
|
@Service
|
public class ElnCrossTemplateBindingDependencyValidator implements ElnTemplateBindingDependencyValidator {
|
private final ElnTemplateCrossReferenceMapper references;
|
private final ElnFieldVersionMapper fieldVersions;
|
|
public ElnCrossTemplateBindingDependencyValidator(ElnTemplateCrossReferenceMapper references,
|
ElnFieldVersionMapper fieldVersions) {
|
this.references = references;
|
this.fieldVersions = fieldVersions;
|
}
|
|
@Override
|
public List<ElnTemplateVos.Diagnostic> validateUpgrade(String tenantId, String templateId,
|
Set<String> bindingIds, String targetFieldVersionId) {
|
ElnFieldVersionEntity target = fieldVersions.selectOne(Wrappers.<ElnFieldVersionEntity>lambdaQuery()
|
.eq(ElnFieldVersionEntity::getFTenantId, tenantId).eq(ElnFieldVersionEntity::getId, targetFieldVersionId)
|
.eq(ElnFieldVersionEntity::getFDeleteMark, 0));
|
if (target == null) return Collections.singletonList(error("CROSS_TEMPLATE_TARGET_VERSION_INVALID", "目标字段版本不存在", null));
|
List<ElnTemplateVos.Diagnostic> result = new ArrayList<>();
|
for (ElnTemplateCrossReferenceEntity rule : rules(tenantId, bindingIds)) {
|
ElnFieldVersionEntity source = fieldVersions.selectOne(Wrappers.<ElnFieldVersionEntity>lambdaQuery()
|
.eq(ElnFieldVersionEntity::getFTenantId, tenantId)
|
.eq(ElnFieldVersionEntity::getId, rule.getLaiyuanZiduanBanbenId())
|
.eq(ElnFieldVersionEntity::getFDeleteMark, 0));
|
if (source == null || !source.getZiduanDingyiId().equals(rule.getLaiyuanZiduanDingyiId())
|
|| !source.getShujuLeixing().equals(target.getShujuLeixing())) {
|
result.add(error("CROSS_TEMPLATE_TARGET_TYPE_MISMATCH", "跨模板字段升级后必须保持与固定来源相同的类型", rule.getMubanBangdingId()));
|
}
|
}
|
return result;
|
}
|
|
@Override
|
public List<ElnTemplateVos.Diagnostic> validateRemoval(String tenantId, String templateId, Set<String> bindingIds) {
|
List<ElnTemplateVos.Diagnostic> result = new ArrayList<>();
|
for (ElnTemplateCrossReferenceEntity rule : rules(tenantId, bindingIds))
|
result.add(error("CROSS_TEMPLATE_RULE_ATTACHED", "跨模板字段仍有取值规则,不能移除或修复为其他字段", rule.getMubanBangdingId()));
|
return result;
|
}
|
|
@Override
|
public List<ElnTemplateVos.Diagnostic> validatePromotion(String tenantId, String templateId,
|
String primaryBindingId, String referenceBindingId) {
|
return validateRemoval(tenantId, templateId, Collections.singleton(primaryBindingId));
|
}
|
|
@Override
|
public List<ElnTemplateVos.Diagnostic> validateCheckboxGroup(
|
String tenantId, String templateId, String bindingId) {
|
List<ElnTemplateCrossReferenceEntity> attached = rules(
|
tenantId, Collections.singleton(bindingId));
|
if (attached.isEmpty()) {
|
return Collections.emptyList();
|
}
|
return Collections.singletonList(error(
|
"CHECKBOX_GROUP_CROSS_TEMPLATE_READ_ONLY",
|
"跨模板只读字段不能加入选择组", bindingId));
|
}
|
|
private List<ElnTemplateCrossReferenceEntity> rules(String tenantId, Set<String> bindingIds) {
|
if (bindingIds == null || bindingIds.isEmpty()) return Collections.emptyList();
|
List<ElnTemplateCrossReferenceEntity> result = references.selectList(Wrappers.<ElnTemplateCrossReferenceEntity>lambdaQuery()
|
.eq(ElnTemplateCrossReferenceEntity::getFTenantId, tenantId)
|
.eq(ElnTemplateCrossReferenceEntity::getFDeleteMark, 0)
|
.in(ElnTemplateCrossReferenceEntity::getMubanBangdingId, bindingIds));
|
return result == null ? Collections.emptyList() : result;
|
}
|
|
private static ElnTemplateVos.Diagnostic error(String code, String message, String bindingId) {
|
ElnTemplateVos.Diagnostic diagnostic = new ElnTemplateVos.Diagnostic();
|
diagnostic.setSeverity("ERROR"); diagnostic.setCode(code); diagnostic.setMessage(message); diagnostic.setBindingId(bindingId);
|
return diagnostic;
|
}
|
}
|