package cn.iocoder.yudao.module.srm.service.supplier; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.module.srm.controller.admin.supplier.vo.SrmSupplierSaveReqVO; import cn.iocoder.yudao.module.srm.dal.dataobject.SrmSupplierDO; import cn.iocoder.yudao.module.srm.dal.mysql.SrmSupplierMapper; import cn.iocoder.yudao.module.system.api.agent.imports.AgentImportCommitReqVO; import cn.iocoder.yudao.module.system.api.agent.imports.AgentImportModuleAdapter; import cn.iocoder.yudao.module.system.api.agent.imports.AgentImportPreflightReqVO; import cn.iocoder.yudao.module.system.api.agent.imports.AgentImportPreflightRespVO; import cn.iocoder.yudao.module.system.api.agent.imports.AgentImportRowReceipt; import cn.iocoder.yudao.module.system.framework.agent.AgentPrincipal; import cn.iocoder.yudao.module.system.service.agent.imports.SystemAgentGenericImportService; import jakarta.annotation.Resource; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.util.*; /** * 供应商档案导入:已存在编码跳过并给警告,只新建不更新。 */ @Component public class SrmSupplierImportAdapter implements AgentImportModuleAdapter { public static final String MODULE_ID = "srm.supplier"; private static final String PERMISSION = "srm:supplier:create"; @Resource private SrmSupplierService supplierService; @Resource private SrmSupplierMapper supplierMapper; @Override public String moduleId() { return MODULE_ID; } @Override public String permission() { return PERMISSION; } @Override public AgentImportPreflightRespVO preflight(AgentPrincipal principal, AgentImportPreflightReqVO request) { // 1. 先统计文件内重复编码,全部标为阻断,避免替用户选版本 Map codeCounts = new HashMap<>(); for (AgentImportPreflightReqVO.Row row : request.getRows()) { String code = value(row, "code"); if (!code.isEmpty()) { codeCounts.merge(code, 1, Integer::sum); } } List rows = new ArrayList<>(); List> resolvedPayload = new ArrayList<>(); int create = 0; int skip = 0; int blocked = 0; for (AgentImportPreflightReqVO.Row row : request.getRows()) { List blockers = new ArrayList<>(); List warnings = new ArrayList<>(); String code = value(row, "code"); String name = value(row, "name"); if (code.isEmpty()) { blockers.add(issue("CODE_REQUIRED", "code", "供应商编码不能为空")); } if (name.isEmpty()) { blockers.add(issue("NAME_REQUIRED", "name", "供应商名称不能为空")); } if (!code.isEmpty() && codeCounts.getOrDefault(code, 0) > 1) { blockers.add(issue("DUPLICATE_CODE_IN_FILE", "code", "文件内存在重复的供应商编码:" + code)); } Integer status = parseStatus(row.getValues().get("status"), blockers); BigDecimal registeredCapital = parseDecimal(row.getValues().get("registeredCapital"), blockers); Long targetId = null; String action; SrmSupplierDO existing = code.isEmpty() ? null : supplierMapper.selectByCode(code); if (!blockers.isEmpty()) { action = "BLOCKED"; blocked++; } else if (existing != null) { action = "SKIP"; targetId = existing.getId(); skip++; warnings.add(issue("SUPPLIER_EXISTS", "code", "供应商编码已存在,已跳过且不会更新现有档案")); } else { action = "CREATE"; create++; } Map resolved = new LinkedHashMap<>(); resolved.put("candidate_id", row.getCandidateId()); resolved.put("code", code); resolved.put("name", name); resolved.put("status", status); resolved.put("action", action); resolved.put("target_id", targetId); resolvedPayload.add(resolved); Map resolvedValues = new LinkedHashMap<>(); resolvedValues.put("code", code); resolvedValues.put("name", name); resolvedValues.put("status", status); resolvedValues.put("registeredCapital", registeredCapital); rows.add(AgentImportPreflightRespVO.Row.builder() .candidateId(row.getCandidateId()) .rowNo(row.getRowNo()) .action(action) .resolved(resolvedValues) .blockers(blockers) .warnings(warnings) .targetId(targetId) .build()); } int total = rows.size(); return AgentImportPreflightRespVO.builder() .moduleId(MODULE_ID) .preflightHash(SystemAgentGenericImportService.preflightHash(MODULE_ID, request, resolvedPayload)) .source(source(request)) .summary(AgentImportPreflightRespVO.Summary.builder() .total(total).create(create).skip(skip).blocked(blocked).build()) .canCommit(blocked == 0) .sideEffects(List.of("创建供应商档案", "不更新已存在的供应商")) .rows(rows) .blockingItems(List.of()) .build(); } @Override public AgentImportRowReceipt commitRow(AgentPrincipal principal, AgentImportCommitReqVO request, AgentImportPreflightRespVO.Row planned, AgentImportPreflightReqVO.Row row) { Map values = row.getValues(); SrmSupplierSaveReqVO saveReqVO = new SrmSupplierSaveReqVO(); saveReqVO.setCode(value(row, "code")); saveReqVO.setName(value(row, "name")); saveReqVO.setShortName(blankToNull(values.get("shortName"))); saveReqVO.setType(blankToNull(values.get("type"))); saveReqVO.setCompanyNature(blankToNull(values.get("companyNature"))); saveReqVO.setRegisteredCapital(decimalOrNull(values.get("registeredCapital"))); saveReqVO.setBusinessLicenseNo(blankToNull(values.get("businessLicenseNo"))); saveReqVO.setTaxNo(blankToNull(values.get("taxNo"))); saveReqVO.setLegalPerson(blankToNull(values.get("legalPerson"))); saveReqVO.setAddress(blankToNull(values.get("address"))); saveReqVO.setWebsite(blankToNull(values.get("website"))); saveReqVO.setContactName(blankToNull(values.get("contactName"))); saveReqVO.setContactMobile(blankToNull(values.get("contactMobile"))); saveReqVO.setContactEmail(blankToNull(values.get("contactEmail"))); saveReqVO.setBankName(blankToNull(values.get("bankName"))); saveReqVO.setBankAccount(blankToNull(values.get("bankAccount"))); saveReqVO.setStatus(parseStatus(values.get("status"), null)); saveReqVO.setRemark(blankToNull(values.get("remark"))); Long id = supplierService.createSupplier(saveReqVO); return AgentImportRowReceipt.created(id, saveReqVO.getCode(), saveReqVO.getName()); } private static AgentImportPreflightRespVO.Source source(AgentImportPreflightReqVO request) { return AgentImportPreflightRespVO.Source.builder() .attachmentId(request.getAttachmentId()) .sessionId(request.getSessionId()) .sourceSha256(request.getSourceSha256()) .proposalRevision(request.getProposalRevision()) .build(); } private static AgentImportPreflightRespVO.Issue issue(String code, String field, String message) { return AgentImportPreflightRespVO.Issue.builder() .code(code).field(field).message(message).retryable(false).build(); } private static String value(AgentImportPreflightReqVO.Row row, String key) { String raw = row.getValues() == null ? null : row.getValues().get(key); return raw == null ? "" : raw.trim(); } private static Integer parseStatus(String raw, List blockers) { if (StrUtil.isBlank(raw)) { return 0; } String value = raw.trim(); if ("0".equals(value) || "1".equals(value)) { return Integer.valueOf(value); } if (blockers != null) { blockers.add(issue("INVALID_STATUS", "status", "状态只能是 0(启用)或 1(禁用)")); } return 0; } private static BigDecimal parseDecimal(String raw, List blockers) { if (StrUtil.isBlank(raw)) { return null; } try { return new BigDecimal(raw.trim()); } catch (NumberFormatException ex) { if (blockers != null) { blockers.add(issue("INVALID_DECIMAL", "registeredCapital", "注册资金必须是数字")); } return null; } } private static BigDecimal decimalOrNull(String raw) { return StrUtil.isBlank(raw) ? null : new BigDecimal(raw.trim()); } private static String blankToNull(String raw) { return StrUtil.isBlank(raw) ? null : raw.trim(); } }