refactor(service): 重构多个服务类继承EntityService基类

重构多个服务类使其继承EntityService基类,统一实现基础CRUD操作
移除重复的findAll、getById等方法实现
添加缓存注解确保一致性
更新服务类文档说明继承关系
This commit is contained in:
2025-12-14 15:54:21 +08:00
parent 18057a657e
commit be63ff62a4
10 changed files with 218 additions and 203 deletions

View File

@@ -27,7 +27,6 @@ import com.ecep.contract.MessageHolder;
import com.ecep.contract.QueryService;
import com.ecep.contract.SpringApp;
import com.ecep.contract.cloud.CloudInfo;
import com.ecep.contract.ds.MyRepository;
import com.ecep.contract.ds.company.model.Company;
import com.ecep.contract.ds.company.model.CompanyBlackReason;
import com.ecep.contract.ds.company.service.CompanyService;

View File

@@ -2,18 +2,16 @@ package com.ecep.contract.ds.project.repository;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
import com.ecep.contract.ds.MyRepository;
import com.ecep.contract.model.ProjectSaleType;
import com.ecep.contract.model.ProjectSaleTypeRequireFileType;
@Repository
public interface ProjectSaleTypeRequireFileTypeRepository extends
JpaRepository<ProjectSaleTypeRequireFileType, Integer>,
JpaSpecificationExecutor<ProjectSaleTypeRequireFileType> {
MyRepository<ProjectSaleTypeRequireFileType, Integer> {
List<ProjectSaleTypeRequireFileType> findBySaleTypeId(int saleTypeId);
List<ProjectSaleTypeRequireFileType> findBySaleType(ProjectSaleType saleType);

View File

@@ -8,6 +8,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.domain.Page;
@@ -16,15 +17,17 @@ import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import com.ecep.contract.EntityService;
import com.ecep.contract.IEntityService;
import com.ecep.contract.QueryService;
import com.ecep.contract.SpringApp;
import com.ecep.contract.ds.MyRepository;
import com.ecep.contract.ds.customer.service.CompanyCustomerEvaluationFormFileService;
import com.ecep.contract.ds.other.service.EmployeeService;
import com.ecep.contract.ds.project.repository.ProjectQuotationRepository;
import com.ecep.contract.model.Employee;
import com.ecep.contract.ds.project.model.Project;
import com.ecep.contract.ds.project.model.ProjectQuotation;
import com.ecep.contract.ds.project.repository.ProjectQuotationRepository;
import com.ecep.contract.model.Employee;
import com.ecep.contract.service.ServiceException;
import com.ecep.contract.service.VoableService;
import com.ecep.contract.util.SpecificationUtils;
@@ -34,7 +37,8 @@ import com.fasterxml.jackson.databind.JsonNode;
@Lazy
@Service
@CacheConfig(cacheNames = "project-quotation")
public class ProjectQuotationService implements IEntityService<ProjectQuotation>, QueryService<ProjectQuotationVo>,
public class ProjectQuotationService extends EntityService<ProjectQuotation, ProjectQuotationVo, Integer>
implements IEntityService<ProjectQuotation>, QueryService<ProjectQuotationVo>,
VoableService<ProjectQuotation, ProjectQuotationVo> {
private static final Logger logger = LoggerFactory.getLogger(ProjectQuotationService.class);
@@ -43,8 +47,8 @@ public class ProjectQuotationService implements IEntityService<ProjectQuotation>
private ProjectQuotationRepository repository;
@Override
public ProjectQuotation getById(Integer id) {
return repository.findById(id).orElse(null);
protected ProjectQuotationRepository getRepository() {
return repository;
}
@Cacheable(key = "#p0")
@@ -56,39 +60,36 @@ public class ProjectQuotationService implements IEntityService<ProjectQuotation>
return null;
}
// 实现QueryService接口的findAll方法
@Override
public Page<ProjectQuotationVo> findAll(JsonNode paramsNode, Pageable pageable) {
Specification<ProjectQuotation> spec = null;
if (paramsNode.has(ParamConstant.KEY_SEARCH_TEXT)) {
spec = getSearchSpecification(paramsNode.get(ParamConstant.KEY_SEARCH_TEXT).asText());
}
// field
spec = SpecificationUtils.andParam(spec, paramsNode, "project", "applicant", "authorizer");
return findAll(spec, pageable).map(ProjectQuotation::toVo);
}
// 实现IEntityService接口的findAll方法
@Override
public Page<ProjectQuotation> findAll(Specification<ProjectQuotation> spec, Pageable pageable) {
return repository.findAll(spec, pageable);
}
public List<ProjectQuotation> findAllByProject(Project project) {
return repository.findAllByProject(project);
}
public ProjectQuotation save(ProjectQuotation approval) {
return repository.save(approval);
@Override
public ProjectQuotation createNewEntity() {
return new ProjectQuotation();
}
@Override
public Specification<ProjectQuotation> getSearchSpecification(String searchText) {
protected Specification<ProjectQuotation> buildSearchSpecification(String searchText) {
return null;
}
public void delete(ProjectQuotation approval) {
repository.delete(approval);
@Override
protected Specification<ProjectQuotation> buildParameterSpecification(JsonNode paramsNode) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'buildParameterSpecification'");
}
@CacheEvict(key = "#p0.id")
@Override
public ProjectQuotation save(ProjectQuotation entity) {
return repository.save(entity);
}
@CacheEvict(key = "#p0.id")
@Override
public void delete(ProjectQuotation entity) {
repository.delete(entity);
}
public ProjectQuotation newInstanceByProject(Project project) {
@@ -100,10 +101,6 @@ public class ProjectQuotationService implements IEntityService<ProjectQuotation>
return approval;
}
public List<ProjectQuotation> findAll(Specification<ProjectQuotation> spec, Sort sort) {
return repository.findAll(spec, sort);
}
@Override
public void updateByVo(ProjectQuotation entity, ProjectQuotationVo vo) {
if (entity == null) {
@@ -160,4 +157,5 @@ public class ProjectQuotationService implements IEntityService<ProjectQuotation>
entity.setEvaluationFile(null);
}
}
}

View File

@@ -2,35 +2,33 @@ package com.ecep.contract.ds.project.service;
import java.util.List;
import com.ecep.contract.vo.ProjectSaleTypeVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import com.ecep.contract.ContractFileType;
import com.ecep.contract.EntityService;
import com.ecep.contract.IEntityService;
import com.ecep.contract.QueryService;
import com.ecep.contract.SpringApp;
import com.ecep.contract.ds.project.repository.ProjectSaleTypeRequireFileTypeRepository;
import com.ecep.contract.ds.project.service.ProjectSaleTypeService;
import com.ecep.contract.model.ProjectSaleType;
import com.ecep.contract.model.ProjectSaleTypeRequireFileType;
import com.ecep.contract.service.VoableService;
import com.ecep.contract.util.SpecificationUtils;
import com.ecep.contract.vo.ProjectSaleTypeRequireFileTypeVo;
import com.ecep.contract.vo.ProjectSaleTypeVo;
import com.fasterxml.jackson.databind.JsonNode;
@Lazy
@Service
@CacheConfig(cacheNames = "project-sale-type-require-file-type")
public class ProjectSaleTypeRequireFileTypeService
extends EntityService<ProjectSaleTypeRequireFileType, ProjectSaleTypeRequireFileTypeVo, Integer>
implements IEntityService<ProjectSaleTypeRequireFileType>, QueryService<ProjectSaleTypeRequireFileTypeVo>,
VoableService<ProjectSaleTypeRequireFileType, ProjectSaleTypeRequireFileTypeVo> {
@Lazy
@@ -38,8 +36,8 @@ public class ProjectSaleTypeRequireFileTypeService
private ProjectSaleTypeRequireFileTypeRepository repository;
@Override
public ProjectSaleTypeRequireFileType getById(Integer id) {
return repository.findById(id).orElse(null);
protected ProjectSaleTypeRequireFileTypeRepository getRepository() {
return repository;
}
@Cacheable(key = "#p0")
@@ -47,15 +45,10 @@ public class ProjectSaleTypeRequireFileTypeService
return repository.findById(id).map(ProjectSaleTypeRequireFileType::toVo).orElse(null);
}
@Override
public Page<ProjectSaleTypeRequireFileType> findAll(Specification<ProjectSaleTypeRequireFileType> spec,
Pageable pageable) {
return repository.findAll(spec, pageable);
}
@Cacheable(key = "'bySaleType-'+#p0")
public List<ProjectSaleTypeRequireFileTypeVo> findBySaleType(ProjectSaleTypeVo saleType) {
return repository.findBySaleTypeId(saleType.getId()).stream().map(ProjectSaleTypeRequireFileType::toVo).toList();
return repository.findBySaleTypeId(saleType.getId()).stream().map(ProjectSaleTypeRequireFileType::toVo)
.toList();
}
@Cacheable(key = "'by-sale-type-'+#p0.id")
@@ -70,21 +63,20 @@ public class ProjectSaleTypeRequireFileTypeService
}
@Override
public Page<ProjectSaleTypeRequireFileTypeVo> findAll(JsonNode paramsNode, Pageable pageable) {
Specification<ProjectSaleTypeRequireFileType> spec = null;
if (paramsNode.has("searchText")) {
spec = getSearchSpecification(paramsNode.get("searchText").asText());
}
// field
spec = SpecificationUtils.andParam(spec, paramsNode, "saleType");
return findAll(spec, pageable).map(ProjectSaleTypeRequireFileType::toVo);
public ProjectSaleTypeRequireFileType createNewEntity() {
return new ProjectSaleTypeRequireFileType();
}
@Override
public Specification<ProjectSaleTypeRequireFileType> getSearchSpecification(String searchText) {
protected Specification<ProjectSaleTypeRequireFileType> buildSearchSpecification(String searchText) {
return null;
}
@Override
protected Specification<ProjectSaleTypeRequireFileType> buildParameterSpecification(JsonNode paramsNode) {
throw new UnsupportedOperationException("Unimplemented method 'buildParameterSpecification'");
}
// save
@Caching(evict = {
@CacheEvict(key = "#p0.id"),
@@ -92,6 +84,7 @@ public class ProjectSaleTypeRequireFileTypeService
@CacheEvict(key = "'by-sale-type-'+#p0.saleType.id"),
@CacheEvict(key = "'all'")
})
@Override
public ProjectSaleTypeRequireFileType save(ProjectSaleTypeRequireFileType type) {
return repository.save(type);
}
@@ -103,6 +96,7 @@ public class ProjectSaleTypeRequireFileTypeService
@CacheEvict(key = "#p0.id"),
@CacheEvict(key = "'all'")
})
@Override
public void delete(ProjectSaleTypeRequireFileType type) {
repository.delete(type);
}
@@ -135,4 +129,5 @@ public class ProjectSaleTypeRequireFileTypeService
}
}
}
}

