package jnpf.elnService.cross.impl; import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import jnpf.elnEntity.template.ElnTemplateCrossReferenceEntity; import jnpf.elnMapper.ElnTemplateCrossReferenceMapper; import jnpf.elnService.template.ElnTemplateVersionCopyParticipant; import jnpf.exception.DataException; import org.springframework.stereotype.Service; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; /** Copies rule identity only after the corresponding target PRIMARY bindings are activated. */ @Service public class ElnCrossTemplateVersionCopyParticipant implements ElnTemplateVersionCopyParticipant { private final ElnTemplateCrossReferenceMapper references; public ElnCrossTemplateVersionCopyParticipant(ElnTemplateCrossReferenceMapper references) { this.references = references; } @Override public void afterBindingsActivated(String tenantId, String sourceTemplateId, String targetTemplateId, Map bindingIdMap) { List rules = references.selectList(Wrappers.lambdaQuery() .eq(ElnTemplateCrossReferenceEntity::getFTenantId, tenantId).eq(ElnTemplateCrossReferenceEntity::getFDeleteMark, 0) .in(ElnTemplateCrossReferenceEntity::getMubanBangdingId, bindingIdMap == null ? Collections.singleton("-") : bindingIdMap.keySet())); if (rules == null) return; for (ElnTemplateCrossReferenceEntity source : rules) { String targetBindingId = bindingIdMap.get(source.getMubanBangdingId()); if (targetBindingId == null) continue; ElnTemplateCrossReferenceEntity existing = references.selectOne(Wrappers.lambdaQuery() .eq(ElnTemplateCrossReferenceEntity::getFTenantId, tenantId) .eq(ElnTemplateCrossReferenceEntity::getMubanBangdingId, targetBindingId)); if (existing != null) { if (!sameSource(existing, source)) throw new DataException("升版绑定已用于其他跨模板来源"); continue; } ElnTemplateCrossReferenceEntity copied = new ElnTemplateCrossReferenceEntity(); copied.setId(IdUtil.getSnowflakeNextIdStr()); copied.setFTenantId(tenantId); copied.setFDeleteMark(0); copied.setMubanBangdingId(targetBindingId); copied.setLaiyuanMubanId(source.getLaiyuanMubanId()); copied.setLaiyuanMubanBianhao(source.getLaiyuanMubanBianhao()); copied.setLaiyuanZiduanDingyiId(source.getLaiyuanZiduanDingyiId()); copied.setLaiyuanZiduanBanbenId(source.getLaiyuanZiduanBanbenId()); if (references.insert(copied) != 1) throw new DataException("跨模板字段升版规则保存失败"); } } private static boolean sameSource(ElnTemplateCrossReferenceEntity left, ElnTemplateCrossReferenceEntity right) { return Objects.equals(left.getLaiyuanMubanId(), right.getLaiyuanMubanId()) && Objects.equals(left.getLaiyuanMubanBianhao(), right.getLaiyuanMubanBianhao()) && Objects.equals(left.getLaiyuanZiduanDingyiId(), right.getLaiyuanZiduanDingyiId()) && Objects.equals(left.getLaiyuanZiduanBanbenId(), right.getLaiyuanZiduanBanbenId()); } }