From 19ebf11ae9e8413082a00b0b0fcd9a12db535a5c Mon Sep 17 00:00:00 2001 From: caiyuchao Date: Mon, 28 Jul 2025 16:02:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=94=9F=E6=88=90lic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../license/enums/LicenseStatusEnum.java | 3 +- .../module/license/AgtLicenseApplication.java | 2 + .../admin/license/LicenseController.java | 2 +- .../dataobject/license/LicenseDetailDO.java | 63 ++++++ .../mysql/license/LicenseDetailMapper.java | 16 ++ .../service/license/LicenseService.java | 5 +- .../service/license/LicenseServiceImpl.java | 208 +++++++++++++----- .../license/service/license/LicenseTask.java | 22 ++ 8 files changed, 263 insertions(+), 58 deletions(-) create mode 100644 agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/dataobject/license/LicenseDetailDO.java create mode 100644 agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/mysql/license/LicenseDetailMapper.java create mode 100644 agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/license/LicenseTask.java diff --git a/agt-module-license/agt-module-license-api/src/main/java/org/agt/module/license/enums/LicenseStatusEnum.java b/agt-module-license/agt-module-license-api/src/main/java/org/agt/module/license/enums/LicenseStatusEnum.java index 5f9f6aa..a0b8c28 100644 --- a/agt-module-license/agt-module-license-api/src/main/java/org/agt/module/license/enums/LicenseStatusEnum.java +++ b/agt-module-license/agt-module-license-api/src/main/java/org/agt/module/license/enums/LicenseStatusEnum.java @@ -12,7 +12,8 @@ public enum LicenseStatusEnum { NOT_APPLIED(0, "未申请"), IN_APPLICATION(1, "申请中"), - COMPLETED(2, "已完成"); // CRM 系统专用 + GENERATING(2, "生成中"), + COMPLETED(3, "已完成"); // CRM 系统专用 ; /** diff --git a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/AgtLicenseApplication.java b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/AgtLicenseApplication.java index f6786ba..b205d78 100644 --- a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/AgtLicenseApplication.java +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/AgtLicenseApplication.java @@ -2,6 +2,7 @@ package org.agt.module.license; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; /** * @description: 项目的启动类 @@ -9,6 +10,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; * @since: 2025-05-21 */ @SpringBootApplication +@EnableScheduling public class AgtLicenseApplication { public static void main(String[] args) { 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 78d7300..bac22b7 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 @@ -62,7 +62,7 @@ public class LicenseController { @Operation(summary = "申请License") @PreAuthorize("@ss.hasPermission('license:license:apply')") public CommonResult applyLicense(@Valid @RequestBody LicenseSaveReqVO updateReqVO) { - licenseService.applyLicense(updateReqVO); + licenseService.applyLicense(updateReqVO, null); return success(true); } 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 new file mode 100644 index 0000000..fde120c --- /dev/null +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/dataobject/license/LicenseDetailDO.java @@ -0,0 +1,63 @@ +package org.agt.module.license.dal.dataobject.license; + +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.ToString; +import org.agt.framework.mybatis.core.dataobject.BaseDO; + +import java.util.List; + +/** + * LicenseDetail DO + * + * @author 管理员 + */ +@TableName(value = "crm_license_detail", autoResultMap = true) +@KeySequence("crm_license_detail_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LicenseDetailDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + /** + * 客户ID + */ + private Long licenseId; + + /** + * 网元开关 + * + * 枚举 {@link TODO lic_ne_switch 对应的类} + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List neList; + /** + * 激活码 + */ + private String activationCode; + /** + * 文件URL + */ + private String fileUrl; + /** + * 提供者ID + */ + private Long providerId; + +} \ No newline at end of file diff --git a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/mysql/license/LicenseDetailMapper.java b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/mysql/license/LicenseDetailMapper.java new file mode 100644 index 0000000..d384c70 --- /dev/null +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/mysql/license/LicenseDetailMapper.java @@ -0,0 +1,16 @@ +package org.agt.module.license.dal.mysql.license; + + +import org.agt.framework.mybatis.core.mapper.BaseMapperX; +import org.agt.module.license.dal.dataobject.license.LicenseDetailDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * CRM-License Mapper + * + * @author super + */ +@Mapper +public interface LicenseDetailMapper extends BaseMapperX { + +} \ 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/LicenseService.java b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/license/LicenseService.java index 88cfd07..7350a8e 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 @@ -5,6 +5,9 @@ import org.agt.framework.common.pojo.PageResult; 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.license.LicenseDO; +import org.agt.module.license.dal.dataobject.license.LicenseDetailDO; + +import java.util.List; /** * License Service 接口 @@ -33,7 +36,7 @@ public interface LicenseService { * * @param updateReqVO 更新信息 */ - void applyLicense(@Valid LicenseSaveReqVO updateReqVO); + void applyLicense(@Valid LicenseSaveReqVO updateReqVO, List licenseDetails); /** * 生成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 6b9eff3..9fb8a92 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 com.baomidou.mybatisplus.core.toolkit.Wrappers; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.agt.framework.common.pojo.PageResult; @@ -15,9 +16,11 @@ 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.license.LicenseDetailDO; import org.agt.module.license.dal.dataobject.license.LicenseProviderDO; 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.LicenseDetailMapper; import org.agt.module.license.dal.mysql.license.LicenseMapper; import org.agt.module.license.dal.mysql.license.LicenseProviderMapper; import org.agt.module.license.dal.mysql.project.ProjectMapper; @@ -71,6 +74,9 @@ public class LicenseServiceImpl implements LicenseService { @Resource private NotifyMessageSendApi notifySendApi; + @Resource + private LicenseDetailMapper licenseDetailMapper; + @Override public Long createLicense(LicenseSaveReqVO createReqVO) { // 校验项目Sn是否唯一 @@ -82,8 +88,16 @@ public class LicenseServiceImpl implements LicenseService { license.setStatus(LicenseStatusEnum.NOT_APPLIED.getCode()); licenseMapper.insert(license); + List neCodeList = createReqVO.getNeCodeList(); + + List licenseDetails = BeanUtils.toBean(neCodeList, LicenseDetailDO.class); + for (LicenseDetailDO licenseDetail : licenseDetails) { + licenseDetail.setLicenseId(license.getId()); + } + licenseDetailMapper.insertBatch(licenseDetails); + createReqVO.setId(license.getId()); - applyLicense(createReqVO); + applyLicense(createReqVO, licenseDetails); // 返回 return license.getId(); } @@ -102,7 +116,7 @@ public class LicenseServiceImpl implements LicenseService { } @Override - public void applyLicense(LicenseSaveReqVO updateReqVO) { + public void applyLicense(LicenseSaveReqVO updateReqVO, List licenseDetails) { // 发送邮件 // 1. 准备参数 Long userId = updateReqVO.getApprover(); @@ -123,9 +137,9 @@ public class LicenseServiceImpl implements LicenseService { notifySendApi.sendSingleMessageToAdmin(new NotifySendSingleToUserReqDTO() .setUserId(userId).setTemplateCode(templateCode).setTemplateParams(templateParams)); - List neCodeList = updateReqVO.getNeCodeList(); +// List neCodeList = updateReqVO.getNeCodeList(); - for (LicenseNeCodeVO neCodeVO : neCodeList) { + for (LicenseDetailDO neCodeVO : licenseDetails) { // 添加数据到License提供者表 LicenseProviderDO licenseProviderDO = new LicenseProviderDO(); licenseProviderDO.setCustomerId(updateReqVO.getCustomerId()); @@ -162,12 +176,13 @@ public class LicenseServiceImpl implements LicenseService { neCodeVO.setProviderId(licenseProviderDO.getId()); } + licenseDetailMapper.updateBatch(licenseDetails); // 更新表 updateReqVO.setStatus(LicenseStatusEnum.IN_APPLICATION.getCode()); updateReqVO.setApplicant(WebFrameworkUtils.getLoginUserId()); updateReqVO.setApplicationTime(LocalDateTime.now()); - updateReqVO.setNeCodeList(neCodeList); +// updateReqVO.setNeCodeList(neCodeList); updateLicense(updateReqVO); } @@ -175,74 +190,147 @@ public class LicenseServiceImpl implements LicenseService { public String generate(Long id) { LicenseDO licenseDO = licenseMapper.selectById(id); - List neCodeList = licenseDO.getNeCodeList(); - for (LicenseNeCodeVO neCodeVO : neCodeList) { +// 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()); licenseProviderDO.setState(2); licenseProviderMapper.updateById(licenseProviderDO); } - try { - System.out.println("线程开始睡眠..."); - Thread.sleep(8000); // 暂停2000毫秒,即2秒 - System.out.println("线程醒来!"); - } catch (InterruptedException e) { - log.error("睡眠失败"); - } +// 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 ""; + } - for (LicenseNeCodeVO neCodeVO : neCodeList) { - LicenseProviderDO licenseProviderDO = licenseProviderMapper.selectById(neCodeVO.getProviderId()); - if (licenseProviderDO.getState() != 3) { -// continue; - } - String newFilePath1 = licenseProviderDO.getNewFilePath1(); + public void genLicenseTask() { + List licenses = licenseMapper.selectList(Wrappers.lambdaQuery().eq(LicenseDO::getStatus, LicenseStatusEnum.GENERATING.getCode())); + for (LicenseDO licenseDO : licenses) { + List licenseDetails = licenseDetailMapper.selectList(Wrappers.lambdaQuery().eq(LicenseDetailDO::getLicenseId, licenseDO.getId())); - 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()); + for (LicenseDetailDO detail : licenseDetails) { + if (StrUtil.isNotBlank(detail.getFileUrl())) { + continue; + } + LicenseProviderDO licenseProviderDO = licenseProviderMapper.selectById(detail.getProviderId()); + if (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_4g", ne.toString()); + label = DictFrameworkUtils.parseDictDataLabel("lic_ne_5g", ne.toString()); if (StrUtil.isBlank(label)) { - label = DictFrameworkUtils.parseDictDataLabel("lic_ne_23g", ne.toString()); + label = DictFrameworkUtils.parseDictDataLabel("lic_ne_4g", ne.toString()); if (StrUtil.isBlank(label)) { - label = DictFrameworkUtils.parseDictDataLabel("lic_ne_add", ne.toString()); + label = DictFrameworkUtils.parseDictDataLabel("lic_ne_23g", ne.toString()); + if (StrUtil.isBlank(label)) { + label = DictFrameworkUtils.parseDictDataLabel("lic_ne_add", ne.toString()); + } } } } + neLabels.add(label); } - 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 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"); + // 上传到文件服务 + 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); + + detail.setFileUrl(fileURL); + licenseDetailMapper.updateById(detail); } - String fileURL = fileApi.createFile(fileContent, fileName); + boolean isCompleted = licenseDetails.stream().allMatch(c -> StrUtil.isNotBlank(c.getFileUrl())); + + if (isCompleted) { + licenseDO.setStatus(LicenseStatusEnum.COMPLETED.getCode()); + licenseMapper.updateById(licenseDO); + } - neCodeVO.setFileUrl(fileURL); } - licenseDO.setNeCodeList(neCodeList); - licenseDO.setStatus(LicenseStatusEnum.COMPLETED.getCode()); - licenseMapper.updateById(licenseDO); - return ""; } @Override @@ -261,12 +349,22 @@ public class LicenseServiceImpl implements LicenseService { @Override public LicenseDO getLicense(Long id) { - return licenseMapper.selectById(id); + LicenseDO licenseDO = licenseMapper.selectById(id); + List licenseDetailDOS = licenseDetailMapper.selectList(Wrappers.lambdaQuery().eq(LicenseDetailDO::getLicenseId, licenseDO.getId())); + List details = BeanUtils.toBean(licenseDetailDOS, LicenseNeCodeVO.class); + licenseDO.setNeCodeList(details); + return licenseDO; } @Override public PageResult getLicensePage(LicensePageReqVO pageReqVO) { - return licenseMapper.selectPage(pageReqVO); + PageResult pageResult = licenseMapper.selectPage(pageReqVO); + for (LicenseDO licenseDO : pageResult.getList()) { + List licenseDetailDOS = licenseDetailMapper.selectList(Wrappers.lambdaQuery().eq(LicenseDetailDO::getLicenseId, licenseDO.getId())); + List details = BeanUtils.toBean(licenseDetailDOS, LicenseNeCodeVO.class); + licenseDO.setNeCodeList(details); + } + return pageResult; } @Override 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 new file mode 100644 index 0000000..a00abab --- /dev/null +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/license/LicenseTask.java @@ -0,0 +1,22 @@ +package org.agt.module.license.service.license; + +import jakarta.annotation.Resource; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * @description: License 定时任务 + * @author: cyc + * @since: 2025-07-28 + */ +@Component +public class LicenseTask { + + @Resource + private LicenseServiceImpl licenseService; + + @Scheduled(cron ="*/5 * * * * ?") + public void task() { + licenseService.genLicenseTask(); + } +}