From be63ff62a4b70fbda8605badcdb141719549bd4f Mon Sep 17 00:00:00 2001 From: songqq Date: Sun, 14 Dec 2025 15:54:21 +0800 Subject: [PATCH] =?UTF-8?q?refactor(service):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E5=A4=9A=E4=B8=AA=E6=9C=8D=E5=8A=A1=E7=B1=BB=E7=BB=A7=E6=89=BF?= =?UTF-8?q?EntityService=E5=9F=BA=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构多个服务类使其继承EntityService基类,统一实现基础CRUD操作 移除重复的findAll、getById等方法实现 添加缓存注解确保一致性 更新服务类文档说明继承关系 --- .../contract/cloud/rk/CloudRkService.java | 1 - ...jectSaleTypeRequireFileTypeRepository.java | 8 +- .../service/ProjectQuotationService.java | 62 +++++----- ...ProjectSaleTypeRequireFileTypeService.java | 41 +++---- .../service/ProjectSaleTypeService.java | 34 +++--- .../project/service/ProjectTypeService.java | 55 ++++----- .../VendorApprovedItemRepository.java | 6 +- .../service/VendorApprovedFileService.java | 52 +++----- .../service/VendorApprovedItemService.java | 48 +++----- server_entity_services.md | 114 ++++++++++++++---- 10 files changed, 218 insertions(+), 203 deletions(-) diff --git a/server/src/main/java/com/ecep/contract/cloud/rk/CloudRkService.java b/server/src/main/java/com/ecep/contract/cloud/rk/CloudRkService.java index 15055ed..03e9b20 100644 --- a/server/src/main/java/com/ecep/contract/cloud/rk/CloudRkService.java +++ b/server/src/main/java/com/ecep/contract/cloud/rk/CloudRkService.java @@ -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; diff --git a/server/src/main/java/com/ecep/contract/ds/project/repository/ProjectSaleTypeRequireFileTypeRepository.java b/server/src/main/java/com/ecep/contract/ds/project/repository/ProjectSaleTypeRequireFileTypeRepository.java index a595ca4..92d1932 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/repository/ProjectSaleTypeRequireFileTypeRepository.java +++ b/server/src/main/java/com/ecep/contract/ds/project/repository/ProjectSaleTypeRequireFileTypeRepository.java @@ -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, - JpaSpecificationExecutor { - + MyRepository { + List findBySaleTypeId(int saleTypeId); List findBySaleType(ProjectSaleType saleType); diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectQuotationService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectQuotationService.java index 4693786..478919f 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectQuotationService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectQuotationService.java @@ -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, QueryService, +public class ProjectQuotationService extends EntityService + implements IEntityService, QueryService, VoableService { private static final Logger logger = LoggerFactory.getLogger(ProjectQuotationService.class); @@ -43,8 +47,8 @@ public class ProjectQuotationService implements IEntityService 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 return null; } - // 实现QueryService接口的findAll方法 - @Override - public Page findAll(JsonNode paramsNode, Pageable pageable) { - Specification 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 findAll(Specification spec, Pageable pageable) { - return repository.findAll(spec, pageable); - } - public List 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 getSearchSpecification(String searchText) { + protected Specification buildSearchSpecification(String searchText) { return null; } - public void delete(ProjectQuotation approval) { - repository.delete(approval); + @Override + protected Specification 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 return approval; } - public List findAll(Specification 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 entity.setEvaluationFile(null); } } + } diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectSaleTypeRequireFileTypeService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectSaleTypeRequireFileTypeService.java index be46291..4ade3e8 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectSaleTypeRequireFileTypeService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectSaleTypeRequireFileTypeService.java @@ -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 implements IEntityService, QueryService, VoableService { @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 findAll(Specification spec, - Pageable pageable) { - return repository.findAll(spec, pageable); - } - @Cacheable(key = "'bySaleType-'+#p0") public List 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 findAll(JsonNode paramsNode, Pageable pageable) { - Specification 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 getSearchSpecification(String searchText) { + protected Specification buildSearchSpecification(String searchText) { return null; } + @Override + protected Specification 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 } } } + } diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectSaleTypeService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectSaleTypeService.java index 5f74a25..78ac807 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectSaleTypeService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectSaleTypeService.java @@ -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, QueryService, +public class ProjectSaleTypeService extends EntityService + implements IEntityService, QueryService, VoableService { @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, return entities.stream().map(ProjectSaleType::toVo).toList(); } - public Page findAll(Specification spec, Pageable pageable) { - return saleTypeRepository.findAll(spec, pageable); - } - @Override - public Page findAll(JsonNode paramsNode, Pageable pageable) { + protected Specification buildParameterSpecification(JsonNode paramsNode) { Specification 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 getSearchSpecification(String searchText) { - if (!StringUtils.hasText(searchText)) { - return null; - } + protected Specification 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, @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, @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, // ProjectSaleTypeVo中的created和version字段在ProjectSaleType实体中不存在,这里不做处理 // 如果需要处理,可以添加日志记录或者其他逻辑 } + } diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectTypeService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectTypeService.java index 498d048..db1d8a4 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectTypeService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectTypeService.java @@ -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 implements IEntityService, QueryService, VoableService { @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 findAll(Specification spec, Pageable pageable) { - return repository.findAll(spec, pageable); - } - - @Override - public Page findAll(JsonNode paramsNode, Pageable pageable) { - Specification 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 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 buildParameterSpecification(JsonNode paramsNode) { + Specification spec = null; + // field + spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "name", "code"); + return spec; + } + @Override + protected Specification buildSearchSpecification(String searchText) { + return (root, query, builder) -> { + return builder.or( + builder.like(root.get("code"), "%" + searchText + "%"), + builder.like(root.get("name"), "%" + searchText + "%")); + }; + } } diff --git a/server/src/main/java/com/ecep/contract/ds/vendor/repository/VendorApprovedItemRepository.java b/server/src/main/java/com/ecep/contract/ds/vendor/repository/VendorApprovedItemRepository.java index 375181a..30bd96d 100644 --- a/server/src/main/java/com/ecep/contract/ds/vendor/repository/VendorApprovedItemRepository.java +++ b/server/src/main/java/com/ecep/contract/ds/vendor/repository/VendorApprovedItemRepository.java @@ -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, JpaSpecificationExecutor { +public interface VendorApprovedItemRepository extends MyRepository { List findAllByList(VendorApproved list); diff --git a/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorApprovedFileService.java b/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorApprovedFileService.java index 479c77a..6c1808a 100644 --- a/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorApprovedFileService.java +++ b/server/src/main/java/com/ecep/contract/ds/vendor/service/VendorApprovedFileService.java @@ -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 findAll(Specification 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 implements IEntityService, QueryService, VoableService { @@ -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 getSearchSpecification(String searchText) { + protected Specification buildSearchSpecification(String searchText) { return (root, query, builder) -> { Path vendor = root.get("vendor"); Path company = vendor.get("company"); @@ -82,30 +84,8 @@ public class VendorApprovedItemService } @Override - public Page findAll(Specification 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 findAll(Specification spec, Sort sort) { - return repository.findAll(spec, sort); - } - - @Override - public Page findAll(JsonNode paramsNode, Pageable pageable) { + protected Specification buildParameterSpecification(JsonNode paramsNode) { Specification 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 findAllByListAndVendor(VendorApproved approvedList, Vendor vendor) { @@ -153,4 +133,4 @@ public class VendorApprovedItemService } } } -} +} \ No newline at end of file diff --git a/server_entity_services.md b/server_entity_services.md index 5422bf7..d8c78da 100644 --- a/server_entity_services.md +++ b/server_entity_services.md @@ -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 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 findAll(JsonNode paramsNode, Pageable pageable) { + Specification 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 buildParameterSpecification(JsonNode paramsNode) { + Specification 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 -- 以及其他几个核心业务服务类 \ No newline at end of file