Compare commits

...

2 Commits

Author SHA1 Message Date
94030a5a39 Merge branch 'main' of http://gitea.ecctrl.com/songqq/contract-manager 2025-12-14 12:59:24 +08:00
7e59f2c17e refactor(服务层): 重构多个服务类继承EntityService基类
统一服务层实现,将PurchaseBillVoucherItemService、PurchaseOrdersService等服务类重构为继承EntityService基类
移除重复代码,实现通用CRUD操作
更新文档标记服务可用性
优化查询规范和缓存配置
2025-12-14 12:58:56 +08:00
9 changed files with 162 additions and 326 deletions

View File

@@ -2,25 +2,22 @@ package com.ecep.contract.ds.contract.service;
import java.util.List;
import com.ecep.contract.util.SpecificationUtils;
import com.ecep.contract.vo.ContractVo;
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.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.ds.contract.repository.PurchaseBillVoucherItemRepository;
import com.ecep.contract.ds.vendor.model.PurchaseBillVoucherItem;
import com.ecep.contract.service.VoableService;
import com.ecep.contract.vo.ContractVo;
import com.ecep.contract.vo.PurchaseBillVoucherItemVo;
import com.fasterxml.jackson.databind.JsonNode;
@@ -28,25 +25,31 @@ import com.fasterxml.jackson.databind.JsonNode;
@Service
@CacheConfig(cacheNames = "purchase-bill-voucher-item")
public class PurchaseBillVoucherItemService
implements IEntityService<PurchaseBillVoucherItem>, QueryService<PurchaseBillVoucherItem>,
extends EntityService<PurchaseBillVoucherItem, PurchaseBillVoucherItemVo, Integer>
implements IEntityService<PurchaseBillVoucherItem>, QueryService<PurchaseBillVoucherItemVo>,
VoableService<PurchaseBillVoucherItem, PurchaseBillVoucherItemVo> {
@Lazy
@Autowired
private PurchaseBillVoucherItemRepository repository;
@Override
public PurchaseBillVoucherItem getById(Integer id) {
return repository.findById(id).orElse(null);
}
@Cacheable(key = "#p0")
@Override
public PurchaseBillVoucherItem findById(Integer id) {
return repository.findById(id).orElse(null);
public PurchaseBillVoucherItemVo findById(Integer id) {
return repository.findById(id).map(PurchaseBillVoucherItem::toVo).orElse(null);
}
@Override
public Specification<PurchaseBillVoucherItem> getSearchSpecification(String searchText) {
protected PurchaseBillVoucherItemRepository getRepository() {
return repository;
}
@Override
public PurchaseBillVoucherItem createNewEntity() {
return new PurchaseBillVoucherItem();
}
@Override
protected Specification<PurchaseBillVoucherItem> buildSearchSpecification(String searchText) {
return (root, query, builder) -> {
return builder.or(
builder.like(root.get("description"), "%" + searchText + "%"));
@@ -54,19 +57,8 @@ public class PurchaseBillVoucherItemService
}
@Override
public Page<PurchaseBillVoucherItem> findAll(Specification<PurchaseBillVoucherItem> spec, Pageable pageable) {
return repository.findAll(spec, pageable);
}
@Override
public Page<PurchaseBillVoucherItem> findAll(JsonNode paramsNode, Pageable pageable) {
Specification<PurchaseBillVoucherItem> spec = null;
if (paramsNode.has("searchText")) {
spec = getSearchSpecification(paramsNode.get("searchText").asText());
}
spec = SpecificationUtils.andParam(spec, paramsNode, "voucher");
return findAll(spec, pageable);
protected Specification<PurchaseBillVoucherItem> buildParameterSpecification(JsonNode paramsNode) {
return null;
}
@Caching(evict = {
@@ -87,10 +79,6 @@ public class PurchaseBillVoucherItemService
return repository.save(entity);
}
public List<PurchaseBillVoucherItem> findAll(Specification<PurchaseBillVoucherItem> spec, Sort sort) {
return repository.findAll(spec, sort);
}
@Override
public void updateByVo(PurchaseBillVoucherItem model, PurchaseBillVoucherItemVo vo) {
model.setId(vo.getId());

View File

@@ -1,12 +1,7 @@
package com.ecep.contract.ds.contract.service;
import java.util.List;
import com.ecep.contract.ds.vendor.model.PurchaseBillVoucherItem;
import com.ecep.contract.ds.vendor.model.PurchaseOrderItem;
import jakarta.persistence.criteria.Root;
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;
@@ -18,11 +13,12 @@ import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
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.SpringApp;
import com.ecep.contract.ds.MyRepository;
import com.ecep.contract.ds.company.service.CompanyService;
import com.ecep.contract.ds.company.service.InvoiceService;
import com.ecep.contract.ds.contract.repository.PurchaseBillVoucherRepository;
@@ -39,40 +35,21 @@ import com.fasterxml.jackson.databind.JsonNode;
@Lazy
@Service
@CacheConfig(cacheNames = "purchase-bill-voucher")
public class PurchaseBillVoucherService
public class PurchaseBillVoucherService extends EntityService<PurchaseBillVoucher, PurchaseBillVoucherVo, Integer>
implements IEntityService<PurchaseBillVoucher>, QueryService<PurchaseBillVoucherVo>,
VoableService<PurchaseBillVoucher, PurchaseBillVoucherVo> {
private static final Logger logger = LoggerFactory.getLogger(PurchaseBillVoucherService.class);
@Lazy
@Autowired
private PurchaseBillVoucherRepository repository;
@Override
public PurchaseBillVoucher getById(Integer id) {
return repository.findById(id).orElse(null);
}
@Override
@Cacheable(key = "#p0")
public PurchaseBillVoucherVo findById(Integer id) {
return repository.findById(id).map(PurchaseBillVoucher::toVo).orElse(null);
}
@Override
public Specification<PurchaseBillVoucher> getSearchSpecification(String searchText) {
// if null
if (!StringUtils.hasText(searchText)) {
return null;
}
return (root, query, builder) -> {
return builder.or(
builder.like(root.get("code"), "%" + searchText + "%"),
builder.like(root.get("description"), "%" + searchText + "%"));
};
}
@Cacheable(key = "'code-'+#p0")
public PurchaseBillVoucherVo findByCode(String code) {
return repository.findByCode(code).map(PurchaseBillVoucher::toVo).orElse(null);
@@ -88,16 +65,17 @@ public class PurchaseBillVoucherService
}
/**
* 保存实体对象,异步方法
* 保存实体对象
*
* @param voucher 要保存的实体对象
* @return 返回异步调用
* @return 返回保存后的实体
*/
@Caching(evict = {
@CacheEvict(key = "#p0.id"),
@CacheEvict(key = "'code-'+#p0.code"),
@CacheEvict(key = "'refId-'+#p0.refId")
})
@Override
public PurchaseBillVoucher save(PurchaseBillVoucher voucher) {
return repository.save(voucher);
}
@@ -112,47 +90,30 @@ public class PurchaseBillVoucherService
repository.delete(order);
}
public long count() {
return repository.count();
}
public long count(Specification<PurchaseBillVoucher> spec) {
return repository.count(spec);
@Override
protected Specification<PurchaseBillVoucher> buildParameterSpecification(JsonNode paramsNode) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'buildParameterSpecification'");
}
@Override
public Page<PurchaseBillVoucher> findAll(Specification<PurchaseBillVoucher> spec, Pageable pageable) {
return repository.findAll(spec, pageable);
protected PurchaseBillVoucherRepository getRepository() {
return repository;
}
@Override
public Page<PurchaseBillVoucherVo> findAll(JsonNode paramsNode, Pageable pageable) {
Specification<PurchaseBillVoucher> spec = null;
if (paramsNode.has("searchText")) {
spec = getSearchSpecification(paramsNode.get("searchText").asText());
}
// field
spec = SpecificationUtils.andParam(spec, paramsNode, "company", "inventory");
if (paramsNode.has("purchaseOrder")) {
spec = SpecificationUtils.and(spec, (root, query, cb) -> {
Root<PurchaseBillVoucherItem> voucherItemRoot = query.from(PurchaseBillVoucherItem.class);
Root<PurchaseOrderItem> orderItemRoot = query.from(PurchaseOrderItem.class);
return cb.and(
cb.equal(voucherItemRoot.get("orderItem"), orderItemRoot),
cb.equal(orderItemRoot.get("order").get("id"), paramsNode.get("purchaseOrder").asInt()),
cb.equal(root, voucherItemRoot.get("voucher"))
);
});
}
return findAll(spec, pageable).map(PurchaseBillVoucher::toVo);
public PurchaseBillVoucher createNewEntity() {
return new PurchaseBillVoucher();
}
public List<PurchaseBillVoucher> findAll(Specification<PurchaseBillVoucher> spec, Sort sort) {
return repository.findAll(spec, sort);
}
public List<PurchaseBillVoucher> search(String searchText) {
return repository.findAll(getSearchSpecification(searchText), Pageable.ofSize(10)).getContent();
@Override
protected Specification<PurchaseBillVoucher> buildSearchSpecification(String searchText) {
return (root, query, builder) -> {
return builder.or(
builder.like(root.get("code"), "%" + searchText + "%"),
builder.like(root.get("description"), "%" + searchText + "%"));
};
}
@Override
@@ -200,4 +161,5 @@ public class PurchaseBillVoucherService
model.setVerifier(employeeService.getById(vo.getVerifierId()));
}
}
}

View File

@@ -3,10 +3,6 @@ package com.ecep.contract.ds.contract.service;
import java.util.List;
import java.util.Objects;
import com.ecep.contract.ds.vendor.model.PurchaseOrder;
import com.ecep.contract.vo.ContractItemVo;
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;
@@ -15,38 +11,31 @@ 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.domain.Sort;
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.SpringApp;
import com.ecep.contract.ds.contract.repository.PurchaseOrderItemRepository;
import com.ecep.contract.ds.other.service.InventoryService;
import com.ecep.contract.ds.vendor.model.PurchaseOrder;
import com.ecep.contract.ds.vendor.model.PurchaseOrderItem;
import com.ecep.contract.service.ServiceException;
import com.ecep.contract.service.VoableService;
import com.ecep.contract.util.SpecificationUtils;
import com.ecep.contract.vo.PurchaseOrderItemVo;
import com.fasterxml.jackson.databind.JsonNode;
@Lazy
@Service
@CacheConfig(cacheNames = "contract-purchase-order-item")
public class PurchaseOrderItemService implements IEntityService<PurchaseOrderItem>, QueryService<PurchaseOrderItemVo>,
public class PurchaseOrderItemService extends EntityService<PurchaseOrderItem, PurchaseOrderItemVo, Integer> implements IEntityService<PurchaseOrderItem>, QueryService<PurchaseOrderItemVo>,
VoableService<PurchaseOrderItem, PurchaseOrderItemVo> {
private static final Logger logger = LoggerFactory.getLogger(PurchaseOrderItemService.class);
@Lazy
@Autowired
private PurchaseOrderItemRepository repository;
@Override
public PurchaseOrderItem getById(Integer id) {
return repository.findById(id).orElse(null);
}
@Cacheable(key = "#p0")
@Override
public PurchaseOrderItemVo findById(Integer id) {
@@ -62,59 +51,13 @@ public class PurchaseOrderItemService implements IEntityService<PurchaseOrderIte
while (list.size() > 1) {
PurchaseOrderItem item = list.removeLast();
repository.delete(item);
if (logger.isInfoEnabled()) {
logger.info("Duplicate PurchaseOrderItem, Delete {}", item);
}
}
return list.getFirst().toVo();
}
@Override
public Specification<PurchaseOrderItem> getSearchSpecification(String searchText) {
if (!StringUtils.hasText(searchText)) {
return null;
}
return (root, query, builder) -> {
return builder.or(builder.like(root.get("description"), "%" + searchText + "%"));
};
}
@Override
public Page<PurchaseOrderItem> findAll(Specification<PurchaseOrderItem> spec, Pageable pageable) {
return repository.findAll(spec, pageable);
}
@Override
public Page<PurchaseOrderItemVo> findAll(JsonNode paramsNode, Pageable pageable) {
Specification<PurchaseOrderItem> spec = null;
if (paramsNode.has("searchText")) {
spec = getSearchSpecification(paramsNode.get("searchText").asText());
}
// field
spec = SpecificationUtils.andParam(spec, paramsNode, "order", "inventory", "contractItem");
// if (paramsNode.has("contractItem")) {
// ContractItemService itemService = SpringApp.getBean(ContractItemService.class);
// var contractItem = itemService.findById(paramsNode.get("contractItem").asInt());
//
// if (contractItem.getInventoryId() == null) {
// spec = SpecificationUtils.and(spec, (root, query, builder) -> {
// return builder.and(
// builder.equal(root.get("order").get("contract").get("id"), contractItem.getContractId()),
// builder.equal(root.get("inventory").get("id"), null)
// );
// });
// } else {
// spec = SpecificationUtils.and(spec, (root, query, builder) -> {
// return builder.and(
// builder.equal(root.get("order").get("contract").get("id"), contractItem.getContractId()),
// builder.equal(root.get("inventory").get("id"), contractItem.getInventoryId())
// );
// });
// }
// }
return findAll(spec, pageable).map(PurchaseOrderItem::toVo);
return super.findAll(paramsNode, pageable);
}
@Caching(evict = {
@@ -134,10 +77,6 @@ public class PurchaseOrderItemService implements IEntityService<PurchaseOrderIte
return repository.save(entity);
}
public List<PurchaseOrderItem> findAll(Specification<PurchaseOrderItem> spec, Sort sort) {
return repository.findAll(spec, sort);
}
@Override
public void updateByVo(PurchaseOrderItem model, PurchaseOrderItemVo vo) {
if (model == null) {
@@ -183,4 +122,26 @@ public class PurchaseOrderItemService implements IEntityService<PurchaseOrderIte
public List<PurchaseOrderItem> findAllByOrder(PurchaseOrder order) {
return repository.findAllByOrder(order);
}
}
@Override
protected PurchaseOrderItemRepository getRepository() {
return repository;
}
@Override
public PurchaseOrderItem createNewEntity() {
return new PurchaseOrderItem();
}
@Override
protected Specification<PurchaseOrderItem> buildSearchSpecification(String searchText) {
return (root, query, builder) -> {
return builder.or(builder.like(root.get("description"), "%" + searchText + "%"));
};
}
@Override
protected Specification<PurchaseOrderItem> buildParameterSpecification(JsonNode paramsNode) {
throw new UnsupportedOperationException("Unimplemented method 'buildParameterSpecification'");
}
}

View File

@@ -3,8 +3,6 @@ package com.ecep.contract.ds.contract.service;
import java.util.List;
import com.ecep.contract.vo.ContractVo;
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;
@@ -13,10 +11,10 @@ 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.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;
@@ -26,7 +24,6 @@ import com.ecep.contract.ds.contract.model.Contract;
import com.ecep.contract.ds.vendor.model.PurchaseOrder;
import com.ecep.contract.service.ServiceException;
import com.ecep.contract.service.VoableService;
import com.ecep.contract.util.SpecificationUtils;
import com.ecep.contract.vo.PurchaseOrderVo;
import com.fasterxml.jackson.databind.JsonNode;
@@ -36,31 +33,32 @@ import com.fasterxml.jackson.databind.JsonNode;
@Lazy
@Service
@CacheConfig(cacheNames = "contract-purchase-order")
public class PurchaseOrdersService implements IEntityService<PurchaseOrder>, QueryService<PurchaseOrderVo>,
public class PurchaseOrdersService extends EntityService<PurchaseOrder, PurchaseOrderVo, Integer>
implements IEntityService<PurchaseOrder>, QueryService<PurchaseOrderVo>,
VoableService<PurchaseOrder, PurchaseOrderVo> {
private static final Logger logger = LoggerFactory.getLogger(PurchaseOrdersService.class);
@Lazy
@Autowired
private PurchaseOrderRepository repository;
@Lazy
@Autowired
private EmployeeService employeeService;
@Override
public PurchaseOrder getById(Integer id) {
return repository.findById(id).orElse(null);
protected PurchaseOrderRepository getRepository() {
return repository;
}
@Override
@Cacheable(key = "#p0")
@Override
public PurchaseOrderVo findById(Integer id) {
return repository.findById(id).map(PurchaseOrder::toVo).orElse(null);
}
@Override
public Specification<PurchaseOrder> getSearchSpecification(String searchText) {
public PurchaseOrder createNewEntity() {
return new PurchaseOrder();
}
@Override
protected Specification<PurchaseOrder> buildSearchSpecification(String searchText) {
return (root, query, builder) -> {
return builder.or(
builder.like(root.get("code"), "%" + searchText + "%"),
@@ -108,31 +106,9 @@ public class PurchaseOrdersService implements IEntityService<PurchaseOrder>, Que
repository.delete(order);
}
public long count() {
return repository.count();
}
public long count(Specification<PurchaseOrder> spec) {
return repository.count(spec);
}
@Override
public Page<PurchaseOrder> findAll(Specification<PurchaseOrder> spec, Pageable pageable) {
return repository.findAll(spec, pageable);
}
@Override
public Page<PurchaseOrderVo> findAll(JsonNode paramsNode, Pageable pageable) {
Specification<PurchaseOrder> spec = null;
if (paramsNode.has("searchText")) {
spec = getSearchSpecification(paramsNode.get("searchText").asText());
}
spec = SpecificationUtils.andParam(spec, paramsNode, "contract");
return findAll(spec, pageable).map(PurchaseOrder::toVo);
}
public List<PurchaseOrder> findAll(Specification<PurchaseOrder> spec, Sort sort) {
return repository.findAll(spec, sort);
protected Specification<PurchaseOrder> buildParameterSpecification(JsonNode paramsNode) {
throw new UnsupportedOperationException("Unimplemented method 'buildParameterSpecification'");
}
public List<PurchaseOrder> findAllByContract(Contract contract) {
@@ -143,15 +119,6 @@ public class PurchaseOrdersService implements IEntityService<PurchaseOrder>, Que
return repository.findAllByContractId(contract.getId());
}
public List<PurchaseOrder> search(String searchText) {
Specification<PurchaseOrder> spec = (root, query, builder) -> {
return builder.or(
builder.like(root.get("name"), "%" + searchText + "%"),
builder.like(root.get("code"), "%" + searchText + "%"));
};
return repository.findAll(spec, Pageable.ofSize(10)).getContent();
}
@Override
public void updateByVo(PurchaseOrder model, PurchaseOrderVo vo) {
if (model == null || vo == null) {

View File

@@ -1,19 +1,15 @@
package com.ecep.contract.ds.contract.service;
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.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;
import com.ecep.contract.EntityService;
import com.ecep.contract.IEntityService;
import com.ecep.contract.QueryService;
import com.ecep.contract.ds.contract.repository.SalesBillVoucherItemRepository;
@@ -25,50 +21,19 @@ import com.fasterxml.jackson.databind.JsonNode;
@Lazy
@Service
@CacheConfig(cacheNames = "sales-bill-voucher-item")
public class SalesBillVoucherItemService
public class SalesBillVoucherItemService extends EntityService<SalesBillVoucherItem, SalesBillVoucherItemVo, Integer>
implements IEntityService<SalesBillVoucherItem>, QueryService<SalesBillVoucherItemVo>,
VoableService<SalesBillVoucherItem, SalesBillVoucherItemVo> {
@Lazy
@Autowired
private SalesBillVoucherItemRepository repository;
@Override
public SalesBillVoucherItem getById(Integer id) {
return repository.findById(id).orElse(null);
}
@Cacheable(key = "#p0")
@Override
public SalesBillVoucherItemVo findById(Integer id) {
return repository.findById(id).map(SalesBillVoucherItem::toVo).orElse(null);
}
@Override
public Specification<SalesBillVoucherItem> getSearchSpecification(String searchText) {
return (root, query, builder) -> {
return builder.or(
builder.like(root.get("description"), "%" + searchText + "%"));
};
}
@Override
public Page<SalesBillVoucherItem> findAll(Specification<SalesBillVoucherItem> spec, Pageable pageable) {
return repository.findAll(spec, pageable);
}
public List<SalesBillVoucherItem> findAll(Specification<SalesBillVoucherItem> spec, Sort sort) {
return repository.findAll(spec, sort);
}
@Override
public Page<SalesBillVoucherItemVo> findAll(JsonNode paramsNode, Pageable pageable) {
Specification<SalesBillVoucherItem> spec = null;
if (paramsNode.has("searchText")) {
spec = getSearchSpecification(paramsNode.get("searchText").asText());
}
return findAll(spec, pageable).map(SalesBillVoucherItem::toVo);
}
@Caching(evict = {
@CacheEvict(key = "'item-'+#p0.id")
})
@@ -85,12 +50,26 @@ public class SalesBillVoucherItemService
return repository.save(entity);
}
public long countItems() {
return repository.count();
@Override
protected SalesBillVoucherItemRepository getRepository() {
return repository;
}
public long countItems(Specification<SalesBillVoucherItem> spec) {
return repository.count(spec);
@Override
public SalesBillVoucherItem createNewEntity() {
return new SalesBillVoucherItem();
}
@Override
protected Specification<SalesBillVoucherItem> buildSearchSpecification(String searchText) {
return (root, query, builder) -> {
return builder.or(builder.like(root.get("description"), "%" + searchText + "%"));
};
}
@Override
protected Specification<SalesBillVoucherItem> buildParameterSpecification(JsonNode paramsNode) {
throw new UnsupportedOperationException("Unimplemented method 'buildParameterSpecification'");
}
@Override
@@ -103,4 +82,5 @@ public class SalesBillVoucherItemService
model.setPrice(vo.getPrice());
model.setDescription(vo.getDescription());
}
}

View File

@@ -2,24 +2,26 @@ package com.ecep.contract.ds.customer.repository;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import com.ecep.contract.ds.MyRepository;
import com.ecep.contract.ds.customer.model.CompanyCustomer;
import com.ecep.contract.ds.customer.model.CompanyCustomerEvaluationFormFile;
import com.ecep.contract.ds.customer.model.CompanyCustomerFile;
@Repository
public interface CompanyCustomerEvaluationFormFileRepository extends JpaRepository<CompanyCustomerEvaluationFormFile, Integer>, JpaSpecificationExecutor<CompanyCustomerEvaluationFormFile> {
public interface CompanyCustomerEvaluationFormFileRepository
extends MyRepository<CompanyCustomerEvaluationFormFile, Integer> {
List<CompanyCustomerEvaluationFormFile> findAllByCustomerFileCustomer(@Param("customer") CompanyCustomer customer);
@Query(value = "SELECT * FROM COMPANY_CUSTOMER_FILE ccf left join COMPANY_CUSTOMER_EVALUATION_FORM_FILE CCEFF on ccf.ID = CCEFF.ID " +
@Query(value = "SELECT * FROM COMPANY_CUSTOMER_FILE ccf left join COMPANY_CUSTOMER_EVALUATION_FORM_FILE CCEFF on ccf.ID = CCEFF.ID "
+
"where ccf.CUSTOMER_ID=:customer and ccf.TYPE=:fileType", nativeQuery = true)
List<CompanyCustomerEvaluationFormFile> findAllByCustomerAndType(@Param("customer") int companyCustomerId, @Param("fileType") String type);
List<CompanyCustomerEvaluationFormFile> findAllByCustomerAndType(@Param("customer") int companyCustomerId,
@Param("fileType") String type);
CompanyCustomerEvaluationFormFile findByCustomerFile(CompanyCustomerFile customerFile);
}

View File

@@ -12,23 +12,25 @@ 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.EntityService;
import com.ecep.contract.IEntityService;
import com.ecep.contract.QueryService;
import com.ecep.contract.ds.MyRepository;
import com.ecep.contract.ds.customer.repository.CompanyCustomerEntityRepository;
import com.ecep.contract.ds.other.service.EmployeeService;
import com.ecep.contract.ds.customer.model.CompanyCustomer;
import com.ecep.contract.ds.customer.model.CompanyCustomerEntity;
import com.ecep.contract.service.VoableService;
import com.ecep.contract.util.SpecificationUtils;
import com.ecep.contract.vo.CompanyCustomerEntityVo;
import com.fasterxml.jackson.databind.JsonNode;
@Lazy
@Service
@CacheConfig(cacheNames = "company-customer-entity")
public class CompanyCustomerEntityService implements IEntityService<CompanyCustomerEntity>, QueryService<CompanyCustomerEntityVo>, VoableService<CompanyCustomerEntity, CompanyCustomerEntityVo> {
public class CompanyCustomerEntityService extends EntityService<CompanyCustomerEntity, CompanyCustomerEntityVo, Integer>
implements IEntityService<CompanyCustomerEntity>, QueryService<CompanyCustomerEntityVo>,
VoableService<CompanyCustomerEntity, CompanyCustomerEntityVo> {
@Lazy
@Autowired
private CompanyCustomerEntityRepository repository;
@@ -42,11 +44,6 @@ public class CompanyCustomerEntityService implements IEntityService<CompanyCusto
@Autowired
private EmployeeService employeeService;
@Override
public CompanyCustomerEntity getById(Integer id) {
return repository.findById(id).orElse(null);
}
@Cacheable(key = "#p0")
@Override
public CompanyCustomerEntityVo findById(Integer id) {
@@ -54,13 +51,6 @@ public class CompanyCustomerEntityService implements IEntityService<CompanyCusto
}
@Override
public Specification<CompanyCustomerEntity> getSearchSpecification(String searchText) {
if (!StringUtils.hasText(searchText)) {
return null;
}
return SpecificationUtils.andWith(searchText, this::buildSearchSpecification);
}
protected Specification<CompanyCustomerEntity> buildSearchSpecification(String searchText) {
return (root, query, builder) -> {
return builder.or(
@@ -70,25 +60,9 @@ public class CompanyCustomerEntityService implements IEntityService<CompanyCusto
};
}
public List<CompanyCustomerEntity> search(String searchText) {
Specification<CompanyCustomerEntity> spec = getSearchSpecification(searchText);
return repository.findAll(spec, Pageable.ofSize(10)).getContent();
}
@Override
public Page<CompanyCustomerEntity> findAll(Specification<CompanyCustomerEntity> spec, Pageable pageable) {
return repository.findAll(spec, pageable);
}
@Override
public Page<CompanyCustomerEntityVo> findAll(JsonNode paramsNode, Pageable pageable) {
Specification<CompanyCustomerEntity> spec = null;
if (paramsNode.has("searchText")) {
spec = getSearchSpecification(paramsNode.get("searchText").asText());
}
// field
spec = SpecificationUtils.andParam(spec, paramsNode, "customer");
return findAll(spec, pageable).map(CompanyCustomerEntity::toVo);
protected Specification<CompanyCustomerEntity> buildParameterSpecification(JsonNode paramsNode) {
throw new UnsupportedOperationException("Unimplemented method 'buildParameterSpecification'");
}
@Caching(evict = {
@@ -126,6 +100,16 @@ public class CompanyCustomerEntityService implements IEntityService<CompanyCusto
repository.saveAll(entities);
}
@Override
protected MyRepository<CompanyCustomerEntity, Integer> getRepository() {
return repository;
}
@Override
public CompanyCustomerEntity createNewEntity() {
return new CompanyCustomerEntity();
}
@Override
public void updateByVo(CompanyCustomerEntity entity, CompanyCustomerEntityVo vo) {
// 优化关联实体处理逻辑 - 客户关联

View File

@@ -3,12 +3,9 @@ package com.ecep.contract.ds.customer.service;
import java.util.List;
import com.ecep.contract.constant.ParamConstant;
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.cache.annotation.Caching;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.domain.Page;
@@ -16,9 +13,11 @@ import org.springframework.data.domain.Pageable;
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.repository.CompanyCustomerEvaluationFormFileRepository;
import com.ecep.contract.ds.customer.model.CompanyCustomer;
import com.ecep.contract.ds.customer.model.CompanyCustomerEvaluationFormFile;
@@ -33,30 +32,31 @@ import com.fasterxml.jackson.databind.JsonNode;
@Service
@CacheConfig(cacheNames = "company-customer-evaluation-form-file")
public class CompanyCustomerEvaluationFormFileService
implements IEntityService<CompanyCustomerEvaluationFormFile>, QueryService<CompanyCustomerEvaluationFormFile>,
extends EntityService<CompanyCustomerEvaluationFormFile, CompanyCustomerEvaluationFormFileVo, Integer>
implements IEntityService<CompanyCustomerEvaluationFormFile>, QueryService<CompanyCustomerEvaluationFormFileVo>,
VoableService<CompanyCustomerEvaluationFormFile, CompanyCustomerEvaluationFormFileVo> {
private static final Logger logger = LoggerFactory.getLogger(CompanyCustomerEvaluationFormFileService.class);
@Lazy
@Autowired
private CompanyCustomerEvaluationFormFileRepository repository;
@Override
public CompanyCustomerEvaluationFormFile getById(Integer id) {
return repository.findById(id).orElse(null);
}
@Cacheable(key = "#p0")
@Override
public CompanyCustomerEvaluationFormFile findById(Integer id) {
return getById(id);
protected CompanyCustomerEvaluationFormFileRepository getRepository() {
return repository;
}
@Override
public Specification<CompanyCustomerEvaluationFormFile> getSearchSpecification(String searchText) {
if (!org.springframework.util.StringUtils.hasText(searchText)) {
return null;
}
public CompanyCustomerEvaluationFormFileVo findById(Integer id) {
return repository.findById(id).map(CompanyCustomerEvaluationFormFile::toVo).orElse(null);
}
@Override
public CompanyCustomerEvaluationFormFile createNewEntity() {
return new CompanyCustomerEvaluationFormFile();
}
@Override
protected Specification<CompanyCustomerEvaluationFormFile> buildSearchSpecification(String searchText) {
return (root, query, builder) -> {
var customerFile = root.get("customerFile");
return builder.or(
@@ -64,8 +64,7 @@ public class CompanyCustomerEvaluationFormFileService
builder.like(root.get("level"), "%" + searchText + "%"),
builder.and(
customerFile.isNotNull(),
builder.like(customerFile.get("filePath"), "%" + searchText + "%")
));
builder.like(customerFile.get("filePath"), "%" + searchText + "%")));
};
}
@@ -86,31 +85,23 @@ public class CompanyCustomerEvaluationFormFileService
}
@Override
public Page<CompanyCustomerEvaluationFormFile> findAll(Specification<CompanyCustomerEvaluationFormFile> spec,
Pageable pageable) {
return repository.findAll(spec, pageable);
}
@Override
public Page<CompanyCustomerEvaluationFormFile> findAll(JsonNode paramsNode, Pageable pageable) {
protected Specification<CompanyCustomerEvaluationFormFile> buildParameterSpecification(JsonNode paramsNode) {
Specification<CompanyCustomerEvaluationFormFile> spec = null;
if (paramsNode.has(ParamConstant.KEY_SEARCH_TEXT)) {
spec = getSearchSpecification(paramsNode.get(ParamConstant.KEY_SEARCH_TEXT).asText());
}
if (paramsNode.has("customer")) {
spec = SpecificationUtils.and(spec,
(root, query, builder) -> builder.equal(root.get("customerFile").get("customer").get("id"), paramsNode.get("customer").asInt()));
(root, query, builder) -> builder.equal(root.get("customerFile").get("customer").get("id"),
paramsNode.get("customer").asInt()));
}
if (paramsNode.has("company")) {
spec = SpecificationUtils.and(spec,
(root, query, builder) -> builder.equal(root.get("customerFile").get("customer").get("company").get("id"), paramsNode.get("company").asInt()));
(root, query, builder) -> builder.equal(
root.get("customerFile").get("customer").get("company").get("id"),
paramsNode.get("company").asInt()));
}
spec = SpecificationUtils.andParam(spec, paramsNode, "customerFile");
spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "catalog", "level");
return findAll(spec, pageable);
return spec;
}
/**
@@ -178,4 +169,5 @@ public class CompanyCustomerEvaluationFormFileService
}
}
}
}

View File

@@ -29,16 +29,16 @@
| ContractService | 是 |
| ContractTypeService | 是 |
| ExtendVendorInfoService | 是 |
| PurchaseBillVoucherItemService | |
| PurchaseBillVoucherService | |
| PurchaseOrderItemService | |
| PurchaseOrdersService | |
| PurchaseBillVoucherItemService | |
| PurchaseBillVoucherService | |
| PurchaseOrderItemService | |
| PurchaseOrdersService | |
| SaleOrdersService | 是 |
| SalesBillVoucherItemService | |
| SalesBillVoucherItemService | |
| SalesBillVoucherService | 是 |
| SalesOrderItemService | 是 |
| CompanyCustomerEntityService | |
| CompanyCustomerEvaluationFormFileService | |
| CompanyCustomerEntityService | |
| CompanyCustomerEvaluationFormFileService | |
| CompanyCustomerFileService | 否 |
| CompanyCustomerFileTypeService | 否 |
| CustomerCatalogService | 否 |