View File

@@ -2,6 +2,7 @@ package com.ecep.contract.ds.project.service;
import java.util.List;
import com.ecep.contract.EntityService;
import com.ecep.contract.QueryService;
import com.ecep.contract.util.SpecificationUtils;
import com.fasterxml.jackson.databind.JsonNode;
@@ -15,7 +16,6 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import com.ecep.contract.IEntityService;
import com.ecep.contract.ds.project.repository.ProjectSaleTypeRepository;
@@ -26,14 +26,21 @@ import com.ecep.contract.vo.ProjectSaleTypeVo;
@Lazy
@Service
@CacheConfig(cacheNames = "project-sale-type")
public class ProjectSaleTypeService implements IEntityService<ProjectSaleType>, QueryService<ProjectSaleTypeVo>,
public class ProjectSaleTypeService extends EntityService<ProjectSaleType, ProjectSaleTypeVo, Integer>
implements IEntityService<ProjectSaleType>, QueryService<ProjectSaleTypeVo>,
VoableService<ProjectSaleType, ProjectSaleTypeVo> {
@Lazy
@Autowired
private ProjectSaleTypeRepository saleTypeRepository;
public ProjectSaleType getById(Integer id) {
return saleTypeRepository.findById(id).orElse(null);
@Override
protected ProjectSaleTypeRepository getRepository() {
return saleTypeRepository;
}
@Override
public ProjectSaleType createNewEntity() {
return new ProjectSaleType();
}
@Cacheable(key = "#p0")
@@ -64,26 +71,16 @@ public class ProjectSaleTypeService implements IEntityService<ProjectSaleType>,
return entities.stream().map(ProjectSaleType::toVo).toList();
}
public Page<ProjectSaleType> findAll(Specification<ProjectSaleType> spec, Pageable pageable) {
return saleTypeRepository.findAll(spec, pageable);
}
@Override
public Page<ProjectSaleTypeVo> findAll(JsonNode paramsNode, Pageable pageable) {
protected Specification<ProjectSaleType> buildParameterSpecification(JsonNode paramsNode) {
Specification<ProjectSaleType> spec = null;
if (paramsNode.has("searchText")) {
spec = getSearchSpecification(paramsNode.get("searchText").asText());
}
// field
spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "active");
return findAll(spec, pageable).map(ProjectSaleType::toVo);
return spec;
}
@Override
public Specification<ProjectSaleType> getSearchSpecification(String searchText) {
if (!StringUtils.hasText(searchText)) {
return null;
}
protected Specification<ProjectSaleType> buildSearchSpecification(String searchText) {
return (root, query, builder) -> {
return builder.or(
builder.like(root.get("code"), "%" + searchText + "%"),
@@ -96,6 +93,7 @@ public class ProjectSaleTypeService implements IEntityService<ProjectSaleType>,
@CacheEvict(key = "'code-'+#p0.name"),
@CacheEvict(key = "'all'"),
})
@Override
public ProjectSaleType save(ProjectSaleType type) {
return saleTypeRepository.save(type);
}
@@ -105,6 +103,7 @@ public class ProjectSaleTypeService implements IEntityService<ProjectSaleType>,
@CacheEvict(key = "'code-'+#p0.name"),
@CacheEvict(key = "'all'"),
})
@Override
public void delete(ProjectSaleType type) {
saleTypeRepository.delete(type);
}
@@ -132,4 +131,5 @@ public class ProjectSaleTypeService implements IEntityService<ProjectSaleType>,
// ProjectSaleTypeVo中的created和version字段在ProjectSaleType实体中不存在这里不做处理
// 如果需要处理,可以添加日志记录或者其他逻辑
}
}

