Compare commits

...

6 Commits

Author SHA1 Message Date
643338f4b0 refactor(WebSocketServerCallbackManager): 使用常量替换硬编码的方法名
将硬编码的方法名替换为ServiceConstant中定义的常量,提高代码可维护性和可读性
2025-12-17 17:01:08 +08:00
880671a5a9 refactor: 使用常量替换硬编码方法名并优化参数构建
- 在ServiceConstant中添加常用方法名常量
- 使用ParamUtils重构多处参数构建逻辑
- 统一QueryService中的方法名调用为常量
- 修复CompanyOldNameService中的字段别名问题
2025-12-17 16:56:45 +08:00
4e738bea3c refactor: 移除冗余方法并优化查询逻辑
移除多个服务类中重复的findAll方法实现,统一使用父类方法
优化QueryService的findOneByProperty实现,提高可读性
为EntityService添加aliasFor方法支持字段别名
修复ContractVerifyWindowController的消息处理逻辑
添加查看验证状态的功能菜单项
2025-12-15 00:04:32 +08:00
3cf3a717be refactor(service): 移除冗余的getById方法
多个服务类中移除了重复的getById方法实现
2025-12-14 17:12:36 +08:00
e8c8305f40 refactor(vendor): 移除冗余方法并统一继承EntityService
重构供应商相关服务类,移除重复的getById等方法,统一继承EntityService基类
更新文档中的服务类检查状态
2025-12-14 16:36:11 +08:00
be63ff62a4 refactor(service): 重构多个服务类继承EntityService基类
重构多个服务类使其继承EntityService基类,统一实现基础CRUD操作
移除重复的findAll、getById等方法实现
添加缓存注解确保一致性
更新服务类文档说明继承关系
2025-12-14 15:54:21 +08:00
48 changed files with 592 additions and 742 deletions

View File

