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 validateUpgrade(String tenantId, String templateId, Set bindingIds, String targetFieldVersionId) { ElnFieldVersionEntity target = fieldVersions.selectOne(Wrappers.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 result = new ArrayList<>(); for (ElnTemplateCrossReferenceEntity rule : rules(tenantId, bindingIds)) { ElnFieldVersionEntity source = fieldVersions.selectOne(Wrappers.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 validateRemoval(String tenantId, String templateId, Set bindingIds) { List result = new ArrayList<>(); for (ElnTemplateCrossReferenceEntity rule : rules(tenantId, bindingIds)) result.add(error("CROSS_TEMPLATE_RULE_ATTACHED", "跨模板字段仍有取值规则,不能移除或修复为其他字段", rule.getMubanBangdingId())); return result; } @Override public List validatePromotion(String tenantId, String templateId, String primaryBindingId, String referenceBindingId) { return validateRemoval(tenantId, templateId, Collections.singleton(primaryBindingId)); } @Override public List validateCheckboxGroup( String tenantId, String templateId, String bindingId) { List 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 rules(String tenantId, Set bindingIds) { if (bindingIds == null || bindingIds.isEmpty()) return Collections.emptyList(); List result = references.selectList(Wrappers.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; } }