feat(制品库功能完善): 产品库不提供直接上传产品操作,文档需要从知识库中选取

产品库上传文档时增加校验规则:
1. 上传文档时需要增加属性:制品标识(为文档id)
2. 校验文档是否存在
3. 校验产品库中是否已存在该文档
This commit is contained in:
OTTO 2024-08-26 15:23:16 +08:00
parent cc39a7637f
commit 248102b5a4
11 changed files with 85 additions and 40 deletions

View File

@ -84,7 +84,7 @@ public class PmsDocumentServiceImpl implements IPmsDocumentService
public PmsDocumentDetailVo selectPmsDocumentDetailVoByIdAndEnterpriseId(Long id, Long enterpriseId) {
PmsDocument pmsDocument = this.selectPmsDocumentByIdAndEnterpriseId(id, enterpriseId);
if (pmsDocument == null) {
throw new ServiceException("The entered parameter is incorrect");
throw new ServiceException("组织知识库下不存在该文档(文档标识[%s])", id);
}
PmsDocumentDetailVo pmsDocumentDetailVo = new PmsDocumentDetailVo();
BeanUtils.copyProperties(pmsDocument, pmsDocumentDetailVo);

View File

@ -127,7 +127,7 @@ public class PmsProductLibraryController extends BaseController {
componentRawInputVo.setRepoName(name);
componentRawInputVo.setEnterpriseIdentifier(enterpriseIdentifier);
componentRawInputVo.setFormat(ProductLibraryRepositoriesFormatEnum.PRODUCT.getKey());
return toAjax(pmsProductLibraryComponentService.insertRawComponent(componentRawInputVo));
return toAjax(pmsProductLibraryService.uploadProductAsset(componentRawInputVo));
}
/**

View File

@ -24,6 +24,6 @@ public class AssetRawInputVo {
private String fileIdentifier;
@ApiModelProperty(value = "文件流", hidden = true)
private SysFileBytes fileBytes;
@ApiModelProperty(value = "制品标识", hidden = true)
@ApiModelProperty(value = "制品标识")
private String assetIdentifier;
}

View File

@ -86,7 +86,6 @@ public class ComponentRawInputVo {
throw new ServiceException("用户提供的制品额外属性格式错误请确保为JSON格式");
}
}
pmsProductLibraryComponent.setPmsEnterpriseIdentifier(enterpriseIdentifier);
return pmsProductLibraryComponent;
}

View File

@ -1,7 +1,6 @@
package com.microservices.pms.productLibrary.service;
import com.microservices.pms.productLibrary.domain.PmsProductLibraryComponent;
import com.microservices.pms.productLibrary.domain.PmsProductLibraryRepositories;
import com.microservices.pms.productLibrary.domain.vo.*;
import java.util.List;
@ -121,8 +120,6 @@ public interface IPmsProductLibraryComponentService {
*/
List<PmsProductLibraryComponent> selectPmsProductLibraryComponentListByDatabase(Long repoId);
PmsProductLibraryRepositories getPmsProductLibraryRepositories(Boolean isProduct, String enterpriseIdentifier, String repositoryName, String snapshotName);
/**
* 批量锁定制品防止重复移入
*

View File

@ -131,4 +131,6 @@ public interface IPmsProductLibraryRepositoriesService {
List<Long> getLockStatusRepositoryList(String enterpriseIdentifier, String repoIds);
PmsProductLibraryRepositories selectPmsProductLibraryRepositoriesById(Long repoId);
PmsProductLibraryRepositories getPmsProductLibraryRepositories(Boolean isProduct, String enterpriseIdentifier, String repositoryName, String snapshotName);
}

View File

@ -91,4 +91,12 @@ public interface IPmsProductLibraryService {
* @return 产品库打包对象
*/
ProductPackagedResultVo getPackagedProduct(String enterpriseIdentifier, String productRepoName);
/**
* 上传产品库制品
*
* @param componentRawInputVo 产品库制品输入对象
* @return 结果
*/
Boolean uploadProductAsset(ComponentRawInputVo componentRawInputVo);
}

View File

