From f970b457c2f54cbc097e279ed95d288e13999208 Mon Sep 17 00:00:00 2001 From: caiyuchao Date: Tue, 2 Sep 2025 11:24:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=BF=80=E6=B4=BB=E7=A0=81=E5=AF=BC?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/license/LicenseController.java | 14 +++ .../license/vo/LicenseCodeImportExcelVO.java | 36 +++++++ .../service/license/LicenseService.java | 3 + .../service/license/LicenseServiceImpl.java | 99 +++++++++++++++++++ 4 files changed, 152 insertions(+) create mode 100644 agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/vo/LicenseCodeImportExcelVO.java diff --git a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/LicenseController.java b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/LicenseController.java index d904f6f..3825907 100644 --- a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/LicenseController.java +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/LicenseController.java @@ -18,6 +18,7 @@ import org.agt.framework.dict.core.DictFrameworkUtils; import org.agt.framework.excel.core.util.ExcelUtils; import org.agt.framework.translate.core.TranslateUtils; import org.agt.module.license.controller.admin.license.vo.ImportRespVO; +import org.agt.module.license.controller.admin.license.vo.LicenseCodeImportExcelVO; import org.agt.module.license.controller.admin.license.vo.LicenseDetailVO; import org.agt.module.license.controller.admin.license.vo.LicenseImportExcelVO; import org.agt.module.license.controller.admin.license.vo.LicensePageReqVO; @@ -244,6 +245,19 @@ public class LicenseController { return success(licenseService.importList(list, updateSupport)); } + @PostMapping("/code-import") + @Operation(summary = "导入License的激活码") + @Parameters({ + @Parameter(name = "file", description = "Excel 文件", required = true), + @Parameter(name = "updateSupport", description = "是否支持更新,默认为 false", example = "true") + }) + @PreAuthorize("@ss.hasPermission('license:license:import')") + public CommonResult importCodeExcel(@RequestParam("file") MultipartFile file, + @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { + List list = ExcelUtils.read(file, LicenseCodeImportExcelVO.class); + return success(licenseService.importCodeList(list, updateSupport)); + } + @PutMapping("/update-detail") @Operation(summary = "更新License明细") @PreAuthorize("@ss.hasPermission('license:license:update')") diff --git a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/vo/LicenseCodeImportExcelVO.java b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/vo/LicenseCodeImportExcelVO.java new file mode 100644 index 0000000..d0e0d3f --- /dev/null +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/vo/LicenseCodeImportExcelVO.java @@ -0,0 +1,36 @@ +package org.agt.module.license.controller.admin.license.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * @description: 导入激活码excelVO + * @author: cyc + * @since: 2025-08-28 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免导入有问题 +@ExcelIgnoreUnannotated +public class LicenseCodeImportExcelVO { + + @Schema(description = "SN") + @ExcelProperty("SN") + private String serialNo; + + @Schema(description = "Customer") + @ExcelProperty("Customer") + private String customerName; + + @Schema(description = "Activation Code") + @ExcelProperty("Activation Code") + private String activationCode; +} diff --git a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/license/LicenseService.java b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/license/LicenseService.java index 3a56896..43af9fb 100644 --- a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/license/LicenseService.java +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/license/LicenseService.java @@ -3,6 +3,7 @@ package org.agt.module.license.service.license; import jakarta.validation.Valid; import org.agt.framework.common.pojo.PageResult; import org.agt.module.license.controller.admin.license.vo.ImportRespVO; +import org.agt.module.license.controller.admin.license.vo.LicenseCodeImportExcelVO; import org.agt.module.license.controller.admin.license.vo.LicenseDetailVO; import org.agt.module.license.controller.admin.license.vo.LicenseImportExcelVO; import org.agt.module.license.controller.admin.license.vo.LicensePageReqVO; @@ -95,5 +96,7 @@ public interface LicenseService { ImportRespVO importList(List list, Boolean updateSupport); + ImportRespVO importCodeList(List list, Boolean updateSupport); + void updateDetailById(LicenseDetailVO licenseDetail); } \ No newline at end of file diff --git a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/license/LicenseServiceImpl.java b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/license/LicenseServiceImpl.java index d6c1da5..30feb8e 100644 --- a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/license/LicenseServiceImpl.java +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/license/LicenseServiceImpl.java @@ -16,6 +16,7 @@ import org.agt.framework.dict.core.DictFrameworkUtils; import org.agt.framework.web.core.util.WebFrameworkUtils; import org.agt.module.infra.api.file.FileApi; import org.agt.module.license.controller.admin.license.vo.ImportRespVO; +import org.agt.module.license.controller.admin.license.vo.LicenseCodeImportExcelVO; import org.agt.module.license.controller.admin.license.vo.LicenseDetailVO; import org.agt.module.license.controller.admin.license.vo.LicenseImportExcelVO; import org.agt.module.license.controller.admin.license.vo.LicensePageReqVO; @@ -818,6 +819,104 @@ public class LicenseServiceImpl implements LicenseService { return respVO; } + @Override + public ImportRespVO importCodeList(List list, Boolean updateSupport) { + + ImportRespVO respVO = ImportRespVO.builder().creates(new ArrayList<>()) + .updates(new ArrayList<>()).failures(new LinkedHashMap<>()).build(); +// list = list.stream().filter(c -> StrUtil.isNotBlank(c.getSerialNo())).collect(Collectors.toList()); + + String lastSn = ""; + String lastCustomer = ""; + for (LicenseCodeImportExcelVO importVO : list) { + if (StrUtil.isBlank(importVO.getSerialNo())) { + importVO.setSerialNo(lastSn); + } + if (StrUtil.isBlank(importVO.getCustomerName())) { + importVO.setCustomerName(lastCustomer); + } + lastSn = importVO.getSerialNo(); + lastCustomer = importVO.getCustomerName(); + } + for (LicenseCodeImportExcelVO importExcelVO : list) { + String serialNo = importExcelVO.getSerialNo().trim(); + if (StrUtil.isBlank(importExcelVO.getCustomerName())) { + continue; + } + String customerName = importExcelVO.getCustomerName().trim(); + String regex = "\\d{8}"; + + if (!serialNo.matches(regex) && customerName.matches(regex)) { + importExcelVO.setSerialNo(customerName); + } + + } + + Map> map = list.stream().collect(Collectors.groupingBy(LicenseCodeImportExcelVO::getSerialNo)); + + List newImportList = new ArrayList<>(); + for (Map.Entry> entry : map.entrySet()) { + String key = entry.getKey(); + List value = entry.getValue(); + + List codeList = new ArrayList<>(); + for (LicenseCodeImportExcelVO importVO : value) { + if (StrUtil.isBlank(importVO.getActivationCode())) { + respVO.getFailures().put(key, "没有找到激活码"); + continue; + } + String activationCode = importVO.getActivationCode(); + if (activationCode.contains(":")) { + activationCode = activationCode.substring(activationCode.indexOf(":") + 1); + } + if (activationCode.matches("^[A-Z0-9]{20,}$")) { + codeList.add(activationCode); + } + + } + + if (CollUtil.isEmpty(codeList)) { + respVO.getFailures().put(key, "没有找到激活码"); + continue; + } + if (CollUtil.isNotEmpty(codeList) && codeList.size() > 1) { + respVO.getFailures().put(key, "激活码有多个"); + continue; + } + LicenseCodeImportExcelVO newImportVO = new LicenseCodeImportExcelVO(); + newImportVO.setSerialNo(key); + newImportVO.setActivationCode(codeList.get(0)); + newImportList.add(newImportVO); + } + + for (LicenseCodeImportExcelVO newImportVO : newImportList) { + List licenseDOS = licenseMapper.selectList(Wrappers.lambdaQuery() + .eq(LicenseDO::getSerialNo, newImportVO.getSerialNo()).eq(LicenseDO::getDataType, 1)); + Optional first = licenseDOS.stream().findFirst(); + if (!first.isPresent()) { + respVO.getFailures().put(newImportVO.getSerialNo(), "没有找到该SN"); + continue; + } + LicenseDO licenseDO = first.get(); + LicenseDetailDO licenseDetailDO = licenseDetailMapper.selectOne(Wrappers.lambdaQuery().eq(LicenseDetailDO::getLicenseId, licenseDO.getId()), false); + if (licenseDetailDO == null) { + respVO.getFailures().put(newImportVO.getSerialNo(), "没有找到网元"); + continue; + } + if (!updateSupport && StrUtil.isNotBlank(licenseDetailDO.getActivationCode())) { + respVO.getFailures().put(newImportVO.getSerialNo(), "激活码已存在"); + continue; + } + licenseDetailDO.setActivationCode(newImportVO.getActivationCode()); +// licenseDetailMapper.updateById(licenseDetailDO); + if (StrUtil.isNotBlank(licenseDetailDO.getActivationCode())) { + respVO.getCreates().add(newImportVO.getSerialNo()); + } + } + + return respVO; + } + private static LocalDateTime getCreateTime(LicenseImportExcelVO importVO) { LocalDateTime createTime = LocalDateTime.now(); try {