@@ -12,6 +12,9 @@ import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level; import java.util.logging.Level;
import javafx.scene.Node;
import javafx.scene.control.*;
import org.controlsfx.control.PopOver;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -50,13 +53,6 @@ import javafx.collections.ObservableList;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
import javafx.scene.control.Button;
import javafx.scene.control.CheckMenuItem;
import javafx.scene.control.DatePicker;
import javafx.scene.control.Label;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.HBox; import javafx.scene.layout.HBox;
import javafx.stage.FileChooser; import javafx.stage.FileChooser;
import javafx.stage.Modality; import javafx.stage.Modality;
@@ -79,6 +75,7 @@ public class ContractVerifyWindowController extends BaseController {
return super.show(loader, owner, modality); return super.show(loader, owner, modality);
} }
@Setter @Setter
@Getter @Getter
public static class MessageExt extends Message { public static class MessageExt extends Message {
@@ -90,12 +87,16 @@ public class ContractVerifyWindowController extends BaseController {
} }
@Data @Data
public static class Model implements MessageHolder { public static class Model {
private SimpleStringProperty code = new SimpleStringProperty(); private SimpleStringProperty code = new SimpleStringProperty();
private SimpleStringProperty name = new SimpleStringProperty(); private SimpleStringProperty name = new SimpleStringProperty();
private SimpleObjectProperty<Integer> employee = new SimpleObjectProperty<>(); private SimpleObjectProperty<Integer> employee = new SimpleObjectProperty<>();
private SimpleObjectProperty<LocalDate> setupDate = new SimpleObjectProperty<>(); private SimpleObjectProperty<LocalDate> setupDate = new SimpleObjectProperty<>();
private SimpleListProperty<MessageExt> messages = new SimpleListProperty<>(FXCollections.observableArrayList()); private SimpleListProperty<MessageExt> messages = new SimpleListProperty<>(FXCollections.observableArrayList());
}
static class MessageHolderImpl implements MessageHolder {
List<MessageExt> messages = new ArrayList<>();
@Override @Override
public void addMessage(Level level, String message) { public void addMessage(Level level, String message) {
@@ -261,6 +262,8 @@ public class ContractVerifyWindowController extends BaseController {
long total = contractService.count(params); long total = contractService.count(params);
setStatus("合同:" + total + ""); setStatus("合同:" + total + "");
MessageHolderImpl messageHolder = new MessageHolderImpl();
while (true) { while (true) {
if (isCloseRequested()) { if (isCloseRequested()) {
break; break;
@@ -268,6 +271,7 @@ public class ContractVerifyWindowController extends BaseController {
Page<ContractVo> page = contractService.findAll(params, pageRequest); Page<ContractVo> page = contractService.findAll(params, pageRequest);
for (ContractVo contract : page) { for (ContractVo contract : page) {
messageHolder.messages.clear();
if (isCloseRequested()) { if (isCloseRequested()) {
break; break;
} }
@@ -285,11 +289,11 @@ public class ContractVerifyWindowController extends BaseController {
model.getName().set(contract.getName()); model.getName().set(contract.getName());
model.getSetupDate().set(contract.getSetupDate()); model.getSetupDate().set(contract.getSetupDate());
comm.verify(contract, model); comm.verify(contract, messageHolder);
setStatus("合同验证进度:" + counter.get() + " / " + total); setStatus("合同验证进度:" + counter.get() + " / " + total);
// 移除中间消息 // 移除中间消息
if (!model.getMessages().isEmpty()) { if (!messageHolder.messages.isEmpty()) {
model.getMessages().removeIf(msg -> msg.getLevel().intValue() <= Level.INFO.intValue()); model.getMessages().setAll(messageHolder.messages.stream().filter(msg -> msg.getLevel().intValue() > Level.INFO.intValue()).limit(50).toList());
} }
if (model.getMessages().isEmpty()) { if (model.getMessages().isEmpty()) {
if (onlyShowVerifiedChecker.isSelected()) { if (onlyShowVerifiedChecker.isSelected()) {
@@ -325,6 +329,7 @@ public class ContractVerifyWindowController extends BaseController {
} }
runAsync(() -> { runAsync(() -> {
ContractVo contract = null; ContractVo contract = null;
MessageHolderImpl messageHolder = new MessageHolderImpl();
try { try {
contract = contractService.findByCode(contractCode); contract = contractService.findByCode(contractCode);
} catch (Exception e) { } catch (Exception e) {
@@ -336,17 +341,18 @@ public class ContractVerifyWindowController extends BaseController {
} }
model.getMessages().clear(); model.getMessages().clear();
try { try {
comm.verify(contract, model); comm.verify(contract, messageHolder);
// 移除中间消息
if (!model.getMessages().isEmpty()) {
model.getMessages().removeIf(msg -> msg.getLevel().intValue() <= Level.INFO.intValue());
}
} catch (Exception e) { } catch (Exception e) {
logger.error(model.getCode().get(), e); logger.error(model.getCode().get(), e);
model.error(e.getMessage()); messageHolder.error(e.getMessage());
} }
if (model.getMessages().isEmpty()) { // 移除中间消息
if (!messageHolder.messages.isEmpty()) {
model.getMessages().setAll(messageHolder.messages.stream().filter(msg -> msg.getLevel().intValue() > Level.INFO.intValue()).limit(50).toList());
}
if (messageHolder.messages.isEmpty()) {
Platform.runLater(() -> { Platform.runLater(() -> {
viewTableDataSet.remove(model); viewTableDataSet.remove(model);
}); });
@@ -380,6 +386,38 @@ public class ContractVerifyWindowController extends BaseController {
ContractWindowController.show(contract, viewTable.getScene().getWindow()); ContractWindowController.show(contract, viewTable.getScene().getWindow());
} }
public void onShowVerifyStatusAction(ActionEvent event) {
// 在新新窗口中显示 状态消息 Model# messages
Model selectedItem = viewTable.getSelectionModel().getSelectedItem();
if (selectedItem == null) {
return;
}
ListView<MessageExt> listView = new ListView<>();
listView.setItems(selectedItem.messages);
listView.setCellFactory(v -> new ListCell<>() {
@Override
protected void updateItem(MessageExt item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setText(null);
setGraphic(null);
} else {
setText(item.getMessage());
setGraphic(new Label(item.getPrefix()));
}
}
});
PopOver popOver = new PopOver(listView);
popOver.setArrowLocation(PopOver.ArrowLocation.TOP_LEFT);
MenuItem menuItem = (MenuItem) event.getSource();
Node node = viewTable.lookup(".table-row-cell:selected");
popOver.show(node);
}
public void onExportVerifyResultAsFileAction(ActionEvent e) { public void onExportVerifyResultAsFileAction(ActionEvent e) {
FileChooser chooser = new FileChooser(); FileChooser chooser = new FileChooser();
chooser.setTitle("导出核验结果"); chooser.setTitle("导出核验结果");

View File

@@ -2,7 +2,9 @@ package com.ecep.contract.controller.employee;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import com.ecep.contract.util.ParamUtils;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import com.ecep.contract.controller.tab.TabSkin; import com.ecep.contract.controller.tab.TabSkin;
@@ -48,7 +50,7 @@ public class EmployeeTabSkinRole
private void initializeListView() { private void initializeListView() {
// 非系统内置账户 // 非系统内置账户
HashMap<String, Object> params = new HashMap<>(); Map<String, Object> params = ParamUtils.builder().build();
List<EmployeeRoleVo> roles = getEmployeeRoleService().findAll(params, Pageable.ofSize(500)).getContent(); List<EmployeeRoleVo> roles = getEmployeeRoleService().findAll(params, Pageable.ofSize(500)).getContent();
controller.rolesField.getSourceItems().setAll(roles); controller.rolesField.getSourceItems().setAll(roles);

View File

@@ -39,13 +39,13 @@ public class CompanyCustomerFileTypeService
return super.findAll(); return super.findAll();
} }
@Caching(put = { @CachePut(key = "#p0.id"), @CachePut(key = "'all'") }) @Caching(put = {@CachePut(key = "#p0.id"), @CachePut(key = "'all'")})
@Override @Override
public CustomerFileTypeLocalVo save(CustomerFileTypeLocalVo entity) { public CustomerFileTypeLocalVo save(CustomerFileTypeLocalVo entity) {
return super.save(entity); return super.save(entity);
} }
@Caching(put = { @CachePut(key = "#p0.id"), @CachePut(key = "'all'") }) @Caching(put = {@CachePut(key = "#p0.id"), @CachePut(key = "'all'")})
@Override @Override
public void delete(CustomerFileTypeLocalVo entity) { public void delete(CustomerFileTypeLocalVo entity) {
super.delete(entity); super.delete(entity);
@@ -53,8 +53,7 @@ public class CompanyCustomerFileTypeService
@Cacheable @Cacheable
public Map<CustomerFileType, CustomerFileTypeLocalVo> findAll(Locale locale) { public Map<CustomerFileType, CustomerFileTypeLocalVo> findAll(Locale locale) {
Map<String, Object> params = new HashMap<>(); Map<String, Object> params = ParamUtils.builder().equals("lang", locale.toLanguageTag()).build();
params.put("lang", locale.toLanguageTag());
return findAll(params, Pageable.unpaged()).stream() return findAll(params, Pageable.unpaged()).stream()
.collect(Collectors.toMap(CustomerFileTypeLocalVo::getType, Function.identity())); .collect(Collectors.toMap(CustomerFileTypeLocalVo::getType, Function.identity()));
} }
@@ -66,7 +65,7 @@ public class CompanyCustomerFileTypeService
/** /**
* 根据语言标签和参数查找单个 CustomerFileTypeLocalVo 对象 * 根据语言标签和参数查找单个 CustomerFileTypeLocalVo 对象
* *
* @param locale 语言区域 * @param locale 语言区域
* @param key 参数键 * @param key 参数键
* @param value 参数值 * @param value 参数值

View File

@@ -1,5 +1,6 @@
package com.ecep.contract.service; package com.ecep.contract.service;
import com.ecep.contract.util.ParamUtils;
import com.ecep.contract.vm.CompanyInvoiceInfoViewModel; import com.ecep.contract.vm.CompanyInvoiceInfoViewModel;
import com.ecep.contract.vo.CompanyInvoiceInfoVo; import com.ecep.contract.vo.CompanyInvoiceInfoVo;
import com.ecep.contract.vo.CompanyVo; import com.ecep.contract.vo.CompanyVo;
@@ -15,9 +16,8 @@ import java.util.Map;
public class CompanyInvoiceInfoService extends QueryService<CompanyInvoiceInfoVo, CompanyInvoiceInfoViewModel> { public class CompanyInvoiceInfoService extends QueryService<CompanyInvoiceInfoVo, CompanyInvoiceInfoViewModel> {
public List<CompanyInvoiceInfoVo> searchByCompany(CompanyVo company, String searchText) { public List<CompanyInvoiceInfoVo> searchByCompany(CompanyVo company, String searchText) {
Map<String, Object> params = new HashMap<>(); Map<String, Object> params = ParamUtils.builder().equals("company", company.getId())
params.put("company", company); .search(searchText).build();
params.put("searchText", searchText);
return findAll(params, Pageable.unpaged()).getContent(); return findAll(params, Pageable.unpaged()).getContent();
} }
} }

View File

@@ -7,6 +7,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import com.ecep.contract.SpringApp; import com.ecep.contract.SpringApp;
import com.ecep.contract.util.ParamUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
@@ -58,8 +59,7 @@ public class CompanyService extends QueryService<CompanyVo, CompanyViewModel> {
} }
public List<CompanyVo> findAllByName(String name) { public List<CompanyVo> findAllByName(String name) {
Map<String, Object> params = new HashMap<>(); Map<String, Object> params = ParamUtils.builder().equals("name", name).build();
params.put("name", name);
return findAll(params, Pageable.unpaged()).getContent(); return findAll(params, Pageable.unpaged()).getContent();
} }

View File

@@ -13,6 +13,12 @@ import com.ecep.contract.vo.ContractVo;
@Service @Service
public class ContractFileService extends QueryService<ContractFileVo, ContractFileViewModel> { public class ContractFileService extends QueryService<ContractFileVo, ContractFileViewModel> {
@Override
public ContractFileVo findById(Integer id) {
return super.findById(id);
}
public List<ContractFileVo> findAllByContract(ContractVo contract) { public List<ContractFileVo> findAllByContract(ContractVo contract) {
return findAll(ParamUtils.equal("contract", contract.getId()), Pageable.unpaged()).getContent(); return findAll(ParamUtils.equal("contract", contract.getId()), Pageable.unpaged()).getContent();
} }

View File

@@ -26,11 +26,11 @@ public class ProjectSaleTypeService extends QueryService<ProjectSaleTypeVo, Proj
} }
public ProjectSaleTypeVo findByCode(String code) { public ProjectSaleTypeVo findByCode(String code) {
return findAll(ParamUtils.builder().equals("code", code).build(), Pageable.ofSize(1)).getContent().getFirst(); return findOneByProperty("code", code);
} }
public ProjectSaleTypeVo findByName(String name) { public ProjectSaleTypeVo findByName(String name) {
return findAll(ParamUtils.builder().equals("name", name).build(), Pageable.ofSize(1)).getContent().getFirst(); return findOneByProperty("name", name);
} }
@Caching(evict = {@CacheEvict(key = "#p0.id")}) @Caching(evict = {@CacheEvict(key = "#p0.id")})

View File

@@ -3,6 +3,7 @@ package com.ecep.contract.service;
import com.ecep.contract.PageArgument; import com.ecep.contract.PageArgument;
import com.ecep.contract.PageContent; import com.ecep.contract.PageContent;
import com.ecep.contract.WebSocketClientService; import com.ecep.contract.WebSocketClientService;
import com.ecep.contract.constant.ServiceConstant;
import com.ecep.contract.model.IdentityEntity; import com.ecep.contract.model.IdentityEntity;
import com.ecep.contract.model.NamedEntity; import com.ecep.contract.model.NamedEntity;
import com.ecep.contract.util.ParamUtils; import com.ecep.contract.util.ParamUtils;
@@ -67,7 +68,7 @@ public class QueryService<T extends IdentityEntity, TV extends IdentityViewModel
@Override @Override
public T save(T entity) { public T save(T entity) {
try { try {
return async("save", entity, entity.getClass().getName()).handle((response, ex) -> { return async(ServiceConstant.SAVE_METHOD_NAME, entity, entity.getClass().getName()).handle((response, ex) -> {
if (ex != null) { if (ex != null) {
throw new RuntimeException("保存实体失败", ex); throw new RuntimeException("保存实体失败", ex);
} }
@@ -88,7 +89,7 @@ public class QueryService<T extends IdentityEntity, TV extends IdentityViewModel
@Override @Override
public void delete(T entity) { public void delete(T entity) {
try { try {
async("delete", entity, entity.getClass().getName()).handle((response, ex) -> { async(ServiceConstant.DELETE_METHOD_NAME, entity, entity.getClass().getName()).handle((response, ex) -> {
if (ex != null) { if (ex != null) {
throw new RuntimeException("删除实体失败", ex); throw new RuntimeException("删除实体失败", ex);
} }
@@ -117,7 +118,7 @@ public class QueryService<T extends IdentityEntity, TV extends IdentityViewModel
} }
public CompletableFuture<T> asyncFindById(Integer id) { public CompletableFuture<T> asyncFindById(Integer id) {
return async("findById", id, Integer.class).handle((response, ex) -> { return async(ServiceConstant.FIND_BY_ID_METHOD_NAME, id, Integer.class).handle((response, ex) -> {
if (ex != null) { if (ex != null) {
throw new RuntimeException("查询实体失败", ex); throw new RuntimeException("查询实体失败", ex);
} }
@@ -149,7 +150,7 @@ public class QueryService<T extends IdentityEntity, TV extends IdentityViewModel
*/ */
public CompletableFuture<Page<T>> asyncFindAll(Map<String, Object> params, Pageable pageable) { public CompletableFuture<Page<T>> asyncFindAll(Map<String, Object> params, Pageable pageable) {
// 调用async方法发送WebSocket请求获取异步响应结果 // 调用async方法发送WebSocket请求获取异步响应结果
return async("findAll", params, PageArgument.of(pageable)).handle((response, ex) -> { return async(ServiceConstant.FIND_ALL_METHOD_NAME, params, PageArgument.of(pageable)).handle((response, ex) -> {
if (ex != null) { if (ex != null) {
throw new RuntimeException("远程方法+findAll+调用失败", ex); throw new RuntimeException("远程方法+findAll+调用失败", ex);
} }
@@ -188,8 +189,9 @@ public class QueryService<T extends IdentityEntity, TV extends IdentityViewModel
} }
public T findOneByProperty(String propertyName, Object propertyValue) { public T findOneByProperty(String propertyName, Object propertyValue) {
return findAll(ParamUtils.builder().equals(propertyName, propertyValue).build(), Pageable.ofSize(1)).stream() ParamUtils.Builder paramBuilder = ParamUtils.builder().equals(propertyName, propertyValue);
.findFirst().orElse(null); Page<T> page = findAll(paramBuilder.build(), Pageable.ofSize(1));
return page.stream().findFirst().orElse(null);
} }
/** /**
@@ -201,7 +203,7 @@ public class QueryService<T extends IdentityEntity, TV extends IdentityViewModel
public CompletableFuture<Long> asyncCount(Map<String, Object> params) { public CompletableFuture<Long> asyncCount(Map<String, Object> params) {
// 调用async方法执行名为"count"的异步操作传入参数params // 调用async方法执行名为"count"的异步操作传入参数params
// 使用handle方法处理异步操作的结果或异常 // 使用handle方法处理异步操作的结果或异常
return async("count", params).handle((response, ex) -> { return async(ServiceConstant.COUNT_METHOD_NAME, params).handle((response, ex) -> {
if (ex != null) { if (ex != null) {
throw new RuntimeException("远程方法+count+调用失败", ex); throw new RuntimeException("远程方法+count+调用失败", ex);
} }

View File

@@ -373,7 +373,10 @@ public class ContractVerifyComm implements BeanContext {
} }
CompanyVo company = getCompanyService().findById(bidVendor.getCompanyId()); CompanyVo company = getCompanyService().findById(bidVendor.getCompanyId());
ContractFileVo contractFile = fileService.findById(bidVendor.getQuotationSheetFileId()); ContractFileVo contractFile = null;
if (bidVendor.getQuotationSheetFileId() != null) {
contractFile = fileService.findById(bidVendor.getQuotationSheetFileId());
}
// 报价表文件不存在 // 报价表文件不存在
if (contractFile == null) { if (contractFile == null) {
if (requireQuotation && bidVendor.getCompanyId().equals(contract.getCompanyId())) { if (requireQuotation && bidVendor.getCompanyId().equals(contract.getCompanyId())) {

View File

@@ -105,9 +105,9 @@
<contextMenu> <contextMenu>
<ContextMenu> <ContextMenu>
<items> <items>
<MenuItem mnemonicParsing="false" onAction="#onShowContractDetailAction" <MenuItem mnemonicParsing="false" onAction="#onShowContractDetailAction" text="合同详情"/>
text="合同详情"/>
<MenuItem mnemonicParsing="false" onAction="#onContractReVerifyAction" text="重新验证"/> <MenuItem mnemonicParsing="false" onAction="#onContractReVerifyAction" text="重新验证"/>
<MenuItem mnemonicParsing="false" onAction="#onShowVerifyStatusAction" text="查看状态"/>
</items> </items>
</ContextMenu> </ContextMenu>
</contextMenu> </contextMenu>

View File

@@ -1,4 +1,9 @@
package com.ecep.contract.constant; package com.ecep.contract.constant;
public class ServiceConstant { public class ServiceConstant {
public static final String COUNT_METHOD_NAME = "count";
public static final String FIND_ALL_METHOD_NAME = "findAll";
public static final String FIND_BY_ID_METHOD_NAME = "findById";
public static final String DELETE_METHOD_NAME = "delete";
public static final String SAVE_METHOD_NAME = "save";
} }

View File

@@ -3,6 +3,7 @@ package com.ecep.contract;
import java.util.List; import java.util.List;
import com.ecep.contract.constant.ParamConstant; import com.ecep.contract.constant.ParamConstant;
import org.hibernate.query.sqm.tree.domain.SqmBasicValuedSimplePath;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
@@ -22,7 +23,7 @@ import lombok.extern.slf4j.Slf4j;
/** /**
* 实体服务基类 * 实体服务基类
* 提供基础的CRUD操作和查询方法 * 提供基础的CRUD操作和查询方法
* *
* @param <T> 实体类型 * @param <T> 实体类型
* @param <VO> VO类型 * @param <VO> VO类型
* @param <ID> 主键类型 * @param <ID> 主键类型
@@ -32,7 +33,7 @@ public abstract class EntityService<T extends Voable<VO>, VO, ID> {
/** /**
* 获取实体数据访问层接口 * 获取实体数据访问层接口
* 子类必须实现此方法,提供具体的实体数据访问层实例 * 子类必须实现此方法,提供具体的实体数据访问层实例
* *
* @return 实体数据访问层接口 * @return 实体数据访问层接口
*/ */
protected abstract MyRepository<T, ID> getRepository(); protected abstract MyRepository<T, ID> getRepository();
@@ -45,14 +46,14 @@ public abstract class EntityService<T extends Voable<VO>, VO, ID> {
* 创建新实体实例 * 创建新实体实例
* 设置默认值或必要的属性 * 设置默认值或必要的属性
* 实例是游离态的,未存储到数据库 * 实例是游离态的,未存储到数据库
* *
* @return 新实体实例 * @return 新实体实例
*/ */
public abstract T createNewEntity(); public abstract T createNewEntity();
/** /**
* 统计所有实体数量 * 统计所有实体数量
* *
* @return 实体数量 * @return 实体数量
*/ */
public long count() { public long count() {
@@ -61,7 +62,7 @@ public abstract class EntityService<T extends Voable<VO>, VO, ID> {
/** /**
* 根据查询规范统计实体数量 * 根据查询规范统计实体数量
* *
* @param spec 查询规范 * @param spec 查询规范
* @return 符合规范的实体数量 * @return 符合规范的实体数量
*/ */
@@ -71,7 +72,7 @@ public abstract class EntityService<T extends Voable<VO>, VO, ID> {
/** /**
* 根据JSON参数节点统计实体数量 * 根据JSON参数节点统计实体数量
* *
* @param paramsNode JSON参数节点 * @param paramsNode JSON参数节点
* @return 符合参数节点规范的实体数量 * @return 符合参数节点规范的实体数量
*/ */
@@ -81,7 +82,7 @@ public abstract class EntityService<T extends Voable<VO>, VO, ID> {
/** /**
* 保存实体到数据库 * 保存实体到数据库
* *
* @param entity 要保存的实体 * @param entity 要保存的实体
* @return 保存后的实体 * @return 保存后的实体
*/ */
@@ -91,7 +92,7 @@ public abstract class EntityService<T extends Voable<VO>, VO, ID> {
/** /**
* 删除实体 * 删除实体
* *
* @param entity 要删除的实体 * @param entity 要删除的实体
*/ */
public void delete(T entity) { public void delete(T entity) {
@@ -103,7 +104,7 @@ public abstract class EntityService<T extends Voable<VO>, VO, ID> {
/** /**
* 应用JSON参数节点到查询规范 * 应用JSON参数节点到查询规范
* *
* @param node JSON参数节点 * @param node JSON参数节点
* @return 应用参数节点后的查询规范 * @return 应用参数节点后的查询规范
*/ */
@@ -121,7 +122,7 @@ public abstract class EntityService<T extends Voable<VO>, VO, ID> {
/** /**
* 根据JSON参数节点查询所有实体 * 根据JSON参数节点查询所有实体
* *
* @param paramsNode JSON参数节点 * @param paramsNode JSON参数节点
* @param pageable 分页信息 * @param pageable 分页信息
* @return 符合参数节点规范的实体分页结果 * @return 符合参数节点规范的实体分页结果
@@ -132,7 +133,7 @@ public abstract class EntityService<T extends Voable<VO>, VO, ID> {
/** /**
* 根据查询规范查询所有实体 * 根据查询规范查询所有实体
* *
* @param spec 查询规范 * @param spec 查询规范
* @param pageable 分页信息 * @param pageable 分页信息
* @return 符合规范的实体分页结果 * @return 符合规范的实体分页结果
@@ -143,7 +144,7 @@ public abstract class EntityService<T extends Voable<VO>, VO, ID> {
/** /**
* 根据查询规范查询所有实体 * 根据查询规范查询所有实体
* *
* @param spec 查询规范 * @param spec 查询规范
* @param sort 排序信息 * @param sort 排序信息
* @return 符合规范的实体列表 * @return 符合规范的实体列表
@@ -154,7 +155,7 @@ public abstract class EntityService<T extends Voable<VO>, VO, ID> {
/** /**
* 根据搜索文本查询所有实体 * 根据搜索文本查询所有实体
* *
* @param searchText 搜索文本 * @param searchText 搜索文本
* @return 符合搜索文本规范的实体列表 * @return 符合搜索文本规范的实体列表
*/ */
@@ -165,7 +166,7 @@ public abstract class EntityService<T extends Voable<VO>, VO, ID> {
/** /**
* 根据搜索文本构建查询规范 * 根据搜索文本构建查询规范
* *
* @param searchText 搜索文本 * @param searchText 搜索文本
* @return 符合搜索文本规范的查询规范 * @return 符合搜索文本规范的查询规范
*/ */
@@ -178,7 +179,7 @@ public abstract class EntityService<T extends Voable<VO>, VO, ID> {
/** /**
* 构建搜索规范 * 构建搜索规范
* *
* @param searchText 搜索文本,非空 * @param searchText 搜索文本,非空
* @return 符合搜索文本规范的查询规范 * @return 符合搜索文本规范的查询规范
*/ */
@@ -186,7 +187,7 @@ public abstract class EntityService<T extends Voable<VO>, VO, ID> {
/** /**
* 构建过滤条件规范 * 构建过滤条件规范
* *
* @param filterNode 过滤条件节点 * @param filterNode 过滤条件节点
* @return 过滤条件规范 * @return 过滤条件规范
*/ */
@@ -226,6 +227,8 @@ public abstract class EntityService<T extends Voable<VO>, VO, ID> {
return null; return null;
} }
field = aliasFor(field, filterNode);
if (ParamConstant.KEY_equal.equals(operatorStr)) { if (ParamConstant.KEY_equal.equals(operatorStr)) {
return buildEqualSpecification(field, filterNode); return buildEqualSpecification(field, filterNode);
} }
@@ -251,6 +254,17 @@ public abstract class EntityService<T extends Voable<VO>, VO, ID> {
return null; return null;
} }
/**
* 为查询字段添加别名
*
* @param field
* @param filterNode
* @return
*/
protected String aliasFor(String field, JsonNode filterNode) {
return field;
}
private <X extends Comparable<? super X>> Specification<T> buildLessThanSpecification(String field, private <X extends Comparable<? super X>> Specification<T> buildLessThanSpecification(String field,
JsonNode filterNode) { JsonNode filterNode) {
JsonNode valueNode = filterNode.get(ParamConstant.KEY_VALUE); JsonNode valueNode = filterNode.get(ParamConstant.KEY_VALUE);
@@ -324,7 +338,7 @@ public abstract class EntityService<T extends Voable<VO>, VO, ID> {
/** /**
* 等于操作符的逻辑 * 等于操作符的逻辑
* *
* @param field * @param field
* @param filterNode * @param filterNode
* @return * @return
@@ -343,11 +357,29 @@ public abstract class EntityService<T extends Voable<VO>, VO, ID> {
path = path.get(segment); path = path.get(segment);
} }
Class<?> clz = path.getJavaType(); Class<?> clz = path.getJavaType();
if (IdentityEntity.class.isAssignableFrom(clz) && valueNode.isNumber()) { if (IdentityEntity.class.isAssignableFrom(clz)) {
return cb.equal(path.get("id"), valueNode.asInt()); if (valueNode.isNumber()) {
return cb.equal(path.get("id"), valueNode.asInt());
}
if (valueNode.isObject() && valueNode.has("id")) {
JsonNode identity = valueNode.get("id");
if (identity.isNumber()) {
return cb.equal(path.get("id"), identity.asInt());
}
}
}
if (clz == java.lang.Enum.class) {
// 将字符串转换为对应的枚举值
clz = ((SqmBasicValuedSimplePath) path).getExpressibleJavaType().getJavaTypeClass();
} }
ObjectMapper objectMapper = SpringApp.getBean(ObjectMapper.class); ObjectMapper objectMapper = SpringApp.getBean(ObjectMapper.class);
Object value = objectMapper.convertValue(valueNode, clz); Object value = null;
try {
value = objectMapper.convertValue(valueNode, clz);
} catch (Exception e) {
throw new RuntimeException("field=" + field + ", clz=" + clz.getName() + ", value=" + valueNode, e);
}
// Object value = valueNode.isTextual() ? valueNode.asText() // Object value = valueNode.isTextual() ? valueNode.asText()
// : valueNode.isNumber() ? valueNode.numberValue() // : valueNode.isNumber() ? valueNode.numberValue()
// : valueNode.isBoolean() ? valueNode.asBoolean() : valueNode; // : valueNode.isBoolean() ? valueNode.asBoolean() : valueNode;
@@ -357,7 +389,7 @@ public abstract class EntityService<T extends Voable<VO>, VO, ID> {
/** /**
* BETWEEN 操作符的逻辑 * BETWEEN 操作符的逻辑
* *
* @param field * @param field
* @param filterNode * @param filterNode
* @return * @return
@@ -366,16 +398,35 @@ public abstract class EntityService<T extends Voable<VO>, VO, ID> {
JsonNode filterNode) { JsonNode filterNode) {
// BETWEEN 操作符:要求 value 为数组,且长度=2 // BETWEEN 操作符:要求 value 为数组,且长度=2
JsonNode valueNode = filterNode.get(ParamConstant.KEY_VALUE); JsonNode valueNode = filterNode.get(ParamConstant.KEY_VALUE);
if (valueNode == null || !valueNode.isArray() || valueNode.size() != 2) { JsonNode lowNode, highNode;
log.debug("BETWEEN 操作符需要 value 为包含两个元素的数组"); boolean includeBegin = false, includeEnd = false;
return null; if (valueNode == null || valueNode.isNull()) {
throw new IllegalArgumentException(field + " 的 BETWEEN 操作符需要参数");
} }
JsonNode lowNode = valueNode.get(0); if (valueNode.isArray()) {
JsonNode highNode = valueNode.get(1); if (valueNode.size() != 2) {
throw new IllegalArgumentException(field + " 的 BETWEEN 操作符的 value 数组长度必须为 2");
}
lowNode = valueNode.get(0);
highNode = valueNode.get(1);
} else if (valueNode.isObject()) {
lowNode = valueNode.get(ParamConstant.KEY_between_begin);
highNode = valueNode.get(ParamConstant.KEY_between_end);
if (valueNode.has(ParamConstant.KEY_INCLUDE_BEGIN)) {
includeBegin = valueNode.get(ParamConstant.KEY_INCLUDE_BEGIN).asBoolean();
}
if (valueNode.has(ParamConstant.KEY_INCLUDE_END)) {
includeEnd = valueNode.get(ParamConstant.KEY_INCLUDE_END).asBoolean();
}
} else {
throw new IllegalArgumentException(field + " 的 BETWEEN 操作符的 value 必须为数组或对象");
}
if (lowNode == null || highNode == null || lowNode.isNull() || highNode.isNull()) { if (lowNode == null || highNode == null || lowNode.isNull() || highNode.isNull()) {
log.debug("BETWEEN 操作符的 value 数组元素不能为空"); throw new IllegalArgumentException(field + "BETWEEN 操作符的 value 数组元素不能为空");
return null;
} }
return (root, query, cb) -> { return (root, query, cb) -> {
// 支持嵌套属性路径,如 company.id // 支持嵌套属性路径,如 company.id
String[] fieldPath = field.split("\\."); String[] fieldPath = field.split("\\.");

View File

@@ -27,7 +27,6 @@ import com.ecep.contract.MessageHolder;
import com.ecep.contract.QueryService; import com.ecep.contract.QueryService;
import com.ecep.contract.SpringApp; import com.ecep.contract.SpringApp;
import com.ecep.contract.cloud.CloudInfo; 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.Company;
import com.ecep.contract.ds.company.model.CompanyBlackReason; import com.ecep.contract.ds.company.model.CompanyBlackReason;
import com.ecep.contract.ds.company.service.CompanyService; import com.ecep.contract.ds.company.service.CompanyService;
@@ -103,10 +102,7 @@ public class CloudRkService extends EntityService<CloudRk, CloudRkVo, Integer>
return cloudRKRepository; return cloudRKRepository;
} }
@Override
public CloudRk getById(Integer id) {
return super.getById(id);
}
@Cacheable(key = "#p0") @Cacheable(key = "#p0")
public CloudRkVo findById(Integer id) { public CloudRkVo findById(Integer id) {

View File

@@ -442,27 +442,6 @@ public class CompanyFileService extends EntityService<CompanyFile, CompanyFileVo
} }
@Override
public Page<CompanyFileVo> findAll(JsonNode paramsNode, Pageable pageable) {
Specification<CompanyFile> spec = null;
if (paramsNode.has(ParamConstant.KEY_SEARCH_TEXT)) {
spec = getSearchSpecification(paramsNode.get(ParamConstant.KEY_SEARCH_TEXT).asText());
}
spec = SpecificationUtils.and(spec, buildParameterSpecification(paramsNode));
return findAll(spec, pageable).map(CompanyFile::toVo);
}
public Page<CompanyFile> findAll(Specification<CompanyFile> spec, Pageable pageable) {
return repository.findAll(spec, pageable);
}
@Override
public Specification<CompanyFile> getSearchSpecification(String searchText) {
if (!StringUtils.hasText(searchText)) {
return null;
}
return SpecificationUtils.andWith(searchText, this::buildSearchSpecification);
}
protected Specification<CompanyFile> buildSearchSpecification(String searchText) { protected Specification<CompanyFile> buildSearchSpecification(String searchText) {
return (root, query, builder) -> { return (root, query, builder) -> {

View File

@@ -137,10 +137,6 @@ public class CompanyOldNameService extends EntityService<CompanyOldName, Company
return companyOldNameRepository.findAllByName(name); return companyOldNameRepository.findAllByName(name);
} }
public List<CompanyOldName> findAll(Specification<CompanyOldName> spec, Sort sort) {
return companyOldNameRepository.findAll(spec, sort);
}
public List<CompanyOldName> findAllByCompany(Company company) { public List<CompanyOldName> findAllByCompany(Company company) {
return companyOldNameRepository.findAllByCompanyId(company.getId()); return companyOldNameRepository.findAllByCompanyId(company.getId());
} }
@@ -211,47 +207,12 @@ public class CompanyOldNameService extends EntityService<CompanyOldName, Company
} }
} }
/**
* 根据提供的搜索文本查询公司旧名称列表。
* <p>
* 该函数使用JPA的Specification接口构建查询条件查找公司旧名称中包含指定文本的记录。
* 查询结果最多返回10条记录。
*
* @param searchText 用于搜索的文本,将匹配公司旧名称中包含该文本的记录。
* @return 包含匹配的公司旧名称的列表列表中的每个元素都是一个CompanyOldName对象。
*/
public List<CompanyOldName> search(String searchText) {
return companyOldNameRepository.findAll(getSearchSpecification(searchText), Pageable.ofSize(10)).getContent();
}
@Override @Override
public Page<CompanyOldName> findAll(Specification<CompanyOldName> spec, Pageable pageable) { protected String aliasFor(String field, JsonNode filterNode) {
return companyOldNameRepository.findAll(spec, pageable); if ("company".equals(field)) {
} return "companyId";
@Override
public Page<CompanyOldNameVo> findAll(JsonNode paramsNode, Pageable pageable) {
Specification<CompanyOldName> spec = null;
if (paramsNode.has(ParamConstant.KEY_SEARCH_TEXT)) {
spec = getSearchSpecification(paramsNode.get(ParamConstant.KEY_SEARCH_TEXT).asText());
} }
if (paramsNode.has("company")) { return super.aliasFor(field, filterNode);
JsonNode param = paramsNode.get("company");
Integer companyId = null;
if (param.isInt()) {
companyId = param.asInt();
} else if (param.isObject()) {
companyId = param.get("id").asInt();
}
if (companyId != null) {
final int id = companyId;
spec = SpecificationUtils.and(spec, (root, query, builder) -> {
return builder.equal(root.get("companyId"), id);
});
}
}
spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "name", "ambiguity", "beginDate", "endDate");
return findAll(spec, pageable).map(CompanyOldName::toVo);
} }
public CompanyOldName createNew(Company company, String name, boolean ambiguity) { public CompanyOldName createNew(Company company, String name, boolean ambiguity) {

View File

@@ -232,12 +232,6 @@ public class HolidayService extends EntityService<HolidayTable, HolidayTableVo,
return entityPage.map(HolidayTable::toVo); return entityPage.map(HolidayTable::toVo);
} }
@Override
public long count(JsonNode paramsNode) {
// 简单实现,返回所有节假日数量
return holidayTableRepository.count();
}
@Override @Override
public void updateByVo(HolidayTable model, HolidayTableVo vo) { public void updateByVo(HolidayTable model, HolidayTableVo vo) {
if (model == null || vo == null) { if (model == null || vo == null) {

View File

@@ -110,17 +110,6 @@ public class ContractBidVendorService extends EntityService<ContractBidVendor, C
return new ContractBidVendor(); return new ContractBidVendor();
} }
@Override
public Page<ContractBidVendorVo> findAll(JsonNode paramsNode, Pageable pageable) {
Specification<ContractBidVendor> spec = null;
if (paramsNode.has("searchText")) {
spec = buildSearchSpecification(paramsNode.get("searchText").asText());
}
// field
spec = SpecificationUtils.andParam(spec, paramsNode, "contract", "company");
return findAll(spec, pageable).map(ContractBidVendor::toVo);
}
@Override @Override
public void updateByVo(ContractBidVendor model, ContractBidVendorVo vo) { public void updateByVo(ContractBidVendor model, ContractBidVendorVo vo) {
// 处理关联对象 // 处理关联对象

View File

@@ -47,10 +47,7 @@ public class ContractCatalogService extends EntityService<ContractCatalog, Contr
return repository.findById(id).map(ContractCatalog::toVo).orElse(null); return repository.findById(id).map(ContractCatalog::toVo).orElse(null);
} }
@Override
public ContractCatalog getById(Integer id) {
return repository.findById(id).orElse(null);
}
public ContractCatalog findByName(String name) { public ContractCatalog findByName(String name) {
return repository.findByName(name).orElse(null); return repository.findByName(name).orElse(null);

View File

@@ -144,11 +144,6 @@ public class ContractInvoiceService extends EntityService<ContractInvoice, Contr
} }
@Override
public Page<ContractInvoiceVo> findAll(JsonNode paramsNode, Pageable pageable) {
return super.findAll(paramsNode, pageable);
}
/** /**
* 构建参数规范 * 构建参数规范
* *

View File

@@ -45,11 +45,6 @@ public class ContractKindService extends EntityService<ContractKind, ContractKin
return repository.findById(id).map(ContractKind::toVo).orElse(null); return repository.findById(id).map(ContractKind::toVo).orElse(null);
} }
@Override
public Page<ContractKindVo> findAll(JsonNode paramsNode, Pageable pageable) {
return super.findAll(paramsNode, pageable);
}
@Override @Override
protected Specification<ContractKind> buildParameterSpecification(JsonNode paramsNode) { protected Specification<ContractKind> buildParameterSpecification(JsonNode paramsNode) {
return null; return null;

View File

@@ -98,11 +98,6 @@ public class ExtendVendorInfoService extends EntityService<ExtendVendorInfo, Ext
repository.delete(bidVendor); repository.delete(bidVendor);
} }
@Override
public Page<ExtendVendorInfoVo> findAll(JsonNode paramsNode, Pageable pageable) {
return super.findAll(paramsNode, pageable);
}
public List<ExtendVendorInfo> findAll(Specification<ExtendVendorInfo> spec, Sort sort) { public List<ExtendVendorInfo> findAll(Specification<ExtendVendorInfo> spec, Sort sort) {
return repository.findAll(spec, sort); return repository.findAll(spec, sort);
} }

View File

@@ -55,11 +55,6 @@ public class PurchaseOrderItemService extends EntityService<PurchaseOrderItem, P
return list.getFirst().toVo(); return list.getFirst().toVo();
} }
@Override
public Page<PurchaseOrderItemVo> findAll(JsonNode paramsNode, Pageable pageable) {
return super.findAll(paramsNode, pageable);
}
@Caching(evict = { @Caching(evict = {
@CacheEvict(key = "#p0.id"), @CacheEvict(key = "#p0.id"),
@CacheEvict(key = "'refId-'+#p0.refId") @CacheEvict(key = "'refId-'+#p0.refId")

View File

@@ -52,10 +52,7 @@ public class SaleOrdersService extends EntityService<SalesOrder, SalesOrderVo, I
return new SalesOrder(); return new SalesOrder();
} }
@Override
public SalesOrder getById(Integer id) {
return repository.findById(id).orElse(null);
}
@Cacheable(key = "#p0") @Cacheable(key = "#p0")
public SalesOrderVo findById(Integer id) { public SalesOrderVo findById(Integer id) {

View File

@@ -4,8 +4,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CacheEvict;
import org.springframework.context.annotation.Lazy; 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.data.jpa.domain.Specification;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -64,17 +62,6 @@ public class EmployeeLoginHistoryService extends EntityService<EmployeeLoginHist
return repository.findById(id).map(EmployeeLoginHistory::toVo).orElse(null); return repository.findById(id).map(EmployeeLoginHistory::toVo).orElse(null);
} }
@Override
public Page<EmployeeLoginHistoryVo> findAll(JsonNode paramsNode, Pageable pageable) {
Specification<EmployeeLoginHistory> spec = null;
if (paramsNode.has("searchText")) {
spec = getSearchSpecification(paramsNode.get("searchText").asText());
}
// 可以根据需要添加更多参数处理
spec = SpecificationUtils.andParam(spec, paramsNode, "employee");
spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "ip", "mac");
return findAll(spec, pageable).map(EmployeeLoginHistory::toVo);
}
@Override @Override
@CacheEvict(key = "#p0.id") @CacheEvict(key = "#p0.id")

View File

@@ -67,7 +67,16 @@ public class EmployeeService extends EntityService<Employee, EmployeeVo, Integer
@Override @Override
protected org.springframework.data.jpa.domain.Specification<Employee> buildSearchSpecification(String searchText) { protected org.springframework.data.jpa.domain.Specification<Employee> buildSearchSpecification(String searchText) {
return getSearchSpecification(searchText); return (root, query, builder) -> {
// 使用或条件组合查询,以实现对员工代码或名称的模糊搜索
return builder.or(
builder.like(root.get("account"), "%" + searchText + "%"),
builder.like(root.get("name"), "%" + searchText + "%"),
builder.like(root.get("alias"), "%" + searchText + "%"),
builder.like(root.get("code"), "%" + searchText + "%"),
builder.like(root.get("email"), "%" + searchText + "%"),
builder.like(root.get("phone"), "%" + searchText + "%"));
};
} }
/** /**
@@ -138,34 +147,6 @@ public class EmployeeService extends EntityService<Employee, EmployeeVo, Integer
employeeRepository.delete(employee); employeeRepository.delete(employee);
} }
@Override
public Page<EmployeeVo> findAll(JsonNode paramsNode, Pageable pageable) {
Specification<Employee> spec = null;
if (paramsNode.has("searchText")) {
spec = getSearchSpecification(paramsNode.get("searchText").asText());
}
// 可以根据需要添加更多参数处理
spec = SpecificationUtils.andParam(spec, paramsNode, "department");
spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "isActive");
return findAll(spec, pageable).map(Employee::toVo);
}
@Override
public Specification<Employee> getSearchSpecification(String searchText) {
if (!StringUtils.hasText(searchText)) {
return null;
}
return (root, query, builder) -> {
// 使用或条件组合查询,以实现对员工代码或名称的模糊搜索
return builder.or(
builder.like(root.get("account"), "%" + searchText + "%"),
builder.like(root.get("name"), "%" + searchText + "%"),
builder.like(root.get("alias"), "%" + searchText + "%"),
builder.like(root.get("code"), "%" + searchText + "%"),
builder.like(root.get("email"), "%" + searchText + "%"),
builder.like(root.get("phone"), "%" + searchText + "%"));
};
}
/** /**
* 根据搜索文本查询员工列表 * 根据搜索文本查询员工列表

View File

@@ -70,9 +70,7 @@ public class InventoryService extends EntityService<Inventory, InventoryVo, Inte
return inventoryRepository.findById(id).map(Inventory::toVo).orElse(null); return inventoryRepository.findById(id).map(Inventory::toVo).orElse(null);
} }
public Inventory getById(Integer id) {
return inventoryRepository.findById(id).orElse(null);
}
@Override @Override
public Page<Inventory> findAll(Specification<Inventory> spec, Pageable pageable) { public Page<Inventory> findAll(Specification<Inventory> spec, Pageable pageable) {

View File

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

View File

@@ -48,17 +48,6 @@ public class ProjectFundPlanService extends EntityService<ProjectFundPlan, Proje
return null; return null;
} }
@Override
public Page<ProjectFundPlanVo> findAll(JsonNode paramsNode, Pageable pageable) {
Specification<ProjectFundPlan> spec = null;
if (paramsNode.has("searchText")) {
spec = buildSearchSpecification(paramsNode.get("searchText").asText());
}
// field
spec = SpecificationUtils.andParam(spec, paramsNode, "project");
return findAll(spec, pageable).map(ProjectFundPlan::toVo);
}
@Caching(evict = { @Caching(evict = {
@CacheEvict(key = "#p0.id"), @CacheEvict(key = "#p0.id"),
}) })

View File

@@ -8,6 +8,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.data.domain.Page; 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.data.jpa.domain.Specification;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.ecep.contract.EntityService;
import com.ecep.contract.IEntityService; import com.ecep.contract.IEntityService;
import com.ecep.contract.QueryService; import com.ecep.contract.QueryService;
import com.ecep.contract.SpringApp; import com.ecep.contract.SpringApp;
import com.ecep.contract.ds.MyRepository;
import com.ecep.contract.ds.customer.service.CompanyCustomerEvaluationFormFileService; import com.ecep.contract.ds.customer.service.CompanyCustomerEvaluationFormFileService;
import com.ecep.contract.ds.other.service.EmployeeService; 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.Project;
import com.ecep.contract.ds.project.model.ProjectQuotation; 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.ServiceException;
import com.ecep.contract.service.VoableService; import com.ecep.contract.service.VoableService;
import com.ecep.contract.util.SpecificationUtils; import com.ecep.contract.util.SpecificationUtils;
@@ -34,7 +37,8 @@ import com.fasterxml.jackson.databind.JsonNode;
@Lazy @Lazy
@Service @Service
@CacheConfig(cacheNames = "project-quotation") @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> { VoableService<ProjectQuotation, ProjectQuotationVo> {
private static final Logger logger = LoggerFactory.getLogger(ProjectQuotationService.class); private static final Logger logger = LoggerFactory.getLogger(ProjectQuotationService.class);
@@ -43,8 +47,8 @@ public class ProjectQuotationService implements IEntityService<ProjectQuotation>
private ProjectQuotationRepository repository; private ProjectQuotationRepository repository;
@Override @Override
public ProjectQuotation getById(Integer id) { protected ProjectQuotationRepository getRepository() {
return repository.findById(id).orElse(null); return repository;
} }
@Cacheable(key = "#p0") @Cacheable(key = "#p0")
@@ -56,39 +60,36 @@ public class ProjectQuotationService implements IEntityService<ProjectQuotation>
return null; 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) { public List<ProjectQuotation> findAllByProject(Project project) {
return repository.findAllByProject(project); return repository.findAllByProject(project);
} }
public ProjectQuotation save(ProjectQuotation approval) { @Override
return repository.save(approval); public ProjectQuotation createNewEntity() {
return new ProjectQuotation();
} }
@Override @Override
public Specification<ProjectQuotation> getSearchSpecification(String searchText) { protected Specification<ProjectQuotation> buildSearchSpecification(String searchText) {
return null; return null;
} }
public void delete(ProjectQuotation approval) { @Override
repository.delete(approval); 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) { public ProjectQuotation newInstanceByProject(Project project) {
@@ -100,10 +101,6 @@ public class ProjectQuotationService implements IEntityService<ProjectQuotation>
return approval; return approval;
} }
public List<ProjectQuotation> findAll(Specification<ProjectQuotation> spec, Sort sort) {
return repository.findAll(spec, sort);
}
@Override @Override
public void updateByVo(ProjectQuotation entity, ProjectQuotationVo vo) { public void updateByVo(ProjectQuotation entity, ProjectQuotationVo vo) {
if (entity == null) { if (entity == null) {
@@ -160,4 +157,5 @@ public class ProjectQuotationService implements IEntityService<ProjectQuotation>
entity.setEvaluationFile(null); entity.setEvaluationFile(null);
} }
} }
} }

View File

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

View File

@@ -104,9 +104,7 @@ public class ProjectService extends EntityService<Project, ProjectVo, Integer>
return project; return project;
} }
public Project getById(Integer id) {
return projectRepository.findById(id).orElse(null);
}
@Cacheable(key = "#p0") @Cacheable(key = "#p0")
public ProjectVo findById(Integer id) { public ProjectVo findById(Integer id) {

View File

@@ -15,6 +15,7 @@ import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import com.ecep.contract.EntityService;
import com.ecep.contract.IEntityService; import com.ecep.contract.IEntityService;
import com.ecep.contract.QueryService; import com.ecep.contract.QueryService;
import com.ecep.contract.ds.project.repository.ProjectTypeRepository; import com.ecep.contract.ds.project.repository.ProjectTypeRepository;
@@ -27,14 +28,20 @@ import com.fasterxml.jackson.databind.JsonNode;
@Lazy @Lazy
@Service @Service
@CacheConfig(cacheNames = "project-type") @CacheConfig(cacheNames = "project-type")
public class ProjectTypeService public class ProjectTypeService extends EntityService<ProjectType, ProjectTypeVo, Integer>
implements IEntityService<ProjectType>, QueryService<ProjectTypeVo>, VoableService<ProjectType, ProjectTypeVo> { implements IEntityService<ProjectType>, QueryService<ProjectTypeVo>, VoableService<ProjectType, ProjectTypeVo> {
@Lazy @Lazy
@Autowired @Autowired
private ProjectTypeRepository repository; private ProjectTypeRepository repository;
public ProjectType getById(Integer id) { @Override
return repository.findById(id).orElse(null); protected ProjectTypeRepository getRepository() {
return repository;
}
@Override
public ProjectType createNewEntity() {
return new ProjectType();
} }
@Cacheable(key = "#p0") @Cacheable(key = "#p0")
@@ -71,33 +78,6 @@ public class ProjectTypeService
return entities.stream().map(ProjectType::toVo).toList(); 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 = { @Caching(evict = {
@CacheEvict(key = "#p0.id"), @CacheEvict(key = "#p0.id"),
@CacheEvict(key = "'all'"), @CacheEvict(key = "'all'"),
@@ -125,6 +105,21 @@ public class ProjectTypeService
model.setDescription(vo.getDescription()); 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 java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository; 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.Vendor;
import com.ecep.contract.ds.vendor.model.VendorApprovedItem; import com.ecep.contract.ds.vendor.model.VendorApprovedItem;
import com.ecep.contract.model.VendorApproved; import com.ecep.contract.model.VendorApproved;
@@ -14,8 +13,7 @@ import com.ecep.contract.model.VendorApproved;
* 合格供方名录 * 合格供方名录
*/ */
@Repository @Repository
public interface VendorApprovedItemRepository extends public interface VendorApprovedItemRepository extends MyRepository<VendorApprovedItem, Integer> {
JpaRepository<VendorApprovedItem, Integer>, JpaSpecificationExecutor<VendorApprovedItem> {
List<VendorApprovedItem> findAllByList(VendorApproved list); List<VendorApprovedItem> findAllByList(VendorApproved list);

View File

@@ -2,15 +2,14 @@ package com.ecep.contract.ds.vendor.repository;
import java.util.Optional; import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import com.ecep.contract.ds.MyRepository;
import com.ecep.contract.model.VendorGroup; import com.ecep.contract.model.VendorGroup;
@Repository @Repository
public interface VendorGroupRepository extends public interface VendorGroupRepository extends
JpaRepository<VendorGroup, Integer>, JpaSpecificationExecutor<VendorGroup> { MyRepository<VendorGroup, Integer> {
Optional<VendorGroup> findByName(String name); Optional<VendorGroup> findByName(String name);

View File

@@ -2,16 +2,14 @@ package com.ecep.contract.ds.vendor.repository;
import java.util.List; import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import com.ecep.contract.ds.MyRepository;
import com.ecep.contract.model.VendorGroupRequireFileType; import com.ecep.contract.model.VendorGroupRequireFileType;
@Repository @Repository
public interface VendorGroupRequireFileTypeRepository extends public interface VendorGroupRequireFileTypeRepository extends
JpaRepository<VendorGroupRequireFileType, Integer>, JpaSpecificationExecutor<VendorGroupRequireFileType> { MyRepository<VendorGroupRequireFileType, Integer> {
List<VendorGroupRequireFileType> findByGroupId(int groupId); List<VendorGroupRequireFileType> findByGroupId(int groupId);
} }

View File

@@ -1,10 +1,19 @@
package com.ecep.contract.ds.vendor.service; 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.EntityService;
import com.ecep.contract.IEntityService;
import com.ecep.contract.QueryService; import com.ecep.contract.QueryService;
import com.ecep.contract.SpringApp; import com.ecep.contract.SpringApp;
import com.ecep.contract.constant.ParamConstant;
import com.ecep.contract.ds.vendor.repository.VendorApprovedFileRepository; import com.ecep.contract.ds.vendor.repository.VendorApprovedFileRepository;
import com.ecep.contract.model.VendorApproved; import com.ecep.contract.model.VendorApproved;
import com.ecep.contract.model.VendorApprovedFile; 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.util.SpecificationUtils;
import com.ecep.contract.vo.VendorApprovedFileVo; import com.ecep.contract.vo.VendorApprovedFileVo;
import com.fasterxml.jackson.databind.JsonNode; 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 @Lazy
@Service @Service
@@ -72,30 +71,15 @@ public class VendorApprovedFileService extends EntityService<VendorApprovedFile,
return spec; 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 要删除的文件实体 * @param entity 要删除的文件实体
*/ */
@Caching(evict = {
@CacheEvict(key = "#p0.id"),
@CacheEvict(key = "'byList-'+#p0.list.id")
})
@Override @Override
public void delete(VendorApprovedFile entity) { public void delete(VendorApprovedFile entity) {
repository.delete(entity); repository.delete(entity);
@@ -107,6 +91,10 @@ public class VendorApprovedFileService extends EntityService<VendorApprovedFile,
* @param entity 要保存的文件实体 * @param entity 要保存的文件实体
* @return 保存后的文件实体 * @return 保存后的文件实体
*/ */
@Caching(evict = {
@CacheEvict(key = "#p0.id"),
@CacheEvict(key = "'byList-'+#p0.list.id")
})
@Override @Override
public VendorApprovedFile save(VendorApprovedFile entity) { public VendorApprovedFile save(VendorApprovedFile entity) {
return repository.save(entity); return repository.save(entity);
@@ -158,4 +146,4 @@ public class VendorApprovedFileService extends EntityService<VendorApprovedFile,
entity.setList(null); entity.setList(null);
} }
} }
} }

View File

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

View File

@@ -8,36 +8,32 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.Consumer; import java.util.function.Consumer;
import com.ecep.contract.SpringApp;
import com.ecep.contract.constant.ParamConstant;
import com.ecep.contract.service.SmbFileService;
import com.hierynomus.smbj.common.SmbPath;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import com.ecep.contract.IEntityService;
import com.ecep.contract.EntityService; import com.ecep.contract.EntityService;
import com.ecep.contract.IEntityService;
import com.ecep.contract.MyDateTimeUtils; import com.ecep.contract.MyDateTimeUtils;
import com.ecep.contract.QueryService; import com.ecep.contract.QueryService;
import com.ecep.contract.SpringApp;
import com.ecep.contract.constant.CompanyVendorConstant; import com.ecep.contract.constant.CompanyVendorConstant;
import com.ecep.contract.ds.other.service.SysConfService; import com.ecep.contract.ds.other.service.SysConfService;
import com.ecep.contract.ds.vendor.repository.VendorApprovedRepository; import com.ecep.contract.ds.vendor.repository.VendorApprovedRepository;
import com.ecep.contract.model.VendorApproved; import com.ecep.contract.model.VendorApproved;
import com.ecep.contract.model.VendorApprovedFile; import com.ecep.contract.model.VendorApprovedFile;
import com.ecep.contract.service.ServiceException; import com.ecep.contract.service.ServiceException;
import com.ecep.contract.service.SmbFileService;
import com.ecep.contract.service.VoableService; import com.ecep.contract.service.VoableService;
import com.ecep.contract.util.FileUtils; import com.ecep.contract.util.FileUtils;
import com.ecep.contract.util.SpecificationUtils; import com.ecep.contract.util.SpecificationUtils;
import com.ecep.contract.vo.VendorApprovedVo; import com.ecep.contract.vo.VendorApprovedVo;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.hierynomus.smbj.common.SmbPath;
@Lazy @Lazy
@Service @Service
@@ -78,11 +74,6 @@ public class VendorApprovedService extends EntityService<VendorApproved, VendorA
return repository.findById(id).map(VendorApproved::toVo).orElse(null); return repository.findById(id).map(VendorApproved::toVo).orElse(null);
} }
@Override
public VendorApproved getById(Integer id) {
return repository.findById(id).orElse(null);
}
@Override @Override
protected org.springframework.data.jpa.domain.Specification<VendorApproved> buildParameterSpecification( protected org.springframework.data.jpa.domain.Specification<VendorApproved> buildParameterSpecification(
JsonNode paramsNode) { JsonNode paramsNode) {
@@ -108,10 +99,6 @@ public class VendorApprovedService extends EntityService<VendorApproved, VendorA
repository.delete(entity); repository.delete(entity);
} }
public Page<VendorApproved> findAll(Specification<VendorApproved> spec, PageRequest pageRequest) {
return repository.findAll(spec, pageRequest);
}
public boolean makePathAbsent(VendorApproved list) { public boolean makePathAbsent(VendorApproved list) {
String path = list.getPath(); String path = list.getPath();
if (StringUtils.hasText(path)) { if (StringUtils.hasText(path)) {

View File

@@ -1,20 +1,16 @@
package com.ecep.contract.ds.vendor.service; package com.ecep.contract.ds.vendor.service;
import com.ecep.contract.constant.ParamConstant;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching; import org.springframework.cache.annotation.Caching;
import org.springframework.context.annotation.Lazy; 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.data.jpa.domain.Specification;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import com.ecep.contract.IEntityService;
import com.ecep.contract.EntityService; import com.ecep.contract.EntityService;
import com.ecep.contract.IEntityService;
import com.ecep.contract.QueryService; import com.ecep.contract.QueryService;
import com.ecep.contract.ds.vendor.repository.VendorClassRepository; import com.ecep.contract.ds.vendor.repository.VendorClassRepository;
import com.ecep.contract.model.VendorCatalog; import com.ecep.contract.model.VendorCatalog;
@@ -48,34 +44,12 @@ public class VendorCatalogService extends EntityService<VendorCatalog, VendorCat
return new VendorCatalog(); return new VendorCatalog();
} }
@Override
public Page<VendorCatalogVo> findAll(JsonNode paramsNode, Pageable pageable) {
Specification<VendorCatalog> 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", "parentId");
return findAll(spec, pageable).map(VendorCatalog::toVo);
}
@Override
public VendorCatalog getById(Integer id) {
return repository.findById(id).orElse(null);
}
@Cacheable(key = "#p0") @Cacheable(key = "#p0")
@Override @Override
public VendorCatalogVo findById(Integer id) { public VendorCatalogVo findById(Integer id) {
return repository.findById(id).map(VendorCatalog::toVo).orElse(null); return repository.findById(id).map(VendorCatalog::toVo).orElse(null);
} }
@Override
public Page<VendorCatalog> findAll(Specification<VendorCatalog> spec, Pageable pageable) {
return repository.findAll(spec, pageable);
}
@Override @Override
protected org.springframework.data.jpa.domain.Specification<VendorCatalog> buildParameterSpecification( protected org.springframework.data.jpa.domain.Specification<VendorCatalog> buildParameterSpecification(
JsonNode paramsNode) { JsonNode paramsNode) {
@@ -121,4 +95,4 @@ public class VendorCatalogService extends EntityService<VendorCatalog, VendorCat
model.setCode(vo.getCode()); model.setCode(vo.getCode());
model.setType(vo.getType()); model.setType(vo.getType());
} }
} }

View File

@@ -8,20 +8,17 @@ import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching; import org.springframework.cache.annotation.Caching;
import org.springframework.context.annotation.Lazy; 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.data.jpa.domain.Specification;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import com.ecep.contract.IEntityService;
import com.ecep.contract.EntityService; import com.ecep.contract.EntityService;
import com.ecep.contract.IEntityService;
import com.ecep.contract.QueryService; import com.ecep.contract.QueryService;
import com.ecep.contract.SpringApp; import com.ecep.contract.SpringApp;
import com.ecep.contract.ds.other.service.EmployeeService; import com.ecep.contract.ds.other.service.EmployeeService;
import com.ecep.contract.ds.vendor.repository.VendorEntityRepository;
import com.ecep.contract.ds.vendor.model.Vendor; import com.ecep.contract.ds.vendor.model.Vendor;
import com.ecep.contract.ds.vendor.model.VendorEntity; import com.ecep.contract.ds.vendor.model.VendorEntity;
import com.ecep.contract.ds.vendor.repository.VendorEntityRepository;
import com.ecep.contract.service.VoableService; import com.ecep.contract.service.VoableService;
import com.ecep.contract.util.SpecificationUtils; import com.ecep.contract.util.SpecificationUtils;
import com.ecep.contract.vo.VendorEntityVo; import com.ecep.contract.vo.VendorEntityVo;
@@ -30,7 +27,8 @@ import com.fasterxml.jackson.databind.JsonNode;
@Lazy @Lazy
@Service @Service
@CacheConfig(cacheNames = "company-vendor-entity") @CacheConfig(cacheNames = "company-vendor-entity")
public class VendorEntityService extends EntityService<VendorEntity, VendorEntityVo, Integer> implements IEntityService<VendorEntity>, QueryService<VendorEntityVo>, public class VendorEntityService extends EntityService<VendorEntity, VendorEntityVo, Integer>
implements IEntityService<VendorEntity>, QueryService<VendorEntityVo>,
VoableService<VendorEntity, VendorEntityVo> { VoableService<VendorEntity, VendorEntityVo> {
@Lazy @Lazy
@Autowired @Autowired
@@ -46,11 +44,6 @@ public class VendorEntityService extends EntityService<VendorEntity, VendorEntit
return new VendorEntity(); return new VendorEntity();
} }
@Override
public VendorEntity getById(Integer id) {
return repository.findById(id).orElse(null);
}
@Cacheable(key = "#p0") @Cacheable(key = "#p0")
@Override @Override
public VendorEntityVo findById(Integer id) { public VendorEntityVo findById(Integer id) {
@@ -69,13 +62,6 @@ public class VendorEntityService extends EntityService<VendorEntity, VendorEntit
} }
@Override @Override
public Specification<VendorEntity> getSearchSpecification(String searchText) {
if (!StringUtils.hasText(searchText)) {
return null;
}
return SpecificationUtils.andWith(searchText, this::buildSearchSpecification);
}
protected Specification<VendorEntity> buildSearchSpecification(String searchText) { protected Specification<VendorEntity> buildSearchSpecification(String searchText) {
return (root, query, builder) -> { return (root, query, builder) -> {
return builder.or( return builder.or(
@@ -86,35 +72,14 @@ public class VendorEntityService extends EntityService<VendorEntity, VendorEntit
} }
@Override @Override
protected org.springframework.data.jpa.domain.Specification<VendorEntity> buildParameterSpecification(JsonNode paramsNode) { protected org.springframework.data.jpa.domain.Specification<VendorEntity> buildParameterSpecification(
JsonNode paramsNode) {
org.springframework.data.jpa.domain.Specification<VendorEntity> spec = null; org.springframework.data.jpa.domain.Specification<VendorEntity> spec = null;
spec = SpecificationUtils.andParam(spec, paramsNode, "vendor"); spec = SpecificationUtils.andParam(spec, paramsNode, "vendor");
spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "name", "abbName", "code"); spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "name", "abbName", "code");
return spec; return spec;
} }
@Override
public List<VendorEntity> search(String searchText) {
Specification<VendorEntity> spec = getSearchSpecification(searchText);
return repository.findAll(spec, Pageable.ofSize(10)).getContent();
}
@Override
public Page<VendorEntity> findAll(Specification<VendorEntity> spec, Pageable pageable) {
return repository.findAll(spec, pageable);
}
@Override
public Page<VendorEntityVo> findAll(JsonNode paramsNode, Pageable pageable) {
Specification<VendorEntity> spec = null;
if (paramsNode.has("searchText")) {
spec = getSearchSpecification(paramsNode.get("searchText").asText());
}
// 添加额外的参数过滤s
spec = SpecificationUtils.andParam(spec, paramsNode, "vendor");
return findAll(spec, pageable).map(VendorEntity::toVo);
}
@Caching(evict = { @Caching(evict = {
@CacheEvict(key = "#p0.id"), @CacheEvict(key = "#p0.id"),
@CacheEvict(key = "'code-'+#p0.code") @CacheEvict(key = "'code-'+#p0.code")
@@ -173,4 +138,4 @@ public class VendorEntityService extends EntityService<VendorEntity, VendorEntit
model.setModifier(employeeService.getById(vo.getModifierId())); model.setModifier(employeeService.getById(vo.getModifierId()));
} }
} }
} }

View File

@@ -12,11 +12,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.ecep.contract.ContractPayWay; import com.ecep.contract.ContractPayWay;
import com.ecep.contract.EntityService;
import com.ecep.contract.IEntityService; import com.ecep.contract.IEntityService;
import com.ecep.contract.MessageHolder; import com.ecep.contract.MessageHolder;
import com.ecep.contract.MyDateTimeUtils; import com.ecep.contract.MyDateTimeUtils;
@@ -42,8 +41,8 @@ import com.fasterxml.jackson.databind.JsonNode;
@Lazy @Lazy
@Service @Service
public class VendorFileService public class VendorFileService extends EntityService<VendorFile, VendorFileVo, Integer>
implements IEntityService<VendorFile>, QueryService<VendorFile>, VoableService<VendorFile, VendorFileVo> { implements IEntityService<VendorFile>, QueryService<VendorFileVo>, VoableService<VendorFile, VendorFileVo> {
private static final Logger logger = LoggerFactory.getLogger(VendorFileService.class); private static final Logger logger = LoggerFactory.getLogger(VendorFileService.class);
@@ -59,42 +58,8 @@ public class VendorFileService
@Autowired @Autowired
private VendorFileRepository repository; private VendorFileRepository repository;
@Override public VendorFileVo findById(Integer id) {
public VendorFile getById(Integer id) { return repository.findById(id).map(VendorFile::toVo).orElse(null);
return repository.findById(id).orElse(null);
}
public VendorFile findById(Integer id) {
return repository.findById(id).orElse(null);
}
@Override
public Specification<VendorFile> getSearchSpecification(String searchText) {
return (root, query, builder) -> {
return builder.or(builder.like(root.get("filePath"), "%" + searchText + "%"));
};
}
@Override
public Page<VendorFile> findAll(Specification<VendorFile> spec, Pageable pageable) {
return repository.findAll(spec, pageable);
}
@Override
public Page<VendorFile> findAll(JsonNode paramsNode, Pageable pageable) {
Specification<VendorFile> spec = null;
if (paramsNode.has(ParamConstant.KEY_SEARCH_TEXT)) {
spec = getSearchSpecification(paramsNode.get(ParamConstant.KEY_SEARCH_TEXT).asText());
}
// 添加额外的参数过滤
if (paramsNode.has("type")) {
VendorFileType type = VendorFileType.valueOf(paramsNode.get("type").asText());
spec = SpecificationUtils.and(spec, (root, query, builder) -> builder.equal(root.get("type"), type));
}
spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "valid");
spec = SpecificationUtils.andFieldBetweenParam(spec, paramsNode, "signDate", LocalDate.class);
spec = SpecificationUtils.andParam(spec, paramsNode, "vendor");
return findAll(spec, pageable);
} }
public List<VendorFile> findAllByVendor(Vendor vendor) { public List<VendorFile> findAllByVendor(Vendor vendor) {
@@ -105,10 +70,6 @@ public class VendorFileService
return repository.findAllByVendorId(vendor.getId()).stream().map(VendorFile::toVo).toList(); return repository.findAllByVendorId(vendor.getId()).stream().map(VendorFile::toVo).toList();
} }
public void delete(VendorFile file) {
repository.delete(file);
}
public void deleteById(int id) { public void deleteById(int id) {
repository.deleteById(id); repository.deleteById(id);
} }
@@ -117,14 +78,6 @@ public class VendorFileService
repository.saveAll(files); repository.saveAll(files);
} }
public VendorFile save(VendorFile file) {
return repository.save(file);
}
public List<VendorFile> findAll(Specification<VendorFile> spec, Sort sort) {
return repository.findAll(spec, sort);
}
public List<VendorFile> findAllByVendorAndType(Vendor vendor, VendorFileType type) { public List<VendorFile> findAllByVendorAndType(Vendor vendor, VendorFileType type) {
return repository.findAllByVendorAndType(vendor, type); return repository.findAllByVendorAndType(vendor, type);
} }
@@ -133,6 +86,40 @@ public class VendorFileService
return repository.findAllByVendorIdAndType(vendor.getId(), type); return repository.findAllByVendorIdAndType(vendor.getId(), type);
} }
@Override
protected VendorFileRepository getRepository() {
return repository;
}
@Override
public VendorFile createNewEntity() {
return new VendorFile();
}
@Override
protected Specification<VendorFile> buildSearchSpecification(String searchText) {
return (root, query, builder) -> {
return builder.or(builder.like(root.get("filePath"), "%" + searchText + "%"));
};
}
@Override
protected Specification<VendorFile> buildParameterSpecification(JsonNode node) {
Specification<VendorFile> spec = null;
if (node.has(ParamConstant.KEY_SEARCH_TEXT)) {
spec = getSearchSpecification(node.get(ParamConstant.KEY_SEARCH_TEXT).asText());
}
// 添加额外的参数过滤
if (node.has("type")) {
VendorFileType type = VendorFileType.valueOf(node.get("type").asText());
spec = SpecificationUtils.and(spec, (root, query, builder) -> builder.equal(root.get("type"), type));
}
spec = SpecificationUtils.andFieldEqualParam(spec, node, "valid");
spec = SpecificationUtils.andFieldBetweenParam(spec, node, "signDate", LocalDate.class);
spec = SpecificationUtils.andParam(spec, node, "vendor");
return spec;
}
/** /**
* 验证供应商文件 * 验证供应商文件
* *

View File

@@ -3,23 +3,21 @@ package com.ecep.contract.ds.vendor.service;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import com.ecep.contract.constant.ParamConstant;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching; import org.springframework.cache.annotation.Caching;
import org.springframework.context.annotation.Lazy; 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.data.jpa.domain.Specification;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import com.ecep.contract.EntityService;
import com.ecep.contract.IEntityService; import com.ecep.contract.IEntityService;
import com.ecep.contract.QueryService; import com.ecep.contract.QueryService;
import com.ecep.contract.VendorFileType; import com.ecep.contract.VendorFileType;
import com.ecep.contract.VendorType; import com.ecep.contract.VendorType;
import com.ecep.contract.constant.ParamConstant;
import com.ecep.contract.ds.vendor.repository.VendorFileTypeLocalRepository; import com.ecep.contract.ds.vendor.repository.VendorFileTypeLocalRepository;
import com.ecep.contract.model.VendorFileTypeLocal; import com.ecep.contract.model.VendorFileTypeLocal;
import com.ecep.contract.service.ServiceException; import com.ecep.contract.service.ServiceException;
@@ -35,44 +33,19 @@ import com.fasterxml.jackson.databind.JsonNode;
@Lazy @Lazy
@Service @Service
@CacheConfig(cacheNames = "vendor-file-type") @CacheConfig(cacheNames = "vendor-file-type")
public class VendorFileTypeService implements IEntityService<VendorFileTypeLocal>, QueryService<VendorFileTypeLocalVo>, public class VendorFileTypeService extends EntityService<VendorFileTypeLocal, VendorFileTypeLocalVo, Integer>
implements IEntityService<VendorFileTypeLocal>, QueryService<VendorFileTypeLocalVo>,
VoableService<VendorFileTypeLocal, VendorFileTypeLocalVo> { VoableService<VendorFileTypeLocal, VendorFileTypeLocalVo> {
@Lazy @Lazy
@Autowired @Autowired
private VendorFileTypeLocalRepository repository; private VendorFileTypeLocalRepository repository;
@Override
public Page<VendorFileTypeLocalVo> findAll(JsonNode paramsNode, Pageable pageable) {
Specification<VendorFileTypeLocal> spec = null;
if (paramsNode.has(ParamConstant.KEY_SEARCH_TEXT)) {
spec = getSearchSpecification(paramsNode.get(ParamConstant.KEY_SEARCH_TEXT).asText());
}
if (paramsNode.has("type")) {
spec = SpecificationUtils.and(spec, (root, query, builder) -> builder.equal(root.get("type"),
VendorType.valueOf(paramsNode.get("type").asText())));
}
// field
spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "lang", "value");
return findAll(spec, pageable).map(VendorFileTypeLocal::toVo);
}
@Cacheable(key = "#p0") @Cacheable(key = "#p0")
@Override @Override
public VendorFileTypeLocalVo findById(Integer id) { public VendorFileTypeLocalVo findById(Integer id) {
return repository.findById(id).map(VendorFileTypeLocal::toVo).orElse(null); return repository.findById(id).map(VendorFileTypeLocal::toVo).orElse(null);
} }
public VendorFileTypeLocal getById(Integer id) {
return repository.findById(id).orElse(null);
}
@Override
public Page<VendorFileTypeLocal> findAll(Specification<VendorFileTypeLocal> spec, Pageable pageable) {
return repository.findAll(spec, pageable);
}
@Cacheable(key = "'all-'+#p0.toLanguageTag()") @Cacheable(key = "'all-'+#p0.toLanguageTag()")
public Map<VendorFileType, VendorFileTypeLocalVo> findAll(Locale locale) { public Map<VendorFileType, VendorFileTypeLocalVo> findAll(Locale locale) {
return repository.getCompleteMapByLocal(locale.toLanguageTag()).entrySet().stream() return repository.getCompleteMapByLocal(locale.toLanguageTag()).entrySet().stream()
@@ -81,20 +54,6 @@ public class VendorFileTypeService implements IEntityService<VendorFileTypeLocal
entry -> entry.getValue().toVo())); entry -> entry.getValue().toVo()));
} }
@Override
public Specification<VendorFileTypeLocal> getSearchSpecification(String searchText) {
if (!StringUtils.hasText(searchText)) {
return null;
}
return (root, query, builder) -> {
return
// builder.or(
builder.like(root.get("type"), "%" + searchText + "%")
// )
;
};
}
@Caching(evict = { @Caching(evict = {
@CacheEvict(key = "#p0.id"), @CacheEvict(key = "#p0.id"),
@CacheEvict(key = "'all-'+#p0.getLang()") @CacheEvict(key = "'all-'+#p0.getLang()")
@@ -113,6 +72,40 @@ public class VendorFileTypeService implements IEntityService<VendorFileTypeLocal
return repository.save(entity); return repository.save(entity);
} }
@Override
protected VendorFileTypeLocalRepository getRepository() {
return repository;
}
@Override
public VendorFileTypeLocal createNewEntity() {
return new VendorFileTypeLocal();
}
@Override
protected Specification<VendorFileTypeLocal> buildSearchSpecification(String searchText) {
return (root, query, builder) -> {
return builder.like(root.get("type"), "%" + searchText + "%");
};
}
@Override
protected Specification<VendorFileTypeLocal> buildParameterSpecification(JsonNode node) {
Specification<VendorFileTypeLocal> spec = null;
if (node.has(ParamConstant.KEY_SEARCH_TEXT)) {
spec = getSearchSpecification(node.get(ParamConstant.KEY_SEARCH_TEXT).asText());
}
if (node.has("type")) {
spec = SpecificationUtils.and(spec, (root, query, builder) -> builder.equal(root.get("type"),
VendorType.valueOf(node.get("type").asText())));
}
// field
spec = SpecificationUtils.andFieldEqualParam(spec, node, "lang", "value");
return spec;
}
@Override @Override
public void updateByVo(VendorFileTypeLocal entity, VendorFileTypeLocalVo vo) throws ServiceException { public void updateByVo(VendorFileTypeLocal entity, VendorFileTypeLocalVo vo) throws ServiceException {
if (entity == null) { if (entity == null) {

View File

@@ -2,18 +2,16 @@ package com.ecep.contract.ds.vendor.service;
import java.util.List; import java.util.List;
import com.ecep.contract.util.SpecificationUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching; import org.springframework.cache.annotation.Caching;
import org.springframework.context.annotation.Lazy; 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.data.jpa.domain.Specification;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.ecep.contract.EntityService;
import com.ecep.contract.IEntityService; import com.ecep.contract.IEntityService;
import com.ecep.contract.QueryService; import com.ecep.contract.QueryService;
import com.ecep.contract.SpringApp; import com.ecep.contract.SpringApp;
@@ -22,6 +20,7 @@ import com.ecep.contract.model.VendorGroup;
import com.ecep.contract.model.VendorGroupRequireFileType; import com.ecep.contract.model.VendorGroupRequireFileType;
import com.ecep.contract.service.ServiceException; import com.ecep.contract.service.ServiceException;
import com.ecep.contract.service.VoableService; import com.ecep.contract.service.VoableService;
import com.ecep.contract.util.SpecificationUtils;
import com.ecep.contract.vo.VendorGroupRequireFileTypeVo; import com.ecep.contract.vo.VendorGroupRequireFileTypeVo;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
@@ -29,55 +28,47 @@ import com.fasterxml.jackson.databind.JsonNode;
@Service @Service
@CacheConfig(cacheNames = "vendor-group-require-file-type") @CacheConfig(cacheNames = "vendor-group-require-file-type")
public class VendorGroupRequireFileTypeService public class VendorGroupRequireFileTypeService
implements IEntityService<VendorGroupRequireFileType>, QueryService<VendorGroupRequireFileType>, extends EntityService<VendorGroupRequireFileType, VendorGroupRequireFileTypeVo, Integer>
implements IEntityService<VendorGroupRequireFileType>, QueryService<VendorGroupRequireFileTypeVo>,
VoableService<VendorGroupRequireFileType, VendorGroupRequireFileTypeVo> { VoableService<VendorGroupRequireFileType, VendorGroupRequireFileTypeVo> {
@Lazy @Lazy
@Autowired @Autowired
private VendorGroupRequireFileTypeRepository repository; private VendorGroupRequireFileTypeRepository repository;
@Override @Override
public VendorGroupRequireFileType getById(Integer id) { protected VendorGroupRequireFileTypeRepository getRepository() {
return repository.findById(id).orElse(null); return repository;
}
@Cacheable(key = "#p0")
public VendorGroupRequireFileType findById(Integer id) {
return getById(id);
} }
@Override @Override
public Page<VendorGroupRequireFileType> findAll(Specification<VendorGroupRequireFileType> spec, Pageable pageable) { public VendorGroupRequireFileType createNewEntity() {
return repository.findAll(spec, pageable); return new VendorGroupRequireFileType();
} }
@Override @Override
public Page<VendorGroupRequireFileType> findAll(JsonNode paramsNode, Pageable pageable) { public VendorGroupRequireFileTypeVo findById(Integer id) {
Specification<VendorGroupRequireFileType> spec = null; return repository.findById(id).map(VendorGroupRequireFileType::toVo).orElse(null);
if (paramsNode.has("searchText")) {
spec = getSearchSpecification(paramsNode.get("searchText").asText());
}
spec = SpecificationUtils.andParam(spec, paramsNode, "group");
// 添加额外的参数过滤
return findAll(spec, pageable);
} }
@Override @Override
public Specification<VendorGroupRequireFileType> getSearchSpecification(String searchText) { protected Specification<VendorGroupRequireFileType> buildSearchSpecification(String searchText) {
return null; return null;
} }
@Override
protected Specification<VendorGroupRequireFileType> buildParameterSpecification(JsonNode paramsNode) {
Specification<VendorGroupRequireFileType> spec = null;
spec = SpecificationUtils.andParam(spec, paramsNode, "group");
return spec;
}
@Cacheable(key = "'byGroup-'+#p0") @Cacheable(key = "'byGroup-'+#p0")
public List<VendorGroupRequireFileTypeVo> findByGroupId(int groupId) { public List<VendorGroupRequireFileTypeVo> findByGroupId(int groupId) {
return repository.findByGroupId(groupId).stream().map(VendorGroupRequireFileType::toVo).toList(); return repository.findByGroupId(groupId).stream().map(VendorGroupRequireFileType::toVo).toList();
} }
// findAll
@Cacheable(key = "'all'")
public List<VendorGroupRequireFileType> findAll() {
return repository.findAll();
}
// save // save
@Override
@Caching(evict = { @Caching(evict = {
@CacheEvict(key = "#p0.id"), @CacheEvict(key = "#p0.id"),
@CacheEvict(key = "'byGroup-'+#p0.group.id"), @CacheEvict(key = "'byGroup-'+#p0.group.id"),
@@ -90,6 +81,7 @@ public class VendorGroupRequireFileTypeService
/** /**
* delete and evict cache * delete and evict cache
*/ */
@Override
@Caching(evict = { @Caching(evict = {
@CacheEvict(key = "#p0.id"), @CacheEvict(key = "'byGroup-'+#p0.group.id"), @CacheEvict(key = "#p0.id"), @CacheEvict(key = "'byGroup-'+#p0.group.id"),
@CacheEvict(key = "'all'") @CacheEvict(key = "'all'")
@@ -121,4 +113,5 @@ public class VendorGroupRequireFileTypeService
} }
} }
} }
} }

View File

@@ -8,12 +8,11 @@ import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching; import org.springframework.cache.annotation.Caching;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import com.ecep.contract.EntityService;
import com.ecep.contract.IEntityService; import com.ecep.contract.IEntityService;
import com.ecep.contract.QueryService; import com.ecep.contract.QueryService;
import com.ecep.contract.ds.vendor.repository.VendorGroupRepository; import com.ecep.contract.ds.vendor.repository.VendorGroupRepository;
@@ -27,22 +26,36 @@ import com.fasterxml.jackson.databind.JsonNode;
@Lazy @Lazy
@Service @Service
@CacheConfig(cacheNames = "vendor-group") @CacheConfig(cacheNames = "vendor-group")
public class VendorGroupService public class VendorGroupService extends EntityService<VendorGroup, VendorGroupVo, Integer>
implements IEntityService<VendorGroup>, QueryService<VendorGroupVo>, VoableService<VendorGroup, VendorGroupVo> { implements IEntityService<VendorGroup>, QueryService<VendorGroupVo>, VoableService<VendorGroup, VendorGroupVo> {
@Lazy @Lazy
@Autowired @Autowired
private VendorGroupRepository vendorGroupRepository; private VendorGroupRepository vendorGroupRepository;
@Override
protected VendorGroupRepository getRepository() {
return vendorGroupRepository;
}
@Override
public VendorGroup createNewEntity() {
VendorGroup group = new VendorGroup();
group.setCode("");
group.setName("");
group.setDescription("");
group.setActive(true);
group.setPriceComparison(true);
group.setRequireQuotationSheetForBid(true);
group.setCanPrePurchase(false);
return group;
}
@Cacheable(key = "#p0") @Cacheable(key = "#p0")
@Override @Override
public VendorGroupVo findById(Integer id) { public VendorGroupVo findById(Integer id) {
return vendorGroupRepository.findById(id).map(VendorGroup::toVo).orElse(null); return vendorGroupRepository.findById(id).map(VendorGroup::toVo).orElse(null);
} }
public VendorGroup getById(Integer id) {
return vendorGroupRepository.findById(id).orElse(null);
}
public VendorGroup findByName(String name) { public VendorGroup findByName(String name) {
return vendorGroupRepository.findByName(name).orElse(null); return vendorGroupRepository.findByName(name).orElse(null);
} }
@@ -57,63 +70,21 @@ public class VendorGroupService
return vendorGroupRepository.findAll(); return vendorGroupRepository.findAll();
} }
public Page<VendorGroup> findAll(Specification<VendorGroup> spec, Pageable pageable) {
return vendorGroupRepository.findAll(spec, pageable);
}
@Override @Override
public Page<VendorGroupVo> findAll(JsonNode paramsNode, Pageable pageable) { protected Specification<VendorGroup> buildSearchSpecification(String searchText) {
Specification<VendorGroup> spec = null;
if (paramsNode.has("searchText")) {
spec = getSearchSpecification(paramsNode.get("searchText").asText());
}
// 添加额外的参数过滤
spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "active", "name", "code");
return findAll(spec, pageable).map(entity -> entity.toVo());
}
@Override
public Specification<VendorGroup> getSearchSpecification(String searchText) {
if (!StringUtils.hasText(searchText)) {
return null;
}
return (root, query, builder) -> { return (root, query, builder) -> {
return builder.or( return builder.or(
builder.like(root.get("name"), "%" + searchText + "%"), builder.like(root.get("name"), "%" + searchText + "%"),
builder.like(root.get("code"), "%" + searchText + "%"), builder.like(root.get("code"), "%" + searchText + "%"),
builder.like(root.get("description"), "%" + searchText + "%") builder.like(root.get("description"), "%" + searchText + "%"));
);
}; };
} }
@Caching(evict = { @Override
@CacheEvict(key = "#p0.id"), protected Specification<VendorGroup> buildParameterSpecification(JsonNode paramsNode) {
@CacheEvict(key = "'code-'+#p0.name"), Specification<VendorGroup> spec = null;
@CacheEvict(key = "'all'"), spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "active", "name", "code");
}) return spec;
public VendorGroup saveEntity(VendorGroup group) {
return vendorGroupRepository.save(group);
}
@Caching(evict = {
@CacheEvict(key = "#p0.id"),
@CacheEvict(key = "'code-'+#p0.name"),
@CacheEvict(key = "'all'"),
})
public void deleteEntity(VendorGroup entity) {
vendorGroupRepository.delete(entity);
}
public VendorGroup newInstance() {
VendorGroup group = new VendorGroup();
group.setCode("");
group.setName("");
group.setDescription("");
group.setActive(true);
group.setPriceComparison(true);
group.setRequireQuotationSheetForBid(true);
group.setCanPrePurchase(false);
return group;
} }
@Override @Override
@@ -134,14 +105,23 @@ public class VendorGroupService
model.setCanPrePurchase(vo.isCanPrePurchase()); model.setCanPrePurchase(vo.isCanPrePurchase());
} }
@Override @Override
@Caching(evict = {
@CacheEvict(key = "#p0.id"),
@CacheEvict(key = "'code-'+#p0.name"),
@CacheEvict(key = "'all'"),
})
public VendorGroup save(VendorGroup entity) { public VendorGroup save(VendorGroup entity) {
return saveEntity(entity); return vendorGroupRepository.save(entity);
} }
@Override @Override
@Caching(evict = {
@CacheEvict(key = "#p0.id"),
@CacheEvict(key = "'code-'+#p0.name"),
@CacheEvict(key = "'all'"),
})
public void delete(VendorGroup entity) { public void delete(VendorGroup entity) {
deleteEntity(entity); vendorGroupRepository.delete(entity);
} }
} }

View File

@@ -77,10 +77,7 @@ public class VendorTypeService extends EntityService<VendorTypeLocal, VendorType
return repository.findById(id).map(VendorTypeLocal::toVo).orElse(null); return repository.findById(id).map(VendorTypeLocal::toVo).orElse(null);
} }
@Override
public VendorTypeLocal getById(Integer id) {
return repository.findById(id).orElse(null);
}
@Cacheable(key = "'all-'+#p0.toLanguageTag()") @Cacheable(key = "'all-'+#p0.toLanguageTag()")
public Map<VendorType, VendorTypeLocal> findAll(Locale locale) { public Map<VendorType, VendorTypeLocal> findAll(Locale locale) {

View File

@@ -20,6 +20,7 @@ import com.ecep.contract.PageArgument;
import com.ecep.contract.PageContent; import com.ecep.contract.PageContent;
import com.ecep.contract.QueryService; import com.ecep.contract.QueryService;
import com.ecep.contract.SpringApp; import com.ecep.contract.SpringApp;
import com.ecep.contract.constant.ServiceConstant;
import com.ecep.contract.constant.WebSocketConstant; import com.ecep.contract.constant.WebSocketConstant;
import com.ecep.contract.handler.SessionInfo; import com.ecep.contract.handler.SessionInfo;
import com.ecep.contract.model.Voable; import com.ecep.contract.model.Voable;
@@ -95,15 +96,15 @@ public class WebSocketServerCallbackManager {
JsonNode argumentsNode = jsonNode.get(WebSocketConstant.ARGUMENTS_FIELD_NAME); JsonNode argumentsNode = jsonNode.get(WebSocketConstant.ARGUMENTS_FIELD_NAME);
Object result = null; Object result = null;
if (methodName.equals("findAll")) { if (methodName.equals(ServiceConstant.FIND_ALL_METHOD_NAME)) {
result = invokerFindAllMethod(service, argumentsNode); result = invokerFindAllMethod(service, argumentsNode);
} else if (methodName.equals("findById")) { } else if (methodName.equals(ServiceConstant.FIND_BY_ID_METHOD_NAME)) {
result = invokerFindByIdMethod(service, argumentsNode); result = invokerFindByIdMethod(service, argumentsNode);
} else if (methodName.equals("save")) { } else if (methodName.equals(ServiceConstant.SAVE_METHOD_NAME)) {
result = invokerSaveMethod(service, argumentsNode); result = invokerSaveMethod(service, argumentsNode);
} else if (methodName.equals("delete")) { } else if (methodName.equals(ServiceConstant.DELETE_METHOD_NAME)) {
result = invokerDeleteMethod(service, argumentsNode); result = invokerDeleteMethod(service, argumentsNode);
} else if (methodName.equals("count")) { } else if (methodName.equals(ServiceConstant.COUNT_METHOD_NAME)) {
result = invokerCountMethod(service, argumentsNode); result = invokerCountMethod(service, argumentsNode);
} else { } else {
result = invokerOtherMethod(service, methodName, argumentsNode); result = invokerOtherMethod(service, methodName, argumentsNode);

View File

@@ -1,4 +1,94 @@
# 服务器端继承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`方法的功能实现是否与父类相同,相同则移除
1.8 检查`findById`f方法的返回值类型须 Vo 类型,如未实现,则添加如下代码
```java
@Override
public VendorGroupRequireFileTypeVo findById(Integer id) {
return repository.findById(id).map(VendorGroupRequireFileType::toVo).orElse(null);
}
```
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 | | 类名 | 是否继承EntityService |
|------|----------------------| |------|----------------------|
@@ -65,39 +155,21 @@
| ProjectFileService | 是 | | ProjectFileService | 是 |
| ProjectFileTypeService | 是 | | ProjectFileTypeService | 是 |
| ProjectFundPlanService | 是 | | ProjectFundPlanService | 是 |
| ProjectIndustryService | | | ProjectIndustryService | |
| ProjectQuotationService | | | ProjectQuotationService | |
| ProjectSaleTypeRequireFileTypeService | | | ProjectSaleTypeRequireFileTypeService | |
| ProjectSaleTypeService | | | ProjectSaleTypeService | |
| ProjectService | 是 | | ProjectService | 是 |
| ProjectTypeService | | | ProjectTypeService | |
| VendorApprovedFileService | | | VendorApprovedFileService | |
| VendorApprovedItemService | | | VendorApprovedItemService | |
| VendorApprovedService | | | VendorApprovedService | |
| VendorCatalogService | | | VendorCatalogService | |
| VendorEntityService | | | VendorEntityService | |
| VendorFileService | | | VendorFileService | |
| VendorFileTypeService | | | VendorFileTypeService | |
| VendorGroupRequireFileTypeService | | | VendorGroupRequireFileTypeService | |
| VendorGroupService | | | VendorGroupService | |
| VendorService | | | VendorService | |
| VendorTypeService | | | VendorTypeService | |
## 分析结果
- 共找到81个实现了IEntityService接口的服务类
- 其中有12个类同时继承了EntityService类
- 大多数服务类69个仅实现了IEntityService接口没有继承EntityService类
继承EntityService类的服务类包括
- CloudRkService
- CloudTycService
- YongYouU8Service
- CompanyBankAccountService
- CompanyService
- ContractService
- SaleOrdersService
- SalesBillVoucherService
- SalesOrderItemService
- ProjectService
- 以及其他几个核心业务服务类