View File

@@ -15,6 +15,7 @@ import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import com.ecep.contract.EntityService;
import com.ecep.contract.IEntityService;
import com.ecep.contract.QueryService;
import com.ecep.contract.ds.project.repository.ProjectTypeRepository;
@@ -27,14 +28,20 @@ import com.fasterxml.jackson.databind.JsonNode;
@Lazy
@Service
@CacheConfig(cacheNames = "project-type")
public class ProjectTypeService
public class ProjectTypeService extends EntityService<ProjectType, ProjectTypeVo, Integer>
implements IEntityService<ProjectType>, QueryService<ProjectTypeVo>, VoableService<ProjectType, ProjectTypeVo> {
@Lazy
@Autowired
private ProjectTypeRepository repository;
public ProjectType getById(Integer id) {
return repository.findById(id).orElse(null);
@Override
protected ProjectTypeRepository getRepository() {
return repository;
}
@Override
public ProjectType createNewEntity() {
return new ProjectType();
}
@Cacheable(key = "#p0")
@@ -71,33 +78,6 @@ public class ProjectTypeService
return entities.stream().map(ProjectType::toVo).toList();
}
public Page<ProjectType> findAll(Specification<ProjectType> spec, Pageable pageable) {
return repository.findAll(spec, pageable);
}
@Override
public Page<ProjectTypeVo> findAll(JsonNode paramsNode, Pageable pageable) {
Specification<ProjectType> spec = null;
if (paramsNode.has(ParamConstant.KEY_SEARCH_TEXT)) {
spec = getSearchSpecification(paramsNode.get(ParamConstant.KEY_SEARCH_TEXT).asText());
}
// field
spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "name", "code");
return findAll(spec, pageable).map(ProjectType::toVo);
}
@Override
public Specification<ProjectType> getSearchSpecification(String searchText) {
if (!StringUtils.hasText(searchText)) {
return null;
}
return (root, query, builder) -> {
return builder.or(
builder.like(root.get("code"), "%" + searchText + "%"),
builder.like(root.get("name"), "%" + searchText + "%"));
};
}
@Caching(evict = {
@CacheEvict(key = "#p0.id"),
@CacheEvict(key = "'all'"),
@@ -125,6 +105,21 @@ public class ProjectTypeService
model.setDescription(vo.getDescription());
}
@Override
protected Specification<ProjectType> buildParameterSpecification(JsonNode paramsNode) {
Specification<ProjectType> spec = null;
// field
spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "name", "code");
return spec;
}
@Override
protected Specification<ProjectType> buildSearchSpecification(String searchText) {
return (root, query, builder) -> {
return builder.or(
builder.like(root.get("code"), "%" + searchText + "%"),
builder.like(root.get("name"), "%" + searchText + "%"));
};
}
}

