feat: license历史

This commit is contained in:
caiyuchao
2025-08-04 15:31:17 +08:00
parent 0cc8554363
commit 1243976a1d
4 changed files with 84 additions and 36 deletions

View File

@@ -52,7 +52,7 @@ public class LicenseController {
@Operation(summary = "创建License") @Operation(summary = "创建License")
@PreAuthorize("@ss.hasPermission('license:license:create')") @PreAuthorize("@ss.hasPermission('license:license:create')")
public CommonResult<Long> createLicense(@Valid @RequestBody LicenseSaveReqVO createReqVO) { public CommonResult<Long> createLicense(@Valid @RequestBody LicenseSaveReqVO createReqVO) {
return success(licenseService.createLicense(createReqVO)); return success(licenseService.createLicense(createReqVO, false));
} }
@PutMapping("/update") @PutMapping("/update")
@@ -105,6 +105,14 @@ public class LicenseController {
return success(license); return success(license);
} }
@GetMapping("/history")
@Operation(summary = "获得License历史列表")
@PreAuthorize("@ss.hasPermission('license:license:query')")
public CommonResult<List<LicenseRespVO>> getLicensePage(@RequestParam("id") Long id) {
List<LicenseRespVO> licenseHistory = licenseService.getLicenseHistory(id);
return success(licenseHistory);
}
@GetMapping("/page") @GetMapping("/page")
@Operation(summary = "获得License分页") @Operation(summary = "获得License分页")
@PreAuthorize("@ss.hasPermission('license:license:query')") @PreAuthorize("@ss.hasPermission('license:license:query')")

View File

@@ -13,6 +13,7 @@ import org.agt.module.license.dal.dataobject.customer.CustomerDO;
import org.agt.module.license.dal.dataobject.project.ProjectDO; import org.agt.module.license.dal.dataobject.project.ProjectDO;
import org.agt.module.system.api.user.AdminUserApi; import org.agt.module.system.api.user.AdminUserApi;
import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
@@ -47,12 +48,7 @@ public class LicenseRespVO implements VO {
@Schema(description = "到期时间") @Schema(description = "到期时间")
@ExcelProperty("到期时间") @ExcelProperty("到期时间")
private LocalDateTime expiryDate; private LocalDate expiryDate;
@Schema(description = "网元开关")
// @ExcelProperty(value = "网元开关", converter = DictConvert.class)
@DictFormat("lic_ne_switch") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
private List<Integer> neList;
@Schema(description = "网元") @Schema(description = "网元")
@ExcelProperty("网元") @ExcelProperty("网元")
@@ -85,10 +81,6 @@ public class LicenseRespVO implements VO {
@ExcelProperty("申请人") @ExcelProperty("申请人")
private String applicantName; private String applicantName;
@Schema(description = "申请时间")
// @ExcelProperty("申请时间")
private LocalDateTime applicationTime;
@Schema(description = "审批人") @Schema(description = "审批人")
@Trans(type = TransType.AUTO_TRANS, key = AdminUserApi.PREFIX, fields = "nickname", ref = "approverName") @Trans(type = TransType.AUTO_TRANS, key = AdminUserApi.PREFIX, fields = "nickname", ref = "approverName")
private Long approver; private Long approver;
@@ -107,8 +99,14 @@ public class LicenseRespVO implements VO {
private String remark; private String remark;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间") // @ExcelProperty("创建时间")
private LocalDateTime createTime; private LocalDateTime createTime;
@Schema(description = "申请时间")
@ExcelProperty("申请时间")
private LocalDateTime applicationTime;
private LicenseRespVO oldLicense; private LicenseRespVO oldLicense;
private boolean hasHistory;
} }

View File

@@ -22,7 +22,7 @@ public interface LicenseService {
* @param createReqVO 创建信息 * @param createReqVO 创建信息
* @return 编号 * @return 编号
*/ */
Long createLicense(@Valid LicenseSaveReqVO createReqVO); Long createLicense(@Valid LicenseSaveReqVO createReqVO, boolean isReapply);
/** /**
* 更新License * 更新License
@@ -85,4 +85,6 @@ public interface LicenseService {
* @return boolean * @return boolean
*/ */
Boolean validateLicenseSnUnique(String sn, Long id); Boolean validateLicenseSnUnique(String sn, Long id);
List<LicenseRespVO> getLicenseHistory(Long id);
} }

