From 04a9071a6f68a95cc594bed24a50b03b7008454d Mon Sep 17 00:00:00 2001 From: caiyuchao Date: Tue, 29 Jul 2025 10:57:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=89=93=E5=8C=85=E4=B8=8B=E8=BD=BDlic?= =?UTF-8?q?ense=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/license/vo/LicenseNeCodeVO.java | 8 + .../dataobject/license/LicenseDetailDO.java | 4 + .../dataobject/license/LicenseProviderDO.java | 5 +- .../service/license/LicenseServiceImpl.java | 193 ++++++++++-------- .../license/service/license/LicenseTask.java | 2 +- 5 files changed, 121 insertions(+), 91 deletions(-) diff --git a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/vo/LicenseNeCodeVO.java b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/vo/LicenseNeCodeVO.java index f3e698f..f8d8b0b 100644 --- a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/vo/LicenseNeCodeVO.java +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/vo/LicenseNeCodeVO.java @@ -23,6 +23,14 @@ public class LicenseNeCodeVO { @Schema(description = "文件url") private String fileUrl; + /** + * 文件URL + */ + private String fileUrlLegacy; + + @Schema(description = "文件url列表") + private List fileUrlList; + @Schema(description = "提供者ID") private Long providerId; } diff --git a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/dataobject/license/LicenseDetailDO.java b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/dataobject/license/LicenseDetailDO.java index fde120c..2bda8e6 100644 --- a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/dataobject/license/LicenseDetailDO.java +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/dataobject/license/LicenseDetailDO.java @@ -55,6 +55,10 @@ public class LicenseDetailDO extends BaseDO { * 文件URL */ private String fileUrl; + /** + * 文件URL-Legacy + */ + private String fileUrlLegacy; /** * 提供者ID */ diff --git a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/dataobject/license/LicenseProviderDO.java b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/dataobject/license/LicenseProviderDO.java index 8de77e8..d8a4898 100644 --- a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/dataobject/license/LicenseProviderDO.java +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/dataobject/license/LicenseProviderDO.java @@ -108,5 +108,8 @@ public class LicenseProviderDO extends BaseDO { * 备注 */ private String remark; - + /** + * 审批人 + */ + private Long approver; } \ 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 9fb8a92..a63735b 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 @@ -3,6 +3,7 @@ package org.agt.module.license.service.license; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ZipUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; @@ -30,8 +31,11 @@ import org.agt.module.system.api.mail.dto.MailSendSingleToUserReqDTO; import org.agt.module.system.api.notify.NotifyMessageSendApi; import org.agt.module.system.api.notify.dto.NotifySendSingleToUserReqDTO; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import java.io.ByteArrayInputStream; +import java.io.File; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; @@ -78,6 +82,7 @@ public class LicenseServiceImpl implements LicenseService { private LicenseDetailMapper licenseDetailMapper; @Override + @Transactional(rollbackFor = Exception.class) public Long createLicense(LicenseSaveReqVO createReqVO) { // 校验项目Sn是否唯一 if (!validateLicenseSnUnique(createReqVO.getSerialNo(), createReqVO.getId())) { @@ -171,6 +176,7 @@ public class LicenseServiceImpl implements LicenseService { licenseProviderDO.setOperationType(1); licenseProviderDO.setState(1); licenseProviderDO.setRemark(updateReqVO.getRemark()); + licenseProviderDO.setApprover(updateReqVO.getApprover()); licenseProviderMapper.insert(licenseProviderDO); neCodeVO.setProviderId(licenseProviderDO.getId()); @@ -187,12 +193,11 @@ public class LicenseServiceImpl implements LicenseService { } @Override + @Transactional(rollbackFor = Exception.class) public String generate(Long id) { LicenseDO licenseDO = licenseMapper.selectById(id); -// List neCodeList = licenseDO.getNeCodeList(); List licenseDetailDOS = licenseDetailMapper.selectList(Wrappers.lambdaQuery().eq(LicenseDetailDO::getLicenseId, licenseDO.getId())); -// List neCodeList = BeanUtils.toBean(licenseDetailDOS, LicenseNeCodeVO.class); for (LicenseDetailDO neCodeVO : licenseDetailDOS) { LicenseProviderDO licenseProviderDO = licenseProviderMapper.selectById(neCodeVO.getProviderId()); @@ -200,65 +205,6 @@ public class LicenseServiceImpl implements LicenseService { licenseProviderMapper.updateById(licenseProviderDO); } -// try { -// System.out.println("线程开始睡眠..."); -// Thread.sleep(8000); // 暂停2000毫秒,即2秒 -// System.out.println("线程醒来!"); -// } catch (InterruptedException e) { -// log.error("睡眠失败"); -// } -// -// for (LicenseDetailDO neCodeVO : licenseDetailDOS) { -// LicenseProviderDO licenseProviderDO = licenseProviderMapper.selectById(neCodeVO.getProviderId()); -// if (licenseProviderDO.getState() != 3) { -//// continue; -// } -// String newFilePath1 = licenseProviderDO.getNewFilePath1(); -// -// List neList = neCodeVO.getNeList(); -// List neLabels = new ArrayList<>(); -// for (Integer ne : neList) { -// String label = DictFrameworkUtils.parseDictDataLabel("lic_ne_all", ne.toString()); -// if (StrUtil.isBlank(label)) { -// label = DictFrameworkUtils.parseDictDataLabel("lic_ne_5g", ne.toString()); -// if (StrUtil.isBlank(label)) { -// label = DictFrameworkUtils.parseDictDataLabel("lic_ne_4g", ne.toString()); -// if (StrUtil.isBlank(label)) { -// label = DictFrameworkUtils.parseDictDataLabel("lic_ne_23g", ne.toString()); -// if (StrUtil.isBlank(label)) { -// label = DictFrameworkUtils.parseDictDataLabel("lic_ne_add", ne.toString()); -// } -// } -// } -// } -// neLabels.add(label); -// } -// String neListStr = StrUtil.join("_", neLabels); -// if (StrUtil.isNotBlank(neListStr)) { -// neListStr = neListStr + "_"; -// } -// String fileName = neListStr + licenseDO.getSerialNo() + "_" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + "_system.ini"; -// -// // 上传到文件服务 -// byte[] fileContent = null; -// try { -// log.info("下载License文件路径为:{}", newFilePath1); -// fileContent = FileUtil.readBytes(newFilePath1); -// } catch (Exception e) { -// log.error("读取文件失败", e); -// } -// if (fileContent == null) { -// log.error("读取文件失败为空"); -// fileContent = ResourceUtil.readBytes("file/MME_13750602_2024-08-02_system.ini"); -// } -// -// String fileURL = fileApi.createFile(fileContent, fileName); -// -// neCodeVO.setFileUrl(fileURL); -// } -// -// licenseDetailMapper.updateBatch(licenseDetailDOS); -// licenseDO.setNeCodeList(neCodeList); licenseDO.setStatus(LicenseStatusEnum.GENERATING.getCode()); licenseMapper.updateById(licenseDO); return ""; @@ -270,43 +216,21 @@ public class LicenseServiceImpl implements LicenseService { List licenseDetails = licenseDetailMapper.selectList(Wrappers.lambdaQuery().eq(LicenseDetailDO::getLicenseId, licenseDO.getId())); for (LicenseDetailDO detail : licenseDetails) { - if (StrUtil.isNotBlank(detail.getFileUrl())) { + if (StrUtil.isNotBlank(detail.getFileUrl()) && StrUtil.isNotBlank(detail.getFileUrlLegacy())) { continue; } LicenseProviderDO licenseProviderDO = licenseProviderMapper.selectById(detail.getProviderId()); - if (licenseProviderDO.getState() != 3) { + if (licenseProviderDO == null || licenseProviderDO.getState() != 3) { continue; } - String newFilePath1 = licenseProviderDO.getNewFilePath1(); - List neList = detail.getNeList(); - List neLabels = new ArrayList<>(); - for (Integer ne : neList) { - String label = DictFrameworkUtils.parseDictDataLabel("lic_ne_all", ne.toString()); - if (StrUtil.isBlank(label)) { - label = DictFrameworkUtils.parseDictDataLabel("lic_ne_5g", ne.toString()); - if (StrUtil.isBlank(label)) { - label = DictFrameworkUtils.parseDictDataLabel("lic_ne_4g", ne.toString()); - if (StrUtil.isBlank(label)) { - label = DictFrameworkUtils.parseDictDataLabel("lic_ne_23g", ne.toString()); - if (StrUtil.isBlank(label)) { - label = DictFrameworkUtils.parseDictDataLabel("lic_ne_add", ne.toString()); - } - } - } - } - neLabels.add(label); - } - String neListStr = StrUtil.join("_", neLabels); - if (StrUtil.isNotBlank(neListStr)) { - neListStr = neListStr + "_"; - } - String fileName = neListStr + licenseDO.getSerialNo() + "_" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + "_system.ini"; + String fileName = getFileName(licenseDO.getSerialNo(), detail.getNeList()); // 上传到文件服务 byte[] fileContent = null; try { - log.info("下载License文件路径为:{}", newFilePath1); + String newFilePath1 = licenseProviderDO.getNewFilePath1(); + log.info("45G_下载License文件路径为:{}", newFilePath1); fileContent = FileUtil.readBytes(newFilePath1); } catch (Exception e) { log.error("读取文件失败", e); @@ -316,15 +240,61 @@ public class LicenseServiceImpl implements LicenseService { fileContent = ResourceUtil.readBytes("file/MME_13750602_2024-08-02_system.ini"); } - String fileURL = fileApi.createFile(fileContent, fileName); + String fileURL = fileApi.createFile(fileContent, "45G_" + fileName); detail.setFileUrl(fileURL); + + // 上传到文件服务 + byte[] fileContent0 = null; + try { + String newFilePath0 = licenseProviderDO.getNewFilePath0(); + log.info("下载Legacy_License文件路径为:{}", newFilePath0); + fileContent0 = FileUtil.readBytes(newFilePath0); + } catch (Exception e) { + log.error("读取文件失败", e); + } + if (fileContent0 == null) { + log.error("读取文件失败为空"); + fileContent0 = ResourceUtil.readBytes("file/MME_13750602_2024-08-02_system.ini"); + } + + String fileURL0 = fileApi.createFile(fileContent0, "Legacy_" + fileName); + + detail.setFileUrlLegacy(fileURL0); licenseDetailMapper.updateById(detail); } boolean isCompleted = licenseDetails.stream().allMatch(c -> StrUtil.isNotBlank(c.getFileUrl())); if (isCompleted) { + // 打包压缩上传 + List pathList = new ArrayList<>(); + List inputStreamList = new ArrayList<>(); + for (LicenseDetailDO detail : licenseDetails) { + LicenseProviderDO licenseProviderDO = licenseProviderMapper.selectById(detail.getProviderId()); + String fileName = getFileName(licenseDO.getSerialNo(), detail.getNeList()); + if (StrUtil.isNotBlank(licenseProviderDO.getNewFilePath1())) { + pathList.add("45G_" + fileName); + inputStreamList.add(new ByteArrayInputStream(FileUtil.readBytes(licenseProviderDO.getNewFilePath1()))); + } else { + pathList.add("45G_" + fileName); + inputStreamList.add(new ByteArrayInputStream(FileUtil.readBytes("file/MME_13750602_2024-08-02_system.ini"))); + } + if (StrUtil.isNotBlank(licenseProviderDO.getNewFilePath0())) { + pathList.add("Legacy_" + fileName); + inputStreamList.add(new ByteArrayInputStream(FileUtil.readBytes(licenseProviderDO.getNewFilePath0()))); + } else { + pathList.add("Legacy_" + fileName); + inputStreamList.add(new ByteArrayInputStream(FileUtil.readBytes("file/MME_13750602_2024-08-02_system.ini"))); + } + } + + File tempFile = new File("D:/temp/temp.zip"); +// File tempFile = new File("/usr/local/licGen"); + ZipUtil.zip(tempFile, pathList.toArray(new String[0]), inputStreamList.toArray(new ByteArrayInputStream[inputStreamList.size()])); + String fileURL = fileApi.createFile(FileUtil.readBytes(tempFile), licenseDO.getSerialNo() + "_" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))+".zip"); + + licenseDO.setFileUrl(fileURL); licenseDO.setStatus(LicenseStatusEnum.COMPLETED.getCode()); licenseMapper.updateById(licenseDO); } @@ -333,6 +303,31 @@ public class LicenseServiceImpl implements LicenseService { } + private static String getFileName(String serialNo, List neList) { + List neLabels = new ArrayList<>(); + for (Integer ne : neList) { + String label = DictFrameworkUtils.parseDictDataLabel("lic_ne_all", ne.toString()); + if (StrUtil.isBlank(label)) { + label = DictFrameworkUtils.parseDictDataLabel("lic_ne_5g", ne.toString()); + if (StrUtil.isBlank(label)) { + label = DictFrameworkUtils.parseDictDataLabel("lic_ne_4g", ne.toString()); + if (StrUtil.isBlank(label)) { + label = DictFrameworkUtils.parseDictDataLabel("lic_ne_23g", ne.toString()); + if (StrUtil.isBlank(label)) { + label = DictFrameworkUtils.parseDictDataLabel("lic_ne_add", ne.toString()); + } + } + } + } + neLabels.add(label); + } + String neListStr = StrUtil.join("_", neLabels); + if (StrUtil.isNotBlank(neListStr)) { + neListStr = neListStr + "_"; + } + return neListStr + serialNo + "_" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + "_system.ini"; + } + @Override public void deleteLicense(Long id) { // 校验存在 @@ -352,6 +347,16 @@ public class LicenseServiceImpl implements LicenseService { LicenseDO licenseDO = licenseMapper.selectById(id); List licenseDetailDOS = licenseDetailMapper.selectList(Wrappers.lambdaQuery().eq(LicenseDetailDO::getLicenseId, licenseDO.getId())); List details = BeanUtils.toBean(licenseDetailDOS, LicenseNeCodeVO.class); + for (LicenseNeCodeVO detail : details) { + List fileUrlList = new ArrayList<>(); + if (StrUtil.isNotBlank(detail.getFileUrl())) { + fileUrlList.add(detail.getFileUrl()); + } + if (StrUtil.isNotBlank(detail.getFileUrlLegacy())) { + fileUrlList.add(detail.getFileUrlLegacy()); + } + detail.setFileUrlList(fileUrlList); + } licenseDO.setNeCodeList(details); return licenseDO; } @@ -362,6 +367,16 @@ public class LicenseServiceImpl implements LicenseService { for (LicenseDO licenseDO : pageResult.getList()) { List licenseDetailDOS = licenseDetailMapper.selectList(Wrappers.lambdaQuery().eq(LicenseDetailDO::getLicenseId, licenseDO.getId())); List details = BeanUtils.toBean(licenseDetailDOS, LicenseNeCodeVO.class); + for (LicenseNeCodeVO detail : details) { + List fileUrlList = new ArrayList<>(); + if (StrUtil.isNotBlank(detail.getFileUrl())) { + fileUrlList.add(detail.getFileUrl()); + } + if (StrUtil.isNotBlank(detail.getFileUrlLegacy())) { + fileUrlList.add(detail.getFileUrlLegacy()); + } + detail.setFileUrlList(fileUrlList); + } licenseDO.setNeCodeList(details); } return pageResult; diff --git a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/license/LicenseTask.java b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/license/LicenseTask.java index a00abab..2f6e763 100644 --- a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/license/LicenseTask.java +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/license/LicenseTask.java @@ -15,7 +15,7 @@ public class LicenseTask { @Resource private LicenseServiceImpl licenseService; - @Scheduled(cron ="*/5 * * * * ?") + @Scheduled(cron ="*/8 * * * * ?") public void task() { licenseService.genLicenseTask(); }