@ -75,24 +75,6 @@ public class PmsProductLibraryComponentServiceImpl implements IPmsProductLibrary
return pmsProductLibraryComponentMapper.selectPmsProductLibraryComponentById(id);
}
@Override
public PmsProductLibraryRepositories getPmsProductLibraryRepositories(Boolean isProduct, String enterpriseIdentifier, String repoName, String snapshotName) {
PmsProductLibraryRepositories pmsProductLibraryRepositories;
if (isProduct) {
pmsProductLibraryRepositories =
pmsProductLibraryProductRepoService.selectPmsProductLibraryByName(enterpriseIdentifier, repoName);
} else {
if (StringUtils.isNotEmpty(snapshotName)) {
pmsProductLibraryRepositories =
pmsProductLibrarySnapshotRepoService.selectPmsProductLibrarySnapshotByName(enterpriseIdentifier, repoName, snapshotName);
} else {
pmsProductLibraryRepositories =
pmsProductLibraryRepositoriesService.selectPmsProductLibraryRepositoriesByName(enterpriseIdentifier, repoName);
}
}
return pmsProductLibraryRepositories;
}
/**
* 查询制品库-制品列表
*
@ -104,7 +86,7 @@ public class PmsProductLibraryComponentServiceImpl implements IPmsProductLibrary
@Override
public NexusComponentResultVo<List<NexusResultDataVo>> selectPmsProductLibraryComponentListByNexus(String enterpriseIdentifier, ComponentSearchVo componentSearchVo, boolean isProduct) {
PmsProductLibraryRepositories pmsProductLibraryRepositories =
getPmsProductLibraryRepositories(isProduct, enterpriseIdentifier, componentSearchVo.getRepositoryName(), componentSearchVo.getSnapshotRepoName());
pmsProductLibraryRepositoriesService.getPmsProductLibraryRepositories(isProduct, enterpriseIdentifier, componentSearchVo.getRepositoryName(), componentSearchVo.getSnapshotRepoName());
componentSearchVo.setRepositoryName(pmsProductLibraryRepositories.getNexusRepositoriesName());
NexusComponentSearchVo<ComponentSearchVo> nexusComponentSearchVo = NexusComponentSearchVo.toRead(componentSearchVo, nexusRequestHelper.getNexusTid());
@ -126,7 +108,7 @@ public class PmsProductLibraryComponentServiceImpl implements IPmsProductLibrary
@Override
public NexusComponentResultVo<NexusAssetResultDataVo> getAssetDetailByAssetId(String enterpriseIdentifier, String repoName, String snapshotName, String assetId, boolean isProduct) {
PmsProductLibraryRepositories pmsProductLibraryRepositories = getPmsProductLibraryRepositories(isProduct, enterpriseIdentifier, repoName, snapshotName);
PmsProductLibraryRepositories pmsProductLibraryRepositories = pmsProductLibraryRepositoriesService.getPmsProductLibraryRepositories(isProduct, enterpriseIdentifier, repoName, snapshotName);
NexusComponentSearchVo<String> nexusComponentSearchVo =
NexusComponentSearchVo.toReadAsset(pmsProductLibraryRepositories.getNexusRepositoriesName(), assetId, nexusRequestHelper.getNexusTid());
NexusComponentResultVo<NexusAssetResultDataVo> assetResultDataVo =
@ -179,7 +161,7 @@ public class PmsProductLibraryComponentServiceImpl implements IPmsProductLibrary
@Override
public NexusComponentResultVo<NexusComponentResultDataVo> getComponentDetailByComponentId(String enterpriseIdentifier, String repoName, String snapshotName, String componentId, boolean isProduct) {
PmsProductLibraryRepositories pmsProductLibraryRepositories = getPmsProductLibraryRepositories(isProduct, enterpriseIdentifier, repoName, snapshotName);
PmsProductLibraryRepositories pmsProductLibraryRepositories = pmsProductLibraryRepositoriesService.getPmsProductLibraryRepositories(isProduct, enterpriseIdentifier, repoName, snapshotName);
NexusComponentSearchVo<String> nexusComponentSearchVo =
NexusComponentSearchVo.toReadComponent(pmsProductLibraryRepositories.getNexusRepositoriesName(), componentId, nexusRequestHelper.getNexusTid());
NexusComponentResultVo<NexusComponentResultDataVo> componentResultVo =
@ -216,7 +198,7 @@ public class PmsProductLibraryComponentServiceImpl implements IPmsProductLibrary
@Override
public NexusComponentResultVo<Boolean> getCanDeleteFolderByNode(String enterpriseIdentifier, ComponentSearchVo componentSearchVo, boolean isProduct) {
PmsProductLibraryRepositories pmsProductLibraryRepositories = getPmsProductLibraryRepositories(isProduct, enterpriseIdentifier, componentSearchVo.getRepositoryName(), componentSearchVo.getSnapshotRepoName());
PmsProductLibraryRepositories pmsProductLibraryRepositories = pmsProductLibraryRepositoriesService.getPmsProductLibraryRepositories(isProduct, enterpriseIdentifier, componentSearchVo.getRepositoryName(), componentSearchVo.getSnapshotRepoName());
NexusComponentSearchVo<String> nexusComponentSearchVo =
NexusComponentSearchVo.toCanDeleteFolder(pmsProductLibraryRepositories.getNexusRepositoriesName(), componentSearchVo.getNode(), nexusRequestHelper.getNexusTid());
return nexusRequestHelper.doRequestToJavaObject(
@ -229,7 +211,7 @@ public class PmsProductLibraryComponentServiceImpl implements IPmsProductLibrary
@Override
public NexusComponentResultVo<Boolean> getCanDeleteComponentByComponentId(String enterpriseIdentifier, String repoName, String snapshotName, String componentId, boolean isProduct) {
PmsProductLibraryRepositories pmsProductLibraryRepositories = getPmsProductLibraryRepositories(isProduct, enterpriseIdentifier, repoName, snapshotName);
PmsProductLibraryRepositories pmsProductLibraryRepositories = pmsProductLibraryRepositoriesService.getPmsProductLibraryRepositories(isProduct, enterpriseIdentifier, repoName, snapshotName);
NexusComponentSearchVo<String> nexusComponentSearchVo =
NexusComponentSearchVo.toCanDeleteComponent(pmsProductLibraryRepositories.getNexusRepositoriesName(), componentId, nexusRequestHelper.getNexusTid());
return nexusRequestHelper.doRequestToJavaObject(
@ -242,7 +224,7 @@ public class PmsProductLibraryComponentServiceImpl implements IPmsProductLibrary
@Override
public NexusComponentResultVo<Boolean> getCanDeleteAssetByAssetId(String enterpriseIdentifier, String repoName, String snapshotName, String assetId, boolean isProduct) {
PmsProductLibraryRepositories pmsProductLibraryRepositories = getPmsProductLibraryRepositories(isProduct, enterpriseIdentifier, repoName, snapshotName);
PmsProductLibraryRepositories pmsProductLibraryRepositories = pmsProductLibraryRepositoriesService.getPmsProductLibraryRepositories(isProduct, enterpriseIdentifier, repoName, snapshotName);
NexusComponentSearchVo<String> nexusComponentSearchVo =
NexusComponentSearchVo.toCanDeleteAsset(pmsProductLibraryRepositories.getNexusRepositoriesName(), assetId, nexusRequestHelper.getNexusTid());
return nexusRequestHelper.doRequestToJavaObject(
@ -255,7 +237,7 @@ public class PmsProductLibraryComponentServiceImpl implements IPmsProductLibrary
@Override
public NexusComponentResultVo<List<String>> deleteAssetByAssetId(String enterpriseIdentifier, String repoName, String snapshotName, String assetId, boolean isProduct) {
PmsProductLibraryRepositories pmsProductLibraryRepositories = getPmsProductLibraryRepositories(isProduct, enterpriseIdentifier, repoName, snapshotName);
PmsProductLibraryRepositories pmsProductLibraryRepositories = pmsProductLibraryRepositoriesService.getPmsProductLibraryRepositories(isProduct, enterpriseIdentifier, repoName, snapshotName);
pmsProductLibraryRepositoriesService.checkLockRepositoryStatus(enterpriseIdentifier, pmsProductLibraryRepositories.getId());
NexusComponentSearchVo<String> nexusComponentSearchVo =
NexusComponentSearchVo.toDeleteAsset(pmsProductLibraryRepositories.getNexusRepositoriesName(), assetId, nexusRequestHelper.getNexusTid());
@ -272,7 +254,7 @@ public class PmsProductLibraryComponentServiceImpl implements IPmsProductLibrary
@Override
public NexusComponentResultVo<List<String>> deleteComponentByComponentId(String enterpriseIdentifier, String repoName, String snapshotName, String componentId, boolean isProduct) {
PmsProductLibraryRepositories pmsProductLibraryRepositories = getPmsProductLibraryRepositories(isProduct, enterpriseIdentifier, repoName, snapshotName);
PmsProductLibraryRepositories pmsProductLibraryRepositories = pmsProductLibraryRepositoriesService.getPmsProductLibraryRepositories(isProduct, enterpriseIdentifier, repoName, snapshotName);
pmsProductLibraryRepositoriesService.checkLockRepositoryStatus(enterpriseIdentifier, pmsProductLibraryRepositories.getId());
NexusComponentSearchVo<String> nexusComponentSearchVo =
NexusComponentSearchVo.toDeleteComponent(pmsProductLibraryRepositories.getNexusRepositoriesName(), componentId, nexusRequestHelper.getNexusTid());
@ -289,7 +271,7 @@ public class PmsProductLibraryComponentServiceImpl implements IPmsProductLibrary
@Override
public NexusComponentResultVo<Object> deleteFolderByNode(String enterpriseIdentifier, ComponentSearchVo componentSearchVo, boolean isProduct) {
PmsProductLibraryRepositories pmsProductLibraryRepositories = getPmsProductLibraryRepositories(isProduct, enterpriseIdentifier, componentSearchVo.getRepositoryName(), componentSearchVo.getSnapshotRepoName());
PmsProductLibraryRepositories pmsProductLibraryRepositories = pmsProductLibraryRepositoriesService.getPmsProductLibraryRepositories(isProduct, enterpriseIdentifier, componentSearchVo.getRepositoryName(), componentSearchVo.getSnapshotRepoName());
pmsProductLibraryRepositoriesService.checkLockRepositoryStatus(enterpriseIdentifier, pmsProductLibraryRepositories.getId());
NexusComponentSearchVo<String> nexusComponentSearchVo =
NexusComponentSearchVo.toDeleteFolder(pmsProductLibraryRepositories.getNexusRepositoriesName(), componentSearchVo.getNode(), nexusRequestHelper.getNexusTid());
@ -384,7 +366,7 @@ public class PmsProductLibraryComponentServiceImpl implements IPmsProductLibrary
public Boolean insertMavenComponent(ComponentMavenInputVo componentMavenInputVo) {
// 构建制品列表用于数据库记录
List<PmsProductLibraryComponent> pmsProductLibraryComponents = new ArrayList<>();
PmsProductLibraryRepositories repo = getPmsProductLibraryRepositories(
PmsProductLibraryRepositories repo = pmsProductLibraryRepositoriesService.getPmsProductLibraryRepositories(
false,
componentMavenInputVo.getEnterpriseIdentifier(),
componentMavenInputVo.getRepoName(),
@ -452,7 +434,7 @@ public class PmsProductLibraryComponentServiceImpl implements IPmsProductLibrary
componentRawInputVo.setDirectory(EscapeUtil.encodeChineseCharacters(componentRawInputVo.getDirectory()));
// 构建制品列表用于数据库记录
List<PmsProductLibraryComponent> pmsProductLibraryComponents = new ArrayList<>();
PmsProductLibraryRepositories repo = getPmsProductLibraryRepositories(
PmsProductLibraryRepositories repo = pmsProductLibraryRepositoriesService.getPmsProductLibraryRepositories(
ProductLibraryRepositoriesFormatEnum.isProduct(componentRawInputVo.getFormat()),
componentRawInputVo.getEnterpriseIdentifier(),
componentRawInputVo.getRepoName(),
@ -507,7 +489,7 @@ public class PmsProductLibraryComponentServiceImpl implements IPmsProductLibrary
@Override
public Boolean insertNpmComponent(ComponentInputVo componentInputVo) {
PmsProductLibraryRepositories repo = getPmsProductLibraryRepositories(
PmsProductLibraryRepositories repo = pmsProductLibraryRepositoriesService.getPmsProductLibraryRepositories(
false,
componentInputVo.getEnterpriseIdentifier(),
componentInputVo.getRepoName(),
@ -545,7 +527,7 @@ public class PmsProductLibraryComponentServiceImpl implements IPmsProductLibrary
@Override
public Boolean insertPypiComponent(ComponentInputVo componentInputVo) {
PmsProductLibraryRepositories repo = getPmsProductLibraryRepositories(
PmsProductLibraryRepositories repo = pmsProductLibraryRepositoriesService.getPmsProductLibraryRepositories(
false,
componentInputVo.getEnterpriseIdentifier(),
componentInputVo.getRepoName(),

View File

@ -15,6 +15,8 @@ import com.microservices.pms.productLibrary.domain.*;
import com.microservices.pms.productLibrary.domain.vo.*;
import com.microservices.pms.productLibrary.mapper.PmsProductLibraryRepositoriesMapper;
import com.microservices.pms.productLibrary.service.IPmsProductLibraryRepositoriesService;
import com.microservices.pms.productLibrary.service.IPmsProductLibraryService;
import com.microservices.pms.productLibrary.service.IPmsProductLibrarySnapshotRepoService;
import com.microservices.pms.utils.NexusRequestHelper;
import com.microservices.pms.utils.NexusRequestUrl;
import org.springframework.beans.factory.annotation.Autowired;
@ -39,6 +41,10 @@ public class PmsProductLibraryRepositoriesServiceImpl implements IPmsProductLibr
private NexusRequestHelper nexusRequestHelper;
@Autowired
private RedisService redisService;
@Autowired
private IPmsProductLibrarySnapshotRepoService pmsProductLibrarySnapshotRepoService;
@Autowired
private IPmsProductLibraryService pmsProductLibraryService;
@Override
public PmsProductLibraryRepositories selectPmsProductLibraryRepositoriesByName(String enterpriseIdentifier, String name) {
@ -405,4 +411,22 @@ public class PmsProductLibraryRepositoriesServiceImpl implements IPmsProductLibr
throw new ServiceException("该制品库锁定中,无法进行操作(制品库Id[%s])", repoId);
}
}
@Override
public PmsProductLibraryRepositories getPmsProductLibraryRepositories(Boolean isProduct, String enterpriseIdentifier, String repoName, String snapshotName) {
PmsProductLibraryRepositories pmsProductLibraryRepositories;
if (isProduct) {
pmsProductLibraryRepositories =
pmsProductLibraryService.selectPmsProductLibraryByName(enterpriseIdentifier, repoName);
} else {
if (StringUtils.isNotEmpty(snapshotName)) {
pmsProductLibraryRepositories =
pmsProductLibrarySnapshotRepoService.selectPmsProductLibrarySnapshotByName(enterpriseIdentifier, repoName, snapshotName);
} else {
pmsProductLibraryRepositories =
selectPmsProductLibraryRepositoriesByName(enterpriseIdentifier, repoName);
}
}
return pmsProductLibraryRepositories;
}
}

View File

@ -9,6 +9,7 @@ import com.microservices.common.core.utils.StringUtils;
import com.microservices.common.core.utils.html.EscapeUtil;
import com.microservices.common.core.web.page.GenericsTableDataInfo;
import com.microservices.common.security.utils.SecurityUtils;
import com.microservices.pms.document.service.IPmsDocumentService;
import com.microservices.pms.enterprise.domain.PmsEnterprise;
import com.microservices.pms.enterprise.service.IPmsEnterpriseService;
import com.microservices.pms.productLibrary.domain.PmsProductLibraryComponent;
@ -30,6 +31,7 @@ import com.microservices.system.api.utils.FeignUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
@ -54,11 +56,15 @@ public class PmsProductLibraryServiceImpl implements IPmsProductLibraryService {
@Autowired
private IPmsProductLibraryAsyncService pmsProductLibraryAsyncService;
@Autowired
@Lazy
private IPmsProductLibraryComponentService pmsProductLibraryComponentService;
@Autowired
@Lazy
private IPmsProductLibraryRepositoriesService pmsProductLibraryRepositoriesService;
@Autowired
private RemoteFileService remoteFileService;
@Autowired
private IPmsDocumentService pmsDocumentService;
@Override
public GenericsTableDataInfo<PmsProductLibraryComponentDataVo> selectComponentList(PmsProductLibraryComponentSearchVo search) {
@ -158,6 +164,31 @@ public class PmsProductLibraryServiceImpl implements IPmsProductLibraryService {
return productPackagedResultVo;
}
@Override
public Boolean uploadProductAsset(ComponentRawInputVo componentRawInputVo) {
PmsProductLibraryRepositories repo = pmsProductLibraryRepositoriesService.getPmsProductLibraryRepositories(
ProductLibraryRepositoriesFormatEnum.isProduct(componentRawInputVo.getFormat()),
componentRawInputVo.getEnterpriseIdentifier(),
componentRawInputVo.getRepoName(),
componentRawInputVo.getSnapshotName());
PmsEnterprise pmsEnterprise = pmsEnterpriseService.selectPmsEnterpriseByIdentifier(componentRawInputVo.getEnterpriseIdentifier());
for (AssetRawInputVo assetRawInputVo : componentRawInputVo.getAssetList()) {
if (!StringUtils.isNumeric(assetRawInputVo.getAssetIdentifier())) {
throw new ServiceException("制品标识格式错误产品库的制品标识应该为文档Id(制品文件名称[%s])", assetRawInputVo.getFilename());
}
PmsProductLibraryComponent pmsProductLibraryComponent =
pmsProductLibraryComponentMapper.selectPmsProductLibraryComponentByIdentifier(repo.getId(), assetRawInputVo.getAssetIdentifier());
if (pmsProductLibraryComponent != null) {
throw new ServiceException("产品库已存在该文档,请勿重复上传(文档文件名称[%s])", assetRawInputVo.getFilename());
}
pmsDocumentService.selectPmsDocumentDetailVoByIdAndEnterpriseId(Long.parseLong(assetRawInputVo.getAssetIdentifier()), pmsEnterprise.getId());
}
return pmsProductLibraryComponentService.insertRawComponent(componentRawInputVo);
}
@Override
public int insertPmsProductLibrary(ProductRepositoriesInputVo productRepositoriesInputVo) {
@ -233,11 +264,11 @@ public class PmsProductLibraryServiceImpl implements IPmsProductLibraryService {
@Override
public NexusComponentResultVo<List<NexusResultDataVo>> selectPmsProductLibraryKeyComponentList(String enterpriseIdentifier, ComponentSearchVo componentSearchVo) {
PmsProductLibraryRepositories productRepo = pmsProductLibraryComponentService.getPmsProductLibraryRepositories(true, enterpriseIdentifier, componentSearchVo.getProductRepoName(), null);
PmsProductLibraryRepositories productRepo = pmsProductLibraryRepositoriesService.getPmsProductLibraryRepositories(true, enterpriseIdentifier, componentSearchVo.getProductRepoName(), null);
PmsProductLibraryComponent productComponentSearch = new PmsProductLibraryComponent();
productComponentSearch.setRepoId(productRepo.getId());
List<PmsProductLibraryComponent> productComponentList = pmsProductLibraryComponentMapper.selectPmsProductLibraryComponentList(productComponentSearch);
PmsProductLibraryRepositories repo = pmsProductLibraryComponentService.getPmsProductLibraryRepositories(false, enterpriseIdentifier, componentSearchVo.getRepositoryName(), null);
PmsProductLibraryRepositories repo = pmsProductLibraryRepositoriesService.getPmsProductLibraryRepositories(false, enterpriseIdentifier, componentSearchVo.getRepositoryName(), null);
componentSearchVo.setRepositoryName(repo.getNexusRepositoriesName());
// Docker类型调用Nexus获取制品列表接口获取
if (ProductLibraryRepositoriesFormatEnum.DOCKER.getKey().equals(repo.getFormat())) {

View File

@ -19,6 +19,7 @@ import com.microservices.pms.productLibrary.service.IPmsProductLibrarySnapshotRe
import com.microservices.pms.utils.NexusRequestHelper;
import com.microservices.pms.utils.NexusRequestUrl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
/**
@ -31,6 +32,7 @@ public class PmsProductLibrarySnapshotRepoServiceImpl implements IPmsProductLibr
private PmsProductLibraryRepositoriesMapper pmsProductLibraryRepositoriesMapper;
@Autowired
@Lazy
private IPmsProductLibraryRepositoriesService pmsProductLibraryRepositoriesService;
@Autowired
private IPmsProductLibraryAsyncService pmsProductLibraryAsyncService;