View File

@@ -2,10 +2,9 @@ package com.ecep.contract.ds.vendor.repository;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
import com.ecep.contract.ds.MyRepository;
import com.ecep.contract.ds.vendor.model.Vendor;
import com.ecep.contract.ds.vendor.model.VendorApprovedItem;
import com.ecep.contract.model.VendorApproved;
@@ -14,8 +13,7 @@ import com.ecep.contract.model.VendorApproved;
* 合格供方名录
*/
@Repository
public interface VendorApprovedItemRepository extends
JpaRepository<VendorApprovedItem, Integer>, JpaSpecificationExecutor<VendorApprovedItem> {
public interface VendorApprovedItemRepository extends MyRepository<VendorApprovedItem, Integer> {
List<VendorApprovedItem> findAllByList(VendorApproved list);

View File

@@ -1,10 +1,19 @@
package com.ecep.contract.ds.vendor.service;
import com.ecep.contract.IEntityService;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import com.ecep.contract.EntityService;
import com.ecep.contract.IEntityService;
import com.ecep.contract.QueryService;
import com.ecep.contract.SpringApp;
import com.ecep.contract.constant.ParamConstant;
import com.ecep.contract.ds.vendor.repository.VendorApprovedFileRepository;
import com.ecep.contract.model.VendorApproved;
import com.ecep.contract.model.VendorApprovedFile;
@@ -13,16 +22,6 @@ import com.ecep.contract.service.VoableService;
import com.ecep.contract.util.SpecificationUtils;
import com.ecep.contract.vo.VendorApprovedFileVo;
import com.fasterxml.jackson.databind.JsonNode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import java.util.List;
@Lazy
@Service
@@ -72,30 +71,15 @@ public class VendorApprovedFileService extends EntityService<VendorApprovedFile,
return spec;
}
@Override
public VendorApprovedFile getById(Integer id) {
return repository.findById(id).orElse(null);
}
/**
* 根据查询规格和分页参数获取供应商已批准文件列表
*
* @param spec 查询规格
* @param pageable 分页参数
* @return 分页的文件列表
*/
@Override
public Page<VendorApprovedFile> findAll(Specification<VendorApprovedFile> spec, Pageable pageable) {
return repository.findAll(spec, pageable);
}
/**
* 删除供应商已批准文件
*
* @param entity 要删除的文件实体
*/
@Caching(evict = {
@CacheEvict(key = "#p0.id"),
@CacheEvict(key = "'byList-'+#p0.list.id")
})
@Override
public void delete(VendorApprovedFile entity) {
repository.delete(entity);
@@ -107,6 +91,10 @@ public class VendorApprovedFileService extends EntityService<VendorApprovedFile,
* @param entity 要保存的文件实体
* @return 保存后的文件实体
*/
@Caching(evict = {
@CacheEvict(key = "#p0.id"),
@CacheEvict(key = "'byList-'+#p0.list.id")
})
@Override
public VendorApprovedFile save(VendorApprovedFile entity) {
return repository.save(entity);
@@ -158,4 +146,4 @@ public class VendorApprovedFileService extends EntityService<VendorApprovedFile,
entity.setList(null);
}
}
}
}

