package kr.itn.itnhub.seed; import kr.itn.itnhub.org.Organization; import kr.itn.itnhub.org.OrganizationMapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.InputStream; import java.util.HashSet; import java.util.List; import java.util.Set; @Service public class SeedService { private final SeedParser parser; private final OrganizationMapper mapper; public SeedService(SeedParser parser, OrganizationMapper mapper) { this.parser = parser; this.mapper = mapper; } @Transactional public SeedReport seed(InputStream xlsx) { List rows = parser.parse(xlsx); Set before = new HashSet<>(); for (Organization existing : mapper.findAll()) { before.add(key(existing.getOrgNo(), existing.getOrgName())); } int created = 0; int updated = 0; for (SeedRow row : rows) { if (before.contains(key(row.orgNo(), row.orgName()))) { updated++; } else { created++; } mapper.upsertBySeed(toOrganization(row)); } return new SeedReport(created, updated, rows.size()); } private String key(String orgNo, String orgName) { return orgNo + " " + orgName; } private Organization toOrganization(SeedRow row) { Organization org = new Organization(); org.setOrgNo(row.orgNo()); org.setOrgName(row.orgName()); org.setChannelSlug(row.channelSlug()); org.setDeptName(row.deptName()); org.setManagerName(row.managerName()); org.setManagerTitle(row.managerTitle()); org.setManagerPhone(row.managerPhone()); org.setManagerEmail(row.managerEmail()); return org; } }