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")
@PreAuthorize("@ss.hasPermission('license:license:create')")
public CommonResult<Long> createLicense(@Valid @RequestBody LicenseSaveReqVO createReqVO) {
return success(licenseService.createLicense(createReqVO));
return success(licenseService.createLicense(createReqVO, false));
}
@PutMapping("/update")
@@ -105,6 +105,14 @@ public class LicenseController {
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")
@Operation(summary = "获得License分页")
@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.system.api.user.AdminUserApi;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@@ -47,12 +48,7 @@ public class LicenseRespVO implements VO {
@Schema(description = "到期时间")
@ExcelProperty("到期时间")
private LocalDateTime expiryDate;
@Schema(description = "网元开关")
// @ExcelProperty(value = "网元开关", converter = DictConvert.class)
@DictFormat("lic_ne_switch") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
private List<Integer> neList;
private LocalDate expiryDate;
@Schema(description = "网元")
@ExcelProperty("网元")
@@ -85,10 +81,6 @@ public class LicenseRespVO implements VO {
@ExcelProperty("申请人")
private String applicantName;
@Schema(description = "申请时间")
// @ExcelProperty("申请时间")
private LocalDateTime applicationTime;
@Schema(description = "审批人")
@Trans(type = TransType.AUTO_TRANS, key = AdminUserApi.PREFIX, fields = "nickname", ref = "approverName")
private Long approver;
@@ -107,8 +99,14 @@ public class LicenseRespVO implements VO {
private String remark;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
// @ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "申请时间")
@ExcelProperty("申请时间")
private LocalDateTime applicationTime;
private LicenseRespVO oldLicense;
private boolean hasHistory;
}

View File

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

View File

@@ -98,8 +98,8 @@ public class LicenseServiceImpl implements LicenseService {
@Override
@Transactional(rollbackFor = Exception.class)
public Long createLicense(LicenseSaveReqVO createReqVO) {
// 校验项目Sn是否唯一
public Long createLicense(LicenseSaveReqVO createReqVO, boolean isReapply) {
// 校验项目Sn是否唯一, boolean isReapply
if (!validateLicenseSnUnique(createReqVO.getSerialNo(), createReqVO.getId())) {
throw exception(LICENSE_SN_DUPLICATE, createReqVO.getSerialNo());
}
@@ -110,7 +110,19 @@ public class LicenseServiceImpl implements LicenseService {
// 插入
LicenseDO license = BeanUtils.toBean(createReqVO, LicenseDO.class);
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();
@@ -207,10 +219,12 @@ public class LicenseServiceImpl implements LicenseService {
licenseDetailMapper.updateBatch(licenseDetails);
// 更新表
updateReqVO.setStatus(LicenseStatusEnum.IN_APPLICATION.getCode());
updateReqVO.setApplicant(WebFrameworkUtils.getLoginUserId());
updateReqVO.setApplicationTime(LocalDateTime.now());
updateLicense(updateReqVO);
LicenseDO licenseDO = new LicenseDO();
licenseDO.setId(updateReqVO.getId());
licenseDO.setStatus(LicenseStatusEnum.IN_APPLICATION.getCode());
licenseDO.setApplicant(WebFrameworkUtils.getLoginUserId());
licenseDO.setApplicationTime(LocalDateTime.now());
licenseMapper.updateById(licenseDO);
}
@Override
@@ -224,23 +238,23 @@ public class LicenseServiceImpl implements LicenseService {
LicenseHistoryDO historyDO = BeanUtils.toBean(licenseDO, LicenseHistoryDO.class);
licenseMapper.deleteById(updateReqVO.getId());
licenseDetailMapper.delete(Wrappers.<LicenseDetailDO>lambdaQuery().eq(LicenseDetailDO::getLicenseId, licenseDO.getId()));
updateReqVO.setId(null);
Long licenseId = createLicense(updateReqVO);
for (LicenseDetailVO neCode : updateReqVO.getNeCodeList()) {
neCode.setFileUrlLegacy(null);
neCode.setFileUrl(null);
neCode.setProviderId(null);
}
Long licenseId = createLicense(updateReqVO, true);
historyDO.setId(null);
historyDO.setLicenseId(licenseId);
historyDO.setFileUrl(null);
licenseHistoryMapper.insert(historyDO);
if (CollUtil.isNotEmpty(licenseDetailDOS)) {
List<LicenseDetailHistoryDO> detailHistoryDOList = BeanUtils.toBean(licenseDetailDOS, LicenseDetailHistoryDO.class);
detailHistoryDOList.forEach(c -> {
c.setLicenseId(licenseId);
c.setFileUrlLegacy(null);
c.setFileUrl(null);
c.setProviderId(null);
c.setId(null);
c.setLicenseId(historyDO.getId());
});
licenseDetailHistoryMapper.insertBatch(detailHistoryDOList);
}
@@ -380,7 +394,7 @@ public class LicenseServiceImpl implements LicenseService {
// File tempFile = new File("D:/temp/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()]));
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);
licenseDO.setFileUrl(fileURL);
@@ -423,6 +437,15 @@ public class LicenseServiceImpl implements LicenseService {
validateLicenseExists(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) {
@@ -443,11 +466,12 @@ public class LicenseServiceImpl implements LicenseService {
List<LicenseDetailDO> licenseDetailDOS = licenseDetailMapper.selectList(Wrappers.<LicenseDetailDO>lambdaQuery().eq(LicenseDetailDO::getLicenseId, license.getId()));
List<LicenseDetailVO> details = BeanUtils.toBean(licenseDetailDOS, LicenseDetailVO.class);
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())) {
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()) {
LicenseHistoryDO historyDO = histroyOptional.get();
LicenseRespVO oldLicense = BeanUtils.toBean(historyDO, LicenseRespVO.class);
@@ -473,7 +497,7 @@ public class LicenseServiceImpl implements LicenseService {
if (i < oldDetails.size()) {
activationCodeMap.put("old", oldDetails.get(i).getActivationCode());
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.setNeList(oldDetails.get(i).getNeList());
mergeDetail.setActivationCode(oldDetails.get(i).getActivationCode());
@@ -488,7 +512,7 @@ public class LicenseServiceImpl implements LicenseService {
neListMap.put("new", details.get(i).getNeList());
}
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);
@@ -557,5 +581,21 @@ public class LicenseServiceImpl implements LicenseService {
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);
}
}