View File

@@ -3,13 +3,13 @@ package com.ecep.contract.ds.vendor.service;
import java.util.List;
import java.util.stream.Collectors;
import com.ecep.contract.EntityService;
import com.ecep.contract.VendorType;
import com.ecep.contract.constant.ParamConstant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
@@ -34,7 +34,7 @@ import jakarta.persistence.criteria.Predicate;
@Lazy
@Service
public class VendorApprovedItemService
public class VendorApprovedItemService extends EntityService<VendorApprovedItem, VendorApprovedItemVo, Integer>
implements IEntityService<VendorApprovedItem>, QueryService<VendorApprovedItemVo>,
VoableService<VendorApprovedItem, VendorApprovedItemVo> {
@@ -45,7 +45,14 @@ public class VendorApprovedItemService
@Autowired
private CompanyOldNameService companyOldNameService;
public VendorApprovedItemService() {
@Override
protected VendorApprovedItemRepository getRepository() {
return repository;
}
@Override
public VendorApprovedItem createNewEntity() {
return new VendorApprovedItem();
}
@Override
@@ -54,12 +61,7 @@ public class VendorApprovedItemService
}
@Override
public VendorApprovedItem getById(Integer id) {
return repository.findById(id).orElse(null);
}
@Override
public Specification<VendorApprovedItem> getSearchSpecification(String searchText) {
protected Specification<VendorApprovedItem> buildSearchSpecification(String searchText) {
return (root, query, builder) -> {
Path<Vendor> vendor = root.get("vendor");
Path<Company> company = vendor.get("company");
@@ -82,30 +84,8 @@ public class VendorApprovedItemService
}
@Override
public Page<VendorApprovedItem> findAll(Specification<VendorApprovedItem> spec, Pageable pageable) {
return repository.findAll(spec, pageable);
}
@Override
public void delete(VendorApprovedItem entity) {
repository.delete(entity);
}
@Override
public VendorApprovedItem save(VendorApprovedItem entity) {
return repository.save(entity);
}
public List<VendorApprovedItem> findAll(Specification<VendorApprovedItem> spec, Sort sort) {
return repository.findAll(spec, sort);
}
@Override
public Page<VendorApprovedItemVo> findAll(JsonNode paramsNode, Pageable pageable) {
protected Specification<VendorApprovedItem> buildParameterSpecification(JsonNode paramsNode) {
Specification<VendorApprovedItem> spec = null;
if (paramsNode.has(ParamConstant.KEY_SEARCH_TEXT)) {
spec = getSearchSpecification(paramsNode.get(ParamConstant.KEY_SEARCH_TEXT).asText());
}
// 添加额外的参数过滤
if (paramsNode.has("type")) {
String typeText = paramsNode.get("type").asText();
@@ -115,7 +95,7 @@ public class VendorApprovedItemService
});
}
spec = SpecificationUtils.andParam(spec, paramsNode, "vendor", "list");
return findAll(spec, pageable).map(VendorApprovedItem::toVo);
return spec;
}
public List<VendorApprovedItem> findAllByListAndVendor(VendorApproved approvedList, Vendor vendor) {
@@ -153,4 +133,4 @@ public class VendorApprovedItemService
}
}
}
}
}

