diff --git a/client/src/main/java/com/ecep/contract/WebSocketClientService.java b/client/src/main/java/com/ecep/contract/WebSocketClientService.java index 6a316ed..719cc5f 100644 --- a/client/src/main/java/com/ecep/contract/WebSocketClientService.java +++ b/client/src/main/java/com/ecep/contract/WebSocketClientService.java @@ -33,11 +33,12 @@ import java.util.function.Consumer; * 提供向服务器端发送WebSocket消息的功能 */ @Service -public class WebSocketService { - private static final Logger logger = LoggerFactory.getLogger(WebSocketService.class); +public class WebSocketClientService { + private static final Logger logger = LoggerFactory.getLogger(WebSocketClientService.class); @Getter @Setter private WebSocket webSocket; + @Getter @Autowired private ObjectMapper objectMapper; private static final int RECONNECT_DELAY_MS = 5000; // 重连延迟时间(毫秒) @@ -93,7 +94,11 @@ public class WebSocketService { String sessionId = node.get(WebSocketConstant.SESSION_ID_FIELD_NAME).asText(); WebSocketClientSession session = sessions.get(sessionId); if (session != null) { - session.onMessage(node); + try { + session.onMessage(node); + } catch (Exception e) { + session.updateMessage(java.util.logging.Level.SEVERE, "会话异常: " + e.getMessage()); + } } } else if (node.has(WebSocketConstant.ERROR_CODE_FIELD_NAME)) { int errorCode = node.get(WebSocketConstant.ERROR_CODE_FIELD_NAME).asInt(); @@ -106,6 +111,7 @@ public class WebSocketService { } } + @Override public void onMessage(WebSocket webSocket, ByteString bytes) { // 处理收到的二进制消息 diff --git a/client/src/main/java/com/ecep/contract/WebSocketClientSession.java b/client/src/main/java/com/ecep/contract/WebSocketClientSession.java index 345e180..b59f9e2 100644 --- a/client/src/main/java/com/ecep/contract/WebSocketClientSession.java +++ b/client/src/main/java/com/ecep/contract/WebSocketClientSession.java @@ -1,24 +1,25 @@ package com.ecep.contract; import com.ecep.contract.constant.WebSocketConstant; -import com.ecep.contract.task.Tasker; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import lombok.Getter; -import lombok.Setter; +import org.springframework.beans.BeanUtils; +import java.beans.PropertyDescriptor; import java.util.Map; import java.util.UUID; +import java.util.logging.Level; -public class WebSocketSession { +public class WebSocketClientSession { @Getter private String sessionId = UUID.randomUUID().toString(); private WebSocketClientTasker tasker; - private final WebSocketService webSocketService; + private final WebSocketClientService webSocketService; - public WebSocketSession(WebSocketService webSocketService) { + public WebSocketClientSession(WebSocketClientService webSocketService) { this.webSocketService = webSocketService; } @@ -26,31 +27,63 @@ public class WebSocketSession { } public void submitTask(WebSocketClientTasker tasker, Object... args) throws JsonProcessingException { - Map argments = Map.of( - WebSocketConstant.SESSION_ID_FIELD_NAME, getSessionId(), - "type", "createTask", - "taskName", tasker.getTaskName(), - "args", args); - webSocketService.send(argments); + this.tasker = tasker; + // 将 tasker.getTaskName() 和 args 合并到一个数组参数中 + Object[] mergedArgs = new Object[args.length + 1]; + mergedArgs[0] = tasker.getTaskName(); + System.arraycopy(args, 0, mergedArgs, 1, args.length); + send("createTask", mergedArgs); } + public void send(String type, Object... args) throws JsonProcessingException { + Map arguments = Map.of( + WebSocketConstant.SESSION_ID_FIELD_NAME, getSessionId(), + "type", type, + WebSocketConstant.ARGUMENTS_FIELD_NAME, args); + webSocketService.send(arguments); + } + + public void onMessage(JsonNode node) { if (node.has("type")) { String type = node.get("type").asText(); + JsonNode args = node.get(WebSocketConstant.ARGUMENTS_FIELD_NAME); if (type.equals("message")) { - JsonNode args = node.get("args"); String message = args.get(1).asText(); String level = args.get(0).asText(); - if (tasker instanceof Tasker t) { - t.updateMessage(java.util.logging.Level.parse(level), message); - } + updateMessage(java.util.logging.Level.parse(level), message); } else if (type.equals("title")) { - JsonNode args = node.get("args"); String message = args.get(0).asText(); - if (tasker instanceof Tasker t) { - t.updateTitle(message); + tasker.updateTitle(message); + } else if (type.equals("property")) { + String name = args.get(0).asText(); + Object value = args.get(1); + try { + PropertyDescriptor descriptor = BeanUtils.getPropertyDescriptor(tasker.getClass(), name); + System.out.println("descriptor = " + descriptor); + System.out.println("descriptor.getPropertyType() = " + descriptor.getPropertyType()); + Object object = webSocketService.getObjectMapper().convertValue(value, descriptor.getPropertyType()); + System.out.println("object = " + object); + System.out.println("descriptor.getWriteMethod() = " + descriptor.getWriteMethod()); + System.out.println("descriptor.getWriteMethod().getParameterTypes() = " + descriptor.getWriteMethod().getParameterTypes()); + descriptor.getWriteMethod().invoke(tasker, object); + } catch (Exception e) { + tasker.updateMessage(java.util.logging.Level.SEVERE, "属性设置失败: " + name + " = " + value); } + } else if (type.equals("progress")) { + long current = args.get(0).asLong(); + long total = args.get(1).asLong(); + tasker.updateProgress(current, total); + } else { + tasker.updateMessage(java.util.logging.Level.INFO, "未知的消息类型: " + node.toString()); } + } else { + tasker.updateMessage(java.util.logging.Level.INFO, "未知的消息: " + node.toString()); } } + + public void updateMessage(Level level, String message) { + tasker.updateMessage(level, message); + } + } diff --git a/client/src/main/java/com/ecep/contract/WebSocketClientTasker.java b/client/src/main/java/com/ecep/contract/WebSocketClientTasker.java index 31be58f..f540853 100644 --- a/client/src/main/java/com/ecep/contract/WebSocketClientTasker.java +++ b/client/src/main/java/com/ecep/contract/WebSocketClientTasker.java @@ -1,4 +1,13 @@ package com.ecep.contract; +import java.util.logging.Level; + public interface WebSocketClientTasker { + String getTaskName(); + + void updateMessage(Level level, String message); + + void updateTitle(String title); + + void updateProgress(long current, long total); } diff --git a/client/src/main/java/com/ecep/contract/controller/HomeWindowController.java b/client/src/main/java/com/ecep/contract/controller/HomeWindowController.java index 1cbba53..f93abd9 100644 --- a/client/src/main/java/com/ecep/contract/controller/HomeWindowController.java +++ b/client/src/main/java/com/ecep/contract/controller/HomeWindowController.java @@ -18,7 +18,7 @@ import org.springframework.stereotype.Component; import com.ecep.contract.Desktop; import com.ecep.contract.DesktopUtils; -import com.ecep.contract.WebSocketService; +import com.ecep.contract.WebSocketClientService; import com.ecep.contract.controller.bank.BankManagerWindowController; import com.ecep.contract.controller.company.CompanyManagerWindowController; import com.ecep.contract.controller.contract.ContractManagerWindowController; @@ -101,7 +101,7 @@ public class HomeWindowController extends BaseController { Desktop.instance.getTaskMonitorCenter().bindStatusLabel(taskMonitorLabel); Desktop.instance.getActiveEmployee().initialize(); - WebSocketService webSocketService = getBean(WebSocketService.class); + WebSocketClientService webSocketService = getBean(WebSocketClientService.class); webSocketMonitorIcon.iconProperty() .bind(webSocketService.getOnlineProperty().map(b -> b ? "CHAIN" : "CHAIN_BROKEN")); webSocketMonitorLabel.textProperty().bind(webSocketService.getMessageProperty()); @@ -219,7 +219,7 @@ public class HomeWindowController extends BaseController { @Override public void onHidden(WindowEvent windowEvent) { System.out.println("windowEvent = " + windowEvent); - WebSocketService webSocketService = getBean(WebSocketService.class); + WebSocketClientService webSocketService = getBean(WebSocketClientService.class); webSocketService.closeWebSocket(); // 在窗口隐藏时关闭WebSocket连接 super.onHidden(windowEvent); } diff --git a/client/src/main/java/com/ecep/contract/controller/contract/ContractVerifyWindowController.java b/client/src/main/java/com/ecep/contract/controller/contract/ContractVerifyWindowController.java index ecec7a4..f0c9013 100644 --- a/client/src/main/java/com/ecep/contract/controller/contract/ContractVerifyWindowController.java +++ b/client/src/main/java/com/ecep/contract/controller/contract/ContractVerifyWindowController.java @@ -10,6 +10,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; @@ -263,9 +264,11 @@ public class ContractVerifyWindowController extends BaseController { viewTableDataSet.clear(); Pageable pageRequest = PageRequest.ofSize(200); AtomicInteger counter = new AtomicInteger(0); - Map params = new HashMap<>(); - params.put("setupDate", - ParamUtils.between(setupDateBeginSelector.getValue(), setupDateEndSelector.getValue())); + + Map params = ParamUtils.builder(). + between("setupDate", setupDateBeginSelector.getValue(), setupDateEndSelector.getValue()) + .build(); + long total = contractService.count(params); setStatus("合同:" + total + " 条"); @@ -293,6 +296,7 @@ public class ContractVerifyWindowController extends BaseController { model.getCode().set(contract.getCode()); model.getName().set(contract.getName()); model.getSetupDate().set(contract.getSetupDate()); + comm.verify(contract, model); setStatus("合同验证进度:" + counter.get() + " / " + total); // 移除中间消息 @@ -332,7 +336,13 @@ public class ContractVerifyWindowController extends BaseController { return; } runAsync(() -> { - Contract contract = contractService.findByCode(contractCode); + Contract contract = null; + try { + contract = contractService.findByCode(contractCode); + } catch (Exception e) { + handleException("查找合同 " + contractCode + " 时发生错误", e); + return; + } if (contract == null) { return; } @@ -369,7 +379,13 @@ public class ContractVerifyWindowController extends BaseController { if (!StringUtils.hasText(contractCode)) { return; } - Contract contract = contractService.findByCode(contractCode); + Contract contract = null; + try { + contract = contractService.findByCode(contractCode); + } catch (Exception e) { + handleException("查找合同 " + contractCode + " 时发生错误", e); + return; + } if (contract == null) { return; } diff --git a/client/src/main/java/com/ecep/contract/controller/contract/ContractWindowController.java b/client/src/main/java/com/ecep/contract/controller/contract/ContractWindowController.java index ec28580..1642890 100644 --- a/client/src/main/java/com/ecep/contract/controller/contract/ContractWindowController.java +++ b/client/src/main/java/com/ecep/contract/controller/contract/ContractWindowController.java @@ -1,23 +1,10 @@ package com.ecep.contract.controller.contract; -import java.io.File; - -import org.springframework.context.annotation.Lazy; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; - +import com.ecep.contract.ContractPayWay; import com.ecep.contract.DesktopUtils; import com.ecep.contract.controller.AbstEntityController; import com.ecep.contract.controller.company.CompanyWindowController; -import com.ecep.contract.controller.tab.ContractTabSkinBase; -import com.ecep.contract.controller.tab.ContractTabSkinFiles; -import com.ecep.contract.controller.tab.ContractTabSkinItemsV2; -import com.ecep.contract.controller.tab.ContractTabSkinPayPlan; -import com.ecep.contract.controller.tab.ContractTabSkinPurchaseOrders; -import com.ecep.contract.controller.tab.ContractTabSkinSaleOrders; -import com.ecep.contract.controller.tab.ContractTabSkinSubContract; -import com.ecep.contract.controller.tab.ContractTabSkinVendorBid; +import com.ecep.contract.controller.tab.*; import com.ecep.contract.model.Company; import com.ecep.contract.model.Contract; import com.ecep.contract.service.CompanyService; @@ -27,19 +14,18 @@ import com.ecep.contract.task.ContractVerifyTasker; import com.ecep.contract.util.FxmlPath; import com.ecep.contract.util.UITools; import com.ecep.contract.vm.ContractViewModel; - import javafx.collections.ObservableList; import javafx.event.ActionEvent; -import javafx.scene.control.Button; -import javafx.scene.control.DatePicker; -import javafx.scene.control.Label; -import javafx.scene.control.Tab; -import javafx.scene.control.TabPane; -import javafx.scene.control.TextArea; -import javafx.scene.control.TextField; +import javafx.scene.control.*; import javafx.scene.layout.BorderPane; import javafx.stage.Window; import javafx.stage.WindowEvent; +import org.springframework.context.annotation.Lazy; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.io.File; @Lazy @Scope("prototype") @@ -145,31 +131,27 @@ public class ContractWindowController ObservableList tabs = tabPane.getTabs(); registerTabSkin(baseInfoTab, tab -> new ContractTabSkinBase(this)); - switch (viewModel.getPayWay().get()) { - case RECEIVE -> { - tabs.remove(extendVendorInfo); - registerTabSkin(contractTab, t -> new ContractTabSkinSubContract(this)); - tabs.remove(bidVendorTab); - Tab saleOrderTab = new Tab("销售订单"); - tabs.add(saleOrderTab); - registerTabSkin(saleOrderTab, tab -> new ContractTabSkinSaleOrders(this, tab)); - tabs.add(new Tab("票据")); - break; - } - case PAY -> { - registerTabSkin(extendVendorInfo, t -> new ContractTabSkinExtendVendorInfo(this)); - tabs.remove(contractTab); - registerTabSkin(bidVendorTab, t -> new ContractTabSkinVendorBid(this)); + ContractPayWay payWay = viewModel.getPayWay().get(); + if (payWay == ContractPayWay.RECEIVE) { + tabs.remove(extendVendorInfo); + registerTabSkin(contractTab, t -> new ContractTabSkinSubContract(this)); + tabs.remove(bidVendorTab); + Tab saleOrderTab = new Tab("销售订单"); + tabs.add(saleOrderTab); + registerTabSkin(saleOrderTab, tab -> new ContractTabSkinSaleOrders(this, tab)); + tabs.add(new Tab("票据")); + } else if (payWay == ContractPayWay.PAY) { + registerTabSkin(extendVendorInfo, t -> new ContractTabSkinExtendVendorInfo(this)); + tabs.remove(contractTab); + registerTabSkin(bidVendorTab, t -> new ContractTabSkinVendorBid(this)); - Tab purchaseOrderTab = new Tab("采购订单"); - tabs.add(purchaseOrderTab); - registerTabSkin(purchaseOrderTab, tab -> new ContractTabSkinPurchaseOrders(this, tab)); + Tab purchaseOrderTab = new Tab("采购订单"); + tabs.add(purchaseOrderTab); + registerTabSkin(purchaseOrderTab, tab -> new ContractTabSkinPurchaseOrders(this, tab)); - tabs.add(new Tab("发货单")); - tabs.add(new Tab("签收单")); - tabs.add(new Tab("付款单")); - break; - } + tabs.add(new Tab("发货单")); + tabs.add(new Tab("签收单")); + tabs.add(new Tab("付款单")); } registerTabSkin(itemTab, tab -> new ContractTabSkinItemsV2(this)); diff --git a/client/src/main/java/com/ecep/contract/controller/customer/CustomerTabSkinFile.java b/client/src/main/java/com/ecep/contract/controller/customer/CustomerTabSkinFile.java index 65f0c03..088eb67 100644 --- a/client/src/main/java/com/ecep/contract/controller/customer/CustomerTabSkinFile.java +++ b/client/src/main/java/com/ecep/contract/controller/customer/CustomerTabSkinFile.java @@ -9,6 +9,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ScheduledExecutorService; import java.util.function.Consumer; +import com.ecep.contract.service.CompanyCustomerFileTypeService; import org.springframework.util.StringUtils; import com.ecep.contract.CompanyCustomerFileType; @@ -104,9 +105,9 @@ public class CustomerTabSkinFile table.disableProperty().bind(viewModel.getPath().isEmpty()); fileTable_idColumn.setCellValueFactory(param -> param.getValue().getId()); - + CompanyCustomerFileTypeService fileTypeService = getCachedBean(CompanyCustomerFileTypeService.class); ObservableMap observableMapByLocal = FXCollections - .observableMap(companyCustomerFileService.getFileTypeLocalMap(getLocale())); + .observableMap(fileTypeService.findAll(getLocale())); fileTable_typeColumn.setCellValueFactory(param -> Bindings.valueAt(observableMapByLocal, param.getValue().getType()).map(BaseEnumEntity::getValue)); @@ -215,7 +216,6 @@ public class CustomerTabSkinFile } - List companyCustomerFiles = new ArrayList<>(); for (File file : files) { File dest = new File(dir, file.getName()); if (file.renameTo(dest)) { @@ -224,12 +224,9 @@ public class CustomerTabSkinFile ccf.setType(CompanyCustomerFileType.General); ccf.setFilePath(dest.getAbsolutePath()); ccf.setValid(false); - companyCustomerFiles.add(ccf); + getCompanyCustomerFileService().save(ccf); } } - - getCompanyCustomerFileService().saveAll(companyCustomerFiles); - loadTableDataSet(); } diff --git a/client/src/main/java/com/ecep/contract/controller/employee/EmployeeTabSkinAuthBind.java b/client/src/main/java/com/ecep/contract/controller/employee/EmployeeTabSkinAuthBind.java index 5627412..cdba385 100644 --- a/client/src/main/java/com/ecep/contract/controller/employee/EmployeeTabSkinAuthBind.java +++ b/client/src/main/java/com/ecep/contract/controller/employee/EmployeeTabSkinAuthBind.java @@ -83,7 +83,7 @@ public class EmployeeTabSkinAuthBind MenuItem menuItem = new MenuItem("导入未关联"); menuItem.setOnAction(event -> { EmployeeAuthBindService service = getEmployeeAuthBindService(); - List authBinds = service.findAllByEmployee(null, Sort.unsorted()); + List authBinds = service.findAllByEmployee(null); for (EmployeeAuthBind authBind : authBinds) { authBind.setEmployee(getEntity()); authBind.setUpdateTime(LocalDateTime.now()); diff --git a/client/src/main/java/com/ecep/contract/controller/employee/EmployeeTabSkinRole.java b/client/src/main/java/com/ecep/contract/controller/employee/EmployeeTabSkinRole.java index a015034..ffd2f41 100644 --- a/client/src/main/java/com/ecep/contract/controller/employee/EmployeeTabSkinRole.java +++ b/client/src/main/java/com/ecep/contract/controller/employee/EmployeeTabSkinRole.java @@ -1,19 +1,18 @@ package com.ecep.contract.controller.employee; -import java.util.HashMap; -import java.util.List; - -import org.springframework.data.domain.Pageable; - import com.ecep.contract.controller.tab.TabSkin; import com.ecep.contract.model.Employee; import com.ecep.contract.model.EmployeeRole; - +import com.ecep.contract.service.EmployeeRoleService; import javafx.beans.property.BooleanProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.collections.ListChangeListener; import javafx.scene.control.ListCell; import javafx.scene.control.Tab; +import org.springframework.data.domain.Pageable; + +import java.util.HashMap; +import java.util.List; public class EmployeeTabSkinRole extends AbstEmployeeBasedTabSkin diff --git a/client/src/main/java/com/ecep/contract/controller/project/ApplyNewProjectWindowController.java b/client/src/main/java/com/ecep/contract/controller/project/ApplyNewProjectWindowController.java index bf43700..233a25c 100644 --- a/client/src/main/java/com/ecep/contract/controller/project/ApplyNewProjectWindowController.java +++ b/client/src/main/java/com/ecep/contract/controller/project/ApplyNewProjectWindowController.java @@ -17,7 +17,7 @@ import com.ecep.contract.model.Project; import com.ecep.contract.model.ProjectSaleType; import com.ecep.contract.service.EmployeeService; import com.ecep.contract.service.ProjectService; -import com.ecep.contract.service.SaleTypeService; +import com.ecep.contract.service.ProjectSaleTypeService; import com.ecep.contract.util.FxmlPath; import com.ecep.contract.vm.ProjectViewModel; @@ -45,7 +45,7 @@ public class ApplyNewProjectWindowController extends BaseController { @Autowired private ProjectService projectService; @Autowired - private SaleTypeService saleTypeService; + private ProjectSaleTypeService saleTypeService; @Autowired private EmployeeService employeeService; diff --git a/client/src/main/java/com/ecep/contract/controller/project/ProjectManagerSkin.java b/client/src/main/java/com/ecep/contract/controller/project/ProjectManagerSkin.java index d139f51..b03a023 100644 --- a/client/src/main/java/com/ecep/contract/controller/project/ProjectManagerSkin.java +++ b/client/src/main/java/com/ecep/contract/controller/project/ProjectManagerSkin.java @@ -17,7 +17,7 @@ import com.ecep.contract.service.CompanyService; import com.ecep.contract.service.ProductTypeService; import com.ecep.contract.service.ProjectService; import com.ecep.contract.service.ProjectTypeService; -import com.ecep.contract.service.SaleTypeService; +import com.ecep.contract.service.ProjectSaleTypeService; import com.ecep.contract.vm.ProjectViewModel; import javafx.application.Platform; @@ -36,7 +36,7 @@ public class ProjectManagerSkin @Setter private ProjectTypeService projectTypeService; @Setter - private SaleTypeService saleTypeService; + private ProjectSaleTypeService saleTypeService; @Setter private ProductTypeService productTypeService; @@ -55,9 +55,9 @@ public class ProjectManagerSkin return companyService; } - public SaleTypeService getSaleTypeService() { + public ProjectSaleTypeService getSaleTypeService() { if (saleTypeService == null) { - saleTypeService = getBean(SaleTypeService.class); + saleTypeService = getBean(ProjectSaleTypeService.class); } return saleTypeService; } diff --git a/client/src/main/java/com/ecep/contract/controller/project/ProjectTabSkinBase.java b/client/src/main/java/com/ecep/contract/controller/project/ProjectTabSkinBase.java index 017dfa9..f37cb73 100644 --- a/client/src/main/java/com/ecep/contract/controller/project/ProjectTabSkinBase.java +++ b/client/src/main/java/com/ecep/contract/controller/project/ProjectTabSkinBase.java @@ -25,7 +25,7 @@ import com.ecep.contract.service.ProductUsageService; import com.ecep.contract.service.ProjectCostService; import com.ecep.contract.service.ProjectIndustryService; import com.ecep.contract.service.ProjectTypeService; -import com.ecep.contract.service.SaleTypeService; +import com.ecep.contract.service.ProjectSaleTypeService; import com.ecep.contract.util.UITools; import javafx.beans.binding.Bindings; @@ -57,7 +57,7 @@ public class ProjectTabSkinBase extends AbstProjectBasedTabSkin implements TabSk @Setter private ProductTypeService productTypeService; @Setter - private SaleTypeService saleTypeService; + private ProjectSaleTypeService saleTypeService; @Setter private ProductUsageService productUsageService; @Setter @@ -96,9 +96,9 @@ public class ProjectTabSkinBase extends AbstProjectBasedTabSkin implements TabSk return productTypeService; } - private SaleTypeService getSaleTypeService() { + private ProjectSaleTypeService getSaleTypeService() { if (saleTypeService == null) { - saleTypeService = getBean(SaleTypeService.class); + saleTypeService = getBean(ProjectSaleTypeService.class); } return saleTypeService; } diff --git a/client/src/main/java/com/ecep/contract/controller/project/ProjectTabSkinCustomerInfo.java b/client/src/main/java/com/ecep/contract/controller/project/ProjectTabSkinCustomerInfo.java index 9b23401..87a41e3 100644 --- a/client/src/main/java/com/ecep/contract/controller/project/ProjectTabSkinCustomerInfo.java +++ b/client/src/main/java/com/ecep/contract/controller/project/ProjectTabSkinCustomerInfo.java @@ -3,6 +3,7 @@ package com.ecep.contract.controller.project; import java.util.List; import java.util.function.BiFunction; +import com.ecep.contract.service.*; import org.controlsfx.control.textfield.AutoCompletionBinding; import com.ecep.contract.util.ProxyUtils; import org.springframework.util.StringUtils; @@ -17,10 +18,6 @@ import com.ecep.contract.model.Company; import com.ecep.contract.model.CompanyBankAccount; import com.ecep.contract.model.CompanyContact; import com.ecep.contract.model.CompanyInvoiceInfo; -import com.ecep.contract.service.BankService; -import com.ecep.contract.service.CompanyBankAccountService; -import com.ecep.contract.service.CompanyContactService; -import com.ecep.contract.service.CompanyService; import com.ecep.contract.util.FxmlPath; import com.ecep.contract.util.UITools; diff --git a/client/src/main/java/com/ecep/contract/controller/project/cost/ProjectCostExportExcelTasker.java b/client/src/main/java/com/ecep/contract/controller/project/cost/ProjectCostExportExcelTasker.java index 302aa32..9f912e1 100644 --- a/client/src/main/java/com/ecep/contract/controller/project/cost/ProjectCostExportExcelTasker.java +++ b/client/src/main/java/com/ecep/contract/controller/project/cost/ProjectCostExportExcelTasker.java @@ -48,7 +48,7 @@ import com.ecep.contract.service.ProjectCostService; import com.ecep.contract.service.ProjectIndustryService; import com.ecep.contract.service.ProjectService; import com.ecep.contract.service.ProjectTypeService; -import com.ecep.contract.service.SaleTypeService; +import com.ecep.contract.service.ProjectSaleTypeService; import com.ecep.contract.task.Tasker; import lombok.Setter; @@ -211,7 +211,7 @@ public class ProjectCostExportExcelTasker extends Tasker { ProjectSaleType saleType = project.getSaleType(); if (saleType != null) { if (!ProxyUtils.isInitialized(saleType)) { - saleType = getBean(SaleTypeService.class).findById(saleType.getId()); + saleType = getBean(ProjectSaleTypeService.class).findById(saleType.getId()); project.setSaleType(saleType); } setCellValue(sheet, "M5", saleType.getName()); diff --git a/client/src/main/java/com/ecep/contract/controller/project/cost/ProjectCostTabSkinItems.java b/client/src/main/java/com/ecep/contract/controller/project/cost/ProjectCostTabSkinItems.java index bc43c75..8e1adc5 100644 --- a/client/src/main/java/com/ecep/contract/controller/project/cost/ProjectCostTabSkinItems.java +++ b/client/src/main/java/com/ecep/contract/controller/project/cost/ProjectCostTabSkinItems.java @@ -2,10 +2,7 @@ package com.ecep.contract.controller.project.cost; import java.text.NumberFormat; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.Function; import org.controlsfx.control.textfield.AutoCompletionBinding; @@ -165,7 +162,7 @@ public class ProjectCostTabSkinItems @Override public Map getSpecification(ProjectCost parent) { - Map params = getSpecification(); + Map params = new HashMap<>(); params.put("cost", parent); return params; } @@ -252,8 +249,8 @@ public class ProjectCostTabSkinItems } static void startEdit(final Cell cell, - final EntityStringConverter converter, - final TextField textField) { + final EntityStringConverter converter, + final TextField textField) { if (textField != null) { textField.setText(getItemText(cell, converter)); } @@ -512,7 +509,7 @@ public class ProjectCostTabSkinItems } private void initializeNumberColumn(TableColumn column, - Function> supplier) { + Function> supplier) { column.setCellValueFactory(param -> supplier.apply(param.getValue())); column.setCellFactory(TextFieldTableCell.forTableColumn(new NumberStringConverter())); column.setOnEditCommit(event -> changed(event, supplier)); diff --git a/client/src/main/java/com/ecep/contract/controller/project/sale_type/AbstProjectSaleTypeBasedTabSkin.java b/client/src/main/java/com/ecep/contract/controller/project/sale_type/AbstProjectSaleTypeBasedTabSkin.java index 9474cdb..aebc2cb 100644 --- a/client/src/main/java/com/ecep/contract/controller/project/sale_type/AbstProjectSaleTypeBasedTabSkin.java +++ b/client/src/main/java/com/ecep/contract/controller/project/sale_type/AbstProjectSaleTypeBasedTabSkin.java @@ -3,7 +3,7 @@ package com.ecep.contract.controller.project.sale_type; import com.ecep.contract.controller.tab.AbstEntityBasedTabSkin; import com.ecep.contract.controller.tab.TabSkin; import com.ecep.contract.model.ProjectSaleType; -import com.ecep.contract.service.SaleTypeService; +import com.ecep.contract.service.ProjectSaleTypeService; import com.ecep.contract.vm.ProjectSaleTypeViewModel; public abstract class AbstProjectSaleTypeBasedTabSkin @@ -14,7 +14,7 @@ public abstract class AbstProjectSaleTypeBasedTabSkin super(controller); } - public SaleTypeService getSaleTypeService() { + public ProjectSaleTypeService getSaleTypeService() { return controller.saleTypeService; } } diff --git a/client/src/main/java/com/ecep/contract/controller/project/sale_type/AbstProjectSaleTypeTableTabSkin.java b/client/src/main/java/com/ecep/contract/controller/project/sale_type/AbstProjectSaleTypeTableTabSkin.java index 2735b6e..f9fef5d 100644 --- a/client/src/main/java/com/ecep/contract/controller/project/sale_type/AbstProjectSaleTypeTableTabSkin.java +++ b/client/src/main/java/com/ecep/contract/controller/project/sale_type/AbstProjectSaleTypeTableTabSkin.java @@ -6,7 +6,7 @@ import com.ecep.contract.controller.tab.TabSkin; import com.ecep.contract.controller.table.AbstEntityTableTabSkin; import com.ecep.contract.model.IdentityEntity; import com.ecep.contract.model.ProjectSaleType; -import com.ecep.contract.service.SaleTypeService; +import com.ecep.contract.service.ProjectSaleTypeService; import com.ecep.contract.vm.IdentityViewModel; import com.ecep.contract.vm.ProjectSaleTypeViewModel; @@ -18,7 +18,7 @@ public abstract class AbstProjectSaleTypeTableTabSkin { @Setter - private SaleTypeService saleTypeService; + private ProjectSaleTypeService saleTypeService; public ProjectSaleTypeManagerSkin(ProjectSaleTypeManagerWindowController controller) { super(controller); } - public SaleTypeService getSaleTypeService() { + public ProjectSaleTypeService getSaleTypeService() { if (saleTypeService == null) { - saleTypeService = getBean(SaleTypeService.class); + saleTypeService = getBean(ProjectSaleTypeService.class); } return saleTypeService; } diff --git a/client/src/main/java/com/ecep/contract/controller/project/sale_type/ProjectSaleTypeManagerWindowController.java b/client/src/main/java/com/ecep/contract/controller/project/sale_type/ProjectSaleTypeManagerWindowController.java index c87b975..873d8b2 100644 --- a/client/src/main/java/com/ecep/contract/controller/project/sale_type/ProjectSaleTypeManagerWindowController.java +++ b/client/src/main/java/com/ecep/contract/controller/project/sale_type/ProjectSaleTypeManagerWindowController.java @@ -9,7 +9,7 @@ import org.springframework.stereotype.Component; import com.ecep.contract.controller.AbstManagerWindowController; import com.ecep.contract.model.ProjectSaleType; -import com.ecep.contract.service.SaleTypeService; +import com.ecep.contract.service.ProjectSaleTypeService; import com.ecep.contract.util.FxmlPath; import com.ecep.contract.vm.ProjectSaleTypeViewModel; @@ -24,7 +24,7 @@ public class ProjectSaleTypeManagerWindowController extends AbstManagerWindowController { @Autowired - private SaleTypeService saleTypeService; + private ProjectSaleTypeService saleTypeService; public TableColumn idColumn; public TableColumn nameColumn; @@ -51,7 +51,7 @@ public class ProjectSaleTypeManagerWindowController @Override - public SaleTypeService getViewModelService() { + public ProjectSaleTypeService getViewModelService() { return saleTypeService; } } diff --git a/client/src/main/java/com/ecep/contract/controller/project/sale_type/ProjectSaleTypeWindowController.java b/client/src/main/java/com/ecep/contract/controller/project/sale_type/ProjectSaleTypeWindowController.java index 8136ff1..8c98a7e 100644 --- a/client/src/main/java/com/ecep/contract/controller/project/sale_type/ProjectSaleTypeWindowController.java +++ b/client/src/main/java/com/ecep/contract/controller/project/sale_type/ProjectSaleTypeWindowController.java @@ -13,7 +13,7 @@ import org.springframework.stereotype.Component; import com.ecep.contract.ContractFileType; import com.ecep.contract.controller.AbstEntityController; import com.ecep.contract.model.ProjectSaleType; -import com.ecep.contract.service.SaleTypeService; +import com.ecep.contract.service.ProjectSaleTypeService; import com.ecep.contract.util.FxmlPath; import com.ecep.contract.vm.DeliverySignMethodViewModel; import com.ecep.contract.vm.ProjectSaleTypeViewModel; @@ -82,7 +82,7 @@ public class ProjectSaleTypeWindowController public TableColumn signMethodTable_createdColumn; @Autowired - protected SaleTypeService saleTypeService; + protected ProjectSaleTypeService saleTypeService; @Override public void show(Stage stage) { @@ -98,7 +98,7 @@ public class ProjectSaleTypeWindowController } @Override - public SaleTypeService getViewModelService() { + public ProjectSaleTypeService getViewModelService() { return saleTypeService; } diff --git a/client/src/main/java/com/ecep/contract/controller/tab/ContractTabSkinBase.java b/client/src/main/java/com/ecep/contract/controller/tab/ContractTabSkinBase.java index 89c2034..281e00f 100644 --- a/client/src/main/java/com/ecep/contract/controller/tab/ContractTabSkinBase.java +++ b/client/src/main/java/com/ecep/contract/controller/tab/ContractTabSkinBase.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.NoSuchElementException; import java.util.Objects; import java.util.Optional; +import java.util.concurrent.ExecutionException; import org.controlsfx.control.textfield.TextFields; import org.controlsfx.glyphfont.Glyph; @@ -327,7 +328,13 @@ public class ContractTabSkinBase extends AbstContractBasedTabSkin { public void onContractOpenMainContractAction(ActionEvent event) { String parentCode = viewModel.getParentCode().get(); - Contract parent = getContractService().findByCode(parentCode); + Contract parent = null; + try { + parent = getContractService().findByCode(parentCode); + } catch (Exception e) { + handleException("查找合同 " + parentCode + " 时发生错误", e); + return; + } if (parent == null) { UITools.showAlertAndWait("没有找到上级合同:" + parentCode); return; @@ -357,7 +364,7 @@ public class ContractTabSkinBase extends AbstContractBasedTabSkin { } } - public void onContractChangePathAction(ActionEvent event) { + public void onContractChangePathAction(ActionEvent event) { DirectoryChooser chooser = new DirectoryChooser(); Contract entity = getEntity(); String path = entity.getPath(); @@ -394,14 +401,19 @@ public class ContractTabSkinBase extends AbstContractBasedTabSkin { // 根据上级合同设置初始目录 String parentCode = entity.getParentCode(); if (StringUtils.hasText(parentCode)) { - Contract parent = getContractService().findByCode(parentCode); - if (parent != null) { - if (StringUtils.hasText(parent.getPath())) { - File dir = new File(parent.getPath()); - if (dir.exists()) { - initialDirectory = dir; + try { + Contract parent = getContractService().findByCode(parentCode); + if (parent != null) { + if (StringUtils.hasText(parent.getPath())) { + File dir = new File(parent.getPath()); + if (dir.exists()) { + initialDirectory = dir; + } } } + } catch (Exception e) { + handleException("查找合同 " + parentCode + " 时发生错误", e); + return; } } } diff --git a/client/src/main/java/com/ecep/contract/service/CompanyCustomerFileService.java b/client/src/main/java/com/ecep/contract/service/CompanyCustomerFileService.java index 13a799d..8893e93 100644 --- a/client/src/main/java/com/ecep/contract/service/CompanyCustomerFileService.java +++ b/client/src/main/java/com/ecep/contract/service/CompanyCustomerFileService.java @@ -1,20 +1,21 @@ package com.ecep.contract.service; +import com.ecep.contract.CompanyCustomerFileType; +import com.ecep.contract.MessageHolder; +import com.ecep.contract.SpringApp; +import com.ecep.contract.model.*; +import com.ecep.contract.util.ParamUtils; +import com.ecep.contract.vm.CompanyCustomerFileViewModel; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + import java.io.File; import java.time.LocalDate; +import java.util.Comparator; import java.util.List; import java.util.Locale; import java.util.Map; -import org.springframework.stereotype.Service; - -import com.ecep.contract.CompanyCustomerFileType; -import com.ecep.contract.MessageHolder; -import com.ecep.contract.model.CompanyCustomer; -import com.ecep.contract.model.CompanyCustomerEvaluationFormFile; -import com.ecep.contract.model.CompanyCustomerFile; -import com.ecep.contract.model.CompanyCustomerFileTypeLocal; -import com.ecep.contract.vm.CompanyCustomerFileViewModel; @Service public class CompanyCustomerFileService extends QueryService { @@ -23,20 +24,69 @@ public class CompanyCustomerFileService extends QueryService params = ParamUtils.builder().equals("company", company.getId()).build(); + long count = contractService.count(params); + if (count == 0) { + holder.info("未发现已登记的合同"); + return null; + } + + // 检索评估表 + List files = findAllByCustomerAndType(companyCustomer, CompanyCustomerFileType.EvaluationForm); + CompanyCustomerFile latestFile = files.stream() + .filter(v -> v.getSignDate() != null && v.isValid()) + .max(Comparator.comparing(CompanyCustomerFile::getSignDate)) + .orElse(null); + if (latestFile == null) { + // 没有有效的评估表的评价日期 + holder.warn("未发现有效的评估表"); + // 返回最早的合同日期 + Contract firstContract = contractService.findAll(params, Pageable.unpaged()).stream() + .filter(v -> v.getSetupDate() != null && !v.getSetupDate().isBefore(miniContractDate)) + .min(Comparator.comparing(Contract::getSetupDate)) + .orElse(null); + if (firstContract == null) { + holder.warn("最早的合同不存在?"); + return null; + } + + LocalDate setupDate = firstContract.getSetupDate(); + holder.info("依据合同 " + firstContract.getCode() + " 的日期 " + setupDate + " 推算"); + return SpringApp.getBean(HolidayService.class).adjustToWorkDay(setupDate.plusDays(-7)); + } + + // 检查失效日期起的第一个合同 + LocalDate nextInValidDate = latestFile.getSignDate().plusYears(1); + File file = new File(latestFile.getFilePath()); + holder.info("依据 " + file.getName() + " 的失效期 " + nextInValidDate + " 检索合同"); + List matchedContracts = contractService.findAll(params, Pageable.unpaged()).stream() + .filter(v -> v.getSetupDate().isAfter(nextInValidDate)).toList(); + // 没有在失效日期后的合同时,使用失效日期 + if (matchedContracts.isEmpty()) { + holder.info("未发现失效期 " + nextInValidDate + " 后的合同"); + return null; + } + holder.info("发现匹配合同 " + matchedContracts.size() + " 个"); + + // 按时间取最早一个 + Contract firstContract = matchedContracts.stream() + .min(Comparator.comparing(Contract::getSetupDate)) + .orElse(null); + LocalDate setupDate = firstContract.getSetupDate(); + holder.info("匹配失效期 " + nextInValidDate + " 后的第一个合同 " + firstContract.getCode() + ", 依据合同 " + firstContract.getCode() + " 的日期 " + setupDate + " 推算"); + return SpringApp.getBean(HolidayService.class).adjustToWorkDay(setupDate.plusDays(-7)); } public File getEvaluationFormTemplate() { throw new UnsupportedOperationException(); } - public void saveAll(List companyCustomerFiles) { - throw new UnsupportedOperationException(); - } - public List findAllByCustomer(CompanyCustomer companyCustomer) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findAllByCustomer'"); + return findAll(ParamUtils.builder().equals("customer", companyCustomer).build(), Pageable.unpaged()).getContent(); } public CompanyCustomerEvaluationFormFile findCustomerEvaluationFormFileByCustomerFile( @@ -60,10 +110,8 @@ public class CompanyCustomerFileService extends QueryService findAllByCustomerAndType(CompanyCustomer customer, - CompanyCustomerFileType evaluationform) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findAllByCustomerAndType'"); + public List findAllByCustomerAndType(CompanyCustomer customer, CompanyCustomerFileType type) { + return findAll(ParamUtils.builder().equals("customer", customer.getId()).equals("type", type.name()).build(), Pageable.unpaged()).getContent(); } public List searchEvaluationFile(CompanyCustomer customer, String searchText) { diff --git a/client/src/main/java/com/ecep/contract/service/CompanyCustomerFileTypeService.java b/client/src/main/java/com/ecep/contract/service/CompanyCustomerFileTypeService.java index 35e264d..8d5ee6b 100644 --- a/client/src/main/java/com/ecep/contract/service/CompanyCustomerFileTypeService.java +++ b/client/src/main/java/com/ecep/contract/service/CompanyCustomerFileTypeService.java @@ -1,4 +1,27 @@ package com.ecep.contract.service; -public class CompanyCustomerFileTypeService { +import com.ecep.contract.CompanyCustomerFileType; +import com.ecep.contract.model.CompanyCustomerFileTypeLocal; +import com.ecep.contract.vm.CompanyCustomerFileTypeLocalViewModel; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Service +@CacheConfig(cacheNames = "company-file-type") +public class CompanyCustomerFileTypeService extends QueryService{ + @Cacheable + public Map findAll(Locale locale) { + Map params = new HashMap<>(); + params.put("lang", locale.toLanguageTag()); + return findAll(params, Pageable.unpaged()).stream() + .collect(Collectors.toMap(CompanyCustomerFileTypeLocal::getType, Function.identity())); + } } diff --git a/client/src/main/java/com/ecep/contract/service/CompanyExtendInfoService.java b/client/src/main/java/com/ecep/contract/service/CompanyExtendInfoService.java index 162d5fa..e4f92ab 100644 --- a/client/src/main/java/com/ecep/contract/service/CompanyExtendInfoService.java +++ b/client/src/main/java/com/ecep/contract/service/CompanyExtendInfoService.java @@ -1,14 +1,20 @@ package com.ecep.contract.service; -import org.springframework.stereotype.Service; - import com.ecep.contract.model.Company; import com.ecep.contract.model.CompanyExtendInfo; +import com.ecep.contract.util.ParamUtils; import com.ecep.contract.vm.CompanyExtendInfoViewModel; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; @Service public class CompanyExtendInfoService extends QueryService { public CompanyExtendInfo findByCompany(Company company) { - throw new UnsupportedOperationException("Unimplemented method 'findByCompany'"); + Page page = findAll(ParamUtils.equal("company", company.getId()), Pageable.ofSize(1)); + if (page.isEmpty()) { + return null; + } + return page.getContent().getFirst(); } } diff --git a/client/src/main/java/com/ecep/contract/service/CompanyFileService.java b/client/src/main/java/com/ecep/contract/service/CompanyFileService.java index 3167995..cc3cf66 100644 --- a/client/src/main/java/com/ecep/contract/service/CompanyFileService.java +++ b/client/src/main/java/com/ecep/contract/service/CompanyFileService.java @@ -10,6 +10,7 @@ import com.ecep.contract.model.Company; import com.ecep.contract.model.CompanyFile; import com.ecep.contract.model.CompanyOldName; import com.ecep.contract.util.FileUtils; +import com.ecep.contract.util.ParamUtils; import com.ecep.contract.vm.CompanyFileViewModel; import javafx.collections.ObservableList; import org.springframework.data.domain.Pageable; @@ -234,9 +235,41 @@ public class CompanyFileService extends QueryService files = findFileByCompanyAndType(company, CompanyFileType.CreditReport); + CompanyFile companyFile = files.stream() + .filter(v -> v.getApplyDate() != null && v.getExpiringDate() != null) + .filter(v -> MyDateTimeUtils.dateValidFilter(verifyDate, v.getApplyDate(), v.getExpiringDate(), 30)) + .findFirst().orElse(null); + if (companyFile == null) { + List dates = new ArrayList<>(); + + files.stream() + .filter(v -> v.getApplyDate() != null && !verifyDate.isBefore(v.getApplyDate())) + .max(Comparator.comparing(CompanyFile::getApplyDate)) + .map(CompanyFile::getApplyDate) + .ifPresent(dates::add); + + files.stream() + .filter(v -> v.getExpiringDate() != null && !verifyDate.isAfter(v.getExpiringDate())) + .min(Comparator.comparing(CompanyFile::getApplyDate)) + .map(CompanyFile::getApplyDate) + .ifPresent(dates::add); + + if (dates.isEmpty()) { + holder.error("未匹配到资信评估报告"); + } else if (dates.size() == 1) { + holder.error("未匹配到资信评估报告, 最接近日期:" + dates.getFirst()); + } else { + LocalDate localDate = dates.stream().max(LocalDate::compareTo).orElse(null); + holder.error("未匹配到资信评估报告, 最接近日期:" + localDate); + } + } + } + + private List findFileByCompanyAndType(Company company, CompanyFileType companyFileType) { + return findAll(ParamUtils.builder().equals("company", company.getId()).equals("type", companyFileType).build(), Pageable.unpaged()).getContent(); } public LocalDate getNextCreditReportDate(Company company, Consumer state) { diff --git a/client/src/main/java/com/ecep/contract/service/CompanyInvoiceInfoService.java b/client/src/main/java/com/ecep/contract/service/CompanyInvoiceInfoService.java index 035c239..d58b6cf 100644 --- a/client/src/main/java/com/ecep/contract/service/CompanyInvoiceInfoService.java +++ b/client/src/main/java/com/ecep/contract/service/CompanyInvoiceInfoService.java @@ -1,19 +1,23 @@ -package com.ecep.contract.controller.project; - -import java.util.List; +package com.ecep.contract.service; import com.ecep.contract.model.Company; import com.ecep.contract.model.CompanyInvoiceInfo; -import com.ecep.contract.service.QueryService; -import com.ecep.contract.service.ViewModelService; import com.ecep.contract.vm.CompanyInvoiceInfoViewModel; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + @Service public class CompanyInvoiceInfoService extends QueryService { public List searchByCompany(Company company, String searchText) { - throw new UnsupportedOperationException("未实现"); + Map params = new HashMap<>(); + params.put("company", company); + params.put("searchText", searchText); + return findAll(params, Pageable.unpaged()).getContent(); } } diff --git a/client/src/main/java/com/ecep/contract/service/CompanyService.java b/client/src/main/java/com/ecep/contract/service/CompanyService.java index 7a98909..992e2ac 100644 --- a/client/src/main/java/com/ecep/contract/service/CompanyService.java +++ b/client/src/main/java/com/ecep/contract/service/CompanyService.java @@ -1,12 +1,15 @@ package com.ecep.contract.service; import com.ecep.contract.MessageHolder; +import com.ecep.contract.MyDateTimeUtils; import com.ecep.contract.SpringApp; import com.ecep.contract.constant.CompanyConstant; import com.ecep.contract.model.Company; import com.ecep.contract.util.FileUtils; import com.ecep.contract.vm.CompanyViewModel; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @@ -18,6 +21,7 @@ import java.util.List; import java.util.Map; @Service +@CacheConfig(cacheNames = "company") public class CompanyService extends QueryService { @Autowired @@ -37,6 +41,11 @@ public class CompanyService extends QueryService { return basePath; } + @Cacheable(key = "#p0") + public Company findById(Integer id) { + return super.findById(id); + } + public Company findByName(String name) { List list = findAllByName(name); if (list.isEmpty()) { @@ -64,18 +73,45 @@ public class CompanyService extends QueryService { } public boolean existsCompanyPath(Company company) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'existsCompanyPath'"); + if (!StringUtils.hasText(company.getPath())) { + return false; + } + + File path = new File(company.getPath()); + return path.exists(); } public boolean checkCompanyPathInBasePath(Company company) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'checkCompanyPathInBasePath'"); + if (!existsCompanyPath(company)) { + return false; + } + File basePath = getBasePath(); + if (basePath == null || !basePath.exists()) { + throw new IllegalArgumentException("basePath 不存在"); + } + File path = new File(company.getPath()); + return path.getAbsolutePath().startsWith(basePath.getAbsolutePath()); } - public void verifyEnterpriseStatus(Company company, LocalDate setupDate, MessageHolder holder) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'verifyEnterpriseStatus'"); + public void verifyEnterpriseStatus(Company company, LocalDate verifyDate, MessageHolder holder) { + // 检查营业状态 + String entStatus = company.getEntStatus(); + if (StringUtils.hasText(entStatus)) { + if (entStatus.contains("注销")) { + LocalDate end = company.getOperationPeriodEnd(); + LocalDate begin = company.getOperationPeriodBegin(); + if (begin == null || end == null) { + // 注销时间未知,无法判断是否在 verifyDate 之后注销 + holder.error("营业状态异常:" + entStatus); + } else { + if (!MyDateTimeUtils.dateValidFilter(verifyDate, begin, end, 0)) { + holder.error("营业状态异常:" + entStatus); + } + } + } + } else { + holder.error("营业状态异常:未设置"); + } } public boolean makePathAbsent(Company company) { diff --git a/client/src/main/java/com/ecep/contract/service/CompanyVendorFileService.java b/client/src/main/java/com/ecep/contract/service/CompanyVendorFileService.java index ed20d31..75b54d4 100644 --- a/client/src/main/java/com/ecep/contract/service/CompanyVendorFileService.java +++ b/client/src/main/java/com/ecep/contract/service/CompanyVendorFileService.java @@ -1,11 +1,15 @@ package com.ecep.contract.service; import java.time.LocalDate; +import java.util.Comparator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.function.Consumer; +import com.ecep.contract.MessageHolder; +import com.ecep.contract.MyDateTimeUtils; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import com.ecep.contract.CompanyVendorFileType; @@ -30,4 +34,38 @@ public class CompanyVendorFileService extends QueryService files = findAllByVendorAndType(companyVendor, CompanyVendorFileType.EvaluationForm); + if (files == null || files.isEmpty()) { + holder.error("未见供应商评价"); + return; + } + + // 检索 验证日期最近一年内的有效评价表,日期宽限7天 + LocalDate begin = verifyDate.plusYears(-1); + CompanyVendorFile vendorFile = files.stream() + .filter(v -> v.getSignDate() != null && v.isValid()) + .filter(v -> MyDateTimeUtils.dateValidFilter(v.getSignDate(), begin, verifyDate, 7)) + .findFirst().orElse(null); + if (vendorFile == null) { + // 检索最后一个有效评价表 + CompanyVendorFile latestFile = files.stream() + .filter(v -> v.getSignDate() != null && v.isValid()) + .max(Comparator.comparing(CompanyVendorFile::getSignDate)) + .orElse(null); + + if (latestFile == null) { + holder.error("未匹配的供应商评价"); + return; + } + // 提示评价表已过期 + holder.error("供应商评价已过期:" + latestFile.getSignDate() + ", 检测日期:" + verifyDate); + } + } + + public List findAllByVendorAndType(CompanyVendor vendor, CompanyVendorFileType type) { + return findAll(Map.of("vendor", vendor.getId(), "type", type.name()), Pageable.unpaged()).getContent(); + } } diff --git a/client/src/main/java/com/ecep/contract/service/CompanyVendorFileTypeService.java b/client/src/main/java/com/ecep/contract/service/CompanyVendorFileTypeService.java index c02b0cf..31575a0 100644 --- a/client/src/main/java/com/ecep/contract/service/CompanyVendorFileTypeService.java +++ b/client/src/main/java/com/ecep/contract/service/CompanyVendorFileTypeService.java @@ -1,4 +1,12 @@ package com.ecep.contract.service; -public class CompanyVendorFileTypeService { +import com.ecep.contract.model.CompanyVendorFileTypeLocal; +import com.ecep.contract.vm.CompanyVendorFileTypeLocalViewModel; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.stereotype.Service; + +@Service +@CacheConfig(cacheNames = "vendor-file-type") +public class CompanyVendorFileTypeService extends QueryService { + } diff --git a/client/src/main/java/com/ecep/contract/service/CompanyVendorService.java b/client/src/main/java/com/ecep/contract/service/CompanyVendorService.java index e6ca130..ae47c51 100644 --- a/client/src/main/java/com/ecep/contract/service/CompanyVendorService.java +++ b/client/src/main/java/com/ecep/contract/service/CompanyVendorService.java @@ -1,18 +1,30 @@ package com.ecep.contract.service; import java.io.File; +import java.time.LocalDate; import java.util.*; +import com.ecep.contract.VendorType; import com.ecep.contract.model.*; +import com.ecep.contract.util.MyStringUtils; +import com.ecep.contract.util.ProxyUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import com.ecep.contract.MessageHolder; import com.ecep.contract.vm.CompanyVendorViewModel; +import org.springframework.util.StringUtils; @Service public class CompanyVendorService extends QueryService { + @Autowired + private CompanyService companyService; + @Autowired + private CompanyFileService companyFileService; + @Autowired + private CompanyVendorFileService companyVendorFileService; public VendorCatalog findCatalogById(Integer id) { // TODO Auto-generated method stub @@ -35,8 +47,70 @@ public class CompanyVendorService extends QueryService findAllTypes(Locale locale) { diff --git a/client/src/main/java/com/ecep/contract/service/ContractBidVendorService.java b/client/src/main/java/com/ecep/contract/service/ContractBidVendorService.java index 21aa5dd..b4525d2 100644 --- a/client/src/main/java/com/ecep/contract/service/ContractBidVendorService.java +++ b/client/src/main/java/com/ecep/contract/service/ContractBidVendorService.java @@ -2,6 +2,8 @@ package com.ecep.contract.service; import java.util.List; +import com.ecep.contract.util.ParamUtils; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import com.ecep.contract.model.Company; @@ -13,13 +15,16 @@ import com.ecep.contract.vm.ContractBidVendorViewModel; public class ContractBidVendorService extends QueryService { public List findByContract(Contract contract) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findByContract'"); + return findAll(ParamUtils.builder() + .equals("contract", contract.getId()) + .build(), Pageable.unpaged()).getContent(); } public List findByContractAndCompany(Contract contract, Company company) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findByContractAndCompany'"); + return findAll(ParamUtils.builder() + .equals("contract", contract.getId()) + .equals("company", company.getId()) + .build(), Pageable.unpaged()).getContent(); } } diff --git a/client/src/main/java/com/ecep/contract/service/ContractService.java b/client/src/main/java/com/ecep/contract/service/ContractService.java index b828110..a16b993 100644 --- a/client/src/main/java/com/ecep/contract/service/ContractService.java +++ b/client/src/main/java/com/ecep/contract/service/ContractService.java @@ -1,29 +1,46 @@ package com.ecep.contract.service; +import com.ecep.contract.MessageHolder; +import com.ecep.contract.constant.CompanyConstant; +import com.ecep.contract.constant.ContractConstant; +import com.ecep.contract.model.*; +import com.ecep.contract.util.ParamUtils; +import com.ecep.contract.vm.ContractViewModel; +import io.micrometer.common.util.StringUtils; +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.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + import java.io.File; import java.time.LocalDate; import java.util.HashMap; import java.util.List; - -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.data.domain.Pageable; -import org.springframework.stereotype.Service; - -import com.ecep.contract.MessageHolder; -import com.ecep.contract.model.CompanyVendor; -import com.ecep.contract.model.Contract; -import com.ecep.contract.model.ContractFile; -import com.ecep.contract.model.Project; -import com.ecep.contract.vm.ContractViewModel; - -import io.micrometer.common.util.StringUtils; +import java.util.concurrent.ExecutionException; @Service @CacheConfig(cacheNames = "contract") public class ContractService extends QueryService { + @Autowired + private SysConfService confService; + + private File basePath; + + /** + * 返回合同的基础目录 + * + * @return 合同的基础目录 + */ + public File getBasePath() { + if (basePath == null) { + basePath = new File(confService.getString(ContractConstant.KEY_BASE_PATH)); + } + return basePath; + } @Cacheable(key = "#p0") public Contract findById(Integer id) { @@ -55,13 +72,30 @@ public class ContractService extends QueryService { } @Cacheable(key = "'code-'+#p0") - public Contract findByCode(String string) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findByCode'"); + public Contract findByCode(String code) { + try { + return async("findByCode", code, String.class).handle((response, ex) -> { + if (response != null) { + return updateValue(new Contract(), response); + } + return null; + }).get(); + } catch (Exception e) { + throw new RuntimeException("查找合同 " + code + " 时发生错误", e); + } } public Contract findByName(String name) { - throw new UnsupportedOperationException("Unimplemented method 'findByName'"); + try { + return async("findByName", name, String.class).handle((response, ex) -> { + if (response != null) { + return updateValue(new Contract(), response); + } + return null; + }).get(); + } catch (Exception e) { + throw new RuntimeException("查找合同 " + name + " 时发生错误", e); + } } public List findAllBySaleContract(Contract contract) { @@ -69,19 +103,28 @@ public class ContractService extends QueryService { if (StringUtils.isEmpty(parentCode)) { return List.of(); } - HashMap params = new HashMap<>(); - params.put("parentCode", contract.getCode()); - return findAll(params, Pageable.unpaged()).getContent(); + return findAll(ParamUtils.equal("parentCode", parentCode), Pageable.unpaged()).getContent(); } public boolean checkContractPathInBasePath(Contract v) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'checkContractPathInBasePath'"); + if (!existsContractPath(v)) { + return false; + } + File basePath = getBasePath(); + if (basePath == null || !basePath.exists()) { + throw new IllegalArgumentException("basePath 不存在"); + } + File path = new File(v.getPath()); + return path.getAbsolutePath().startsWith(basePath.getAbsolutePath()); } public boolean existsContractPath(Contract v) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'existsContractPath'"); + if (!org.springframework.util.StringUtils.hasText(v.getPath())) { + return false; + } + + File path = new File(v.getPath()); + return path.exists(); } public boolean makePathAbsent(Contract contract) { @@ -89,29 +132,37 @@ public class ContractService extends QueryService { throw new UnsupportedOperationException("Unimplemented method 'makePathAbsent'"); } - public List findAllByCompanyVendor(CompanyVendor vendor, LocalDate miniDate, LocalDate date) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findAllByCompanyVendor'"); + public List findAllByCompanyVendor(CompanyVendor vendor, LocalDate beginDate, LocalDate endDate) { + Company company = vendor.getCompany(); + return findAll(ParamUtils.builder() + .equals("company", company.getId()) + .between("setupDate", beginDate, endDate) + .build(), Pageable.unpaged()).getContent(); } - public Contract[] findAllSalesByProject(Project project) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findAllSalesByProject'"); + public List findAllSalesByProject(Project project) { + HashMap params = new HashMap<>(); + params.put("parentCode", ""); + params.put("project", project.getId()); + return findAll(params, Pageable.unpaged()).getContent(); } public Contract findSalesByProject(Project project) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findSalesByProject'"); + HashMap params = new HashMap<>(); + params.put("parentCode", ""); + params.put("project", project.getId()); + Page page = findAll(params, Pageable.ofSize(1)); + if (page.isEmpty()) { + return null; + } + return page.getContent().getFirst(); } - public File getBasePath() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'getBasePath'"); - } public List findAllByProject(Project project) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findAllByProject'"); + HashMap params = new HashMap<>(); + params.put("project", project.getId()); + return findAll(params, Pageable.unpaged()).getContent(); } public void syncContractFile(ContractFile contractFile, File outputFile, MessageHolder holder) { diff --git a/client/src/main/java/com/ecep/contract/service/EmployeeAuthBindService.java b/client/src/main/java/com/ecep/contract/service/EmployeeAuthBindService.java index 08210c8..f407bf4 100644 --- a/client/src/main/java/com/ecep/contract/service/EmployeeAuthBindService.java +++ b/client/src/main/java/com/ecep/contract/service/EmployeeAuthBindService.java @@ -1,19 +1,22 @@ package com.ecep.contract.service; -import java.util.List; - -import org.springframework.data.domain.Sort; -import org.springframework.stereotype.Service; - +import com.ecep.contract.model.Employee; import com.ecep.contract.model.EmployeeAuthBind; import com.ecep.contract.vm.EmployeeAuthBindViewModel; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; @Service public class EmployeeAuthBindService extends QueryService { - public List findAllByEmployee(Object object, Sort unsorted) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findAllByEmployee'"); + public List findAllByEmployee(Employee employee) { + Map params = new HashMap(); + params.put("employee", null); + return findAll(params, Pageable.unpaged()).getContent(); } } diff --git a/client/src/main/java/com/ecep/contract/service/EmployeeService.java b/client/src/main/java/com/ecep/contract/service/EmployeeService.java index 225d4df..45c24a6 100644 --- a/client/src/main/java/com/ecep/contract/service/EmployeeService.java +++ b/client/src/main/java/com/ecep/contract/service/EmployeeService.java @@ -1,12 +1,15 @@ package com.ecep.contract.service; -import java.util.List; - -import org.springframework.stereotype.Service; - +import com.ecep.contract.PageContent; import com.ecep.contract.model.Employee; import com.ecep.contract.model.EmployeeRole; import com.ecep.contract.vm.EmployeeViewModel; +import com.fasterxml.jackson.databind.JsonNode; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; @Service public class EmployeeService extends QueryService { @@ -19,14 +22,33 @@ public class EmployeeService extends QueryService { } public List getRolesByEmployeeId(Integer id) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'getRolesByEmployeeId'"); + try { + return async("getRolesByEmployeeId", List.of(id), List.of(Integer.class)).handle((response, ex) -> { + if (response != null) { + try { + List content = new ArrayList<>(); + for (JsonNode node : response) { + EmployeeRole newEntity = new EmployeeRole(); + objectMapper.updateValue(newEntity, node); + content.add(newEntity); + } + return content; + } catch (Exception e) { + throw new RuntimeException(response.toString(), e); + } + } + return null; + }).get(); + } catch (InterruptedException | ExecutionException e) { + throw new RuntimeException(e); + } } public void updateActive(int sessionId) { // TODO Auto-generated method stub throw new UnsupportedOperationException("Unimplemented method 'updateActive'"); } + public Employee findByCode(String personCode) { // TODO Auto-generated method stub throw new UnsupportedOperationException("Unimplemented method 'findByCode'"); diff --git a/client/src/main/java/com/ecep/contract/service/ExtendVendorInfoService.java b/client/src/main/java/com/ecep/contract/service/ExtendVendorInfoService.java index c125aa2..fe7a11a 100644 --- a/client/src/main/java/com/ecep/contract/service/ExtendVendorInfoService.java +++ b/client/src/main/java/com/ecep/contract/service/ExtendVendorInfoService.java @@ -1,21 +1,48 @@ package com.ecep.contract.service; +import com.ecep.contract.util.ParamUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import com.ecep.contract.model.Contract; import com.ecep.contract.model.ExtendVendorInfo; import com.ecep.contract.vm.ExtendVendorInfoViewModel; +import org.springframework.util.StringUtils; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; @Service public class ExtendVendorInfoService extends QueryService { + @Autowired + private VendorGroupService vendorGroupService; - public ExtendVendorInfo findByContract(Contract contract) { - throw new UnsupportedOperationException("Unimplemented method 'findByContract'"); - } + public ExtendVendorInfo findByContract(Contract contract) { + Page page = findAll(ParamUtils.builder().equals("contract", contract).build(), Pageable.ofSize(1)); + if (page.isEmpty()) { + return null; + } + return page.getContent().getFirst(); + } - public ExtendVendorInfo newInstanceByContract(Contract contract) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'newInstanceByContract'"); - } + public ExtendVendorInfo newInstanceByContract(Contract contract) { + ExtendVendorInfo info = new ExtendVendorInfo(); + info.setContract(contract); + + if (StringUtils.hasText(contract.getCode())) { + String regex = "-([A-Z]{1,4})(\\d{1,4})"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(contract.getCode()); + if (matcher.find()) { + info.setGroup(vendorGroupService.findByCode(matcher.group(1))); + info.setCodeSequenceNumber(Integer.parseInt(matcher.group(2))); + } + } + info.setAssignedProvider(false); + info.setPrePurchase(false); + return info; + } } diff --git a/client/src/main/java/com/ecep/contract/service/HolidayService.java b/client/src/main/java/com/ecep/contract/service/HolidayService.java index b935495..f1c19d5 100644 --- a/client/src/main/java/com/ecep/contract/service/HolidayService.java +++ b/client/src/main/java/com/ecep/contract/service/HolidayService.java @@ -1,4 +1,15 @@ package com.ecep.contract.service; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; + +@Lazy +@Service public class HolidayService { + + public LocalDate adjustToWorkDay(LocalDate date) { + throw new RuntimeException("Not implemented"); + } } diff --git a/client/src/main/java/com/ecep/contract/service/ProjectCostService.java b/client/src/main/java/com/ecep/contract/service/ProjectCostService.java index 121757a..8b149a3 100644 --- a/client/src/main/java/com/ecep/contract/service/ProjectCostService.java +++ b/client/src/main/java/com/ecep/contract/service/ProjectCostService.java @@ -2,6 +2,11 @@ package com.ecep.contract.service; import java.util.List; +import com.ecep.contract.util.ParamUtils; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import com.ecep.contract.MessageHolder; @@ -13,18 +18,29 @@ import com.ecep.contract.vm.ProjectCostViewModel; public class ProjectCostService extends QueryService { public ProjectCost findAutoCostByProject(Project project) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findAutoCostByProject'"); + Page page = findAll(ParamUtils.builder().equals("project", project.getId()).build(), Pageable.unpaged()); + if (page.isEmpty()) { + return null; + } + return page.getContent().getFirst(); } public ProjectCost newInstanceByProject(Project project) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'newInstanceByProject'"); + ProjectCost cost = new ProjectCost(); + cost.setProject(project); + // 0.3‰:购销合同、建筑安装工程承包合同、技术合同 + cost.setStampTax(0.03f); + cost.setTaxAndSurcharges(11f); + return cost; } public ProjectCost findLatestByProject(Project project) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findLatestByProject'"); + PageRequest pageRequest = PageRequest.of(0, 1, Sort.Direction.DESC, "version"); + Page page = findAll(ParamUtils.builder().equals("project", project.getId()).build(), pageRequest); + if (page.isEmpty()) { + return null; + } + return page.getContent().getFirst(); } public void updateAutoCost(Project project, MessageHolder holder) { @@ -33,8 +49,7 @@ public class ProjectCostService extends QueryService findAllByProject(Project project) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findAllByProject'"); + return findAll(ParamUtils.builder().equals("project", project.getId()).build(), Pageable.unpaged()).getContent(); } } diff --git a/client/src/main/java/com/ecep/contract/service/ProjectQuotationService.java b/client/src/main/java/com/ecep/contract/service/ProjectQuotationService.java index 7fd035a..1bf3a99 100644 --- a/client/src/main/java/com/ecep/contract/service/ProjectQuotationService.java +++ b/client/src/main/java/com/ecep/contract/service/ProjectQuotationService.java @@ -1,19 +1,19 @@ package com.ecep.contract.service; -import java.util.List; - -import org.springframework.stereotype.Service; - import com.ecep.contract.model.Project; import com.ecep.contract.model.ProjectQuotation; +import com.ecep.contract.util.ParamUtils; import com.ecep.contract.vm.ProjectQuotationViewModel; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.util.List; @Service public class ProjectQuotationService extends QueryService { public List findAllByProject(Project project) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findAllByProject'"); + return findAll(ParamUtils.builder().equals("project", project.getId()).build(), Pageable.unpaged()).getContent(); } } diff --git a/client/src/main/java/com/ecep/contract/service/ProjectSaleTypeRequireFileTypeService.java b/client/src/main/java/com/ecep/contract/service/ProjectSaleTypeRequireFileTypeService.java index 7505f3b..e1d59e8 100644 --- a/client/src/main/java/com/ecep/contract/service/ProjectSaleTypeRequireFileTypeService.java +++ b/client/src/main/java/com/ecep/contract/service/ProjectSaleTypeRequireFileTypeService.java @@ -2,6 +2,8 @@ package com.ecep.contract.service; import java.util.List; +import com.ecep.contract.util.ParamUtils; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import com.ecep.contract.model.ProjectSaleTypeRequireFileType; @@ -12,8 +14,7 @@ public class ProjectSaleTypeRequireFileTypeService extends QueryService { public List findBySaleTypeId(Integer id) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findBySaleTypeId'"); + return findAll(ParamUtils.equal("fileType", id), Pageable.unpaged()).getContent(); } } diff --git a/client/src/main/java/com/ecep/contract/service/ProjectSaleTypeService.java b/client/src/main/java/com/ecep/contract/service/ProjectSaleTypeService.java index 18c50f4..05a3b01 100644 --- a/client/src/main/java/com/ecep/contract/service/ProjectSaleTypeService.java +++ b/client/src/main/java/com/ecep/contract/service/ProjectSaleTypeService.java @@ -1,16 +1,19 @@ package com.ecep.contract.service; -import org.springframework.stereotype.Service; - import com.ecep.contract.model.ProjectSaleType; +import com.ecep.contract.util.ParamUtils; import com.ecep.contract.vm.ProjectSaleTypeViewModel; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; @Service public class ProjectSaleTypeService extends QueryService { - public ProjectSaleType findByCode(String substring) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findByCode'"); + public ProjectSaleType findByCode(String code) { + return findAll(ParamUtils.builder().equals("code", code).build(), Pageable.ofSize(1)).getContent().getFirst(); } + public ProjectSaleType findByName(String name) { + return findAll(ParamUtils.builder().equals("name", name).build(), Pageable.ofSize(1)).getContent().getFirst(); + } } diff --git a/client/src/main/java/com/ecep/contract/service/QueryService.java b/client/src/main/java/com/ecep/contract/service/QueryService.java index 6d97d73..8bd2a70 100644 --- a/client/src/main/java/com/ecep/contract/service/QueryService.java +++ b/client/src/main/java/com/ecep/contract/service/QueryService.java @@ -2,14 +2,15 @@ package com.ecep.contract.service; import com.ecep.contract.PageArgument; import com.ecep.contract.PageContent; -import com.ecep.contract.WebSocketService; +import com.ecep.contract.WebSocketClientService; import com.ecep.contract.model.IdentityEntity; -import com.ecep.contract.msg.SimpleMessage; import com.ecep.contract.vm.IdentityViewModel; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -19,13 +20,15 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.ExecutionException; import java.util.function.Supplier; public class QueryService> implements ViewModelService { + // 添加日志记录器 + private static final Logger logger = LoggerFactory.getLogger(QueryService.class); @Autowired - protected WebSocketService webSocketService; + protected WebSocketClientService webSocketService; @Autowired protected ObjectMapper objectMapper; @@ -61,56 +64,60 @@ public class QueryService { + if (response != null) { + try { + objectMapper.updateValue(entity, response); + } catch (JsonMappingException e) { + throw new RuntimeException(e); + } + } + return entity; + }).get(); } catch (Exception e) { - e.printStackTrace(); + throw new RuntimeException("保存实体失败", e); } - return entity; } @Override public void delete(T entity) { - SimpleMessage msg = new SimpleMessage(); - msg.setService(getBeanName()); - msg.setMethod("delete"); - msg.setArguments(entity); try { - JsonNode response = webSocketService.send(msg).get(webSocketService.getReadTimeout(), TimeUnit.MILLISECONDS); - if (response != null) { - objectMapper.updateValue(entity, response); - } + async("delete", entity, entity.getClass().getName()).handle((response, ex) -> { + if (response != null) { + return updateValue(entity, response); + } + return null; + }).get(); } catch (Exception e) { - e.printStackTrace(); + logger.error("删除实体失败 #{}", entity.getId(), e); + throw new RuntimeException("删除实体失败", e); } } - public CompletableFuture asyncFindById(Integer id) { - SimpleMessage msg = new SimpleMessage(); - msg.setService(getBeanName()); - msg.setMethod("findById"); - msg.setArguments(id); - return webSocketService.send(msg).orTimeout(webSocketService.getReadTimeout(), TimeUnit.MILLISECONDS).handle((response, ex) -> { + public T updateValue(T entity, JsonNode node) { + try { + objectMapper.updateValue(entity, node); + } catch (JsonMappingException e) { + throw new RuntimeException(e); + } + return entity; + } + + + public CompletableFuture async(String method, Object... params) { + return webSocketService.invoke(getBeanName(), method, params).handle((response, ex) -> { if (ex != null) { - return null; - } - if (response == null) { - return null; + throw new RuntimeException("远程方法+" + method + "+调用失败", ex); } + return response; + }); + } + + public CompletableFuture asyncFindById(Integer id) { + return async("findById", id, Integer.class).handle((response, ex) -> { T newEntity = createNewEntity(); - try { - objectMapper.updateValue(newEntity, response); - } catch (JsonMappingException e) { - throw new RuntimeException(response.toString(), e); - } - return newEntity; + return updateValue(newEntity, response); }); } @@ -119,45 +126,77 @@ public class QueryService findAll() { return findAll(null, Pageable.unpaged()).getContent(); } + /** + * 异步查询所有实体数据,返回CompletableFuture对象 + * + * @param params 查询参数映射表,可以包含过滤条件等信息 + * @param pageable 分页参数,包含页码、每页条数、排序规则等 + * @return 包含分页结果的CompletableFuture对象 + */ public CompletableFuture> asyncFindAll(Map params, Pageable pageable) { - SimpleMessage msg = new SimpleMessage(); - msg.setService(getBeanName()); - msg.setMethod("findAll"); - msg.setArguments(params, PageArgument.of(pageable)); - return webSocketService.send(msg).orTimeout(webSocketService.getReadTimeout(), TimeUnit.MILLISECONDS).handle((response, ex) -> { - if (ex != null) { - return null; - } - if (response == null) { - return null; - } - + // 调用async方法发送WebSocket请求,获取异步响应结果 + return async("findAll", params, PageArgument.of(pageable)).handle((response, ex) -> { try { + // 将响应结果转换为PageContent对象,使用当前类的createNewEntity方法创建实体实例 PageContent pageContent = of(response, objectMapper, this::createNewEntity); + // 将PageContent转换为Spring Data的Page对象并返回 return pageContent.toPage(); } catch (Exception e) { + // 处理转换过程中的异常,包装为RuntimeException并附带响应内容 throw new RuntimeException(response.toString(), e); } }); } + /** + * 同步查询所有实体数据,实现了ViewModelService接口的findAll方法 + * + * @param params 查询参数映射表,可以包含过滤条件等信息 + * @param pageable 分页参数,包含页码、每页条数、排序规则等 + * @return 包含查询结果的Page对象 + * @throws RuntimeException 当查询失败时抛出异常 + */ @Override public Page findAll(Map params, Pageable pageable) { try { + // 调用异步方法并阻塞等待结果返回 return asyncFindAll(params, pageable).get(); } catch (Exception e) { - e.printStackTrace(); + // 处理异步查询过程中的任何异常,转换为运行时异常抛出 + throw new RuntimeException("查询所有实体失败", e); + } + } + + /** + * 异步执行计数操作,返回CompletableFuture类型结果 + * + * @param params 包含计数所需参数的Map集合 + * @return 返回一个CompletableFuture对象,用于获取异步操作的结果 + */ + public CompletableFuture asyncCount(Map params) { + // 调用async方法执行名为"count"的异步操作,传入参数params + // 使用handle方法处理异步操作的结果或异常 + return async("count", params).handle((response, ex) -> { + // 将响应结果转换为Long类型并返回 + return response.asLong(); + }); + } + + public long count(Map params) { + try { + return asyncCount(params).get(); + } catch (Exception e) { + throw new RuntimeException("计数失败", e); } - return null; } public List search(String searchText) { @@ -199,4 +238,4 @@ public class QueryService asyncFindById(String id) { - SimpleMessage msg = new SimpleMessage(); - msg.setService(getBeanName()); - msg.setMethod("findById"); - msg.setArguments(id); - return webSocketService.send(msg).orTimeout(webSocketService.getReadTimeout(), TimeUnit.MILLISECONDS).handle((response, ex) -> { + return webSocketService.invoke(getBeanName(), "findById", id).handle((response, ex) -> { if (ex != null) { - return null; - } - if (response == null) { - return null; + throw new RuntimeException("远程方法+findById+调用失败", ex); } SysConf newEntity = new SysConf(); try { @@ -60,16 +51,9 @@ public class SysConfService { } public CompletableFuture> asyncFindAll(Map params, Pageable pageable) { - SimpleMessage msg = new SimpleMessage(); - msg.setService(getBeanName()); - msg.setMethod("findAll"); - msg.setArguments(params, PageArgument.of(pageable)); - return webSocketService.send(msg).orTimeout(webSocketService.getReadTimeout(), TimeUnit.MILLISECONDS).handle((response, ex) -> { + return webSocketService.invoke(getBeanName(), "findAll", params, PageArgument.of(pageable)).handle((response, ex) -> { if (ex != null) { - return null; - } - if (response == null) { - return null; + throw new RuntimeException("远程方法+findAll+调用失败", ex); } try { PageContent pageContent = QueryService.of(response, objectMapper, SysConf::new); @@ -163,20 +147,23 @@ public class SysConfService { @CacheEvict(key = "#p0.id") public SysConf save(SysConf entity) { - SimpleMessage msg = new SimpleMessage(); - msg.setService(getBeanName()); - msg.setMethod("save"); - msg.setArguments(entity); try { - Object response = webSocketService.send(msg).get(webSocketService.getReadTimeout(), TimeUnit.MILLISECONDS); - if (response != null) { - objectMapper.updateValue(entity, response); - } + return webSocketService.invoke(getBeanName(), "save", entity).handle((response, ex) -> { + if (ex != null) { + throw new RuntimeException("远程方法+save+调用失败", ex); + } + if (response != null) { + try { + objectMapper.updateValue(entity, response); + } catch (JsonMappingException e) { + throw new RuntimeException(e); + } + } + return entity; + }).get(); } catch (Exception e) { - e.printStackTrace(); + throw new RuntimeException("保存实体失败", e); } - return entity; - } public String getBeanName() { diff --git a/client/src/main/java/com/ecep/contract/service/VendorGroupRequireFileTypeService.java b/client/src/main/java/com/ecep/contract/service/VendorGroupRequireFileTypeService.java index e81fa8b..68fb2a6 100644 --- a/client/src/main/java/com/ecep/contract/service/VendorGroupRequireFileTypeService.java +++ b/client/src/main/java/com/ecep/contract/service/VendorGroupRequireFileTypeService.java @@ -1,7 +1,9 @@ package com.ecep.contract.service; import java.util.List; +import java.util.Map; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import com.ecep.contract.model.VendorGroupRequireFileType; @@ -12,8 +14,7 @@ public class VendorGroupRequireFileTypeService extends QueryService { public List findByGroupId(Integer id) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findByGroupId'"); + return findAll(Map.of("group", id), Pageable.unpaged()).getContent(); } } diff --git a/client/src/main/java/com/ecep/contract/service/VendorGroupService.java b/client/src/main/java/com/ecep/contract/service/VendorGroupService.java index a4e9315..56ccc7d 100644 --- a/client/src/main/java/com/ecep/contract/service/VendorGroupService.java +++ b/client/src/main/java/com/ecep/contract/service/VendorGroupService.java @@ -9,8 +9,26 @@ import com.ecep.contract.vm.VendorGroupViewModel; public class VendorGroupService extends QueryService { public VendorGroup newInstance() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method '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; + } + + public VendorGroup findByCode(String code) { + try { + return async("findByCode", code, String.class).handle((response, ex) -> { + VendorGroup newEntity = newInstance(); + return updateValue(newEntity, response); + }).get(); + } catch (Exception e) { + throw new RuntimeException("查询实体失败", e); + } } } diff --git a/client/src/main/java/com/ecep/contract/service/ViewModelService.java b/client/src/main/java/com/ecep/contract/service/ViewModelService.java index 2b93a4d..d10ace6 100644 --- a/client/src/main/java/com/ecep/contract/service/ViewModelService.java +++ b/client/src/main/java/com/ecep/contract/service/ViewModelService.java @@ -92,7 +92,6 @@ public interface ViewModelService findAll(Map params, Pageable pageable) { - // TODO Auto-generated method stub throw new UnsupportedOperationException("Unimplemented method 'findAll'"); } default long count(Map params) { - // TODO Auto-generated method stub throw new UnsupportedOperationException("Unimplemented method 'count'"); } diff --git a/client/src/main/java/com/ecep/contract/task/ContractRepairTask.java b/client/src/main/java/com/ecep/contract/task/ContractRepairTask.java index 7847943..86d8983 100644 --- a/client/src/main/java/com/ecep/contract/task/ContractRepairTask.java +++ b/client/src/main/java/com/ecep/contract/task/ContractRepairTask.java @@ -1,15 +1,19 @@ package com.ecep.contract.task; import com.ecep.contract.MessageHolder; +import com.ecep.contract.SpringApp; +import com.ecep.contract.WebSocketClientService; +import com.ecep.contract.WebSocketClientTasker; import com.ecep.contract.model.Contract; +import com.fasterxml.jackson.core.JsonProcessingException; import lombok.Getter; import lombok.Setter; /** - * + * */ -public class ContractRepairTask extends Tasker { +public class ContractRepairTask extends Tasker implements WebSocketClientTasker { @Getter @Setter private Contract contract; @@ -28,11 +32,35 @@ public class ContractRepairTask extends Tasker { public ContractRepairTask() { } + @Override + public String getTaskName() { + return "ContractRepairTask"; + } + + @Override + public void updateProgress(long current, long total) { + super.updateProgress(current, total); + } + + @Override protected Object execute(MessageHolder holder) throws Exception { updateTitle("修复合同 " + contract.toPrettyString()); - updateProgress(1, 1); + return callRemoteTask(holder); + } + + private Object callRemoteTask(MessageHolder holder) { + WebSocketClientService webSocketService = SpringApp.getBean(WebSocketClientService.class); + webSocketService.withSession(session -> { + try { + session.submitTask(this, contract.getId(), getLocale().toLanguageTag()); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + }); + return null; } + } diff --git a/client/src/main/java/com/ecep/contract/task/ContractSyncTask.java b/client/src/main/java/com/ecep/contract/task/ContractSyncTask.java index 9a57d99..1de1f12 100644 --- a/client/src/main/java/com/ecep/contract/task/ContractSyncTask.java +++ b/client/src/main/java/com/ecep/contract/task/ContractSyncTask.java @@ -1,19 +1,55 @@ package com.ecep.contract.task; +import com.ecep.contract.MessageHolder; +import com.ecep.contract.SpringApp; +import com.ecep.contract.WebSocketClientTasker; +import com.ecep.contract.WebSocketClientService; +import com.ecep.contract.service.YongYouU8Service; +import com.fasterxml.jackson.core.JsonProcessingException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.ecep.contract.MessageHolder; - /** * 合同同步任务 */ -public class ContractSyncTask extends Tasker { +public class ContractSyncTask extends Tasker implements WebSocketClientTasker { private static final Logger logger = LoggerFactory.getLogger(ContractSyncTask.class); + private YongYouU8Service yongYouU8Service; + + private YongYouU8Service getYongYouU8Service() { + if (yongYouU8Service == null) { + yongYouU8Service = SpringApp.getBean(YongYouU8Service.class); + } + return yongYouU8Service; + } + + public String getTaskName() { + return "ContractSyncTask"; + } + @Override + public void updateProgress(long current, long total) { + super.updateProgress(current, total); + } + + @Override + protected Object execute(MessageHolder holder) throws Exception { updateTitle("用友U8系统-同步合同"); + return callRemoteTask(holder); + } + + private Object callRemoteTask(MessageHolder holder) { + WebSocketClientService webSocketService = SpringApp.getBean(WebSocketClientService.class); + webSocketService.withSession(session -> { + try { + session.submitTask(this); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + }); + return null; } diff --git a/client/src/main/java/com/ecep/contract/task/ContractVerifyComm.java b/client/src/main/java/com/ecep/contract/task/ContractVerifyComm.java index 833d2ce..774f6bb 100644 --- a/client/src/main/java/com/ecep/contract/task/ContractVerifyComm.java +++ b/client/src/main/java/com/ecep/contract/task/ContractVerifyComm.java @@ -13,6 +13,7 @@ import java.util.Locale; import java.util.Objects; import java.util.stream.Collectors; +import com.ecep.contract.util.ProxyUtils; import org.springframework.util.StringUtils; import com.ecep.contract.CompanyCustomerFileType; @@ -311,6 +312,12 @@ public class ContractVerifyComm { } CompanyExtendInfo companyExtendInfo = getCompanyExtendInfoService().findByCompany(company); + if (companyExtendInfo == null) { + CompanyExtendInfo extendInfo = new CompanyExtendInfo(); + extendInfo.setCompany(company); + extendInfo.setDisableVerify(false); + companyExtendInfo = getCompanyExtendInfoService().save(extendInfo); + } if (companyExtendInfo.isDisableVerify()) { holder.debug("公司设定不做校验"); @@ -429,7 +436,7 @@ public class ContractVerifyComm { } private void verifyVendorFile(VendorGroup group, boolean assignedProvider, Contract contract, - MessageHolder holder) { + MessageHolder holder) { if (group == null) { return; } @@ -523,7 +530,7 @@ public class ContractVerifyComm { } private void verifyAsCustomer(Company company, CompanyExtendInfo companyExtendInfo, Contract contract, - MessageHolder holder) { + MessageHolder holder) { boolean valiad = true; Project project = contract.getProject(); if (project == null) { @@ -555,6 +562,9 @@ public class ContractVerifyComm { verifyProject(contract, project, holder.sub("项目")); ProjectSaleType saleType = project.getSaleType(); + if (!ProxyUtils.isInitialized(saleType)) { + saleType = getSaleTypeService().findById(saleType.getId()); + } if (saleType != null) { if (getContractService().existsContractPath(contract)) { saleType = getSaleTypeService().findById(saleType.getId()); @@ -616,7 +626,7 @@ public class ContractVerifyComm { } private boolean verifyCustomerFileByContract(CompanyCustomer companyCustomer, Contract contract, - MessageHolder holder) { + MessageHolder holder) { List verifyDates = new ArrayList<>(); LocalDate minDate = LocalDate.of(2022, 1, 1); LocalDate developDate = companyCustomer.getDevelopDate(); diff --git a/client/src/main/java/com/ecep/contract/task/Tasker.java b/client/src/main/java/com/ecep/contract/task/Tasker.java index ac334a7..4fbd2a0 100644 --- a/client/src/main/java/com/ecep/contract/task/Tasker.java +++ b/client/src/main/java/com/ecep/contract/task/Tasker.java @@ -1,12 +1,5 @@ package com.ecep.contract.task; -import java.util.Locale; -import java.util.logging.Level; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.BeansException; - import com.ecep.contract.Desktop; import com.ecep.contract.Message; import com.ecep.contract.MessageHolder; @@ -15,12 +8,17 @@ import com.ecep.contract.model.Employee; import com.ecep.contract.service.CompanyService; import com.ecep.contract.service.EmployeeService; import com.ecep.contract.service.SysConfService; - import javafx.application.Platform; import javafx.beans.property.StringProperty; import javafx.concurrent.Task; import javafx.scene.control.ListCell; import lombok.Setter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeansException; + +import java.util.Locale; +import java.util.logging.Level; public abstract class Tasker extends Task { private static final Logger logger = LoggerFactory.getLogger(Tasker.class); @@ -86,7 +84,7 @@ public abstract class Tasker extends Task { updateMessage(Level.INFO, message); } - protected void updateMessage(Level level, String message) { + public void updateMessage(Level level, String message) { if (messageHandler != null) { if (messageHandler.test(new Message(level, message))) { return; @@ -95,6 +93,10 @@ public abstract class Tasker extends Task { super.updateMessage(message); } + public void updateTitle(String title) { + super.updateTitle(title); + } + protected void skipUpdateCheckUpdateMessage(String message) { if (Platform.isFxApplicationThread()) { ((StringProperty) messageProperty()).set(message); @@ -172,4 +174,5 @@ public abstract class Tasker extends Task { public Locale getLocale() { return Desktop.instance.getActiveEmployee().localeProperty().get(); } + } diff --git a/client/src/main/java/com/ecep/contract/util/ParamUtils.java b/client/src/main/java/com/ecep/contract/util/ParamUtils.java index 4a31bc0..f9f46dd 100644 --- a/client/src/main/java/com/ecep/contract/util/ParamUtils.java +++ b/client/src/main/java/com/ecep/contract/util/ParamUtils.java @@ -6,23 +6,15 @@ import java.util.Map; import java.util.Objects; public class ParamUtils { - public static Map between(LocalDate begin, LocalDate end) { - Map params = new HashMap<>(); - params.put("begin", begin); - params.put("end", end); - return params; + public static Map between(String key, LocalDate begin, LocalDate end) { + return Map.of(key, Map.of( + "begin", begin, + "end", end + )); } - public static Map equal(String key, boolean value) { - Map params = new HashMap<>(); - params.put(key, value); - return params; - } - - public static Map equal(String key, String value) { - Map params = new HashMap<>(); - params.put(key, value); - return params; + public static Map equal(String key, Object value) { + return Map.of(key, value); } public static Map like(String key, String value) { @@ -70,7 +62,7 @@ public class ParamUtils { } public Builder equals(String key, Object value) { - params.put(key, Map.of("equals", value)); + params.put(key, value); return this; } diff --git a/client/src/main/java/com/ecep/contract/vm/CompanyCustomerFileTypeLocalViewModel.java b/client/src/main/java/com/ecep/contract/vm/CompanyCustomerFileTypeLocalViewModel.java index f3eb65a..becbf64 100644 --- a/client/src/main/java/com/ecep/contract/vm/CompanyCustomerFileTypeLocalViewModel.java +++ b/client/src/main/java/com/ecep/contract/vm/CompanyCustomerFileTypeLocalViewModel.java @@ -1,4 +1,12 @@ package com.ecep.contract.vm; -public class CompanyCustomerFileTypeLocalViewModel { +import com.ecep.contract.CompanyCustomerFileType; +import com.ecep.contract.model.CompanyCustomerFileTypeLocal; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class CompanyCustomerFileTypeLocalViewModel extends EnumViewModel { + } diff --git a/client/src/main/java/com/ecep/contract/vm/CompanyVendorFileTypeLocalViewModel.java b/client/src/main/java/com/ecep/contract/vm/CompanyVendorFileTypeLocalViewModel.java index a1164b1..d804848 100644 --- a/client/src/main/java/com/ecep/contract/vm/CompanyVendorFileTypeLocalViewModel.java +++ b/client/src/main/java/com/ecep/contract/vm/CompanyVendorFileTypeLocalViewModel.java @@ -1,4 +1,13 @@ package com.ecep.contract.vm; -public class CompanyVendorFileTypeLocalViewModel { +import com.ecep.contract.CompanyCustomerFileType; +import com.ecep.contract.CompanyVendorFileType; +import com.ecep.contract.model.CompanyCustomerFileTypeLocal; +import com.ecep.contract.model.CompanyVendorFileTypeLocal; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class CompanyVendorFileTypeLocalViewModel extends EnumViewModel { } diff --git a/client/src/main/java/com/ecep/contract/vm/ContractFileTypeLocalViewModel.java b/client/src/main/java/com/ecep/contract/vm/ContractFileTypeLocalViewModel.java index a107fd1..9455bba 100644 --- a/client/src/main/java/com/ecep/contract/vm/ContractFileTypeLocalViewModel.java +++ b/client/src/main/java/com/ecep/contract/vm/ContractFileTypeLocalViewModel.java @@ -12,40 +12,22 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) -public class ContractFileTypeLocalViewModel extends IdentityViewModel { - private SimpleObjectProperty type = new SimpleObjectProperty<>(); +public class ContractFileTypeLocalViewModel extends EnumViewModel { private SimpleStringProperty suggestFileName = new SimpleStringProperty(); - private SimpleStringProperty lang = new SimpleStringProperty(); - private SimpleStringProperty value = new SimpleStringProperty(); @Override protected void updateFrom(ContractFileTypeLocal v) { super.updateFrom(v); - type.set(v.getType()); suggestFileName.set(v.getSuggestFileName()); - lang.set(v.getLang()); - value.set(v.getValue()); } @Override public boolean copyTo(ContractFileTypeLocal v) { boolean ret = super.copyTo(v); - if (!Objects.equals(type.get(), v.getType())) { - v.setType(type.get()); - ret = true; - } if (!Objects.equals(suggestFileName.get(), v.getSuggestFileName())) { v.setSuggestFileName(suggestFileName.get()); ret = true; } - if (!Objects.equals(lang.get(), v.getLang())) { - v.setLang(lang.get()); - ret = true; - } - if (!Objects.equals(value.get(), v.getValue())) { - v.setValue(value.get()); - ret = true; - } return ret; } } diff --git a/client/src/main/java/com/ecep/contract/vm/EnumViewModel.java b/client/src/main/java/com/ecep/contract/vm/EnumViewModel.java index b42376a..1aca9f7 100644 --- a/client/src/main/java/com/ecep/contract/vm/EnumViewModel.java +++ b/client/src/main/java/com/ecep/contract/vm/EnumViewModel.java @@ -1,4 +1,43 @@ package com.ecep.contract.vm; -public class EnumViewModel { +import com.ecep.contract.model.BaseEnumEntity; +import javafx.beans.property.SimpleObjectProperty; +import javafx.beans.property.SimpleStringProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Objects; + +@Data +@EqualsAndHashCode(callSuper = true) +public class EnumViewModel, T extends BaseEnumEntity> extends IdentityViewModel { + private SimpleObjectProperty type = new SimpleObjectProperty<>(); + private SimpleStringProperty lang = new SimpleStringProperty(); + private SimpleStringProperty value = new SimpleStringProperty(); + + @Override + protected void updateFrom(T v) { + super.updateFrom(v); + type.set(v.getType()); + lang.set(v.getLang()); + value.set(v.getValue()); + } + + @Override + public boolean copyTo(T v) { + boolean ret = super.copyTo(v); + if (!Objects.equals(v.getType(), type.get())) { + v.setType(type.get()); + ret = true; + } + if (!Objects.equals(v.getLang(), lang.get())) { + v.setLang(lang.get()); + ret = true; + } + if (!Objects.equals(v.getValue(), value.get())) { + v.setValue(value.get()); + ret = true; + } + return ret; + } } diff --git a/client/src/main/resources/logback.xml b/client/src/main/resources/logback.xml index a1a64a5..77b020e 100644 --- a/client/src/main/resources/logback.xml +++ b/client/src/main/resources/logback.xml @@ -11,7 +11,7 @@ - + diff --git a/client/src/main/resources/ui/inventory/inventory-contract.fxml b/client/src/main/resources/ui/inventory/inventory-contract.fxml index a776ca9..f104040 100644 --- a/client/src/main/resources/ui/inventory/inventory-contract.fxml +++ b/client/src/main/resources/ui/inventory/inventory-contract.fxml @@ -4,7 +4,7 @@ + fx:controller="com.ecep.contract.controller.inventory.InventoryTabSkinContracts"> diff --git a/client/src/main/resources/ui/inventory/inventory-history-price.fxml b/client/src/main/resources/ui/inventory/inventory-history-price.fxml index ae8cf39..efb6342 100644 --- a/client/src/main/resources/ui/inventory/inventory-history-price.fxml +++ b/client/src/main/resources/ui/inventory/inventory-history-price.fxml @@ -4,7 +4,7 @@ + fx:controller="com.ecep.contract.controller.inventory.InventoryTabSkinHistoryPrice"> diff --git a/client/src/main/resources/ui/inventory/inventory-manager.fxml b/client/src/main/resources/ui/inventory/inventory-manager.fxml index fde0042..b45774c 100644 --- a/client/src/main/resources/ui/inventory/inventory-manager.fxml +++ b/client/src/main/resources/ui/inventory/inventory-manager.fxml @@ -3,7 +3,7 @@ + fx:controller="com.ecep.contract.controller.inventory.InventoryManagerWindowController"> diff --git a/client/src/main/resources/ui/inventory/inventory.fxml b/client/src/main/resources/ui/inventory/inventory.fxml index d779cdb..d5967e3 100644 --- a/client/src/main/resources/ui/inventory/inventory.fxml +++ b/client/src/main/resources/ui/inventory/inventory.fxml @@ -5,7 +5,7 @@ + fx:controller="com.ecep.contract.controller.inventory.InventoryWindowController"> diff --git a/common/src/main/java/com/ecep/contract/constant/ProjectConstant.java b/common/src/main/java/com/ecep/contract/constant/ProjectConstant.java index 42db7e4..f9bcfea 100644 --- a/common/src/main/java/com/ecep/contract/constant/ProjectConstant.java +++ b/common/src/main/java/com/ecep/contract/constant/ProjectConstant.java @@ -4,4 +4,5 @@ public class ProjectConstant { public final static String KEY_CUSTOMER_SATISFACTION_SURVEY_TEMPLATE = "project.customer-satisfaction-survey.template"; + public static final String KEY_BASE_PATH = "project.base.path"; } diff --git a/common/src/main/java/com/ecep/contract/constant/WebSocketConstant.java b/common/src/main/java/com/ecep/contract/constant/WebSocketConstant.java index f5dbf82..dabd2eb 100644 --- a/common/src/main/java/com/ecep/contract/constant/WebSocketConstant.java +++ b/common/src/main/java/com/ecep/contract/constant/WebSocketConstant.java @@ -1,4 +1,16 @@ package com.ecep.contract.constant; public class WebSocketConstant { + public static final String MESSAGE_ID_FIELD_NAME = "messageId"; + public static final String MESSAGE_TYPE_FIELD_NAME = "messageType"; + public static final String SUCCESS_FIELD_VALUE = "success"; + public static final String MESSAGE_FIELD_NAME = "message"; + public static final String ERROR_CODE_FIELD_NAME = "errorCode"; + + public static final String SERVICE_FIELD_NAME = "service"; + public static final String METHOD_FIELD_NAME = "method"; + public static final String ARGUMENTS_FIELD_NAME = "arguments"; + + + public static final String SESSION_ID_FIELD_NAME = "sessionId"; } diff --git a/common/src/main/java/com/ecep/contract/model/CompanyVendor.java b/common/src/main/java/com/ecep/contract/model/CompanyVendor.java index 6ebea7e..fd3324b 100644 --- a/common/src/main/java/com/ecep/contract/model/CompanyVendor.java +++ b/common/src/main/java/com/ecep/contract/model/CompanyVendor.java @@ -6,6 +6,8 @@ import java.time.LocalDate; import java.util.List; import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import org.hibernate.annotations.ColumnDefault; import com.ecep.contract.VendorType; @@ -56,6 +58,7 @@ public class CompanyVendor implements IdentityEntity, CompanyBasedEntity, Serial private Company company; @OneToMany(mappedBy = "vendor", fetch = FetchType.LAZY) + @JsonIgnore @ToString.Exclude private List entities; diff --git a/common/src/main/java/com/ecep/contract/model/CompanyVendorFileTypeLocal.java b/common/src/main/java/com/ecep/contract/model/CompanyVendorFileTypeLocal.java index 800e906..11b66b3 100644 --- a/common/src/main/java/com/ecep/contract/model/CompanyVendorFileTypeLocal.java +++ b/common/src/main/java/com/ecep/contract/model/CompanyVendorFileTypeLocal.java @@ -1,5 +1,6 @@ package com.ecep.contract.model; +import java.io.Serializable; import java.util.Objects; import com.ecep.contract.CompanyVendorFileType; @@ -19,7 +20,8 @@ import lombok.ToString; @Entity @Table(name = "COMPANY_VENDOR_FILE_TYPE_LOCAL") @ToString -public class CompanyVendorFileTypeLocal extends BaseEnumEntity { +public class CompanyVendorFileTypeLocal extends BaseEnumEntity implements Serializable { + private static final long serialVersionUID = 1L; @Override public final boolean equals(Object object) { if (this == object) diff --git a/common/src/main/java/com/ecep/contract/model/ContractFileTypeLocal.java b/common/src/main/java/com/ecep/contract/model/ContractFileTypeLocal.java index 83472a1..a5785aa 100644 --- a/common/src/main/java/com/ecep/contract/model/ContractFileTypeLocal.java +++ b/common/src/main/java/com/ecep/contract/model/ContractFileTypeLocal.java @@ -1,5 +1,6 @@ package com.ecep.contract.model; +import java.io.Serializable; import java.util.Objects; import com.ecep.contract.ContractFileType; @@ -20,7 +21,8 @@ import lombok.ToString; @Entity @Table(name = "CONTRACT_FILE_TYPE_LOCAL") @ToString -public class ContractFileTypeLocal extends BaseEnumEntity { +public class ContractFileTypeLocal extends BaseEnumEntity implements Serializable { + private static final long serialVersionUID = 1L; /** * 建议的文件名 */ diff --git a/common/src/main/java/com/ecep/contract/model/ContractGroup.java b/common/src/main/java/com/ecep/contract/model/ContractGroup.java index 99fdb9a..746f52c 100644 --- a/common/src/main/java/com/ecep/contract/model/ContractGroup.java +++ b/common/src/main/java/com/ecep/contract/model/ContractGroup.java @@ -64,6 +64,7 @@ public class ContractGroup implements IdentityEntity, NamedEntity, Serializable @Override public final int hashCode() { + super.hashCode(); return HibernateProxyUtils.hashCode(this); } } diff --git a/common/src/main/java/com/ecep/contract/model/CustomerCatalog.java b/common/src/main/java/com/ecep/contract/model/CustomerCatalog.java index 6cf819e..5f15fde 100644 --- a/common/src/main/java/com/ecep/contract/model/CustomerCatalog.java +++ b/common/src/main/java/com/ecep/contract/model/CustomerCatalog.java @@ -1,5 +1,6 @@ package com.ecep.contract.model; +import java.io.Serializable; import java.util.Objects; import com.ecep.contract.util.HibernateProxyUtils; @@ -22,7 +23,8 @@ import lombok.ToString; @Entity @Table(name = "CUSTOMER_CATALOG", schema = "supplier_ms") @ToString -public class CustomerCatalog implements BasedEntity, IdentityEntity { +public class CustomerCatalog implements BasedEntity, IdentityEntity, Serializable { + private static final long serialVersionUID = 1L; @Id @Column(name = "ID", nullable = false) @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/common/src/main/java/com/ecep/contract/model/CustomerSatisfactionSurvey.java b/common/src/main/java/com/ecep/contract/model/CustomerSatisfactionSurvey.java index 82e33d8..64d9c8f 100644 --- a/common/src/main/java/com/ecep/contract/model/CustomerSatisfactionSurvey.java +++ b/common/src/main/java/com/ecep/contract/model/CustomerSatisfactionSurvey.java @@ -1,5 +1,6 @@ package com.ecep.contract.model; +import java.io.Serializable; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Objects; @@ -27,7 +28,8 @@ import lombok.ToString; @Entity @Table(name = "PROJECT_CUSTOMER_SATISFACTION_SURVEY", schema = "supplier_ms") @ToString -public class CustomerSatisfactionSurvey implements IdentityEntity, ProjectBasedEntity { +public class CustomerSatisfactionSurvey implements IdentityEntity, ProjectBasedEntity, Serializable { + private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false) diff --git a/common/src/main/java/com/ecep/contract/model/DeliverySignMethod.java b/common/src/main/java/com/ecep/contract/model/DeliverySignMethod.java index d395ba6..9afb1b1 100644 --- a/common/src/main/java/com/ecep/contract/model/DeliverySignMethod.java +++ b/common/src/main/java/com/ecep/contract/model/DeliverySignMethod.java @@ -1,5 +1,6 @@ package com.ecep.contract.model; +import java.io.Serializable; import java.util.Objects; import com.ecep.contract.util.HibernateProxyUtils; @@ -24,7 +25,8 @@ import lombok.ToString; @Setter @Entity @Table(name = "PRODUCT_DELIVERY_SIGN_METHOD", schema = "supplier_ms") -public class DeliverySignMethod implements BasedEntity, IdentityEntity { +public class DeliverySignMethod implements BasedEntity, IdentityEntity , Serializable { + private static final long serialVersionUID = 1L; @Id @Column(name = "ID", nullable = false) @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/common/src/main/java/com/ecep/contract/model/Employee.java b/common/src/main/java/com/ecep/contract/model/Employee.java index 18fcc69..9e735ab 100644 --- a/common/src/main/java/com/ecep/contract/model/Employee.java +++ b/common/src/main/java/com/ecep/contract/model/Employee.java @@ -117,8 +117,11 @@ public class Employee implements BasedEntity, IdentityEntity, NamedEntity, Seria public final boolean equals(Object object) { if (this == object) return true; - if (object == null || HibernateProxyUtils.isNotEffectiveClassEquals(this, object)) + if (object == null) return false; + if (HibernateProxyUtils.isNotEffectiveClassEquals(object, this)) { + return false; + } Employee employee = (Employee) object; return getId() != null && Objects.equals(getId(), employee.getId()); } diff --git a/common/src/main/java/com/ecep/contract/model/ExtendVendorInfo.java b/common/src/main/java/com/ecep/contract/model/ExtendVendorInfo.java index f2bddd0..5b0ef4d 100644 --- a/common/src/main/java/com/ecep/contract/model/ExtendVendorInfo.java +++ b/common/src/main/java/com/ecep/contract/model/ExtendVendorInfo.java @@ -1,28 +1,21 @@ package com.ecep.contract.model; -import java.util.Objects; - import com.ecep.contract.util.HibernateProxyUtils; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; +import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; import lombok.ToString; +import java.io.Serializable; +import java.util.Objects; + @Getter @Setter @Entity @Table(name = "CONTRACT_EXTEND_VENDOR_INFO", schema = "supplier_ms") @ToString -public class ExtendVendorInfo implements IdentityEntity { +public class ExtendVendorInfo implements IdentityEntity, Serializable { + private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false) diff --git a/common/src/main/java/com/ecep/contract/model/HistoryPrice.java b/common/src/main/java/com/ecep/contract/model/HistoryPrice.java index 25a537b..9e915f1 100644 --- a/common/src/main/java/com/ecep/contract/model/HistoryPrice.java +++ b/common/src/main/java/com/ecep/contract/model/HistoryPrice.java @@ -3,11 +3,13 @@ package com.ecep.contract.model; import jakarta.persistence.Embeddable; import lombok.Data; +import java.io.Serializable; import java.time.MonthDay; @Embeddable @Data -public class HistoryPrice { +public class HistoryPrice implements Serializable { + private static final long serialVersionUID = 1L; /** * 税率,1% =1,100% =100 */ @@ -22,7 +24,6 @@ public class HistoryPrice { private double postTaxPrice; /** * 12-31, 字符串方式存储 - * {@link com.ecep.contract.manager.ds.MonthDayConverter} */ private MonthDay monthDay; } diff --git a/common/src/main/java/com/ecep/contract/model/HolidayTable.java b/common/src/main/java/com/ecep/contract/model/HolidayTable.java index 1c29188..0d4be8d 100644 --- a/common/src/main/java/com/ecep/contract/model/HolidayTable.java +++ b/common/src/main/java/com/ecep/contract/model/HolidayTable.java @@ -1,5 +1,6 @@ package com.ecep.contract.model; +import java.io.Serializable; import java.time.LocalDate; import java.util.Objects; @@ -21,7 +22,8 @@ import lombok.ToString; @Entity @Table(name = "HOLIDAY_TABLE") @ToString -public class HolidayTable { +public class HolidayTable implements Serializable { + private static final long serialVersionUID = 1L; @Id @Column(name = "ID", nullable = false) @JdbcTypeCode(SqlTypes.DATE) diff --git a/common/src/main/java/com/ecep/contract/model/InventoryHistoryPrice.java b/common/src/main/java/com/ecep/contract/model/InventoryHistoryPrice.java index 99500f7..c0669d1 100644 --- a/common/src/main/java/com/ecep/contract/model/InventoryHistoryPrice.java +++ b/common/src/main/java/com/ecep/contract/model/InventoryHistoryPrice.java @@ -1,5 +1,6 @@ package com.ecep.contract.model; +import java.io.Serializable; import java.time.Year; import java.util.Objects; @@ -26,7 +27,8 @@ import lombok.ToString; @ToString @Entity @Table(name = "INVENTORY_HISTORY", schema = "supplier_ms") -public class InventoryHistoryPrice implements IdentityEntity { +public class InventoryHistoryPrice implements IdentityEntity, Serializable { + private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false) diff --git a/common/src/main/java/com/ecep/contract/model/ProjectFile.java b/common/src/main/java/com/ecep/contract/model/ProjectFile.java index 3d96dbb..39174e9 100644 --- a/common/src/main/java/com/ecep/contract/model/ProjectFile.java +++ b/common/src/main/java/com/ecep/contract/model/ProjectFile.java @@ -29,7 +29,7 @@ import lombok.ToString; @Entity @Table(name = "PROJECT_FILE") @ToString -public class ProjectFile implements IdentityEntity, ProjectBasedEntity, Serializable { +public class ProjectFile implements IdentityEntity, ProjectBasedEntity, java.io.Serializable { private static final long serialVersionUID = 1L; @Id diff --git a/common/src/main/java/com/ecep/contract/model/ProjectFileTypeLocal.java b/common/src/main/java/com/ecep/contract/model/ProjectFileTypeLocal.java index 785ecd2..a44b38f 100644 --- a/common/src/main/java/com/ecep/contract/model/ProjectFileTypeLocal.java +++ b/common/src/main/java/com/ecep/contract/model/ProjectFileTypeLocal.java @@ -1,5 +1,6 @@ package com.ecep.contract.model; +import java.io.Serializable; import java.util.Objects; import com.ecep.contract.ProjectFileType; @@ -16,7 +17,8 @@ import lombok.ToString; @Entity @Table(name = "PROJECT_FILE_TYPE_LOCAL") @ToString -public class ProjectFileTypeLocal extends BaseEnumEntity { +public class ProjectFileTypeLocal extends BaseEnumEntity implements java.io.Serializable { + private static final long serialVersionUID = 1L; @Override public final boolean equals(Object object) { if (this == object) { diff --git a/common/src/main/java/com/ecep/contract/model/ProjectFundPlan.java b/common/src/main/java/com/ecep/contract/model/ProjectFundPlan.java index 86b0c82..235beb5 100644 --- a/common/src/main/java/com/ecep/contract/model/ProjectFundPlan.java +++ b/common/src/main/java/com/ecep/contract/model/ProjectFundPlan.java @@ -32,7 +32,8 @@ import lombok.ToString; @Entity @Table(name = "PROJECT_FUND_PLAN") @ToString -public class ProjectFundPlan implements IdentityEntity, ProjectBasedEntity { +public class ProjectFundPlan implements IdentityEntity, ProjectBasedEntity, java.io.Serializable { + private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false) diff --git a/common/src/main/java/com/ecep/contract/model/ProjectQuotation.java b/common/src/main/java/com/ecep/contract/model/ProjectQuotation.java index 377a612..e4cf8a0 100644 --- a/common/src/main/java/com/ecep/contract/model/ProjectQuotation.java +++ b/common/src/main/java/com/ecep/contract/model/ProjectQuotation.java @@ -30,7 +30,8 @@ import lombok.ToString; @Entity @Table(name = "PROJECT_QUOTATION") @ToString -public class ProjectQuotation implements IdentityEntity, ProjectBasedEntity { +public class ProjectQuotation implements IdentityEntity, ProjectBasedEntity, java.io.Serializable { + private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false) diff --git a/common/src/main/java/com/ecep/contract/model/ProjectSaleType.java b/common/src/main/java/com/ecep/contract/model/ProjectSaleType.java index 1b66a9f..fa627ba 100644 --- a/common/src/main/java/com/ecep/contract/model/ProjectSaleType.java +++ b/common/src/main/java/com/ecep/contract/model/ProjectSaleType.java @@ -1,5 +1,6 @@ package com.ecep.contract.model; +import java.io.Serializable; import java.util.Objects; import com.ecep.contract.util.HibernateProxyUtils; @@ -20,7 +21,8 @@ import lombok.Setter; @Setter @Entity @Table(name = "PROJECT_SALE_TYPE") -public class ProjectSaleType implements IdentityEntity, NamedEntity, BasedEntity { +public class ProjectSaleType implements IdentityEntity, NamedEntity, BasedEntity, Serializable { + private static final long serialVersionUID = 1L; @Id @Column(name = "ID", nullable = false) @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/common/src/main/java/com/ecep/contract/model/ProjectSaleTypeRequireFileType.java b/common/src/main/java/com/ecep/contract/model/ProjectSaleTypeRequireFileType.java index d07851f..6df0b25 100644 --- a/common/src/main/java/com/ecep/contract/model/ProjectSaleTypeRequireFileType.java +++ b/common/src/main/java/com/ecep/contract/model/ProjectSaleTypeRequireFileType.java @@ -27,7 +27,8 @@ import lombok.ToString; @Setter @Entity @Table(name = "PROJECT_SALE_TYPE_REQ_FILE_TYPE") -public class ProjectSaleTypeRequireFileType implements IdentityEntity, BasedEntity { +public class ProjectSaleTypeRequireFileType implements IdentityEntity, BasedEntity, java.io.Serializable { + private static final long serialVersionUID = 1L; @Id @Column(name = "ID", nullable = false) @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/common/src/main/java/com/ecep/contract/model/ProjectType.java b/common/src/main/java/com/ecep/contract/model/ProjectType.java index aa945bc..b8ba8a0 100644 --- a/common/src/main/java/com/ecep/contract/model/ProjectType.java +++ b/common/src/main/java/com/ecep/contract/model/ProjectType.java @@ -21,7 +21,7 @@ import lombok.Setter; @Setter @Entity @Table(name = "PROJECT_TYPE") -public class ProjectType implements IdentityEntity, NamedEntity, BasedEntity, Serializable { +public class ProjectType implements IdentityEntity, NamedEntity, BasedEntity, java.io.Serializable { private static final long serialVersionUID = 1L; @Id @Column(name = "ID", nullable = false) diff --git a/common/src/main/java/com/ecep/contract/model/PurchaseBillVoucher.java b/common/src/main/java/com/ecep/contract/model/PurchaseBillVoucher.java index 0a471ed..750fbb2 100644 --- a/common/src/main/java/com/ecep/contract/model/PurchaseBillVoucher.java +++ b/common/src/main/java/com/ecep/contract/model/PurchaseBillVoucher.java @@ -27,7 +27,8 @@ import lombok.ToString; @Entity @Table(name = "PURCHASE_BILL_VOUCHER", schema = "supplier_ms") @ToString -public class PurchaseBillVoucher implements IdentityEntity, BasedEntity { +public class PurchaseBillVoucher implements IdentityEntity, BasedEntity, java.io.Serializable { + private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false) diff --git a/common/src/main/java/com/ecep/contract/model/PurchaseBillVoucherItem.java b/common/src/main/java/com/ecep/contract/model/PurchaseBillVoucherItem.java index b41ae76..c488b84 100644 --- a/common/src/main/java/com/ecep/contract/model/PurchaseBillVoucherItem.java +++ b/common/src/main/java/com/ecep/contract/model/PurchaseBillVoucherItem.java @@ -26,7 +26,8 @@ import lombok.ToString; @Entity @Table(name = "PURCHASE_BILL_VOUCHER_ITEM", schema = "supplier_ms") @ToString -public class PurchaseBillVoucherItem implements IdentityEntity, BasedEntity { +public class PurchaseBillVoucherItem implements IdentityEntity, BasedEntity, java.io.Serializable { + private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false) diff --git a/common/src/main/java/com/ecep/contract/model/PurchaseOrder.java b/common/src/main/java/com/ecep/contract/model/PurchaseOrder.java index e298af6..8e6f95e 100644 --- a/common/src/main/java/com/ecep/contract/model/PurchaseOrder.java +++ b/common/src/main/java/com/ecep/contract/model/PurchaseOrder.java @@ -27,7 +27,8 @@ import lombok.ToString; @Entity @Table(name = "PURCHASE_ORDER", schema = "supplier_ms") @ToString -public class PurchaseOrder implements IdentityEntity, BasedEntity, ContractBasedEntity { +public class PurchaseOrder implements IdentityEntity, BasedEntity, ContractBasedEntity, java.io.Serializable { + private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false) diff --git a/common/src/main/java/com/ecep/contract/model/PurchaseOrderItem.java b/common/src/main/java/com/ecep/contract/model/PurchaseOrderItem.java index 17778d5..9de8cf6 100644 --- a/common/src/main/java/com/ecep/contract/model/PurchaseOrderItem.java +++ b/common/src/main/java/com/ecep/contract/model/PurchaseOrderItem.java @@ -27,7 +27,8 @@ import lombok.ToString; @Entity @Table(name = "PURCHASE_ORDER_ITEM", schema = "supplier_ms") @ToString -public class PurchaseOrderItem implements IdentityEntity, BasedEntity { +public class PurchaseOrderItem implements IdentityEntity, BasedEntity, java.io.Serializable { + private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false) diff --git a/common/src/main/java/com/ecep/contract/model/PurchaseReceipt.java b/common/src/main/java/com/ecep/contract/model/PurchaseReceipt.java index 85adf4e..66ef95d 100644 --- a/common/src/main/java/com/ecep/contract/model/PurchaseReceipt.java +++ b/common/src/main/java/com/ecep/contract/model/PurchaseReceipt.java @@ -27,7 +27,8 @@ import lombok.ToString; @Entity @Table(name = "PURCHASE_RECEIPT", schema = "supplier_ms") @ToString -public class PurchaseReceipt implements IdentityEntity, BasedEntity { +public class PurchaseReceipt implements IdentityEntity, BasedEntity, java.io.Serializable { + private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false) diff --git a/common/src/main/java/com/ecep/contract/model/PurchaseSettlementVoucher.java b/common/src/main/java/com/ecep/contract/model/PurchaseSettlementVoucher.java index f2dfe1a..2fb2343 100644 --- a/common/src/main/java/com/ecep/contract/model/PurchaseSettlementVoucher.java +++ b/common/src/main/java/com/ecep/contract/model/PurchaseSettlementVoucher.java @@ -27,7 +27,8 @@ import lombok.ToString; @Entity @Table(name = "PURCHASE_SETTLE_VOUCHER", schema = "supplier_ms") @ToString -public class PurchaseSettlementVoucher implements IdentityEntity, BasedEntity { +public class PurchaseSettlementVoucher implements IdentityEntity, BasedEntity, java.io.Serializable { + private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false) diff --git a/common/src/main/java/com/ecep/contract/model/PurchaseSettlementVoucherItem.java b/common/src/main/java/com/ecep/contract/model/PurchaseSettlementVoucherItem.java index 7bc33f0..0807435 100644 --- a/common/src/main/java/com/ecep/contract/model/PurchaseSettlementVoucherItem.java +++ b/common/src/main/java/com/ecep/contract/model/PurchaseSettlementVoucherItem.java @@ -26,7 +26,8 @@ import lombok.ToString; @Entity @Table(name = "PURCHASE_SETTLE_VOUCHER_ITEM", schema = "supplier_ms") @ToString -public class PurchaseSettlementVoucherItem implements IdentityEntity, BasedEntity { +public class PurchaseSettlementVoucherItem implements IdentityEntity, BasedEntity, java.io.Serializable { + private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false) diff --git a/common/src/main/java/com/ecep/contract/model/SalesBillVoucher.java b/common/src/main/java/com/ecep/contract/model/SalesBillVoucher.java index 630aa66..28218fc 100644 --- a/common/src/main/java/com/ecep/contract/model/SalesBillVoucher.java +++ b/common/src/main/java/com/ecep/contract/model/SalesBillVoucher.java @@ -27,7 +27,8 @@ import lombok.ToString; @Entity @Table(name = "SALES_BILL_VOUCHER", schema = "supplier_ms") @ToString -public class SalesBillVoucher implements IdentityEntity, BasedEntity { +public class SalesBillVoucher implements IdentityEntity, BasedEntity, java.io.Serializable { + private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false) diff --git a/common/src/main/java/com/ecep/contract/model/SalesBillVoucherItem.java b/common/src/main/java/com/ecep/contract/model/SalesBillVoucherItem.java index 28e2659..a5c0e9e 100644 --- a/common/src/main/java/com/ecep/contract/model/SalesBillVoucherItem.java +++ b/common/src/main/java/com/ecep/contract/model/SalesBillVoucherItem.java @@ -26,7 +26,8 @@ import lombok.ToString; @Entity @Table(name = "SALES_BILL_VOUCHER_ITEM", schema = "supplier_ms") @ToString -public class SalesBillVoucherItem implements IdentityEntity, BasedEntity { +public class SalesBillVoucherItem implements IdentityEntity, BasedEntity, java.io.Serializable { + private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false) diff --git a/common/src/main/java/com/ecep/contract/model/SalesOrder.java b/common/src/main/java/com/ecep/contract/model/SalesOrder.java index a1f7f21..ba77be9 100644 --- a/common/src/main/java/com/ecep/contract/model/SalesOrder.java +++ b/common/src/main/java/com/ecep/contract/model/SalesOrder.java @@ -1,5 +1,6 @@ package com.ecep.contract.model; +import java.io.Serializable; import java.time.LocalDate; import java.util.Objects; @@ -27,7 +28,8 @@ import lombok.ToString; @Entity @Table(name = "CONTRACT_SALES_ORDER", schema = "supplier_ms") @ToString -public class SalesOrder implements IdentityEntity, BasedEntity, ContractBasedEntity { +public class SalesOrder implements IdentityEntity, BasedEntity, ContractBasedEntity, Serializable { + private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false) diff --git a/common/src/main/java/com/ecep/contract/model/SalesOrderInvoice.java b/common/src/main/java/com/ecep/contract/model/SalesOrderInvoice.java index 1956b94..d883cfc 100644 --- a/common/src/main/java/com/ecep/contract/model/SalesOrderInvoice.java +++ b/common/src/main/java/com/ecep/contract/model/SalesOrderInvoice.java @@ -1,4 +1,44 @@ package com.ecep.contract.model; -public class SalesOrderInvoice { +import com.ecep.contract.util.HibernateProxyUtils; +import jakarta.persistence.*; +import lombok.*; +import org.hibernate.proxy.HibernateProxy; + +import java.io.Serializable; +import java.util.Objects; + +/** + * 销售订单发票 + */ +@Getter +@Setter +@RequiredArgsConstructor +@Entity +@Table(name = "SALES_ORDER_INVOICE", schema = "supplier_ms") +@ToString +public class SalesOrderInvoice implements IdentityEntity, Serializable { + private static final long serialVersionUID = 1L; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "ID", nullable = false) + private Integer id; + + @Override + public final boolean equals(Object o) { + if (this == o) return true; + if (o == null) return false; + if (HibernateProxyUtils.isNotEffectiveClassEquals(o, this)) { + return false; + } + SalesOrderInvoice that = (SalesOrderInvoice) o; + return getId() != null && Objects.equals(getId(), that.getId()); + } + + @Override + public final int hashCode() { + return HibernateProxyUtils.hashCode(this); + } + + } diff --git a/common/src/main/java/com/ecep/contract/model/SalesOrderItem.java b/common/src/main/java/com/ecep/contract/model/SalesOrderItem.java index 981df43..e3ee88c 100644 --- a/common/src/main/java/com/ecep/contract/model/SalesOrderItem.java +++ b/common/src/main/java/com/ecep/contract/model/SalesOrderItem.java @@ -1,5 +1,6 @@ package com.ecep.contract.model; +import java.io.Serializable; import java.time.LocalDate; import java.util.Objects; @@ -27,7 +28,8 @@ import lombok.ToString; @Entity @Table(name = "CONTRACT_SALES_ORDER_ITEM", schema = "supplier_ms") @ToString -public class SalesOrderItem implements IdentityEntity, BasedEntity { +public class SalesOrderItem implements IdentityEntity, BasedEntity, Serializable { + private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false) diff --git a/common/src/main/java/com/ecep/contract/model/VendorGroup.java b/common/src/main/java/com/ecep/contract/model/VendorGroup.java index 03e17b2..67bc04a 100644 --- a/common/src/main/java/com/ecep/contract/model/VendorGroup.java +++ b/common/src/main/java/com/ecep/contract/model/VendorGroup.java @@ -1,19 +1,14 @@ package com.ecep.contract.model; -import java.util.Objects; - import com.ecep.contract.util.HibernateProxyUtils; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Table; +import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; import lombok.ToString; +import java.io.Serializable; +import java.util.Objects; + /** * 采购合同类型 */ @@ -22,7 +17,8 @@ import lombok.ToString; @Entity @Table(name = "VENDOR_GROUP", schema = "supplier_ms") @ToString -public class VendorGroup implements IdentityEntity, NamedEntity, BasedEntity { +public class VendorGroup implements IdentityEntity, NamedEntity, BasedEntity, Serializable { + private static final long serialVersionUID = 1L; @Id @Column(name = "ID", nullable = false) diff --git a/common/src/main/java/com/ecep/contract/model/VendorGroupRequireFileType.java b/common/src/main/java/com/ecep/contract/model/VendorGroupRequireFileType.java index 7961a0e..feea6e2 100644 --- a/common/src/main/java/com/ecep/contract/model/VendorGroupRequireFileType.java +++ b/common/src/main/java/com/ecep/contract/model/VendorGroupRequireFileType.java @@ -1,5 +1,6 @@ package com.ecep.contract.model; +import java.io.Serializable; import java.util.Objects; import com.ecep.contract.ContractFileType; @@ -27,7 +28,8 @@ import lombok.ToString; @Setter @Entity @Table(name = "VENDOR_GROUP_REQ_FILE_TYPE") -public class VendorGroupRequireFileType implements IdentityEntity, BasedEntity { +public class VendorGroupRequireFileType implements IdentityEntity, BasedEntity, Serializable { + private static final long serialVersionUID = 1L; @Id @Column(name = "ID", nullable = false) @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/common/src/main/java/com/ecep/contract/model/VendorTypeLocal.java b/common/src/main/java/com/ecep/contract/model/VendorTypeLocal.java index 44227cc..71ab60f 100644 --- a/common/src/main/java/com/ecep/contract/model/VendorTypeLocal.java +++ b/common/src/main/java/com/ecep/contract/model/VendorTypeLocal.java @@ -1,5 +1,6 @@ package com.ecep.contract.model; +import java.io.Serializable; import java.util.Objects; import com.ecep.contract.VendorType; @@ -19,7 +20,8 @@ import lombok.ToString; @Entity @Table(name = "VENDOR_TYPE_LOCAL") @ToString(callSuper = true) -public class VendorTypeLocal extends BaseEnumEntity { +public class VendorTypeLocal extends BaseEnumEntity implements Serializable { + private static final long serialVersionUID = 1L; @Override public final boolean equals(Object object) { diff --git a/common/src/main/java/com/ecep/contract/model/VolumeSize.java b/common/src/main/java/com/ecep/contract/model/VolumeSize.java index d6e086d..c29ab78 100644 --- a/common/src/main/java/com/ecep/contract/model/VolumeSize.java +++ b/common/src/main/java/com/ecep/contract/model/VolumeSize.java @@ -3,12 +3,15 @@ package com.ecep.contract.model; import jakarta.persistence.Embeddable; import lombok.Data; +import java.io.Serializable; + /** * 体积尺寸 */ @Embeddable @Data -public class VolumeSize { +public class VolumeSize implements Serializable { + private static final long serialVersionUID = 1L; /** * 体积 */ diff --git a/common/src/main/java/com/ecep/contract/msg/SimpleMessage.java b/common/src/main/java/com/ecep/contract/msg/SimpleMessage.java index e1e413f..bb223fd 100644 --- a/common/src/main/java/com/ecep/contract/msg/SimpleMessage.java +++ b/common/src/main/java/com/ecep/contract/msg/SimpleMessage.java @@ -1,12 +1,13 @@ package com.ecep.contract.msg; +import com.ecep.contract.constant.WebSocketConstant; +import lombok.Data; + import java.util.Arrays; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; -import lombok.Data; - @Data public class SimpleMessage { @@ -16,6 +17,9 @@ public class SimpleMessage { private String method; private Object data; private List parameterTypes; + /** + * @see WebSocketConstant#ARGUMENTS_FIELD_NAME + */ private List arguments; public void setArguments(Object... arguments) { diff --git a/common/src/main/java/com/ecep/contract/util/HibernateProxyUtils.java b/common/src/main/java/com/ecep/contract/util/HibernateProxyUtils.java index 66215aa..3211a6c 100644 --- a/common/src/main/java/com/ecep/contract/util/HibernateProxyUtils.java +++ b/common/src/main/java/com/ecep/contract/util/HibernateProxyUtils.java @@ -2,6 +2,8 @@ package com.ecep.contract.util; import org.hibernate.proxy.HibernateProxy; +import java.util.Objects; + public class HibernateProxyUtils { private static boolean useProxy = true; @@ -19,14 +21,12 @@ public class HibernateProxyUtils { Class thisEffectiveClass = that instanceof HibernateProxy ? ((HibernateProxy) that).getHibernateLazyInitializer().getPersistentClass() : that.getClass(); - if (thisEffectiveClass != oEffectiveClass) - return false; - return true; + return thisEffectiveClass != oEffectiveClass; } public static int hashCode(Object that) { if (!useProxy) { - return that.hashCode(); + return that.getClass().hashCode(); } return that instanceof HibernateProxy ? ((HibernateProxy) that).getHibernateLazyInitializer().getPersistentClass().hashCode() diff --git a/config.properties b/config.properties index 6082957..8cde52e 100644 --- a/config.properties +++ b/config.properties @@ -2,7 +2,7 @@ #Wed Mar 26 16:33:45 CST 2025 # 日志配置 logging.level.com.ecep.contract=DEBUG -logging.level.com.ecep.contract.WebSocketService=DEBUG +logging.level.com.ecep.contract.WebSocketClientService=DEBUG cloud.u8.enabled=true #db.server.database=supplier_ms diff --git a/server/src/main/java/com/ecep/contract/EntityService.java b/server/src/main/java/com/ecep/contract/EntityService.java index be78487..c548136 100644 --- a/server/src/main/java/com/ecep/contract/EntityService.java +++ b/server/src/main/java/com/ecep/contract/EntityService.java @@ -1,4 +1,68 @@ package com.ecep.contract; -public class EntityService { +import com.ecep.contract.ds.MyRepository; +import com.ecep.contract.model.Contract; +import com.ecep.contract.util.SpecificationUtils; +import com.fasterxml.jackson.databind.JsonNode; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.util.StringUtils; + +import java.util.List; + +public abstract class EntityService { + + protected abstract MyRepository getRepository(); + + public abstract T createNewEntity(); + + + public long count() { + return getRepository().count(); + } + + public long count(Specification spec) { + return getRepository().count(spec); + } + + public long count(JsonNode paramsNode) { + return getRepository().count(buildParameterSpecification(paramsNode)); + } + + protected abstract Specification buildParameterSpecification(JsonNode paramsNode); + + public Page findAll(JsonNode paramsNode, Pageable pageable) { + Specification spec = null; + if (paramsNode.has("searchText")) { + spec = getSpecification(paramsNode.get("searchText").asText()); + } + spec = SpecificationUtils.and(spec, buildParameterSpecification(paramsNode)); + return findAll(spec, pageable); + } + + + public Page findAll(Specification spec, Pageable pageable) { + return getRepository().findAll(spec, pageable); + } + + public List findAll(Specification spec, Sort sort) { + return getRepository().findAll(spec, sort); + } + + protected abstract Specification buildSearchSpecification(String searchText); + + public Specification getSpecification(String searchText) { + if (!StringUtils.hasText(searchText)) { + return null; + } + return SpecificationUtils.andWith(searchText, this::buildSearchSpecification); + } + + public List search(String searchText) { + Specification spec = getSpecification(searchText); + return getRepository().findAll(spec, Pageable.ofSize(10)).getContent(); + } } diff --git a/server/src/main/java/com/ecep/contract/QueryService.java b/server/src/main/java/com/ecep/contract/QueryService.java index 9e5fdc6..bf44334 100644 --- a/server/src/main/java/com/ecep/contract/QueryService.java +++ b/server/src/main/java/com/ecep/contract/QueryService.java @@ -23,4 +23,8 @@ public interface QueryService { Specification getSpecification(String searchText); Page findAll(Specification spec, Pageable pageable); + + default long count(JsonNode paramsNode) { + return 0; + } } \ No newline at end of file diff --git a/server/src/main/java/com/ecep/contract/cloud/old/OldVersionSyncCustomerTask.java b/server/src/main/java/com/ecep/contract/cloud/old/OldVersionSyncCustomerTask.java index 42369d3..0e7d980 100644 --- a/server/src/main/java/com/ecep/contract/cloud/old/OldVersionSyncCustomerTask.java +++ b/server/src/main/java/com/ecep/contract/cloud/old/OldVersionSyncCustomerTask.java @@ -1,5 +1,15 @@ package com.ecep.contract.cloud.old; +import com.ecep.contract.MessageHolder; +import com.ecep.contract.SpringApp; +import com.ecep.contract.ds.company.service.CompanyService; +import com.ecep.contract.ds.customer.service.CompanyCustomerService; +import com.ecep.contract.model.Company; +import com.ecep.contract.model.Contract; +import com.ecep.contract.ui.Tasker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.io.File; import java.util.Arrays; import java.util.List; @@ -8,16 +18,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.ecep.contract.MessageHolder; -import com.ecep.contract.SpringApp; -import com.ecep.contract.ds.company.service.CompanyService; -import com.ecep.contract.model.Company; -import com.ecep.contract.model.Contract; -import com.ecep.contract.ui.Tasker; - /** * */ @@ -25,7 +25,6 @@ public class OldVersionSyncCustomerTask extends Tasker { private static final Logger logger = LoggerFactory.getLogger(OldVersionSyncCustomerTask.class); private final OldVersionService service = SpringApp.getBean(OldVersionService.class); - private final CompanyService companyService = SpringApp.getBean(CompanyService.class); private Map>> oldNameGroupedMap; private Map>> contactGroupedMap; @@ -39,7 +38,7 @@ public class OldVersionSyncCustomerTask extends Tasker { @Override protected Object execute(MessageHolder holder) throws Exception { updateTitle("老版本-同步客户数据"); - basePath = companyService.getCustomerBasePath(); + basePath = getCachedBean(CompanyCustomerService.class).getBasePath(); List runnable = Arrays.asList(this::loadOldNames, this::loadContacts, this::syncCustomers, this::syncContracts); @@ -67,7 +66,6 @@ public class OldVersionSyncCustomerTask extends Tasker { } } - private void loadContacts() { try (Stream> stream = service.queryAllCustomerContactForStream()) { diff --git a/server/src/main/java/com/ecep/contract/cloud/old/OldVersionSyncVendorTask.java b/server/src/main/java/com/ecep/contract/cloud/old/OldVersionSyncVendorTask.java index 9de4db5..caab57e 100644 --- a/server/src/main/java/com/ecep/contract/cloud/old/OldVersionSyncVendorTask.java +++ b/server/src/main/java/com/ecep/contract/cloud/old/OldVersionSyncVendorTask.java @@ -8,6 +8,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import java.util.stream.Stream; +import com.ecep.contract.ds.vendor.service.CompanyVendorService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,7 +35,7 @@ public class OldVersionSyncVendorTask extends Tasker { @Override protected Object execute(MessageHolder holder) throws Exception { - basePath = companyService.getVendorBasePath(); + basePath = getCachedBean(CompanyVendorService.class).getBasePath(); List runnable = Arrays.asList(this::loadOldNames, this::loadContacts, this::syncVendors, this::syncContracts); for (int i = 0; i < runnable.size(); i++) { diff --git a/server/src/main/java/com/ecep/contract/cloud/u8/ContractSyncTask.java b/server/src/main/java/com/ecep/contract/cloud/u8/ContractSyncTask.java index e64fd97..aa8b209 100644 --- a/server/src/main/java/com/ecep/contract/cloud/u8/ContractSyncTask.java +++ b/server/src/main/java/com/ecep/contract/cloud/u8/ContractSyncTask.java @@ -3,21 +3,17 @@ package com.ecep.contract.cloud.u8; import java.sql.Timestamp; import java.time.LocalDateTime; import java.util.Map; -import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; -import java.util.logging.Level; +import java.util.function.BiConsumer; import java.util.stream.Stream; +import com.ecep.contract.service.WebSocketServerTasker; +import com.fasterxml.jackson.databind.JsonNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import com.ecep.contract.MessageHolder; @@ -28,55 +24,19 @@ import com.ecep.contract.ds.contract.tasker.AbstContractRepairTasker; /** * 合同同步任务 */ -@Component -public class ContractSyncTask extends AbstContractRepairTasker implements InitializingBean, DisposableBean { +public class ContractSyncTask extends AbstContractRepairTasker implements WebSocketServerTasker { private static final Logger logger = LoggerFactory.getLogger(ContractSyncTask.class); private YongYouU8Repository repository; - private ScheduledExecutorService executorService; private ScheduledFuture scheduleAtFixedRate; - @Autowired - public ContractSyncTask(ScheduledExecutorService executorService) { - this.executorService = executorService; - updateTitle("用友U8系统-同步合同"); - System.out.println("合同同步任务启动"); + public ContractSyncTask() { } + + @Override - public void afterPropertiesSet() throws Exception { - scheduleAtFixedRate = executorService.scheduleAtFixedRate(() -> { - try { - ContractSyncTask.this.call(); - } catch (Exception e) { - logger.error("合同同步任务异常", e); - } - }, 1, 5, TimeUnit.MINUTES); - ; - } + public void init(JsonNode argsNode) { - public void destroy() throws Exception { - if (scheduleAtFixedRate != null) { - scheduleAtFixedRate.cancel(true); - } - } - - @Override - protected void updateMessage(Level level, String message) { - if (level == Level.SEVERE) { - logger.error(message); - } - if (level == Level.WARNING) { - logger.warn(message); - } - if (level == Level.INFO) { - logger.info(message); - } - if (level == Level.FINE) { - logger.debug(message); - } - if (level == Level.FINER) { - logger.trace(message); - } } @Override @@ -189,4 +149,5 @@ public class ContractSyncTask extends AbstContractRepairTasker implements Initia getConfService().set(CloudYuConstant.KEY_SYNC_BY_LATEST_DATE, String.valueOf(reference.get())); } + } diff --git a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/CompanyCtx.java b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/CompanyCtx.java index d2d93f9..b6f2d59 100644 --- a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/CompanyCtx.java +++ b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/CompanyCtx.java @@ -120,7 +120,8 @@ public class CompanyCtx extends AbstractYongYouU8Ctx { return null; } } - Company com = companyService.createNewCompany(name); + Company com = companyService.createNewEntity(); + com.setName(name); com.setShortName(abbName); return companyService.save(com); } diff --git a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/ContractCtx.java b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/ContractCtx.java index a19d475..801dd9f 100644 --- a/server/src/main/java/com/ecep/contract/cloud/u8/ctx/ContractCtx.java +++ b/server/src/main/java/com/ecep/contract/cloud/u8/ctx/ContractCtx.java @@ -17,6 +17,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; import java.util.stream.Stream; +import com.ecep.contract.ds.contract.service.*; import com.ecep.contract.util.FileUtils; import org.hibernate.Hibernate; import org.springframework.util.StringUtils; @@ -27,15 +28,10 @@ import com.ecep.contract.MessageHolder; import com.ecep.contract.MyDateTimeUtils; import com.ecep.contract.constant.CloudServiceConstant; import com.ecep.contract.ds.company.CompanyFileUtils; -import com.ecep.contract.ds.contract.service.ContractFileService; -import com.ecep.contract.ds.contract.service.ContractFileTypeService; -import com.ecep.contract.ds.contract.service.ContractItemService; -import com.ecep.contract.ds.contract.service.ContractPayPlanService; -import com.ecep.contract.ds.contract.service.ContractService; import com.ecep.contract.ds.customer.service.CompanyCustomerEntityService; import com.ecep.contract.ds.customer.service.CompanyCustomerService; import com.ecep.contract.ds.project.ProjectCtx; -import com.ecep.contract.ds.project.service.SaleTypeService; +import com.ecep.contract.ds.project.service.ProjectSaleTypeService; import com.ecep.contract.ds.vendor.service.CompanyVendorEntityService; import com.ecep.contract.ds.vendor.service.CompanyVendorService; import com.ecep.contract.model.Company; @@ -98,8 +94,8 @@ public class ContractCtx extends AbstractYongYouU8Ctx { return getCachedBean(ContractFileService.class); } - public SaleTypeService getSaleTypeService() { - return getCachedBean(SaleTypeService.class); + public ProjectSaleTypeService getSaleTypeService() { + return getCachedBean(ProjectSaleTypeService.class); } VendorCtx getVendorCtx() { @@ -301,7 +297,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { if (contract.getType() != null && contract.getPayWay() != null) { ContractType type = contract.getType(); if (!Hibernate.isInitialized(type)) { - type = getContractService().findTypeById(type.getId()); + type = getCachedBean(ContractTypeService.class).findById(type.getId()); contract.setType(type); } if (!type.getDirection().equals(contract.getPayWay().getText())) { @@ -312,12 +308,12 @@ public class ContractCtx extends AbstractYongYouU8Ctx { if (contract.getKind() != null && contract.getType() != null) { ContractKind kind = contract.getKind(); if (!Hibernate.isInitialized(kind)) { - kind = getContractService().findKindById(kind.getId()); + kind = getCachedBean(ContractKindService.class).findById(kind.getId()); contract.setKind(kind); } ContractType type = contract.getType(); if (!Hibernate.isInitialized(type)) { - type = getContractService().findTypeById(type.getId()); + type = getCachedBean(ContractTypeService.class).findById(type.getId()); contract.setType(type); } if (!kind.getName().equals(type.getTitle())) { @@ -412,7 +408,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { } private CompanyVendorEntity updateVendorEntityDetailByCode(CompanyVendorEntity entity, String unitCode, - MessageHolder holder) { + MessageHolder holder) { if (vendorEntityUpdateDelayDays > 0) { LocalDateTime today = LocalDateTime.now(); if (entity.getFetchedTime() != null) { @@ -431,7 +427,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { } private CompanyCustomerEntity updateCustomerEntityDetailByCode(CompanyCustomerEntity entity, String unitCode, - MessageHolder holder) { + MessageHolder holder) { if (customerEntityUpdateDelayDays > 0) { LocalDateTime today = LocalDateTime.now(); if (entity.getFetchedTime() != null) { @@ -529,7 +525,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { } private boolean updateTypeByCode(Contract contract, String typeCode, MessageHolder holder) { - ContractType type = getContractService().findTypeByCode(typeCode); + ContractType type = getCachedBean(ContractTypeService.class).findByCode(typeCode); if (!Objects.equals(contract.getType(), type)) { contract.setType(type); holder.info("合同类型修改为: " + type.getName()); @@ -539,7 +535,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { } private boolean updateGroupByCode(Contract contract, String groupCode, MessageHolder holder) { - ContractGroup group = getContractService().findGroupByCode(groupCode); + ContractGroup group = getCachedBean(ContractGroupService.class).findByCode(groupCode); if (!Objects.equals(contract.getGroup(), group)) { contract.setGroup(group); holder.info("合同分组修改为: " + group.getName()); @@ -549,7 +545,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { } private boolean updateKindByCode(Contract contract, String kindName, MessageHolder holder) { - ContractKind kind = getContractService().findKindByName(kindName); + ContractKind kind = getCachedBean(ContractKindService.class).findByName(kindName); if (!Objects.equals(contract.getKind(), kind)) { contract.setKind(kind); holder.info("合同分类修改为: " + kind.getName()); @@ -605,7 +601,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { * 客户数据要通过 CompanyCustomerEntity 表关联来从用友数据库中读取 */ public boolean syncByCustomerEntity(CompanyCustomer companyCustomer, CompanyCustomerEntity entity, - MessageHolder holder) { + MessageHolder holder) { String code = entity.getCode(); holder.debug("同步客户相关项 " + code + "," + entity.getName() + " 的合同"); if (!StringUtils.hasText(code)) { @@ -645,7 +641,7 @@ public class ContractCtx extends AbstractYongYouU8Ctx { if (contract == null) { holder.debug("根据合同号未查找到合同, 合同号: " + contractId); - contract = service.createNew(); + contract = service.createNewEntity(); contract.setGuid(guid); contract.setCode(contractId); contract = service.save(contract); diff --git a/server/src/main/java/com/ecep/contract/config/WebSocketConfig.java b/server/src/main/java/com/ecep/contract/config/WebSocketConfig.java index 7eb4b14..70166e2 100644 --- a/server/src/main/java/com/ecep/contract/config/WebSocketConfig.java +++ b/server/src/main/java/com/ecep/contract/config/WebSocketConfig.java @@ -9,7 +9,7 @@ import org.springframework.web.socket.config.annotation.WebSocketConfigurer; import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor; -import com.ecep.contract.handler.WebSocketHandler; +import com.ecep.contract.handler.WebSocketServerHandler; /** * WebSocket配置类 @@ -19,10 +19,10 @@ import com.ecep.contract.handler.WebSocketHandler; @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { - private final WebSocketHandler webSocketHandler; + private final WebSocketServerHandler webSocketHandler; @Autowired - public WebSocketConfig(WebSocketHandler webSocketHandler) { + public WebSocketConfig(WebSocketServerHandler webSocketHandler) { this.webSocketHandler = webSocketHandler; } diff --git a/server/src/main/java/com/ecep/contract/ds/company/repository/CompanyRepository.java b/server/src/main/java/com/ecep/contract/ds/company/repository/CompanyRepository.java index 20f1063..bfc9c95 100644 --- a/server/src/main/java/com/ecep/contract/ds/company/repository/CompanyRepository.java +++ b/server/src/main/java/com/ecep/contract/ds/company/repository/CompanyRepository.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Optional; import java.util.stream.Stream; +import com.ecep.contract.ds.MyRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; @@ -14,11 +15,7 @@ import org.springframework.stereotype.Repository; import com.ecep.contract.model.Company; @Repository -public interface CompanyRepository extends - // JDBC interfaces - CrudRepository, PagingAndSortingRepository, - // JPA interfaces - JpaRepository, JpaSpecificationExecutor { +public interface CompanyRepository extends MyRepository { List findAllByName(String name); diff --git a/server/src/main/java/com/ecep/contract/ds/company/service/CompanyFileService.java b/server/src/main/java/com/ecep/contract/ds/company/service/CompanyFileService.java index ec80a9f..a94f7e9 100644 --- a/server/src/main/java/com/ecep/contract/ds/company/service/CompanyFileService.java +++ b/server/src/main/java/com/ecep/contract/ds/company/service/CompanyFileService.java @@ -11,13 +11,17 @@ import java.util.function.Consumer; import java.util.regex.Matcher; import java.util.regex.Pattern; +import com.ecep.contract.*; import com.ecep.contract.constant.CompanyConstant; +import com.ecep.contract.ds.MyRepository; import com.ecep.contract.util.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; import org.springframework.context.annotation.Lazy; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -26,11 +30,6 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; -import com.ecep.contract.CompanyFileType; -import com.ecep.contract.IEntityService; -import com.ecep.contract.MyDateTimeUtils; -import com.ecep.contract.QueryService; -import com.ecep.contract.SpringApp; import com.ecep.contract.constant.CloudServiceConstant; import com.ecep.contract.ds.company.repository.CompanyFileRepository; import com.ecep.contract.ds.company.repository.CompanyFileTypeLocalRepository; @@ -50,7 +49,7 @@ import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "company-file") -public class CompanyFileService implements IEntityService, QueryService { +public class CompanyFileService extends EntityService implements IEntityService, QueryService { private static final Logger logger = LoggerFactory.getLogger(CompanyFileService.class); @Lazy @Autowired @@ -62,53 +61,47 @@ public class CompanyFileService implements IEntityService, QuerySer @Autowired private CompanyFileTypeLocalRepository fileTypeLocalRepository; + @Override + protected CompanyFileRepository getRepository() { + return companyFileRepository; + } + + @Override + public CompanyFile createNewEntity() { + return new CompanyFile(); + } + @Cacheable(key = "#p0") public CompanyFile findById(Integer id) { return companyFileRepository.findById(id).orElse(null); } - @Override - public Page findAll(Specification spec, Pageable pageable) { - return companyFileRepository.findAll(spec, pageable); - } public List findFileByCompanyAndType(Company company, CompanyFileType type) { return companyFileRepository.findByCompanyAndType(company, type); } + @Override - public Specification getSpecification(String searchText) { - if (!StringUtils.hasText(searchText)) { - return null; - } + protected Specification buildSearchSpecification(String searchText) { return (root, query, builder) -> { return builder.or(builder.like(root.get("filePath"), "%" + searchText + "%")); }; } - @Cacheable(key = "'type-locals-'+#p0") - public Map findAllFileTypes(String lang) { - return fileTypeLocalRepository.getCompleteMapByLocal(lang); - } - // public List findAllFileTypes(String lang) { - // Map map = - // fileTypeLocalRepository.getCompleteMapByLocal(lang); - // public List list = new ArrayList<>(map.values()); - // list.sort((o1, o2) -> Objects.compare(o1.getValue(), o2.getValue(), - // String::compareTo)); - // return list; - // } - @Override - public Page findAll(JsonNode paramsNode, Pageable pageable) { + protected Specification buildParameterSpecification(JsonNode paramsNode) { Specification spec = null; - if (paramsNode.has("searchText")) { - spec = getSpecification(paramsNode.get("searchText").asText()); + if (paramsNode.has("type")) { + CompanyFileType type = CompanyFileType.valueOf(paramsNode.get("type").asText()); + spec = SpecificationUtils.and(spec, (root, query, builder) -> { + return builder.equal(root.get("type"), type); + }); } // field spec = SpecificationUtils.andParam(spec, paramsNode, "company"); spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "filePath"); - return findAll(spec, pageable); + return spec; } /** @@ -215,18 +208,23 @@ public class CompanyFileService implements IEntityService, QuerySer * @param companyFile 企业文件 * @return 保存后的企业文件 */ + @Caching(evict = { + @CacheEvict(key = "#p0.id") + }) public CompanyFile save(CompanyFile companyFile) { return companyFileRepository.save(companyFile); } - public List findAll(Specification spec, Sort sort) { - return companyFileRepository.findAll(spec, sort); - } - + @Caching(evict = { + @CacheEvict(key = "#p0") + }) public void deleteById(int id) { companyFileRepository.deleteById(id); } + @Caching(evict = { + @CacheEvict(key = "#p0.id") + }) public void delete(CompanyFile file) { companyFileRepository.delete(file); } diff --git a/server/src/main/java/com/ecep/contract/ds/company/service/CompanyService.java b/server/src/main/java/com/ecep/contract/ds/company/service/CompanyService.java index c68a8fa..1112d8c 100644 --- a/server/src/main/java/com/ecep/contract/ds/company/service/CompanyService.java +++ b/server/src/main/java/com/ecep/contract/ds/company/service/CompanyService.java @@ -1,43 +1,13 @@ package com.ecep.contract.ds.company.service; -import java.io.File; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.concurrent.CompletableFuture; -import java.util.function.Consumer; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import com.ecep.contract.constant.CompanyConstant; -import com.ecep.contract.util.FileUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cache.annotation.CacheConfig; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.cache.annotation.Caching; -import org.springframework.context.annotation.Lazy; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.domain.Specification; -import org.springframework.lang.Nullable; -import org.springframework.stereotype.Service; -import org.springframework.util.StringUtils; - +import com.ecep.contract.EntityService; import com.ecep.contract.IEntityService; import com.ecep.contract.MyDateTimeUtils; import com.ecep.contract.QueryService; import com.ecep.contract.cloud.rk.CloudRkService; import com.ecep.contract.cloud.tyc.CloudTycService; import com.ecep.contract.cloud.u8.YongYouU8Service; -import com.ecep.contract.constant.CompanyCustomerConstant; -import com.ecep.contract.constant.CompanyVendorConstant; +import com.ecep.contract.constant.CompanyConstant; import com.ecep.contract.ds.company.repository.CompanyRepository; import com.ecep.contract.ds.contract.service.ContractService; import com.ecep.contract.ds.customer.service.CompanyCustomerService; @@ -47,15 +17,31 @@ import com.ecep.contract.model.Company; import com.ecep.contract.model.CompanyCustomer; import com.ecep.contract.model.CompanyOldName; import com.ecep.contract.model.CompanyVendor; +import com.ecep.contract.util.FileUtils; import com.ecep.contract.util.MyStringUtils; import com.ecep.contract.util.SpecificationUtils; import com.fasterxml.jackson.databind.JsonNode; - import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Path; import jakarta.persistence.criteria.Predicate; -import jakarta.transaction.Transactional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.io.File; +import java.time.LocalDate; +import java.util.*; +import java.util.function.Consumer; +import java.util.stream.Collectors; /** * 公司服务 @@ -63,7 +49,7 @@ import jakarta.transaction.Transactional; @Lazy @Service @CacheConfig(cacheNames = "company") -public class CompanyService implements IEntityService, QueryService { +public class CompanyService extends EntityService implements IEntityService, QueryService { private static final Logger logger = LoggerFactory.getLogger(CompanyService.class); @Lazy @@ -74,9 +60,6 @@ public class CompanyService implements IEntityService, QueryService, QueryService, QueryService findAll(Specification spec, Pageable pageable) { - return companyRepository.findAll(spec, pageable); - } @Override - public Page findAll(JsonNode paramsNode, Pageable pageable) { - Specification spec = null; - if (paramsNode.has("searchText")) { - spec = getSpecification(paramsNode.get("searchText").asText()); - } - return findAll(spec, pageable); + protected Specification buildParameterSpecification(JsonNode paramsNode) { + return null; } /** @@ -342,16 +331,6 @@ public class CompanyService implements IEntityService, QueryService asyncSave(Company company) { - return CompletableFuture.completedFuture(companyRepository.save(company)); - } - /** * 保存实体对象 * @@ -366,28 +345,6 @@ public class CompanyService implements IEntityService, QueryService spec) { - return companyRepository.count(spec); - } - - @Transactional - public void findAllWithStream(Consumer> consumer) { - try (Stream stream = companyRepository.findAllAsStream()) { - consumer.accept(stream); - } - } - - public File getVendorBasePath() { - return new File(confService.getString(CompanyVendorConstant.KEY_BASE_PATH)); - } - - public File getCustomerBasePath() { - return new File(confService.getString(CompanyCustomerConstant.KEY_BASE_PATH)); - } public File getBasePath() { return new File(confService.getString(CompanyConstant.COMPANY_BASE_PATH)); @@ -483,6 +440,7 @@ public class CompanyService implements IEntityService, QueryService getSpecification(String searchText) { if (!StringUtils.hasText(searchText)) { @@ -536,8 +494,8 @@ public class CompanyService implements IEntityService, QueryService buildSearchPredicate(searchText, root, query, builder); } - public Predicate buildSearchPredicate(String searchText, Path root, @Nullable CriteriaQuery query, - CriteriaBuilder builder) { + public Predicate buildSearchPredicate(String searchText, Path root, CriteriaQuery query, + CriteriaBuilder builder) { return builder.or( builder.like(root.get("name"), "%" + searchText + "%"), builder.like(root.get("shortName"), "%" + searchText + "%"), @@ -548,25 +506,6 @@ public class CompanyService implements IEntityService, QueryService search(String searchText) { - Specification spec = getSpecification(searchText); - return companyRepository.findAll(spec, Pageable.ofSize(10)).getContent(); - } - - public Company createNewCompany(String name) { - Company company = new Company(); - company.setName(name); - company.setCreated(LocalDate.now()); - return company; - } - public List getAllNames(Company company) { List list = new ArrayList<>(); list.add(company.getName()); diff --git a/server/src/main/java/com/ecep/contract/ds/company/tasker/CompanyVerifyTasker.java b/server/src/main/java/com/ecep/contract/ds/company/tasker/CompanyVerifyTasker.java index 4459506..80bf0f9 100644 --- a/server/src/main/java/com/ecep/contract/ds/company/tasker/CompanyVerifyTasker.java +++ b/server/src/main/java/com/ecep/contract/ds/company/tasker/CompanyVerifyTasker.java @@ -11,6 +11,7 @@ import com.ecep.contract.ds.company.service.CompanyService; import com.ecep.contract.ds.contract.tasker.ContractVerifyComm; import com.ecep.contract.model.Company; import com.ecep.contract.model.Contract; +import com.ecep.contract.ui.MessageHolderImpl; import com.ecep.contract.ui.Tasker; import lombok.Getter; @@ -39,7 +40,7 @@ public class CompanyVerifyTasker extends Tasker { comm.setVerifyCompanyPath(false); comm.setVerifyCompanyStatus(false); comm.setVerifyCompanyCredit(false); - return execute(new MessageHolderImpl() { + return execute(new MessageHolderImpl(this) { @Override public void addMessage(Level level, String message) { super.addMessage(level, message); diff --git a/server/src/main/java/com/ecep/contract/ds/contract/repository/ContractRepository.java b/server/src/main/java/com/ecep/contract/ds/contract/repository/ContractRepository.java index 67bf3bd..95ed5da 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/repository/ContractRepository.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/repository/ContractRepository.java @@ -12,6 +12,12 @@ import com.ecep.contract.model.Contract; @Repository public interface ContractRepository extends MyRepository { + /** + * 根据GUID查找合同的方法 + * + * @param guid 合同的唯一标识符 + * @return 返回一个Optional对象,可能包含找到的合同,也可能为空 + */ Optional findByGuid(String guid); Optional findByProjectIdAndPayWay(int projectId, ContractPayWay payWay); diff --git a/server/src/main/java/com/ecep/contract/ds/contract/repository/SalesBillVoucherRepository.java b/server/src/main/java/com/ecep/contract/ds/contract/repository/SalesBillVoucherRepository.java index cf56707..a222a17 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/repository/SalesBillVoucherRepository.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/repository/SalesBillVoucherRepository.java @@ -2,6 +2,7 @@ package com.ecep.contract.ds.contract.repository; import java.util.Optional; +import com.ecep.contract.ds.MyRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.repository.CrudRepository; @@ -11,11 +12,7 @@ import org.springframework.stereotype.Repository; import com.ecep.contract.model.SalesBillVoucher; @Repository -public interface SalesBillVoucherRepository extends - // JDBC interfaces - CrudRepository, PagingAndSortingRepository, - // JPA interfaces - JpaRepository, JpaSpecificationExecutor { +public interface SalesBillVoucherRepository extends MyRepository { Optional findByCode(String code); diff --git a/server/src/main/java/com/ecep/contract/ds/contract/repository/SalesOrderItemRepository.java b/server/src/main/java/com/ecep/contract/ds/contract/repository/SalesOrderItemRepository.java index c79f456..457c5e1 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/repository/SalesOrderItemRepository.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/repository/SalesOrderItemRepository.java @@ -3,6 +3,7 @@ package com.ecep.contract.ds.contract.repository; import java.util.List; import java.util.Optional; +import com.ecep.contract.ds.MyRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.repository.CrudRepository; @@ -13,11 +14,7 @@ import com.ecep.contract.model.SalesOrder; import com.ecep.contract.model.SalesOrderItem; @Repository -public interface SalesOrderItemRepository extends - // JDBC interfaces - CrudRepository, PagingAndSortingRepository, - // JPA interfaces - JpaRepository, JpaSpecificationExecutor { +public interface SalesOrderItemRepository extends MyRepository { Optional findByCode(String code); diff --git a/server/src/main/java/com/ecep/contract/ds/contract/repository/SalesOrderRepository.java b/server/src/main/java/com/ecep/contract/ds/contract/repository/SalesOrderRepository.java index d4d5410..c82bf0c 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/repository/SalesOrderRepository.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/repository/SalesOrderRepository.java @@ -3,6 +3,7 @@ package com.ecep.contract.ds.contract.repository; import java.util.List; import java.util.Optional; +import com.ecep.contract.ds.MyRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.repository.CrudRepository; @@ -13,11 +14,7 @@ import com.ecep.contract.model.Contract; import com.ecep.contract.model.SalesOrder; @Repository -public interface SalesOrderRepository extends - // JDBC interfaces - CrudRepository, PagingAndSortingRepository, - // JPA interfaces - JpaRepository, JpaSpecificationExecutor { +public interface SalesOrderRepository extends MyRepository { Optional findByCode(String code); diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractBidVendorService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractBidVendorService.java index 5ab93c7..eed5f30 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractBidVendorService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractBidVendorService.java @@ -101,7 +101,7 @@ public class ContractBidVendorService implements IEntityService, QueryService { +public class ContractService extends EntityService implements IEntityService, QueryService { private static final Logger logger = LoggerFactory.getLogger(ContractService.class); @Lazy @Autowired private ContractCatalogService contractCatalogService; @Lazy @Autowired - private ContractTypeService contractTypeService; - @Lazy - @Autowired - private ContractGroupService contractGroupService; - @Lazy - @Autowired - private ContractKindService contractKindService; - @Lazy - @Autowired - private ContractFileService contractFileService; - @Lazy - @Autowired protected ContractRepository contractRepository; @Lazy @Autowired protected SysConfService confService; + @Override + protected ContractRepository getRepository() { + return contractRepository; + } + @Cacheable(key = "#p0") public Contract findById(Integer id) { - return contractRepository.findById(id).orElse(null); + return getRepository().findById(id).orElse(null); } public Contract findByName(String name) { @@ -113,43 +107,6 @@ public class ContractService implements IEntityService, QueryService spec) { - return contractRepository.count(spec); - } - - public Page findAll(Specification spec, Pageable pageable) { - return contractRepository.findAll(spec, pageable); - } - - public List findAll(Specification spec, Sort sort) { - return contractRepository.findAll(spec, sort); - } - - @Override - public Page findAll(JsonNode paramsNode, Pageable pageable) { - Specification spec = null; - if (paramsNode.has("searchText")) { - spec = getSpecification(paramsNode.get("searchText").asText()); - } - // field - if (paramsNode.has("payWay")) { - ContractPayWay payWay = ContractPayWay.valueOf(paramsNode.get("payWay").asText()); - spec = SpecificationUtils.and(spec, (root, query, cb) -> { - return cb.equal(root.get("payWay"), payWay); - }); - } - spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "parentCode"); - - // relation - spec = SpecificationUtils.andParam(spec, paramsNode, "group", "kind", "type", "group", "company", "project"); - - return findAll(spec, pageable); - } - public List findAllByCompany(Company company) { return contractRepository.findAllByCompanyId(company.getId()); } @@ -170,33 +127,6 @@ public class ContractService implements IEntityService, QueryService findAllGroups() { - return contractGroupService.findAll(); - } - - public ContractType findTypeById(Integer id) { - return contractTypeService.findById(id); - } - - public ContractType findTypeByCode(String typeCode) { - return contractTypeService.findByCode(typeCode); - } - - public ContractKind findKindById(Integer id) { - return contractKindService.findById(id); - } - - public ContractKind findKindByName(String kindName) { - return contractKindService.findByName(kindName); - } /** * 返回合同的分类目录 @@ -270,18 +200,28 @@ public class ContractService implements IEntityService, QueryService getSpecification(String searchText) { - if (!StringUtils.hasText(searchText)) { - return null; + protected Specification buildParameterSpecification(JsonNode paramsNode) { + Specification spec = null; + // field + if (paramsNode.has("payWay")) { + ContractPayWay payWay = ContractPayWay.valueOf(paramsNode.get("payWay").asText()); + spec = SpecificationUtils.and(spec, (root, query, cb) -> { + return cb.equal(root.get("payWay"), payWay); + }); } - return SpecificationUtils.andWith(searchText, this::buildSearchSpecification); + spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "parentCode"); + spec = SpecificationUtils.andFieldBetweenParam(spec, paramsNode, "setupDate", LocalDate.class); + + // relation + spec = SpecificationUtils.andParam(spec, paramsNode, "group", "kind", "type", "group", "company", "project"); + return spec; } /** @@ -424,10 +364,6 @@ public class ContractService implements IEntityService, QueryService search(String searchText) { - Specification spec = getSpecification(searchText); - return contractRepository.findAll(spec, Pageable.ofSize(10)).getContent(); - } public List findByCodeStartsWith(ContractPayWay payWay, String parentCode) { return contractRepository.findByPayWayAndCodeStartsWith(payWay, parentCode); diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/SaleOrdersService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/SaleOrdersService.java index 6edfee1..2bfa8f4 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/SaleOrdersService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/SaleOrdersService.java @@ -1,7 +1,15 @@ package com.ecep.contract.ds.contract.service; -import java.util.List; - +import com.ecep.contract.EntityService; +import com.ecep.contract.IEntityService; +import com.ecep.contract.QueryService; +import com.ecep.contract.ds.MyRepository; +import com.ecep.contract.ds.contract.repository.SalesOrderRepository; +import com.ecep.contract.model.Contract; +import com.ecep.contract.model.PurchaseOrder; +import com.ecep.contract.model.SalesOrder; +import com.ecep.contract.util.SpecificationUtils; +import com.fasterxml.jackson.databind.JsonNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -17,10 +25,7 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; -import com.ecep.contract.IEntityService; -import com.ecep.contract.ds.contract.repository.SalesOrderRepository; -import com.ecep.contract.model.Contract; -import com.ecep.contract.model.SalesOrder; +import java.util.List; /** * 合同服务 @@ -28,23 +33,39 @@ import com.ecep.contract.model.SalesOrder; @Lazy @Service @CacheConfig(cacheNames = "contract-sale-order") -public class SaleOrdersService implements IEntityService { +public class SaleOrdersService extends EntityService implements IEntityService, QueryService { private static final Logger logger = LoggerFactory.getLogger(SaleOrdersService.class); @Lazy @Autowired private SalesOrderRepository salesOrderRepository; + @Override + protected SalesOrderRepository getRepository() { + return salesOrderRepository; + } + + @Override + public SalesOrder createNewEntity() { + return new SalesOrder(); + } + @Cacheable(key = "#p0") public SalesOrder findById(Integer id) { return salesOrderRepository.findById(id).orElse(null); } + @Override - public Specification getSpecification(String searchText) { - if (!StringUtils.hasText(searchText)) { - return null; - } + protected Specification buildParameterSpecification(JsonNode paramsNode) { + Specification spec = null; + spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "code"); + spec = SpecificationUtils.andParam(spec, paramsNode, "contract", "employee", "maker", "verifier"); + return spec; + } + + @Override + protected Specification buildSearchSpecification(String searchText) { return (root, query, builder) -> { return builder.or( builder.like(root.get("name"), "%" + searchText + "%"), @@ -79,27 +100,8 @@ public class SaleOrdersService implements IEntityService { salesOrderRepository.delete(order); } - public long count() { - return salesOrderRepository.count(); - } - - public long count(Specification spec) { - return salesOrderRepository.count(spec); - } - - public Page findAll(Specification spec, Pageable pageable) { - return salesOrderRepository.findAll(spec, pageable); - } - - public List findAll(Specification spec, Sort sort) { - return salesOrderRepository.findAll(spec, sort); - } public List findAllByContract(Contract contract) { return salesOrderRepository.findAllByContract(contract); } - - public List search(String searchText) { - return salesOrderRepository.findAll(getSpecification(searchText), Pageable.ofSize(10)).getContent(); - } } diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/SalesBillVoucherService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/SalesBillVoucherService.java index 9f8f347..3a00ccd 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/SalesBillVoucherService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/SalesBillVoucherService.java @@ -2,6 +2,12 @@ package com.ecep.contract.ds.contract.service; import java.util.List; +import com.ecep.contract.EntityService; +import com.ecep.contract.QueryService; +import com.ecep.contract.ds.MyRepository; +import com.ecep.contract.model.SalesOrder; +import com.ecep.contract.util.SpecificationUtils; +import com.fasterxml.jackson.databind.JsonNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -29,7 +35,7 @@ import com.ecep.contract.model.SalesBillVoucherItem; @Lazy @Service @CacheConfig(cacheNames = "sales-bill-voucher") -public class SalesBillVoucherService implements IEntityService { +public class SalesBillVoucherService extends EntityService implements IEntityService, QueryService { private static final Logger logger = LoggerFactory.getLogger(SalesBillVoucherService.class); @Lazy @@ -39,6 +45,15 @@ public class SalesBillVoucherService implements IEntityService @Autowired private SalesBillVoucherItemRepository salesBillVoucherItemRepository; + @Override + protected SalesBillVoucherRepository getRepository() { + return salesBillVoucherRepository; + } + + @Override + public SalesBillVoucher createNewEntity() { + return new SalesBillVoucher(); + } @Cacheable(key = "#p0") public SalesBillVoucher findById(Integer id) { @@ -46,11 +61,7 @@ public class SalesBillVoucherService implements IEntityService } @Override - public Specification getSpecification(String searchText) { - if (!StringUtils.hasText(searchText)) { - return null; - } - + protected Specification buildSearchSpecification(String searchText) { return (root, query, builder) -> { return builder.or( builder.like(root.get("name"), "%" + searchText + "%"), @@ -90,33 +101,15 @@ public class SalesBillVoucherService implements IEntityService salesBillVoucherRepository.delete(order); } - public long count() { - return salesBillVoucherRepository.count(); - } - public long count(Specification spec) { - return salesBillVoucherRepository.count(spec); + @Override + protected Specification buildParameterSpecification(JsonNode paramsNode) { + Specification spec = null; + spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "refId"); + spec = SpecificationUtils.andParam(spec, paramsNode, "company", "order", "employee", "maker", "verifier"); + return spec; } - public Page findAll(Specification spec, Pageable pageable) { - return salesBillVoucherRepository.findAll(spec, pageable); - } - - public List findAll(Specification spec, Sort sort) { - return salesBillVoucherRepository.findAll(spec, sort); - } - - public List search(String searchText) { - Specification spec = (root, query, builder) -> { - return builder.or( - builder.like(root.get("name"), "%" + searchText + "%"), - builder.like(root.get("code"), "%" + searchText + "%") - ); - }; - return salesBillVoucherRepository.findAll(spec, Pageable.ofSize(10)).getContent(); - } - - @Cacheable(key = "'item-'+#p0") public SalesBillVoucherItem findItemById(Integer id) { return salesBillVoucherItemRepository.findById(id).orElse(null); diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/SalesOrderItemService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/SalesOrderItemService.java index 37a2d43..5cfcffa 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/SalesOrderItemService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/SalesOrderItemService.java @@ -2,6 +2,11 @@ package com.ecep.contract.ds.contract.service; import java.util.List; +import com.ecep.contract.EntityService; +import com.ecep.contract.QueryService; +import com.ecep.contract.model.SalesOrder; +import com.ecep.contract.util.SpecificationUtils; +import com.fasterxml.jackson.databind.JsonNode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; @@ -21,19 +26,30 @@ import com.ecep.contract.model.SalesOrderItem; @Lazy @Service @CacheConfig(cacheNames = "contract-sale-order-item") -public class SalesOrderItemService implements IEntityService { +public class SalesOrderItemService extends EntityService implements IEntityService, QueryService { @Lazy @Autowired private SalesOrderItemRepository repository; + @Override + public SalesOrderItemRepository getRepository() { + return repository; + } + + @Override + public SalesOrderItem createNewEntity() { + return new SalesOrderItem(); + } + @Cacheable(key = "#p0") @Override public SalesOrderItem findById(Integer id) { return repository.findById(id).orElse(null); } + @Override - public Specification getSpecification(String searchText) { + protected Specification buildSearchSpecification(String searchText) { return (root, query, builder) -> { return builder.or( builder.like(root.get("code"), "%" + searchText + "%"), @@ -44,8 +60,11 @@ public class SalesOrderItemService implements IEntityService { } @Override - public Page findAll(Specification spec, Pageable pageable) { - return repository.findAll(spec, pageable); + protected Specification buildParameterSpecification(JsonNode paramsNode) { + Specification spec = null; + spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "code"); + spec = SpecificationUtils.andParam(spec, paramsNode, "order"); + return spec; } @Caching( @@ -67,8 +86,4 @@ public class SalesOrderItemService implements IEntityService { public SalesOrderItem save(SalesOrderItem entity) { return repository.save(entity); } - - public List findAll(Specification spec, Sort sort) { - return repository.findAll(spec, sort); - } } diff --git a/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractRepairTask.java b/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractRepairTask.java index 7f771aa..1cd62de 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractRepairTask.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractRepairTask.java @@ -1,7 +1,11 @@ package com.ecep.contract.ds.contract.tasker; +import java.util.Locale; import java.util.concurrent.atomic.AtomicReference; +import com.ecep.contract.ds.contract.service.ContractService; +import com.ecep.contract.service.WebSocketServerTasker; +import com.fasterxml.jackson.databind.JsonNode; import org.springframework.util.StringUtils; import com.ecep.contract.ContractPayWay; @@ -14,19 +18,25 @@ import lombok.Setter; /** * 合同修复任务 */ -public class ContractRepairTask extends AbstContractRepairTasker { +public class ContractRepairTask extends AbstContractRepairTasker implements WebSocketServerTasker { @Getter - @Setter private Contract contract; @Getter boolean repaired = false; - + private final ContractRepairComm comm = new ContractRepairComm(); public ContractRepairTask() { } + public void init(JsonNode argsNode) { + int contractId = argsNode.get(1).asInt(); + contract = getCachedBean(ContractService.class).findById(contractId); + String lang = argsNode.get(2).asText(); + setLocale(Locale.forLanguageTag(lang)); + } + @Override protected void repair(MessageHolder holder) { updateTitle("修复合同 " + contract.toPrettyString()); @@ -41,6 +51,7 @@ public class ContractRepairTask extends AbstContractRepairTasker { AtomicReference contractProperty = new AtomicReference<>(contract); if (repair(contractProperty, parent, holder, progress -> updateProgress(progress, 1))) { repaired = true; + updateProperty("repaired", true); } setContract(contractProperty.get()); @@ -48,5 +59,9 @@ public class ContractRepairTask extends AbstContractRepairTasker { updateProgress(1, 1); } + public void setContract(Contract contract) { + this.contract = contract; + updateProperty("contract", contract); + } } diff --git a/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractVerifyComm.java b/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractVerifyComm.java index a7fdcd7..a0be886 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractVerifyComm.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractVerifyComm.java @@ -43,7 +43,7 @@ import com.ecep.contract.ds.project.service.ProjectCostService; import com.ecep.contract.ds.project.service.ProjectQuotationService; import com.ecep.contract.ds.project.service.ProjectSaleTypeRequireFileTypeService; import com.ecep.contract.ds.project.service.ProjectService; -import com.ecep.contract.ds.project.service.SaleTypeService; +import com.ecep.contract.ds.project.service.ProjectSaleTypeService; import com.ecep.contract.ds.vendor.service.CompanyVendorService; import com.ecep.contract.ds.vendor.service.VendorGroupRequireFileTypeService; import com.ecep.contract.ds.vendor.service.VendorGroupService; @@ -74,7 +74,7 @@ public class ContractVerifyComm { // Project private ProjectService projectService; private ProjectSaleTypeRequireFileTypeService saleTypeRequireFileTypeService; - private SaleTypeService saleTypeService; + private ProjectSaleTypeService projectSaleTypeService; private ProjectCostService projectCostService; private ProjectQuotationService projectQuotationService; private ProjectBidService projectBidService; @@ -106,11 +106,11 @@ public class ContractVerifyComm { return projectService; } - private SaleTypeService getSaleTypeService() { - if (saleTypeService == null) { - saleTypeService = SpringApp.getBean(SaleTypeService.class); + private ProjectSaleTypeService getProjectSaleTypeService() { + if (projectSaleTypeService == null) { + projectSaleTypeService = SpringApp.getBean(ProjectSaleTypeService.class); } - return saleTypeService; + return projectSaleTypeService; } ProjectCostService getProjectCostService() { @@ -574,7 +574,7 @@ public class ContractVerifyComm { if (saleType != null) { if (CompanyFileUtils.exists(contract.getPath())) { if (!Hibernate.isInitialized(saleType)) { - saleType = getSaleTypeService().findById(saleType.getId()); + saleType = getProjectSaleTypeService().findById(saleType.getId()); project.setSaleType(saleType); } if (!contract.getPath().startsWith(saleType.getPath())) { @@ -725,7 +725,7 @@ public class ContractVerifyComm { if (saleType == null) { String code = contract.getCode(); if (code != null && code.length() > 5) { - saleType = getSaleTypeService().findByCode(code.substring(0, 1)); + saleType = getProjectSaleTypeService().findByCode(code.substring(0, 1)); } } @@ -865,7 +865,7 @@ public class ContractVerifyComm { } } if (!Hibernate.isInitialized(saleType)) { - saleType = getSaleTypeService().findById(saleType.getId()); + saleType = getProjectSaleTypeService().findById(saleType.getId()); } if (saleType.isCriticalProjectDecision()) { if (contract.getAmount() != null && contract.getAmount() >= saleType.getCriticalProjectLimit()) { diff --git a/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractVerifyTasker.java b/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractVerifyTasker.java index f3b42ab..6b42c14 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractVerifyTasker.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/tasker/ContractVerifyTasker.java @@ -7,12 +7,15 @@ import java.util.logging.Level; import com.ecep.contract.MessageHolder; import com.ecep.contract.ds.contract.service.ContractService; import com.ecep.contract.model.Contract; +import com.ecep.contract.service.WebSocketServerTasker; +import com.ecep.contract.ui.MessageHolderImpl; import com.ecep.contract.ui.Tasker; +import com.fasterxml.jackson.databind.JsonNode; import lombok.Getter; import lombok.Setter; -public class ContractVerifyTasker extends Tasker { +public class ContractVerifyTasker extends Tasker implements WebSocketServerTasker { @Getter @Setter @@ -24,7 +27,7 @@ public class ContractVerifyTasker extends Tasker { @Override public Object call() throws Exception { updateTitle("验证合同 " + contract.getCode() + " 及其子合同是否符合合规要求"); - return execute(new MessageHolderImpl() { + return execute(new MessageHolderImpl(this) { @Override public void addMessage(Level level, String message) { super.addMessage(level, message); @@ -58,4 +61,12 @@ public class ContractVerifyTasker extends Tasker { public void setLocale(Locale locale) { comm.setLocale(locale); } + + @Override + public void init(JsonNode argsNode) { + int contractId = argsNode.get(1).asInt(); + contract = getCachedBean(ContractService.class).findById(contractId); + } + + } diff --git a/server/src/main/java/com/ecep/contract/ds/contract/tasker/CustomerContractCostFormUpdateTask.java b/server/src/main/java/com/ecep/contract/ds/contract/tasker/CustomerContractCostFormUpdateTask.java index bd302a2..5570f2b 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/tasker/CustomerContractCostFormUpdateTask.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/tasker/CustomerContractCostFormUpdateTask.java @@ -29,7 +29,7 @@ import com.ecep.contract.ds.project.service.ProjectCostService; import com.ecep.contract.ds.project.service.ProjectIndustryService; import com.ecep.contract.ds.project.service.ProjectService; import com.ecep.contract.ds.project.service.ProjectTypeService; -import com.ecep.contract.ds.project.service.SaleTypeService; +import com.ecep.contract.ds.project.service.ProjectSaleTypeService; import com.ecep.contract.model.Company; import com.ecep.contract.model.Contract; import com.ecep.contract.model.Employee; @@ -90,7 +90,7 @@ public class CustomerContractCostFormUpdateTask extends Tasker { @Setter private ProjectTypeService projectTypeService; @Setter - private SaleTypeService saleTypeService; + private ProjectSaleTypeService projectSaleTypeService; @Setter private ProjectIndustryService projectIndustryService; @Setter @@ -116,11 +116,11 @@ public class CustomerContractCostFormUpdateTask extends Tasker { return projectTypeService; } - private SaleTypeService getSaleTypeService() { - if (saleTypeService == null) { - saleTypeService = SpringApp.getBean(SaleTypeService.class); + private ProjectSaleTypeService getProjectSaleTypeService() { + if (projectSaleTypeService == null) { + projectSaleTypeService = SpringApp.getBean(ProjectSaleTypeService.class); } - return saleTypeService; + return projectSaleTypeService; } private ProjectIndustryService getProjectIndustryService() { @@ -262,7 +262,7 @@ public class CustomerContractCostFormUpdateTask extends Tasker { saleType = project.getSaleType(); if (saleType != null) { if (!Hibernate.isInitialized(saleType)) { - saleType = getSaleTypeService().findById(saleType.getId()); + saleType = getProjectSaleTypeService().findById(saleType.getId()); project.setSaleType(saleType); } } diff --git a/server/src/main/java/com/ecep/contract/ds/other/service/BankService.java b/server/src/main/java/com/ecep/contract/ds/other/service/BankService.java index 6eeb829..6bad1f2 100644 --- a/server/src/main/java/com/ecep/contract/ds/other/service/BankService.java +++ b/server/src/main/java/com/ecep/contract/ds/other/service/BankService.java @@ -43,6 +43,13 @@ public class BankService implements IEntityService, QueryService { return findAll(spec, pageable); } + + + @Override + public long count(JsonNode paramsNode) { + return bankRepository.count(); + } + @Override public Specification getSpecification(String searchText) { if (!StringUtils.hasText(searchText)) { diff --git a/server/src/main/java/com/ecep/contract/ds/other/service/EmployeeAuthBindService.java b/server/src/main/java/com/ecep/contract/ds/other/service/EmployeeAuthBindService.java index abf2901..3b06ebf 100644 --- a/server/src/main/java/com/ecep/contract/ds/other/service/EmployeeAuthBindService.java +++ b/server/src/main/java/com/ecep/contract/ds/other/service/EmployeeAuthBindService.java @@ -2,6 +2,7 @@ package com.ecep.contract.ds.other.service; import java.util.List; +import com.ecep.contract.util.SpecificationUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.context.annotation.Lazy; @@ -57,6 +58,7 @@ public class EmployeeAuthBindService implements IEntityService spec = getSpecification(paramsNode.get("searchText").asText()); } // 可以根据需要添加更多参数处理 + spec = SpecificationUtils.andParam(spec, paramsNode, "employee"); return findAll(spec, pageable); } diff --git a/server/src/main/java/com/ecep/contract/ds/other/service/EmployeeService.java b/server/src/main/java/com/ecep/contract/ds/other/service/EmployeeService.java index d44a407..1b3e442 100644 --- a/server/src/main/java/com/ecep/contract/ds/other/service/EmployeeService.java +++ b/server/src/main/java/com/ecep/contract/ds/other/service/EmployeeService.java @@ -1,8 +1,13 @@ package com.ecep.contract.ds.other.service; -import java.util.List; -import java.util.Optional; - +import com.ecep.contract.IEntityService; +import com.ecep.contract.QueryService; +import com.ecep.contract.ds.other.repository.EmployeeRepository; +import com.ecep.contract.model.Employee; +import com.ecep.contract.model.EmployeeRole; +import com.ecep.contract.util.SpecificationUtils; +import com.fasterxml.jackson.databind.JsonNode; +import jakarta.transaction.Transactional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -17,14 +22,8 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; -import com.ecep.contract.IEntityService; -import com.ecep.contract.QueryService; -import com.fasterxml.jackson.databind.JsonNode; -import com.ecep.contract.ds.other.repository.EmployeeRepository; -import com.ecep.contract.model.Employee; -import com.ecep.contract.model.EmployeeRole; - -import jakarta.transaction.Transactional; +import java.util.List; +import java.util.Optional; /** * 员工服务类 @@ -119,6 +118,8 @@ public class EmployeeService implements IEntityService, QueryService, QueryService getRolesByEmployeeId(int employeeId) { + public List getRolesByEmployeeId(Integer employeeId) { Optional optional = employeeRepository.findById(employeeId); if (optional.isPresent()) { Employee employee = optional.get(); diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/CustomerSatisfactionSurveyService.java b/server/src/main/java/com/ecep/contract/ds/project/service/CustomerSatisfactionSurveyService.java index abc2c89..95496c7 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/CustomerSatisfactionSurveyService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/CustomerSatisfactionSurveyService.java @@ -2,6 +2,10 @@ package com.ecep.contract.ds.project.service; import java.util.List; +import com.ecep.contract.QueryService; +import com.ecep.contract.model.CompanyBankAccount; +import com.ecep.contract.util.SpecificationUtils; +import com.fasterxml.jackson.databind.JsonNode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.data.domain.Page; @@ -20,7 +24,7 @@ import com.ecep.contract.model.CustomerSatisfactionSurvey; @Lazy @Service public class CustomerSatisfactionSurveyService - implements IEntityService { + implements IEntityService, QueryService { @Lazy @Autowired private CustomerSatisfactionSurveyRepository repository; @@ -86,4 +90,15 @@ public class CustomerSatisfactionSurveyService public List findAll(Specification spec) { return repository.findAll(spec); } + + @Override + public Page findAll(JsonNode paramsNode, Pageable pageable) { + Specification spec = null; + if (paramsNode.has("searchText")) { + spec = getSpecification(paramsNode.get("searchText").asText()); + } + // field + spec = SpecificationUtils.andParam(spec, paramsNode, "project", "applicant"); + return findAll(spec, pageable); + } } diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/DeliverySignMethodService.java b/server/src/main/java/com/ecep/contract/ds/project/service/DeliverySignMethodService.java index f6ceb8e..8cdb67b 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/DeliverySignMethodService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/DeliverySignMethodService.java @@ -2,6 +2,10 @@ package com.ecep.contract.ds.project.service; import java.util.List; +import com.ecep.contract.QueryService; +import com.ecep.contract.model.CompanyBankAccount; +import com.ecep.contract.util.SpecificationUtils; +import com.fasterxml.jackson.databind.JsonNode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; @@ -22,7 +26,7 @@ import com.ecep.contract.model.ProjectSaleType; @Lazy @Service @CacheConfig(cacheNames = "project-sign-method") -public class DeliverySignMethodService implements IEntityService { +public class DeliverySignMethodService implements IEntityService, QueryService { @Lazy @Autowired private ProductDeliverySignMethodRepository deliverySignMethodRepository; @@ -37,6 +41,17 @@ public class DeliverySignMethodService implements IEntityService findAll(JsonNode paramsNode, Pageable pageable) { + Specification spec = null; + if (paramsNode.has("searchText")) { + spec = getSpecification(paramsNode.get("searchText").asText()); + } + // field +// spec = SpecificationUtils.andParam(spec, paramsNode, "company"); + return findAll(spec, pageable); + } + public DeliverySignMethod findBySaleTypeAndName(ProjectSaleType saleType, String name) { return deliverySignMethodRepository.findBySaleTypeAndName(saleType, name).orElse(null); } diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProductTypeService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProductTypeService.java index 6b9ae66..144fe53 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProductTypeService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProductTypeService.java @@ -2,6 +2,10 @@ package com.ecep.contract.ds.project.service; import java.util.List; +import com.ecep.contract.QueryService; +import com.ecep.contract.model.CompanyBankAccount; +import com.ecep.contract.util.SpecificationUtils; +import com.fasterxml.jackson.databind.JsonNode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; @@ -21,7 +25,7 @@ import com.ecep.contract.model.ProductType; @Lazy @Service @CacheConfig(cacheNames = "product-type") -public class ProductTypeService implements IEntityService { +public class ProductTypeService implements IEntityService, QueryService { @Lazy @Autowired private ProductTypeRepository productTypeRepository; @@ -50,6 +54,18 @@ public class ProductTypeService implements IEntityService { return productTypeRepository.findAll(spec, pageable); } + + @Override + public Page findAll(JsonNode paramsNode, Pageable pageable) { + Specification spec = null; + if (paramsNode.has("searchText")) { + spec = getSpecification(paramsNode.get("searchText").asText()); + } + // field +// spec = SpecificationUtils.andParam(spec, paramsNode, "company"); + return findAll(spec, pageable); + } + @Override public Specification getSpecification(String searchText) { if (!StringUtils.hasText(searchText)) { diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProductUsageService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProductUsageService.java index db4644e..42aa899 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProductUsageService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProductUsageService.java @@ -2,6 +2,10 @@ package com.ecep.contract.ds.project.service; import java.util.List; +import com.ecep.contract.QueryService; +import com.ecep.contract.model.CompanyBankAccount; +import com.ecep.contract.util.SpecificationUtils; +import com.fasterxml.jackson.databind.JsonNode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; @@ -21,7 +25,7 @@ import com.ecep.contract.model.ProductUsage; @Lazy @Service @CacheConfig(cacheNames = "product-usage") -public class ProductUsageService implements IEntityService { +public class ProductUsageService implements IEntityService, QueryService { @Lazy @Autowired private ProductUsageRepository productUsageRepository; @@ -36,6 +40,17 @@ public class ProductUsageService implements IEntityService { return productUsageRepository.findAll(spec, pageable); } + @Override + public Page findAll(JsonNode paramsNode, Pageable pageable) { + Specification spec = null; + if (paramsNode.has("searchText")) { + spec = getSpecification(paramsNode.get("searchText").asText()); + } + // field +// spec = SpecificationUtils.andParam(spec, paramsNode, "company"); + return findAll(spec, pageable); + } + @Override public Specification getSpecification(String searchText) { if (!StringUtils.hasText(searchText)) { diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectBidService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectBidService.java index 03f0dd4..45da63e 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectBidService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectBidService.java @@ -3,6 +3,10 @@ package com.ecep.contract.ds.project.service; import java.time.LocalDateTime; import java.util.List; +import com.ecep.contract.QueryService; +import com.ecep.contract.model.CompanyBankAccount; +import com.ecep.contract.util.SpecificationUtils; +import com.fasterxml.jackson.databind.JsonNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -20,7 +24,7 @@ import com.ecep.contract.model.ProjectBid; @Lazy @Service -public class ProjectBidService implements IEntityService { +public class ProjectBidService implements IEntityService, QueryService { private static final Logger logger = LoggerFactory.getLogger(ProjectBidService.class); @Lazy @@ -36,6 +40,17 @@ public class ProjectBidService implements IEntityService { return repository.findAll(spec, pageable); } + @Override + public Page findAll(JsonNode paramsNode, Pageable pageable) { + Specification spec = null; + if (paramsNode.has("searchText")) { + spec = getSpecification(paramsNode.get("searchText").asText()); + } + // field + spec = SpecificationUtils.andParam(spec, paramsNode, "project", "cost", "applicant", "authorizer"); + return findAll(spec, pageable); + } + public List findAllByProject(Project project) { return repository.findAllByProject(project); } diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectCostItemService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectCostItemService.java index 2f53217..3a06c6c 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectCostItemService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectCostItemService.java @@ -2,6 +2,10 @@ package com.ecep.contract.ds.project.service; import java.util.List; +import com.ecep.contract.QueryService; +import com.ecep.contract.model.CompanyBankAccount; +import com.ecep.contract.util.SpecificationUtils; +import com.fasterxml.jackson.databind.JsonNode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.data.domain.Page; @@ -17,7 +21,7 @@ import com.ecep.contract.model.ProjectCostItem; @Lazy @Service -public class ProjectCostItemService implements IEntityService { +public class ProjectCostItemService implements IEntityService, QueryService { @Lazy @Autowired private ProjectCostItemRepository repository; @@ -48,6 +52,17 @@ public class ProjectCostItemService implements IEntityService { return repository.findAll(spec, pageable); } + @Override + public Page findAll(JsonNode paramsNode, Pageable pageable) { + Specification spec = null; + if (paramsNode.has("searchText")) { + spec = getSpecification(paramsNode.get("searchText").asText()); + } + // field + spec = SpecificationUtils.andParam(spec, paramsNode, "cost", "inventory", "creator", "updater"); + return findAll(spec, pageable); + } + @Override public void delete(ProjectCostItem entity) { repository.delete(entity); diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectCostService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectCostService.java index a07c9a1..02eaa9f 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectCostService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectCostService.java @@ -3,6 +3,10 @@ package com.ecep.contract.ds.project.service; import java.util.Comparator; import java.util.List; +import com.ecep.contract.QueryService; +import com.ecep.contract.model.CompanyBankAccount; +import com.ecep.contract.util.SpecificationUtils; +import com.fasterxml.jackson.databind.JsonNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -22,7 +26,7 @@ import com.ecep.contract.model.ProjectCost; @Lazy @Service -public class ProjectCostService implements IEntityService { +public class ProjectCostService implements IEntityService, QueryService { private static final Logger logger = LoggerFactory.getLogger(ProjectCostService.class); @Lazy @@ -39,6 +43,17 @@ public class ProjectCostService implements IEntityService { return repository.findAll(spec, pageable); } + @Override + public Page findAll(JsonNode paramsNode, Pageable pageable) { + Specification spec = null; + if (paramsNode.has("searchText")) { + spec = getSpecification(paramsNode.get("searchText").asText()); + } + // field + spec = SpecificationUtils.andParam(spec, paramsNode, "contract", "project", "applicant", "authorizer"); + return findAll(spec, pageable); + } + public ProjectCost findByContract(Contract contract) { return repository.findByContract(contract).orElse(null); } diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectFileService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectFileService.java index e9b5df5..9bbaeca 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectFileService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectFileService.java @@ -5,6 +5,10 @@ import java.util.List; import java.util.Optional; import java.util.function.Consumer; +import com.ecep.contract.QueryService; +import com.ecep.contract.model.CompanyBankAccount; +import com.ecep.contract.util.SpecificationUtils; +import com.fasterxml.jackson.databind.JsonNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -24,7 +28,7 @@ import com.ecep.contract.model.ProjectFile; @Lazy @Service -public class ProjectFileService implements IEntityService { +public class ProjectFileService implements IEntityService, QueryService { private static final Logger logger = LoggerFactory.getLogger(ProjectFileService.class); @Autowired @@ -39,6 +43,17 @@ public class ProjectFileService implements IEntityService { return projectFileRepository.findAll(spec, pageable); } + @Override + public Page findAll(JsonNode paramsNode, Pageable pageable) { + Specification spec = null; + if (paramsNode.has("searchText")) { + spec = getSpecification(paramsNode.get("searchText").asText()); + } + // field + spec = SpecificationUtils.andParam(spec, paramsNode, "project"); + return findAll(spec, pageable); + } + public List findAllByProject(Project project) { return projectFileRepository.findByProject(project); } diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectFundPlanService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectFundPlanService.java index fa6f835..777e768 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectFundPlanService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectFundPlanService.java @@ -3,6 +3,10 @@ package com.ecep.contract.ds.project.service; import java.time.LocalDateTime; import java.util.List; +import com.ecep.contract.QueryService; +import com.ecep.contract.model.CompanyBankAccount; +import com.ecep.contract.util.SpecificationUtils; +import com.fasterxml.jackson.databind.JsonNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -20,7 +24,7 @@ import com.ecep.contract.model.ProjectFundPlan; @Lazy @Service -public class ProjectFundPlanService implements IEntityService { +public class ProjectFundPlanService implements IEntityService, QueryService { private static final Logger logger = LoggerFactory.getLogger(ProjectFundPlanService.class); @Lazy @@ -36,6 +40,17 @@ public class ProjectFundPlanService implements IEntityService { return repository.findAll(spec, pageable); } + @Override + public Page findAll(JsonNode paramsNode, Pageable pageable) { + Specification spec = null; + if (paramsNode.has("searchText")) { + spec = getSpecification(paramsNode.get("searchText").asText()); + } + // field + spec = SpecificationUtils.andParam(spec, paramsNode, "project", "contractPayPlan"); + return findAll(spec, pageable); + } + public List findAllByProject(Project project) { return repository.findAllByProject(project); } diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectIndustryService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectIndustryService.java index 8a70e9b..b6ff2e8 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectIndustryService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectIndustryService.java @@ -2,6 +2,10 @@ package com.ecep.contract.ds.project.service; import java.util.List; +import com.ecep.contract.QueryService; +import com.ecep.contract.model.CompanyBankAccount; +import com.ecep.contract.util.SpecificationUtils; +import com.fasterxml.jackson.databind.JsonNode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; @@ -21,7 +25,7 @@ import com.ecep.contract.model.ProjectIndustry; @Lazy @Service @CacheConfig(cacheNames = "project-industry") -public class ProjectIndustryService implements IEntityService { +public class ProjectIndustryService implements IEntityService, QueryService { @Lazy @Autowired private ProjectIndustryRepository industryRepository; @@ -50,6 +54,17 @@ public class ProjectIndustryService implements IEntityService { return industryRepository.findAll(spec, pageable); } + @Override + public Page findAll(JsonNode paramsNode, Pageable pageable) { + Specification spec = null; + if (paramsNode.has("searchText")) { + spec = getSpecification(paramsNode.get("searchText").asText()); + } + // field +// spec = SpecificationUtils.andParam(spec, paramsNode, "company"); + return findAll(spec, pageable); + } + @Override public Specification getSpecification(String searchText) { if (!StringUtils.hasText(searchText)) { diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectQuotationService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectQuotationService.java index 4c04663..ee54689 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectQuotationService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectQuotationService.java @@ -3,6 +3,10 @@ package com.ecep.contract.ds.project.service; import java.time.LocalDateTime; import java.util.List; +import com.ecep.contract.QueryService; +import com.ecep.contract.model.CompanyBankAccount; +import com.ecep.contract.util.SpecificationUtils; +import com.fasterxml.jackson.databind.JsonNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -20,7 +24,7 @@ import com.ecep.contract.model.ProjectQuotation; @Lazy @Service -public class ProjectQuotationService implements IEntityService { +public class ProjectQuotationService implements IEntityService, QueryService { private static final Logger logger = LoggerFactory.getLogger(ProjectQuotationService.class); @@ -38,6 +42,17 @@ public class ProjectQuotationService implements IEntityService return repository.findAll(spec, pageable); } + @Override + public Page findAll(JsonNode paramsNode, Pageable pageable) { + Specification spec = null; + if (paramsNode.has("searchText")) { + spec = getSpecification(paramsNode.get("searchText").asText()); + } + // field + spec = SpecificationUtils.andParam(spec, paramsNode, "project", "applicant","authorizer"); + return findAll(spec, pageable); + } + public List findAllByProject(Project project) { return repository.findAllByProject(project); } diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectSaleTypeRequireFileTypeService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectSaleTypeRequireFileTypeService.java index ea94d25..dbcfc2d 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectSaleTypeRequireFileTypeService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectSaleTypeRequireFileTypeService.java @@ -2,6 +2,10 @@ package com.ecep.contract.ds.project.service; import java.util.List; +import com.ecep.contract.QueryService; +import com.ecep.contract.model.CompanyBankAccount; +import com.ecep.contract.util.SpecificationUtils; +import com.fasterxml.jackson.databind.JsonNode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; @@ -20,7 +24,7 @@ import com.ecep.contract.model.ProjectSaleTypeRequireFileType; @Lazy @Service @CacheConfig(cacheNames = "project-sale-type-require-file-type") -public class ProjectSaleTypeRequireFileTypeService implements IEntityService { +public class ProjectSaleTypeRequireFileTypeService implements IEntityService, QueryService { @Lazy @Autowired private ProjectSaleTypeRequireFileTypeRepository repository; @@ -46,6 +50,17 @@ public class ProjectSaleTypeRequireFileTypeService implements IEntityService findAll(JsonNode paramsNode, Pageable pageable) { + Specification spec = null; + if (paramsNode.has("searchText")) { + spec = getSpecification(paramsNode.get("searchText").asText()); + } + // field + spec = SpecificationUtils.andParam(spec, paramsNode, "saleType"); + return findAll(spec, pageable); + } + @Override public Specification getSpecification(String searchText) { return null; diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectSaleTypeService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectSaleTypeService.java index 951a0a6..c91be55 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectSaleTypeService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectSaleTypeService.java @@ -3,7 +3,6 @@ package com.ecep.contract.ds.project.service; import java.util.List; import com.ecep.contract.QueryService; -import com.ecep.contract.model.CompanyBankAccount; import com.ecep.contract.util.SpecificationUtils; import com.fasterxml.jackson.databind.JsonNode; import org.springframework.beans.factory.annotation.Autowired; @@ -24,8 +23,8 @@ import com.ecep.contract.model.ProjectSaleType; @Lazy @Service -@CacheConfig(cacheNames = "sale-type") -public class SaleTypeService implements IEntityService, QueryService { +@CacheConfig(cacheNames = "project-sale-type") +public class ProjectSaleTypeService implements IEntityService, QueryService { @Lazy @Autowired private ProjectSaleTypeRepository saleTypeRepository; diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectService.java index 87da9fc..3f09293 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectService.java @@ -8,6 +8,10 @@ import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; +import com.ecep.contract.QueryService; +import com.ecep.contract.constant.ProjectConstant; +import com.ecep.contract.model.*; +import com.fasterxml.jackson.databind.JsonNode; import org.hibernate.Hibernate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,14 +29,6 @@ import org.springframework.util.StringUtils; import com.ecep.contract.IEntityService; import com.ecep.contract.ds.other.service.SysConfService; import com.ecep.contract.ds.project.repository.ProjectRepository; -import com.ecep.contract.model.Contract; -import com.ecep.contract.model.DeliverySignMethod; -import com.ecep.contract.model.ProductType; -import com.ecep.contract.model.ProductUsage; -import com.ecep.contract.model.Project; -import com.ecep.contract.model.ProjectIndustry; -import com.ecep.contract.model.ProjectSaleType; -import com.ecep.contract.model.ProjectType; import com.ecep.contract.util.SpecificationUtils; /** @@ -41,11 +37,9 @@ import com.ecep.contract.util.SpecificationUtils; @Lazy @Service @CacheConfig(cacheNames = "project") -public class ProjectService implements IEntityService { +public class ProjectService implements IEntityService, QueryService { private static final Logger logger = LoggerFactory.getLogger(ProjectService.class); - public static final String KEY_BASE_PATH = "project.base.path"; - @Lazy @Autowired private ProjectRepository projectRepository; @@ -66,7 +60,7 @@ public class ProjectService implements IEntityService { private ProjectIndustryService projectIndustryService; @Lazy @Autowired - private SaleTypeService saleTypeService; + private ProjectSaleTypeService projectSaleTypeService; @Lazy @Autowired private ProjectTypeService projectTypeService; @@ -90,7 +84,7 @@ public class ProjectService implements IEntityService { } public File getBasePath() { - return new File(confService.getString(KEY_BASE_PATH)); + return new File(confService.getString(ProjectConstant.KEY_BASE_PATH)); } public boolean makePathAbsent(Project project) { @@ -130,6 +124,23 @@ public class ProjectService implements IEntityService { return projectRepository.findAll(spec, pageable); } + @Override + public Page findAll(JsonNode paramsNode, Pageable pageable) { + Specification spec = null; + if (paramsNode.has("searchText")) { + spec = getSpecification(paramsNode.get("searchText").asText()); + } + // field + spec = SpecificationUtils.andParam(spec, paramsNode, "customer","industry","saleType", "projectType", "productType","deliverySignMethod", "productUsage"); + spec = SpecificationUtils.andParam(spec, paramsNode, "applicant","authorizer"); + + // + spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "code"); + + + return findAll(spec, pageable); + } + @CacheEvict(key = "#p0.id") public void delete(Project project) { projectRepository.delete(project); @@ -186,7 +197,7 @@ public class ProjectService implements IEntityService { if (code.length() >= 6) { try { - ProjectSaleType saleType = saleTypeService.findByCode(code.substring(0, 1)); + ProjectSaleType saleType = projectSaleTypeService.findByCode(code.substring(0, 1)); if (saleType == null) { return null; } @@ -228,7 +239,7 @@ public class ProjectService implements IEntityService { } } - ProjectSaleType saleType = saleTypeService.findByCode(saleTypeCode); + ProjectSaleType saleType = projectSaleTypeService.findByCode(saleTypeCode); if (saleType != null) { project.setSaleType(saleType); } @@ -307,7 +318,7 @@ public class ProjectService implements IEntityService { return null; } if (!Hibernate.isInitialized(saleType)) { - saleType = saleTypeService.findById(saleType.getId()); + saleType = projectSaleTypeService.findById(saleType.getId()); project.setSaleType(saleType); } if (!StringUtils.hasText(saleType.getPath())) { diff --git a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectTypeService.java b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectTypeService.java index ecb602b..c058db8 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/service/ProjectTypeService.java +++ b/server/src/main/java/com/ecep/contract/ds/project/service/ProjectTypeService.java @@ -2,6 +2,10 @@ package com.ecep.contract.ds.project.service; import java.util.List; +import com.ecep.contract.QueryService; +import com.ecep.contract.model.CompanyBankAccount; +import com.ecep.contract.util.SpecificationUtils; +import com.fasterxml.jackson.databind.JsonNode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; @@ -21,7 +25,7 @@ import com.ecep.contract.model.ProjectType; @Lazy @Service @CacheConfig(cacheNames = "project-type") -public class ProjectTypeService implements IEntityService { +public class ProjectTypeService implements IEntityService, QueryService { @Lazy @Autowired private ProjectTypeRepository projectTypeRepository; @@ -50,6 +54,17 @@ public class ProjectTypeService implements IEntityService { return projectTypeRepository.findAll(spec, pageable); } + @Override + public Page findAll(JsonNode paramsNode, Pageable pageable) { + Specification spec = null; + if (paramsNode.has("searchText")) { + spec = getSpecification(paramsNode.get("searchText").asText()); + } + // field +// spec = SpecificationUtils.andParam(spec, paramsNode, "company"); + return findAll(spec, pageable); + } + @Override public Specification getSpecification(String searchText) { if (!StringUtils.hasText(searchText)) { diff --git a/server/src/main/java/com/ecep/contract/ds/vendor/service/CompanyVendorFileService.java b/server/src/main/java/com/ecep/contract/ds/vendor/service/CompanyVendorFileService.java index 99050e8..21e59df 100644 --- a/server/src/main/java/com/ecep/contract/ds/vendor/service/CompanyVendorFileService.java +++ b/server/src/main/java/com/ecep/contract/ds/vendor/service/CompanyVendorFileService.java @@ -64,6 +64,10 @@ public class CompanyVendorFileService implements IEntityService builder.equal(root.get("type"), type)); + } spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "valid"); spec = SpecificationUtils.andParam(spec, paramsNode, "vendor"); return findAll(spec, pageable); diff --git a/server/src/main/java/com/ecep/contract/ds/vendor/service/CompanyVendorService.java b/server/src/main/java/com/ecep/contract/ds/vendor/service/CompanyVendorService.java index bc63077..9b734ed 100644 --- a/server/src/main/java/com/ecep/contract/ds/vendor/service/CompanyVendorService.java +++ b/server/src/main/java/com/ecep/contract/ds/vendor/service/CompanyVendorService.java @@ -313,8 +313,9 @@ public class CompanyVendorService extends CompanyBasicService implements IEntity * @param verifyDate 检测日期 * @param holder 状态输出对象 */ - private void verify(CompanyVendor companyVendor, LocalDate verifyDate, MessageHolder holder) { + public boolean verify(CompanyVendor companyVendor, LocalDate verifyDate, MessageHolder holder) { boolean modified = false; + if (verifyAsQualifiedVendor(companyVendor, verifyDate, holder)) { modified = true; } @@ -335,6 +336,7 @@ public class CompanyVendorService extends CompanyBasicService implements IEntity if (modified) { companyVendorRepository.save(companyVendor); } + return modified; } public File getEvaluationFormTemplate() { diff --git a/server/src/main/java/com/ecep/contract/ds/vendor/task/VendorVerifyAllTasker.java b/server/src/main/java/com/ecep/contract/ds/vendor/task/VendorVerifyAllTasker.java index e0d704e..a235012 100644 --- a/server/src/main/java/com/ecep/contract/ds/vendor/task/VendorVerifyAllTasker.java +++ b/server/src/main/java/com/ecep/contract/ds/vendor/task/VendorVerifyAllTasker.java @@ -6,6 +6,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.stream.Collectors; +import com.ecep.contract.ui.MessageHolderImpl; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -51,7 +52,7 @@ public class VendorVerifyAllTasker extends Tasker { MessageHolder subHolder = holder.sub(counter.get() + " / " + total + "> #" + vendor.getId() + "> "); List meesages = new ArrayList<>(); - MessageHolderImpl messageHolder = new MessageHolderImpl() { + MessageHolderImpl messageHolder = new MessageHolderImpl(this) { @Override public void addMessage(Level level, String message) { if (level.intValue() > Level.INFO.intValue()) { diff --git a/server/src/main/java/com/ecep/contract/handler/WebSocketServerHandler.java b/server/src/main/java/com/ecep/contract/handler/WebSocketServerHandler.java index a14c918..d765a9e 100644 --- a/server/src/main/java/com/ecep/contract/handler/WebSocketServerHandler.java +++ b/server/src/main/java/com/ecep/contract/handler/WebSocketServerHandler.java @@ -42,14 +42,12 @@ import java.util.concurrent.TimeUnit; * 处理与客户端的WebSocket连接、消息传递和断开连接 */ @Component -public class WebSocketHandler extends TextWebSocketHandler { +public class WebSocketServerHandler extends TextWebSocketHandler { + private static final Logger logger = LoggerFactory.getLogger(WebSocketServerHandler.class); private final AuthenticationManager authenticationManager; - private final ObjectMapper objectMapper; - private static final Logger logger = LoggerFactory.getLogger(WebSocketHandler.class); - @Autowired private EmployeeLoginHistoryService employeeLoginHistoryService; @Autowired @@ -67,7 +65,7 @@ public class WebSocketHandler extends TextWebSocketHandler { private Integer employeeId; private Integer loginHistoryId; private WebSocketSession session; - private ScheduledFuture schedule; + private ScheduledFuture pingPongScheduledFuture; void click() { try { @@ -78,7 +76,7 @@ public class WebSocketHandler extends TextWebSocketHandler { } } - WebSocketHandler(ObjectMapper objectMapper, AuthenticationManager authenticationManager) { + WebSocketServerHandler(ObjectMapper objectMapper, AuthenticationManager authenticationManager) { this.objectMapper = objectMapper; this.authenticationManager = authenticationManager; } @@ -97,7 +95,7 @@ public class WebSocketHandler extends TextWebSocketHandler { if (sessionInfo.getEmployeeId() == null) { logger.error("会话未绑定用户: {}", session.getId()); sendError(session, 401, "会话未绑定用户"); - session.close(); + session.close(CloseStatus.NOT_ACCEPTABLE); return; } @@ -111,7 +109,7 @@ public class WebSocketHandler extends TextWebSocketHandler { } ScheduledFuture schedule = scheduledExecutorService.schedule(sessionInfo::click, 30, TimeUnit.SECONDS); - sessionInfo.setSchedule(schedule); + sessionInfo.setPingPongScheduledFuture(schedule); } @@ -158,6 +156,8 @@ public class WebSocketHandler extends TextWebSocketHandler { logger.warn("解析消息回调JSON失败: {}", payload, e); return false; } + + if (jsonNode.has(WebSocketConstant.MESSAGE_ID_FIELD_NAME)) { // 处理 messageId 的消息 String messageId = jsonNode.get(WebSocketConstant.MESSAGE_ID_FIELD_NAME).asText(); @@ -195,7 +195,7 @@ public class WebSocketHandler extends TextWebSocketHandler { } String methodName = jsonNode.get(WebSocketConstant.METHOD_FIELD_NAME).asText(); - JsonNode argumentsNode = jsonNode.get("arguments"); + JsonNode argumentsNode = jsonNode.get(WebSocketConstant.ARGUMENTS_FIELD_NAME); Object result = null; if (methodName.equals("findAll")) { @@ -206,27 +206,39 @@ public class WebSocketHandler extends TextWebSocketHandler { result = invokerSaveMethod(service, argumentsNode); } else if (methodName.equals("delete")) { result = invokerDeleteMethod(service, argumentsNode); + } else if (methodName.equals("count")) { + result = invokerCountMethod(service, argumentsNode); } else { result = invokerOtherMethod(service, methodName, argumentsNode); } - String response = objectMapper.writeValueAsString(Map.of( - WebSocketConstant.MESSAGE_ID_FIELD_NAME, messageId, - WebSocketConstant.SUCCESS_FIELD_VALUE, true, - "data", result - )); + Map map = new HashMap<>(); + map.put("data", result); + map.put(WebSocketConstant.MESSAGE_ID_FIELD_NAME, messageId); + map.put(WebSocketConstant.SUCCESS_FIELD_VALUE, true); + + String response = objectMapper.writeValueAsString(map); session.sendMessage(new TextMessage(response)); } + private Object invokerOtherMethod(Object service, String methodName, JsonNode argumentsNode) throws NoSuchMethodException, SecurityException, InvocationTargetException, IllegalAccessException, ClassNotFoundException, JsonProcessingException { int size = argumentsNode.size(); + Class targetClass = getTargetClass(service.getClass()); if (size == 0) { - Method method = service.getClass().getMethod(methodName); + Method method = targetClass.getMethod(methodName); return method.invoke(service); } + if (!argumentsNode.get(0).isArray()) { + Class parameterType = Class.forName(argumentsNode.get(1).asText()); + Object arg = objectMapper.treeToValue(argumentsNode.get(0), parameterType); + Method method = targetClass.getMethod(methodName, parameterType); + return method.invoke(service, arg); + } + // 参数值 JsonNode paramsNode = argumentsNode.get(0); // 参数类型 @@ -239,12 +251,12 @@ public class WebSocketHandler extends TextWebSocketHandler { parameterTypes[i] = Class.forName(type); args[i] = objectMapper.treeToValue(paramsNode.get(i), parameterTypes[i]); } - Class targetClass = getTargetClass(service.getClass()); + try { Method method = targetClass.getMethod(methodName, parameterTypes); return method.invoke(service, args); } catch (NoSuchMethodException e) { - logger.error("targetClass: {}, Methods:{}", targetClass, targetClass.getMethods()); + logger.error("NoSuchMethodException, targetClass: {}, Methods:{}", targetClass, targetClass.getMethods()); throw e; } } @@ -463,6 +475,14 @@ public class WebSocketHandler extends TextWebSocketHandler { return PageContent.of(page); } + private Object invokerCountMethod(Object service, JsonNode argumentsNode) { + JsonNode paramsNode = argumentsNode.get(0); + if (service instanceof QueryService entityService) { + return entityService.count(paramsNode); + } + return null; + } + private void sendError(WebSocketSession session, String messageId, String message) { _sendError(session, WebSocketConstant.MESSAGE_ID_FIELD_NAME, messageId, message); } @@ -533,10 +553,10 @@ public class WebSocketHandler extends TextWebSocketHandler { if (sessionInfo == null) { return; } - ScheduledFuture schedule = sessionInfo.getSchedule(); + ScheduledFuture schedule = sessionInfo.getPingPongScheduledFuture(); if (schedule != null) { schedule.cancel(true); - sessionInfo.setSchedule(null); + sessionInfo.setPingPongScheduledFuture(null); } Integer loginHistoryId = sessionInfo.getLoginHistoryId(); diff --git a/server/src/main/java/com/ecep/contract/service/WebSocketServerTaskManager.java b/server/src/main/java/com/ecep/contract/service/WebSocketServerTaskManager.java index 3a20047..3a3d71f 100644 --- a/server/src/main/java/com/ecep/contract/service/WebSocketServerTaskManager.java +++ b/server/src/main/java/com/ecep/contract/service/WebSocketServerTaskManager.java @@ -17,8 +17,8 @@ import java.util.Map; import java.util.concurrent.ScheduledExecutorService; @Service -public class WebSocketTaskManager implements InitializingBean { - private static final Logger logger = LoggerFactory.getLogger(WebSocketTaskManager.class); +public class WebSocketServerTaskManager implements InitializingBean { + private static final Logger logger = LoggerFactory.getLogger(WebSocketServerTaskManager.class); @Autowired private ObjectMapper objectMapper; @Autowired @@ -56,10 +56,12 @@ public class WebSocketTaskManager implements InitializingBean { } private void createTask(WebSocketSession session, String sessionId, JsonNode jsonNode) { - if (!jsonNode.has("taskName")) { - throw new IllegalArgumentException("缺失 taskName 参数"); + if (!jsonNode.has(WebSocketConstant.ARGUMENTS_FIELD_NAME)) { + throw new IllegalArgumentException("缺失 " + WebSocketConstant.ARGUMENTS_FIELD_NAME + " 参数"); } - String taskName = jsonNode.get("taskName").asText(); + JsonNode argsNode = jsonNode.get(WebSocketConstant.ARGUMENTS_FIELD_NAME); + + String taskName = argsNode.get(0).asText(); String clzName = taskClzMap.get(taskName); if (clzName == null) { @@ -78,7 +80,10 @@ public class WebSocketTaskManager implements InitializingBean { if (tasker instanceof WebSocketServerTasker t) { t.setTitleHandler(title -> sendToSession(session, sessionId, "title", title)); t.setMessageHandler(msg -> sendMessageToSession(session, sessionId, msg)); - t.init(jsonNode); + t.setPropertyHandler((name, value) -> sendToSession(session, sessionId, "property", name, value)); + t.setProgressHandler((current, total) -> sendToSession(session, sessionId, "progress", current, total)); + t.init(argsNode); + scheduledExecutorService.submit(t); } } @@ -92,7 +97,7 @@ public class WebSocketTaskManager implements InitializingBean { String text = objectMapper.writeValueAsString(Map.of( WebSocketConstant.SESSION_ID_FIELD_NAME, sessionId, "type", type, - "args", args + WebSocketConstant.ARGUMENTS_FIELD_NAME, args )); session.sendMessage(new TextMessage(text)); } catch (IOException e) { diff --git a/server/src/main/java/com/ecep/contract/service/WebSocketServerTasker.java b/server/src/main/java/com/ecep/contract/service/WebSocketServerTasker.java index 3b8e064..c3752ec 100644 --- a/server/src/main/java/com/ecep/contract/service/WebSocketServerTasker.java +++ b/server/src/main/java/com/ecep/contract/service/WebSocketServerTasker.java @@ -4,12 +4,20 @@ import com.ecep.contract.Message; import com.fasterxml.jackson.databind.JsonNode; import java.util.concurrent.Callable; +import java.util.function.BiConsumer; import java.util.function.Predicate; -public interface WebSocketTasker extends Callable { +public interface WebSocketServerTasker extends Callable { + /** + * 设置消息处理函数 + */ void setMessageHandler(Predicate messageHandler); void setTitleHandler(Predicate titleHandler); - void init(JsonNode jsonNode); + void setPropertyHandler(BiConsumer propertyHandler); + + void init(JsonNode argsNode); + + void setProgressHandler(BiConsumer progressHandler); } diff --git a/server/src/main/java/com/ecep/contract/service/WebSocketService.java b/server/src/main/java/com/ecep/contract/service/WebSocketService.java index 8d966fc..8c84fc7 100644 --- a/server/src/main/java/com/ecep/contract/service/WebSocketService.java +++ b/server/src/main/java/com/ecep/contract/service/WebSocketService.java @@ -10,7 +10,7 @@ import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import com.ecep.contract.handler.MessageNotitfication; -import com.ecep.contract.handler.WebSocketHandler; +import com.ecep.contract.handler.WebSocketServerHandler; import com.fasterxml.jackson.databind.ObjectMapper; /** @@ -21,11 +21,11 @@ import com.fasterxml.jackson.databind.ObjectMapper; public class WebSocketService { private static final Logger logger = Logger.getLogger(WebSocketService.class.getName()); - private final WebSocketHandler webSocketHandler; + private final WebSocketServerHandler webSocketHandler; @Autowired private ObjectMapper objectMapper; - public WebSocketService(WebSocketHandler webSocketHandler) { + public WebSocketService(WebSocketServerHandler webSocketHandler) { this.webSocketHandler = webSocketHandler; } diff --git a/server/src/main/java/com/ecep/contract/ui/MessageHolderImpl.java b/server/src/main/java/com/ecep/contract/ui/MessageHolderImpl.java index d223f83..5ce0df5 100644 --- a/server/src/main/java/com/ecep/contract/ui/MessageHolderImpl.java +++ b/server/src/main/java/com/ecep/contract/ui/MessageHolderImpl.java @@ -1,4 +1,21 @@ package com.ecep.contract.ui; -public class MessageHolderImpl { +import com.ecep.contract.MessageHolder; + +import java.util.logging.Level; + +/** + * 错误消息处理 + */ +public class MessageHolderImpl implements MessageHolder { + private final Tasker tasker; + + public MessageHolderImpl(Tasker tasker) { + this.tasker = tasker; + } + + @Override + public void addMessage(Level level, String message) { + tasker.updateMessage(level, message); + } } diff --git a/server/src/main/java/com/ecep/contract/ui/Tasker.java b/server/src/main/java/com/ecep/contract/ui/Tasker.java index 5e66ad3..80ff6df 100644 --- a/server/src/main/java/com/ecep/contract/ui/Tasker.java +++ b/server/src/main/java/com/ecep/contract/ui/Tasker.java @@ -2,6 +2,7 @@ package com.ecep.contract.ui; import java.util.HashMap; import java.util.Locale; +import java.util.function.BiConsumer; import java.util.logging.Level; import org.slf4j.Logger; @@ -26,6 +27,11 @@ public abstract class Tasker implements java.util.concurrent.Callable { @Setter private java.util.function.Predicate titleHandler; @Setter + private BiConsumer propertyHandler; + @Setter + private BiConsumer progressHandler; + @Getter + @Setter private Locale locale = Locale.getDefault(); private HashMap, Object> cachedMap = new HashMap<>(); @Setter @@ -34,6 +40,7 @@ public abstract class Tasker implements java.util.concurrent.Callable { @Getter private boolean cancelled = false; + public SysConfService getConfService() { return getCachedBean(SysConfService.class); } @@ -66,7 +73,7 @@ public abstract class Tasker implements java.util.concurrent.Callable { @Override public T call() throws Exception { - MessageHolderImpl holder = new MessageHolderImpl(); + MessageHolderImpl holder = new MessageHolderImpl(this); try { return execute(holder); } catch (Exception e) { @@ -99,23 +106,19 @@ public abstract class Tasker implements java.util.concurrent.Callable { } } - /** - * 错误消息处理 - */ - public class MessageHolderImpl implements MessageHolder { - public MessageHolderImpl() { - } - - @Override - public void addMessage(Level level, String message) { - updateMessage(level, message); + public void updateProgress(long current, long total) { + if (progressHandler != null) { + progressHandler.accept(current, total); } } - public Locale getLocale() { - return locale; + public void updateProgress(double current, double total) { + updateProgress((long) (current * 1000), (long) (total * 1000)); } - public void updateProgress(double d, double total) { + public void updateProperty(String property, Object value) { + if (propertyHandler != null) { + propertyHandler.accept(property, value); + } } } diff --git a/server/src/main/java/com/ecep/contract/util/SpecificationUtils.java b/server/src/main/java/com/ecep/contract/util/SpecificationUtils.java index 6bb338d..a5bac2b 100644 --- a/server/src/main/java/com/ecep/contract/util/SpecificationUtils.java +++ b/server/src/main/java/com/ecep/contract/util/SpecificationUtils.java @@ -1,11 +1,14 @@ package com.ecep.contract.util; -import java.util.function.Function; - +import com.ecep.contract.SpringApp; +import com.ecep.contract.model.Contract; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.BeanUtils; import org.springframework.data.jpa.domain.Specification; import org.springframework.util.StringUtils; -import com.fasterxml.jackson.databind.JsonNode; +import java.util.function.Function; public class SpecificationUtils { public static Specification and(Specification one, Specification two) { @@ -40,7 +43,7 @@ public class SpecificationUtils { * @return 搜索条件为空时返回null,否则返回一个Specification对象 */ public static Specification andWith(String searchText, - Function> buildSearchSpecification) { + Function> buildSearchSpecification) { Specification spec = null; String[] split = null; do { @@ -60,6 +63,12 @@ public class SpecificationUtils { continue; } JsonNode param = paramsNode.get(field); + if (param.isNull()) { + spec = SpecificationUtils.and(spec, (root, query, builder) -> { + return builder.isNull(root.get(field)); + }); + continue; + } Integer value = null; if (param.isInt()) { value = param.asInt(); @@ -103,4 +112,24 @@ public class SpecificationUtils { } return spec; } -} + + + public static > Specification andFieldBetweenParam(Specification spec, JsonNode paramsNode, String field, Class valyeType) { + if (paramsNode.has(field)) { + JsonNode param = paramsNode.get(field); + if (param.isObject()) { + JsonNode beginNode = param.get("begin"); + JsonNode endNode = param.get("end"); + + ObjectMapper objectMapper = SpringApp.getBean(ObjectMapper.class); + Y begin = objectMapper.convertValue(beginNode, valyeType); + Y end = objectMapper.convertValue(endNode, valyeType); + + spec = SpecificationUtils.and(spec, (root, query, builder) -> { + return builder.between(root.get(field), begin, end); + }); + } + } + return spec; + } +} \ No newline at end of file