View File

@@ -98,8 +98,8 @@ public class LicenseServiceImpl implements LicenseService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long createLicense(LicenseSaveReqVO createReqVO) { public Long createLicense(LicenseSaveReqVO createReqVO, boolean isReapply) {
// 校验项目Sn是否唯一 // 校验项目Sn是否唯一, boolean isReapply
if (!validateLicenseSnUnique(createReqVO.getSerialNo(), createReqVO.getId())) { if (!validateLicenseSnUnique(createReqVO.getSerialNo(), createReqVO.getId())) {
throw exception(LICENSE_SN_DUPLICATE, createReqVO.getSerialNo()); throw exception(LICENSE_SN_DUPLICATE, createReqVO.getSerialNo());
} }
@@ -110,7 +110,19 @@ public class LicenseServiceImpl implements LicenseService {
// 插入 // 插入
LicenseDO license = BeanUtils.toBean(createReqVO, LicenseDO.class); LicenseDO license = BeanUtils.toBean(createReqVO, LicenseDO.class);
license.setStatus(LicenseStatusEnum.NOT_APPLIED.getCode()); license.setStatus(LicenseStatusEnum.NOT_APPLIED.getCode());
licenseMapper.insert(license); if (isReapply) {
licenseMapper.update(Wrappers.<LicenseDO>lambdaUpdate()
.eq(LicenseDO::getId, license.getId())
.set(LicenseDO::getExpiryDate, license.getExpiryDate())
.set(LicenseDO::getUserNumber, license.getUserNumber())
.set(LicenseDO::getRanNumber, license.getRanNumber())
.set(LicenseDO::getRemark, StrUtil.isBlank(license.getRemark()) ? null : license.getRemark())
.set(LicenseDO::getApprover, license.getApprover())
.set(LicenseDO::getFileUrl, null)
);
} else {
licenseMapper.insert(license);
}
List<LicenseDetailVO> neCodeList = createReqVO.getNeCodeList(); List<LicenseDetailVO> neCodeList = createReqVO.getNeCodeList();
@@ -207,10 +219,12 @@ public class LicenseServiceImpl implements LicenseService {
licenseDetailMapper.updateBatch(licenseDetails); licenseDetailMapper.updateBatch(licenseDetails);
// 更新表 // 更新表
updateReqVO.setStatus(LicenseStatusEnum.IN_APPLICATION.getCode()); LicenseDO licenseDO = new LicenseDO();
updateReqVO.setApplicant(WebFrameworkUtils.getLoginUserId()); licenseDO.setId(updateReqVO.getId());
updateReqVO.setApplicationTime(LocalDateTime.now()); licenseDO.setStatus(LicenseStatusEnum.IN_APPLICATION.getCode());
updateLicense(updateReqVO); licenseDO.setApplicant(WebFrameworkUtils.getLoginUserId());
licenseDO.setApplicationTime(LocalDateTime.now());
licenseMapper.updateById(licenseDO);
} }
@Override @Override
@@ -224,23 +238,23 @@ public class LicenseServiceImpl implements LicenseService {
LicenseHistoryDO historyDO = BeanUtils.toBean(licenseDO, LicenseHistoryDO.class); LicenseHistoryDO historyDO = BeanUtils.toBean(licenseDO, LicenseHistoryDO.class);
licenseMapper.deleteById(updateReqVO.getId());
licenseDetailMapper.delete(Wrappers.<LicenseDetailDO>lambdaQuery().eq(LicenseDetailDO::getLicenseId, licenseDO.getId())); licenseDetailMapper.delete(Wrappers.<LicenseDetailDO>lambdaQuery().eq(LicenseDetailDO::getLicenseId, licenseDO.getId()));
updateReqVO.setId(null); for (LicenseDetailVO neCode : updateReqVO.getNeCodeList()) {
Long licenseId = createLicense(updateReqVO); neCode.setFileUrlLegacy(null);
neCode.setFileUrl(null);
neCode.setProviderId(null);
}
Long licenseId = createLicense(updateReqVO, true);
historyDO.setId(null);
historyDO.setLicenseId(licenseId); historyDO.setLicenseId(licenseId);
historyDO.setFileUrl(null);
licenseHistoryMapper.insert(historyDO); licenseHistoryMapper.insert(historyDO);
if (CollUtil.isNotEmpty(licenseDetailDOS)) { if (CollUtil.isNotEmpty(licenseDetailDOS)) {
List<LicenseDetailHistoryDO> detailHistoryDOList = BeanUtils.toBean(licenseDetailDOS, LicenseDetailHistoryDO.class); List<LicenseDetailHistoryDO> detailHistoryDOList = BeanUtils.toBean(licenseDetailDOS, LicenseDetailHistoryDO.class);
detailHistoryDOList.forEach(c -> { detailHistoryDOList.forEach(c -> {
c.setLicenseId(licenseId); c.setId(null);
c.setFileUrlLegacy(null); c.setLicenseId(historyDO.getId());
c.setFileUrl(null);
c.setProviderId(null);
}); });
licenseDetailHistoryMapper.insertBatch(detailHistoryDOList); licenseDetailHistoryMapper.insertBatch(detailHistoryDOList);
} }
@@ -380,7 +394,7 @@ public class LicenseServiceImpl implements LicenseService {
// File tempFile = new File("D:/temp/temp.zip"); // File tempFile = new File("D:/temp/temp.zip");
File tempFile = new File("/usr/local/licGen/temp.zip"); File tempFile = new File("/usr/local/licGen/temp.zip");
ZipUtil.zip(tempFile, pathList.toArray(new String[0]), inputStreamList.toArray(new ByteArrayInputStream[inputStreamList.size()])); 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"); String fileURL = fileApi.createFile(FileUtil.readBytes(tempFile), licenseDO.getSerialNo() + "_" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + ".zip");
FileUtil.del(tempFile); FileUtil.del(tempFile);
licenseDO.setFileUrl(fileURL); licenseDO.setFileUrl(fileURL);
@@ -423,6 +437,15 @@ public class LicenseServiceImpl implements LicenseService {
validateLicenseExists(id); validateLicenseExists(id);
// 删除 // 删除
licenseMapper.deleteById(id); licenseMapper.deleteById(id);
licenseDetailMapper.delete(Wrappers.<LicenseDetailDO>lambdaQuery().eq(LicenseDetailDO::getLicenseId, id));
List<LicenseHistoryDO> licenseHistoryDOS = licenseHistoryMapper.selectList(Wrappers.<LicenseHistoryDO>lambdaQuery().eq(LicenseHistoryDO::getLicenseId, id));
for (LicenseHistoryDO licenseHistoryDO : licenseHistoryDOS) {
licenseDetailHistoryMapper.delete(Wrappers.<LicenseDetailHistoryDO>lambdaQuery().eq(LicenseDetailHistoryDO::getLicenseId, licenseHistoryDO.getId()));
}
licenseHistoryMapper.delete(Wrappers.<LicenseHistoryDO>lambdaQuery().eq(LicenseHistoryDO::getLicenseId, id));
} }
private void validateLicenseExists(Long id) { private void validateLicenseExists(Long id) {
@@ -443,11 +466,12 @@ public class LicenseServiceImpl implements LicenseService {
List<LicenseDetailDO> licenseDetailDOS = licenseDetailMapper.selectList(Wrappers.<LicenseDetailDO>lambdaQuery().eq(LicenseDetailDO::getLicenseId, license.getId())); List<LicenseDetailDO> licenseDetailDOS = licenseDetailMapper.selectList(Wrappers.<LicenseDetailDO>lambdaQuery().eq(LicenseDetailDO::getLicenseId, license.getId()));
List<LicenseDetailVO> details = BeanUtils.toBean(licenseDetailDOS, LicenseDetailVO.class); List<LicenseDetailVO> details = BeanUtils.toBean(licenseDetailDOS, LicenseDetailVO.class);
fillDetail(details, license); fillDetail(details, license);
List<LicenseHistoryDO> historyList = licenseHistoryMapper.selectList(Wrappers.<LicenseHistoryDO>lambdaQuery()
.eq(LicenseHistoryDO::getLicenseId, license.getId())
.orderByDesc(LicenseHistoryDO::getApplicationTime));
Optional<LicenseHistoryDO> histroyOptional = historyList.stream().findFirst();
license.setHasHistory(histroyOptional.isPresent());
if (LicenseStatusEnum.REAPPLYING.getCode().equals(license.getStatus())) { if (LicenseStatusEnum.REAPPLYING.getCode().equals(license.getStatus())) {
List<LicenseHistoryDO> historyList = licenseHistoryMapper.selectList(Wrappers.<LicenseHistoryDO>lambdaQuery()
.eq(LicenseHistoryDO::getLicenseId, license.getId())
.orderByDesc(LicenseHistoryDO::getApplicationTime));
Optional<LicenseHistoryDO> histroyOptional = historyList.stream().findFirst();
if (histroyOptional.isPresent()) { if (histroyOptional.isPresent()) {
LicenseHistoryDO historyDO = histroyOptional.get(); LicenseHistoryDO historyDO = histroyOptional.get();
LicenseRespVO oldLicense = BeanUtils.toBean(historyDO, LicenseRespVO.class); LicenseRespVO oldLicense = BeanUtils.toBean(historyDO, LicenseRespVO.class);
@@ -473,7 +497,7 @@ public class LicenseServiceImpl implements LicenseService {
if (i < oldDetails.size()) { if (i < oldDetails.size()) {
activationCodeMap.put("old", oldDetails.get(i).getActivationCode()); activationCodeMap.put("old", oldDetails.get(i).getActivationCode());
neListMap.put("old", oldDetails.get(i).getNeList()); neListMap.put("old", oldDetails.get(i).getNeList());
fileUrlListMap.put("old", oldDetails.get(i).getFileUrlList()); fileUrlListMap.put("old", null);
mergeDetail.setFileUrl(oldDetails.get(i).getFileUrl()); mergeDetail.setFileUrl(oldDetails.get(i).getFileUrl());
mergeDetail.setNeList(oldDetails.get(i).getNeList()); mergeDetail.setNeList(oldDetails.get(i).getNeList());
mergeDetail.setActivationCode(oldDetails.get(i).getActivationCode()); mergeDetail.setActivationCode(oldDetails.get(i).getActivationCode());
@@ -488,7 +512,7 @@ public class LicenseServiceImpl implements LicenseService {
neListMap.put("new", details.get(i).getNeList()); neListMap.put("new", details.get(i).getNeList());
} }
if (!(i < oldDetails.size() && Objects.equals(oldDetails.get(i).getFileUrlList(), details.get(i).getFileUrlList()))) { if (!(i < oldDetails.size() && Objects.equals(oldDetails.get(i).getFileUrlList(), details.get(i).getFileUrlList()))) {
fileUrlListMap.put("new", details.get(i).getFileUrlList()); fileUrlListMap.put("new", null);
} }
} }
mergeDetail.setActivationCodeMap(activationCodeMap); mergeDetail.setActivationCodeMap(activationCodeMap);
@@ -557,5 +581,21 @@ public class LicenseServiceImpl implements LicenseService {
return true; return true;
} }
@Override
public List<LicenseRespVO> getLicenseHistory(Long id) {
List<LicenseHistoryDO> historyDOList = licenseHistoryMapper.selectList(Wrappers.<LicenseHistoryDO>lambdaQuery()
.eq(LicenseHistoryDO::getLicenseId, id).orderByDesc(LicenseHistoryDO::getApplicationTime));
List<LicenseRespVO> voList = BeanUtils.toBean(historyDOList, LicenseRespVO.class);
for (LicenseRespVO licenseRespVO : voList) {
fillLicenseHistoryRespVO(licenseRespVO);
}
return voList;
}
private void fillLicenseHistoryRespVO(LicenseRespVO license) {
List<LicenseDetailHistoryDO> licenseDetailDOS = licenseDetailHistoryMapper.selectList(Wrappers.<LicenseDetailHistoryDO>lambdaQuery().eq(LicenseDetailHistoryDO::getLicenseId, license.getId()));
List<LicenseDetailVO> details = BeanUtils.toBean(licenseDetailDOS, LicenseDetailVO.class);
fillDetail(details, license);
}
} }