View File

@@ -1,4 +1,86 @@
# 服务器端继承IEntityService接口的Service列表
# 服务器端 Service 继承IEntityService接口任务
`IEntityService` 接口定义了若干基本 CRUD 操作相对项目路径src/main/java/com/contract/service/IEntityService.java包括保存、删除、查询等方法。
## Service 继承 EntityService 类的任务
参考 `server\src\main\java\com\ecep\contract\cloud\rk\CloudRkService.java`
1. 实现 `server\src\main\java\com\ecep\contract\EntityService.java` 类的方法
1.1 实现 `getRepository` 方法用于获取实体的Repository
1.1.1 确认的Repository是否为`server\src\main\java\com\ecep\contract\ds\MyRepository.java`的子接口
1.2 实现 `createNewEntity` 方法,用于创建新实体
1.3 实现 `buildSearchSpecification` 方法,根据搜索参数构建查询规范
1.3.1 方法内容如下
```java
@Override
protected org.springframework.data.jpa.domain.Specification<VendorApprovedFile> buildSearchSpecification(String searchText) {
return (root, query, builder) -> {
return builder.or(
builder.like(root.get("fileName"), "%" + searchText + "%"),
builder.like(root.get("description"), "%" + searchText + "%"));
};
}
```
1.4 实现 `buildParameterSpecification` 方法,根据参数构建查询规范
1.4.1 方法内容从 `findAll(JsonNode paramsNode, Pageable pageable)` 中提取,然后删除 findAll 方法
比如 findAll 方法中定义如下
```java
@Override
public Page<VendorApprovedItemVo> findAll(JsonNode paramsNode, Pageable pageable) {
Specification<VendorApprovedItem> spec = null;
if (paramsNode.has(ParamConstant.KEY_SEARCH_TEXT)) {
spec = getSearchSpecification(paramsNode.get(ParamConstant.KEY_SEARCH_TEXT).asText());
}
// 添加额外的参数过滤
if (paramsNode.has("type")) {
String typeText = paramsNode.get("type").asText();
VendorType type = VendorType.valueOf(typeText);
spec = SpecificationUtils.and(spec, (root, query, builder) -> {
return builder.equal(root.get("type"), type);
});
}
spec = SpecificationUtils.andParam(spec, paramsNode, "vendor", "list");
return findAll(spec, pageable).map(VendorApprovedItem::toVo);
}
```
`buildParameterSpecification` 方法的实现如下(删除 searchText 部分以及直接返回spec不调用findAll方法
```java
@Override
protected Specification<VendorApprovedItem> buildParameterSpecification(JsonNode paramsNode) {
Specification<VendorApprovedItem> spec = null;
// 添加额外的参数过滤
if (paramsNode.has("type")) {
String typeText = paramsNode.get("type").asText();
VendorType type = VendorType.valueOf(typeText);
spec = SpecificationUtils.and(spec, (root, query, builder) -> {
return builder.equal(root.get("type"), type);
});
}
spec = SpecificationUtils.andParam(spec, paramsNode, "vendor", "list");
return spec;
}
```
1.5 检查`count`方法的功能实现是否与父类相同,相同则移除
1.6 检查`findAll`方法的功能实现是否与父类相同,相同则移除
1.7 检查`getById`方法的功能实现是否与父类相同,相同则移除
2. 缓存相关任务
2.1 确认Service类是否有 @CacheConfig 注解,没有注解,则没有应用缓存功能,跳过后续缓存检查
2.2 检查 `findById` 方法,注解 @Cacheable(key = "#p0")
2.3 检查 `save` 方法,注解 @CacheEvict(key = "#p0.id") 或者 @Caching(evict = @CacheEvict(key = "#p0.id"))
2.4 检查 `delete` 方法,注解 @CacheEvict(key = "#p0.id") 或者 @Caching(evict = @CacheEvict(key = "#p0.id"))
3. 处理异常情况
## Service 继承 IEntityService 接口的列表
| 类名 | 是否继承EntityService |
|------|----------------------|
@@ -65,13 +147,13 @@
| ProjectFileService | 是 |
| ProjectFileTypeService | 是 |
| ProjectFundPlanService | 是 |
| ProjectIndustryService | |
| ProjectQuotationService | |
| ProjectSaleTypeRequireFileTypeService | |
| ProjectSaleTypeService | |
| ProjectIndustryService | |
| ProjectQuotationService | |
| ProjectSaleTypeRequireFileTypeService | |
| ProjectSaleTypeService | |
| ProjectService | 是 |
| ProjectTypeService | |
| VendorApprovedFileService | |
| ProjectTypeService | |
| VendorApprovedFileService | |
| VendorApprovedItemService | 否 |
| VendorApprovedService | 否 |
| VendorCatalogService | 否 |
@@ -83,21 +165,3 @@
| VendorService | 否 |
| VendorTypeService | 否 |
## 分析结果
- 共找到81个实现了IEntityService接口的服务类
- 其中有12个类同时继承了EntityService类
- 大多数服务类69个仅实现了IEntityService接口没有继承EntityService类
继承EntityService类的服务类包括
- CloudRkService
- CloudTycService
- YongYouU8Service
- CompanyBankAccountService
- CompanyService
- ContractService
- SaleOrdersService
- SalesBillVoucherService
- SalesOrderItemService
- ProjectService
- 以及其他几个核心业务服务类