From 8af90ae54986988d7bddabfb6d33cb01d12bb773 Mon Sep 17 00:00:00 2001 From: caiyuchao Date: Fri, 18 Jul 2025 16:31:34 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20license=E7=94=B3=E8=AF=B7=E3=80=81?= =?UTF-8?q?=E7=94=9F=E6=88=90=E5=92=8C=E4=B8=8B=E8=BD=BD=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/license/LicenseController.java | 8 ++ .../admin/license/vo/LicensePageReqVO.java | 3 + .../admin/license/vo/LicenseRespVO.java | 4 + .../admin/license/vo/LicenseSaveReqVO.java | 3 + .../dal/dataobject/license/LicenseDO.java | 4 + .../service/license/LicenseService.java | 8 ++ .../service/license/LicenseServiceImpl.java | 76 +++++++++++++++++++ .../file/MME_13750602_2024-08-02_system.ini | 7 ++ 8 files changed, 113 insertions(+) create mode 100644 agt-module-license/agt-module-license-server/src/main/resources/file/MME_13750602_2024-08-02_system.ini 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 15f0842..78d7300 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 @@ -66,6 +66,14 @@ public class LicenseController { return success(true); } + @GetMapping("/generate") + @Operation(summary = "生成License") + @PreAuthorize("@ss.hasPermission('license:license:generate')") + public CommonResult generate(@RequestParam("id") Long id) { + String url = licenseService.generate(id); + return success(url); + } + @DeleteMapping("/delete") @Operation(summary = "删除License") @Parameter(name = "id", description = "编号", required = true) diff --git a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/vo/LicensePageReqVO.java b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/vo/LicensePageReqVO.java index 5844581..423d07b 100644 --- a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/vo/LicensePageReqVO.java +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/vo/LicensePageReqVO.java @@ -43,6 +43,9 @@ public class LicensePageReqVO extends PageParam { @Schema(description = "激活码") private String activationCode; + @Schema(description = "文件URL") + private String fileUrl; + @Schema(description = "License内容") private String licenseContent; diff --git a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/vo/LicenseRespVO.java b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/vo/LicenseRespVO.java index 36be384..b83e9a9 100644 --- a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/vo/LicenseRespVO.java +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/vo/LicenseRespVO.java @@ -66,6 +66,10 @@ public class LicenseRespVO implements VO { @ExcelProperty("激活码") private String activationCode; + @Schema(description = "文件URL") + @ExcelProperty("文件URL") + private String fileUrl; + @Schema(description = "License内容") @ExcelProperty("License内容") private String licenseContent; diff --git a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/vo/LicenseSaveReqVO.java b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/vo/LicenseSaveReqVO.java index 798b0dc..a5c8acb 100644 --- a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/vo/LicenseSaveReqVO.java +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/license/vo/LicenseSaveReqVO.java @@ -42,6 +42,9 @@ public class LicenseSaveReqVO { @Schema(description = "激活码") private String activationCode; + @Schema(description = "文件URL") + private String fileUrl; + @Schema(description = "License内容") private String licenseContent; diff --git a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/dataobject/license/LicenseDO.java b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/dataobject/license/LicenseDO.java index 4d4de93..236b794 100644 --- a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/dataobject/license/LicenseDO.java +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/dataobject/license/LicenseDO.java @@ -71,6 +71,10 @@ public class LicenseDO extends BaseDO { * 激活码 */ private String activationCode; + /** + * 文件URL + */ + private String fileUrl; /** * License内容 */ 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 600d82b..88cfd07 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 @@ -35,6 +35,14 @@ public interface LicenseService { */ void applyLicense(@Valid LicenseSaveReqVO updateReqVO); + /** + * 生成License + * + * @param id license ID + * @return 文件路径 + */ + String generate(Long id); + /** * 删除License * 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 dabeeca..4162595 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 @@ -1,19 +1,35 @@ package org.agt.module.license.service.license; +import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.util.StrUtil; import jakarta.annotation.Resource; import org.agt.framework.common.pojo.PageResult; import org.agt.framework.common.util.object.BeanUtils; +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.LicensePageReqVO; import org.agt.module.license.controller.admin.license.vo.LicenseSaveReqVO; +import org.agt.module.license.dal.dataobject.customer.CustomerDO; import org.agt.module.license.dal.dataobject.license.LicenseDO; +import org.agt.module.license.dal.dataobject.project.ProjectDO; +import org.agt.module.license.dal.mysql.customer.CustomerMapper; import org.agt.module.license.dal.mysql.license.LicenseMapper; +import org.agt.module.license.dal.mysql.project.ProjectMapper; import org.agt.module.license.enums.LicenseStatusEnum; +import org.agt.module.system.api.mail.MailSendApi; +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.validation.annotation.Validated; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import static org.agt.framework.common.exception.util.ServiceExceptionUtil.exception; import static org.agt.module.license.enums.ErrorCodeConstants.LICENSE_NOT_EXISTS; @@ -31,6 +47,21 @@ public class LicenseServiceImpl implements LicenseService { @Resource private LicenseMapper licenseMapper; + @Resource + private CustomerMapper customerMapper; + + @Resource + private ProjectMapper projectMapper; + + @Resource + private FileApi fileApi; + + @Resource + private MailSendApi mailSendApi; + + @Resource + private NotifyMessageSendApi notifySendApi; + @Override public Long createLicense(LicenseSaveReqVO createReqVO) { // 校验项目Sn是否唯一 @@ -64,6 +95,51 @@ public class LicenseServiceImpl implements LicenseService { updateReqVO.setApplicant(WebFrameworkUtils.getLoginUserId()); updateReqVO.setApplicationTime(LocalDateTime.now()); updateLicense(updateReqVO); + // 发送邮件 + // 1. 准备参数 + Long userId = updateReqVO.getApprover(); + String templateCode = "license_apply"; // 邮件模版,记得在【邮箱管理】中配置噢 + Map templateParams = new HashMap<>(); + CustomerDO customerDO = customerMapper.selectById(updateReqVO.getCustomerId()); + ProjectDO projectDO = projectMapper.selectById(updateReqVO.getProjectId()); + templateParams.put("customer", customerDO.getName()); + templateParams.put("project", projectDO.getName()); + templateParams.put("sn", updateReqVO.getSerialNo()); + templateParams.put("url", "http://192.168.9.50/license/generate?id=" + updateReqVO.getId()); + + // 2. 发送邮件 + mailSendApi.sendSingleMailToAdmin(new MailSendSingleToUserReqDTO() + .setUserId(userId).setTemplateCode(templateCode).setTemplateParams(templateParams)); + + // 发送站内信 + notifySendApi.sendSingleMessageToAdmin(new NotifySendSingleToUserReqDTO() + .setUserId(userId).setTemplateCode(templateCode).setTemplateParams(templateParams)); + } + + @Override + public String generate(Long id) { + LicenseDO licenseDO = licenseMapper.selectById(id); + + List neList = licenseDO.getNeList(); + List neLabels = new ArrayList<>(); + for (Integer ne : neList) { + String label = DictFrameworkUtils.parseDictDataLabel("lic_ne_list", 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 = ResourceUtil.readBytes("file/MME_13750602_2024-08-02_system.ini"); + String fileURL = fileApi.createFile(fileContent, fileName); + + licenseDO.setFileUrl(fileURL); + licenseDO.setStatus(LicenseStatusEnum.COMPLETED.getCode()); + licenseMapper.updateById(licenseDO); + return fileURL; } @Override diff --git a/agt-module-license/agt-module-license-server/src/main/resources/file/MME_13750602_2024-08-02_system.ini b/agt-module-license/agt-module-license-server/src/main/resources/file/MME_13750602_2024-08-02_system.ini new file mode 100644 index 0000000..85d7ce8 --- /dev/null +++ b/agt-module-license/agt-module-license-server/src/main/resources/file/MME_13750602_2024-08-02_system.ini @@ -0,0 +1,7 @@ +[pytest] +addopts = --verbose + +# Pytest requires that test files have unique names, because pytest imports +# them as top-level modules. It is silly to prefix or suffix a test file with +# the directory name that contains it. Use __init__.py for all test files. +python_files = __init__.py