diff --git a/client/src/main/java/com/ecep/contract/WebSocketClientService.java b/client/src/main/java/com/ecep/contract/WebSocketClientService.java index 719cc5f..7abbf97 100644 --- a/client/src/main/java/com/ecep/contract/WebSocketClientService.java +++ b/client/src/main/java/com/ecep/contract/WebSocketClientService.java @@ -134,7 +134,7 @@ public class WebSocketClientService { @Override public void onFailure(WebSocket webSocket, Throwable t, Response response) { - logger.error("WebSocket连接失败: " + t.getMessage()); + logger.error("WebSocket连接失败: " + t.getMessage() + ", response=" + response, t); Platform.runLater(() -> { online.setValue(false); message.set("连接失败: " + t.getMessage()); @@ -179,13 +179,19 @@ public class WebSocketClientService { if (webSocket == null) { throw new IllegalStateException("WebSocket is not initialized"); } - + if (!online.get()) { + throw new IllegalStateException("WebSocket is not online"); + } String json = objectMapper.writeValueAsString(msg); callbacks.put(msg.getMessageId(), future); if (webSocket.send(json)) { logger.debug("send message success:{}", json); } else { - future.completeExceptionally(new RuntimeException("Failed to send WebSocket message")); + if (isActive) { + future.completeExceptionally(new RuntimeException("Failed to send WebSocket message")); + } else { + future.completeExceptionally(new RuntimeException("WebSocket is not active")); + } } } catch (Exception e) { logger.error("Failed to send WebSocket message: {}", e.getMessage()); @@ -321,14 +327,14 @@ public class WebSocketClientService { } } - private void closeSession(WebSocketClientSession session) { + public void closeSession(WebSocketClientSession session) { if (session != null) { sessions.remove(session.getSessionId()); session.close(); } } - private WebSocketClientSession createSession() { + public WebSocketClientSession createSession() { WebSocketClientSession session = new WebSocketClientSession(this); sessions.put(session.getSessionId(), session); return session; diff --git a/client/src/main/java/com/ecep/contract/WebSocketClientSession.java b/client/src/main/java/com/ecep/contract/WebSocketClientSession.java index b59f9e2..a151abb 100644 --- a/client/src/main/java/com/ecep/contract/WebSocketClientSession.java +++ b/client/src/main/java/com/ecep/contract/WebSocketClientSession.java @@ -7,6 +7,7 @@ import lombok.Getter; import org.springframework.beans.BeanUtils; import java.beans.PropertyDescriptor; +import java.util.Locale; import java.util.Map; import java.util.UUID; import java.util.logging.Level; @@ -24,15 +25,12 @@ public class WebSocketClientSession { } public void close() { + webSocketService.closeSession(this); } - public void submitTask(WebSocketClientTasker tasker, Object... args) throws JsonProcessingException { + public void submitTask(WebSocketClientTasker tasker, Locale locale, Object... args) throws JsonProcessingException { 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); + send("createTask", tasker.getTaskName(), locale.toLanguageTag(), args); } public void send(String type, Object... args) throws JsonProcessingException { @@ -49,31 +47,17 @@ public class WebSocketClientSession { String type = node.get("type").asText(); JsonNode args = node.get(WebSocketConstant.ARGUMENTS_FIELD_NAME); if (type.equals("message")) { - String message = args.get(1).asText(); - String level = args.get(0).asText(); - updateMessage(java.util.logging.Level.parse(level), message); + handleAsMessage(args); } else if (type.equals("title")) { - String message = args.get(0).asText(); - tasker.updateTitle(message); + handleAsTitle(args); } 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); - } + handleAsProperty(args); } else if (type.equals("progress")) { - long current = args.get(0).asLong(); - long total = args.get(1).asLong(); - tasker.updateProgress(current, total); + handleAsProgress(args); + } else if (type.equals("start")) { + handleAsStart(args); + } else if (type.equals("done")) { + handleAsDone(args); } else { tasker.updateMessage(java.util.logging.Level.INFO, "未知的消息类型: " + node.toString()); } @@ -82,6 +66,49 @@ public class WebSocketClientSession { } } + private void handleAsDone(JsonNode args) { + tasker.updateMessage(java.util.logging.Level.INFO, "任务完成"); + close(); + } + + private void handleAsStart(JsonNode args) { + tasker.updateMessage(java.util.logging.Level.INFO, "任务开始"); + } + + private void handleAsProgress(JsonNode args) { + long current = args.get(0).asLong(); + long total = args.get(1).asLong(); + tasker.updateProgress(current, total); + } + + private void handleAsProperty(JsonNode args) { + 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); + } + } + + private void handleAsTitle(JsonNode args) { + String message = args.get(0).asText(); + tasker.updateTitle(message); + } + + private void handleAsMessage(JsonNode args) { + String level = args.get(0).asText(); + String message = args.get(1).asText(); + updateMessage(java.util.logging.Level.parse(level), message); + } + 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 f540853..366fbf3 100644 --- a/client/src/main/java/com/ecep/contract/WebSocketClientTasker.java +++ b/client/src/main/java/com/ecep/contract/WebSocketClientTasker.java @@ -1,5 +1,8 @@ package com.ecep.contract; +import com.fasterxml.jackson.core.JsonProcessingException; + +import java.util.Locale; import java.util.logging.Level; public interface WebSocketClientTasker { @@ -10,4 +13,17 @@ public interface WebSocketClientTasker { void updateTitle(String title); void updateProgress(long current, long total); + + default Object callRemoteTask(MessageHolder holder, Locale locale, Object... args) { + WebSocketClientService webSocketService = SpringApp.getBean(WebSocketClientService.class); + webSocketService.withSession(session -> { + try { + session.submitTask(this, locale, args); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + }); + + return null; + } } diff --git a/client/src/main/java/com/ecep/contract/controller/project/cost/ProjectCostImportItemsFromContractsTasker.java b/client/src/main/java/com/ecep/contract/controller/project/cost/ProjectCostImportItemsFromContractsTasker.java index 38badb6..4ebb6a0 100644 --- a/client/src/main/java/com/ecep/contract/controller/project/cost/ProjectCostImportItemsFromContractsTasker.java +++ b/client/src/main/java/com/ecep/contract/controller/project/cost/ProjectCostImportItemsFromContractsTasker.java @@ -1,19 +1,31 @@ package com.ecep.contract.controller.project.cost; import com.ecep.contract.MessageHolder; +import com.ecep.contract.WebSocketClientTasker; import com.ecep.contract.model.ProjectCost; import com.ecep.contract.task.Tasker; - import lombok.Setter; -public class ProjectCostImportItemsFromContractsTasker extends Tasker { +/** + * 从相关合同中导入成本项 + */ +public class ProjectCostImportItemsFromContractsTasker extends Tasker implements WebSocketClientTasker { @Setter private ProjectCost cost; @Override protected Object execute(MessageHolder holder) throws Exception { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'execute'"); + updateTitle("修复项目成本 " + cost.getId()); + return callRemoteTask(holder, getLocale(), cost.getId()); } + @Override + public String getTaskName() { + return "ProjectCostImportItemsFromContractsTasker"; + } + + @Override + public void updateProgress(long current, long total) { + super.updateProgress(current, total); + } } 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 281e00f..192c728 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 @@ -8,10 +8,14 @@ import java.util.NoSuchElementException; import java.util.Objects; import java.util.Optional; import java.util.concurrent.ExecutionException; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; +import javafx.beans.value.ObservableValue; import org.controlsfx.control.textfield.TextFields; import org.controlsfx.glyphfont.Glyph; import com.ecep.contract.util.ProxyUtils; +import org.springframework.util.StreamUtils; import org.springframework.util.StringUtils; import com.ecep.contract.ContractPayWay; @@ -285,7 +289,7 @@ public class ContractTabSkinBase extends AbstContractBasedTabSkin { // 设置项目的开始创建时间,从合同的创建时间、提交日期、开始日期中取最早的日期 List dates = new ArrayList<>(); - if (viewModel.getCreated().get() != null) { + if (viewModel.getCreated().getValue() != null) { dates.add(viewModel.getCreated().get().toLocalDate()); } if (viewModel.getSetupDate().get() != null) { diff --git a/client/src/main/java/com/ecep/contract/controller/table/cell/AsyncUpdateTableCell.java b/client/src/main/java/com/ecep/contract/controller/table/cell/AsyncUpdateTableCell.java index cd7cd89..17a8188 100644 --- a/client/src/main/java/com/ecep/contract/controller/table/cell/AsyncUpdateTableCell.java +++ b/client/src/main/java/com/ecep/contract/controller/table/cell/AsyncUpdateTableCell.java @@ -120,10 +120,11 @@ public class AsyncUpdateTableCell extends javafx.sc return; } - if (getService() instanceof QueryService queryService) { - queryService.asyncFindById(getItem().getId()).thenAccept(this::_updateEntity); - return; - } +// if (getService() instanceof QueryService queryService) { +// queryService.findById(getItem().getId()); +// queryService.asyncFindById(getItem().getId()).thenAccept(this::_updateEntity); +// return; +// } T entity = initialize(); _updateEntity(entity); diff --git a/client/src/main/java/com/ecep/contract/controller/vendor/CompanyVendorManagerSkin.java b/client/src/main/java/com/ecep/contract/controller/vendor/CompanyVendorManagerSkin.java index fdc0ef3..30f95c2 100644 --- a/client/src/main/java/com/ecep/contract/controller/vendor/CompanyVendorManagerSkin.java +++ b/client/src/main/java/com/ecep/contract/controller/vendor/CompanyVendorManagerSkin.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import com.ecep.contract.service.VendorTypeService; import com.ecep.contract.util.ProxyUtils; import com.ecep.contract.MyDateTimeUtils; @@ -61,6 +62,8 @@ public class CompanyVendorManagerSkin @Override public void initializeTable() { + getBean(VendorTypeService.class); + List vendorTypeLocals = getCompanyVendorService() .findAllTypes(controller.getLocale()); ComboBoxUtils.initialComboBox(controller.typeSelector, vendorTypeLocals, true); diff --git a/client/src/main/java/com/ecep/contract/controller/vendor/VendorTabSkinFile.java b/client/src/main/java/com/ecep/contract/controller/vendor/VendorTabSkinFile.java index a73d83a..aacb970 100644 --- a/client/src/main/java/com/ecep/contract/controller/vendor/VendorTabSkinFile.java +++ b/client/src/main/java/com/ecep/contract/controller/vendor/VendorTabSkinFile.java @@ -9,7 +9,7 @@ import java.util.concurrent.CompletableFuture; import com.ecep.contract.util.ProxyUtils; import org.springframework.util.StringUtils; -import com.ecep.contract.CompanyVendorFileType; +import com.ecep.contract.VendorFileType; import com.ecep.contract.DesktopUtils; import com.ecep.contract.MyDateTimeUtils; import com.ecep.contract.SpringApp; @@ -19,7 +19,7 @@ import com.ecep.contract.model.BaseEnumEntity; import com.ecep.contract.model.Company; import com.ecep.contract.model.CompanyVendor; import com.ecep.contract.model.CompanyVendorFile; -import com.ecep.contract.model.CompanyVendorFileTypeLocal; +import com.ecep.contract.model.VendorFileTypeLocal; import com.ecep.contract.service.CompanyVendorFileService; import com.ecep.contract.task.CompanyVendorEvaluationFormUpdateTask; import com.ecep.contract.util.FxmlPath; @@ -91,7 +91,7 @@ public class VendorTabSkinFile table.disableProperty().bind(viewModel.getPath().isEmpty()); fileTable_idColumn.setCellValueFactory(param -> param.getValue().getId()); - ObservableMap observableMapByLocal = FXCollections + ObservableMap observableMapByLocal = FXCollections .observableMap(companyVendorFileService.getFileTypeLocalMap(getLocale())); fileTable_typeColumn.setCellValueFactory(param -> Bindings.valueAt(observableMapByLocal, param.getValue().getType()).map(BaseEnumEntity::getValue)); @@ -151,7 +151,7 @@ public class VendorTabSkinFile if (file.renameTo(dest)) { CompanyVendorFile ccf = new CompanyVendorFile(); ccf.setVendor(companyVendor); - ccf.setType(CompanyVendorFileType.EvaluationForm); + ccf.setType(VendorFileType.EvaluationForm); ccf.setFilePath(dest.getAbsolutePath()); ccf.setSignDate(nextSignDate); ccf.setValid(true); @@ -172,7 +172,7 @@ public class VendorTabSkinFile if (file.renameTo(dest)) { CompanyVendorFile ccf = new CompanyVendorFile(); ccf.setVendor(companyVendor); - ccf.setType(CompanyVendorFileType.General); + ccf.setType(VendorFileType.General); ccf.setFilePath(dest.getAbsolutePath()); ccf.setValid(false); companyVendorFiles.add(ccf); diff --git a/client/src/main/java/com/ecep/contract/controller/vendor/approved_list/CompanyVendorApprovedListVendorImportTask.java b/client/src/main/java/com/ecep/contract/controller/vendor/approved_list/CompanyVendorApprovedListVendorImportTask.java index 704a802..d88b81d 100644 --- a/client/src/main/java/com/ecep/contract/controller/vendor/approved_list/CompanyVendorApprovedListVendorImportTask.java +++ b/client/src/main/java/com/ecep/contract/controller/vendor/approved_list/CompanyVendorApprovedListVendorImportTask.java @@ -16,7 +16,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.util.StringUtils; -import com.ecep.contract.CompanyVendorFileType; +import com.ecep.contract.VendorFileType; import com.ecep.contract.MessageHolder; import com.ecep.contract.VendorType; import com.ecep.contract.model.Company; @@ -574,7 +574,7 @@ public class CompanyVendorApprovedListVendorImportTask extends Tasker { CompanyVendorFileService fileService = getCompanyVendorFileService(); LocalDate miniDate = publishDate.minusYears(vendorFileMinusYear); return fileService.findAll(ParamUtils.builder().equals("vendor", vendor.getId()).equals("valid", true) - .equals("type", CompanyVendorFileType.EvaluationForm).between("signDate", miniDate, publishDate) + .equals("type", VendorFileType.EvaluationForm).between("signDate", miniDate, publishDate) .build(), Pageable.unpaged()).getContent(); } } 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 75b54d4..9c1a193 100644 --- a/client/src/main/java/com/ecep/contract/service/CompanyVendorFileService.java +++ b/client/src/main/java/com/ecep/contract/service/CompanyVendorFileService.java @@ -12,10 +12,10 @@ import com.ecep.contract.MyDateTimeUtils; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; -import com.ecep.contract.CompanyVendorFileType; +import com.ecep.contract.VendorFileType; import com.ecep.contract.model.CompanyVendor; import com.ecep.contract.model.CompanyVendorFile; -import com.ecep.contract.model.CompanyVendorFileTypeLocal; +import com.ecep.contract.model.VendorFileTypeLocal; import com.ecep.contract.vm.CompanyVendorFileViewModel; @Service @@ -30,14 +30,14 @@ public class CompanyVendorFileService extends QueryService getFileTypeLocalMap(Locale locale) { + public Map getFileTypeLocalMap(Locale locale) { // TODO Auto-generated method stub throw new UnsupportedOperationException("Unimplemented method 'getFileTypeLocalMap'"); } public void verify(CompanyVendor companyVendor, LocalDate verifyDate, MessageHolder holder) { // 查询所有评价表 - List files = findAllByVendorAndType(companyVendor, CompanyVendorFileType.EvaluationForm); + List files = findAllByVendorAndType(companyVendor, VendorFileType.EvaluationForm); if (files == null || files.isEmpty()) { holder.error("未见供应商评价"); return; @@ -65,7 +65,7 @@ public class CompanyVendorFileService extends QueryService findAllByVendorAndType(CompanyVendor vendor, CompanyVendorFileType type) { + public List findAllByVendorAndType(CompanyVendor vendor, VendorFileType 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/ContractGroupService.java b/client/src/main/java/com/ecep/contract/service/ContractGroupService.java index 553f508..df69afc 100644 --- a/client/src/main/java/com/ecep/contract/service/ContractGroupService.java +++ b/client/src/main/java/com/ecep/contract/service/ContractGroupService.java @@ -1,15 +1,60 @@ package com.ecep.contract.service; +import com.ecep.contract.model.ContractKind; +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.stereotype.Service; import com.ecep.contract.model.ContractGroup; import com.ecep.contract.vm.ContractGroupViewModel; +import java.util.List; + @Service +@CacheConfig(cacheNames = "contract-group") public class ContractGroupService extends QueryService { - public ContractGroup findByCode(String groupCode) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findByCode'"); + @Override + @Cacheable(key = "#p0") + public ContractGroup findById(Integer id) { + return super.findById(id); + } + + public ContractGroup findByCode(String code) { + try { + return async("findByCode", code, String.class).handle((response, ex) -> { + if (ex != null) { + throw new RuntimeException("远程方法+findByCode+调用失败", ex); + } + ContractGroup newEntity = createNewEntity(); + return updateValue(newEntity, response); + }).get(); + } catch (Exception e) { + throw new RuntimeException("查询实体失败" + code, e); + } + } + + @Cacheable(key = "'groups'") + @Override + public List findAll() { + return super.findAll(); + } + + @Caching(evict = { + @CacheEvict(key = "#p0.id"), @CacheEvict(key = "'groups'") + }) + @Override + public ContractGroup save(ContractGroup entity) { + return super.save(entity); + } + + @Caching(evict = { + @CacheEvict(key = "#p0.id"), @CacheEvict(key = "'groups'") + }) + @Override + public void delete(ContractGroup entity) { + super.delete(entity); } } \ No newline at end of file diff --git a/client/src/main/java/com/ecep/contract/service/ContractKindService.java b/client/src/main/java/com/ecep/contract/service/ContractKindService.java index 402729d..6169897 100644 --- a/client/src/main/java/com/ecep/contract/service/ContractKindService.java +++ b/client/src/main/java/com/ecep/contract/service/ContractKindService.java @@ -1,19 +1,73 @@ package com.ecep.contract.service; +import com.ecep.contract.model.ContractType; +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.stereotype.Service; import com.ecep.contract.model.ContractKind; import com.ecep.contract.vm.ContractKindViewModel; +import java.util.List; + @Service +@CacheConfig(cacheNames = "contract-kind") public class ContractKindService extends QueryService { + @Cacheable(key = "#p0") + @Override + public ContractKind findById(Integer id) { + return super.findById(id); + } public ContractKind findByName(String name) { - throw new UnsupportedOperationException("Unimplemented method 'findByName'"); + try { + return async("findByName", name, String.class).handle((response, ex) -> { + ContractKind newEntity = createNewEntity(); + return updateValue(newEntity, response); + }).get(); + } catch (Exception e) { + throw new RuntimeException("查询实体失败" + name, e); + } } public ContractKind findByCode(String code) { - throw new UnsupportedOperationException("Unimplemented method 'findByCode'"); + try { + return async("findByCode", code, String.class).handle((response, ex) -> { + if (ex != null) { + throw new RuntimeException("远程方法+findByCode+调用失败", ex); + } + ContractKind newEntity = createNewEntity(); + return updateValue(newEntity, response); + }).get(); + } catch (Exception e) { + throw new RuntimeException("查询实体失败" + code, e); + } } + + @Cacheable(key = "'kinds'") + @Override + public List findAll() { + return super.findAll(); + } + + @Caching(evict = { + @CacheEvict(key = "#p0.id"), @CacheEvict(key = "'kinds'"), + }) + @Override + public ContractKind save(ContractKind entity) { + return super.save(entity); + } + + @Caching(evict = { + @CacheEvict(key = "#p0.id"), @CacheEvict(key = "'kinds'"), + }) + @Override + public void delete(ContractKind entity) { + super.delete(entity); + } + + } \ No newline at end of file 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 a16b993..3cf0c6c 100644 --- a/client/src/main/java/com/ecep/contract/service/ContractService.java +++ b/client/src/main/java/com/ecep/contract/service/ContractService.java @@ -75,6 +75,9 @@ public class ContractService extends QueryService { public Contract findByCode(String code) { try { return async("findByCode", code, String.class).handle((response, ex) -> { + if (ex != null) { + throw new RuntimeException("远程方法+findByCode+调用失败", ex); + } if (response != null) { return updateValue(new Contract(), response); } diff --git a/client/src/main/java/com/ecep/contract/service/ContractTypeService.java b/client/src/main/java/com/ecep/contract/service/ContractTypeService.java index 6dddc8a..5ca7244 100644 --- a/client/src/main/java/com/ecep/contract/service/ContractTypeService.java +++ b/client/src/main/java/com/ecep/contract/service/ContractTypeService.java @@ -1,20 +1,69 @@ package com.ecep.contract.service; +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.stereotype.Service; import com.ecep.contract.model.ContractType; import com.ecep.contract.vm.ContractTypeViewModel; +import java.util.List; + @Service +@CacheConfig(cacheNames = "contract-type") public class ContractTypeService extends QueryService { + @Cacheable(key = "#p0") + @Override + public ContractType findById(Integer id) { + return super.findById(id); + } public ContractType findByName(String name) { - throw new UnsupportedOperationException("Unimplemented method 'findByName'"); + try { + return async("findByName", name, String.class).handle((response, ex) -> { + ContractType newEntity = createNewEntity(); + return updateValue(newEntity, response); + }).get(); + } catch (Exception e) { + throw new RuntimeException("查询实体失败" + name, e); + } } - public ContractType findByCode(String typeCode) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findByCode'"); + public ContractType findByCode(String code) { + try { + return async("findByCode", code, String.class).handle((response, ex) -> { + if (ex != null) { + throw new RuntimeException("远程方法+findByCode+调用失败", ex); + } + ContractType newEntity = createNewEntity(); + return updateValue(newEntity, response); + }).get(); + } catch (Exception e) { + throw new RuntimeException("查询实体失败" + code, e); + } } + @Cacheable(key = "'types'") + @Override + public List findAll() { + return super.findAll(); + } + + @Caching(evict = { + @CacheEvict(key = "#p0.id"), @CacheEvict(key = "'types'"), + }) + @Override + public void delete(ContractType entity) { + super.delete(entity); + } + + @Caching(evict = { + @CacheEvict(key = "#p0.id"), @CacheEvict(key = "'types'"), + }) + @Override + public ContractType save(ContractType entity) { + return super.save(entity); + } } 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 45c24a6..de6ae7a 100644 --- a/client/src/main/java/com/ecep/contract/service/EmployeeService.java +++ b/client/src/main/java/com/ecep/contract/service/EmployeeService.java @@ -5,6 +5,10 @@ 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.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -12,15 +16,43 @@ import java.util.List; import java.util.concurrent.ExecutionException; @Service +@CacheConfig(cacheNames = "employee") public class EmployeeService extends QueryService { public static final int DEFAULT_SYSTEM_EMPLOYEE_ID = 26; - public Employee findByName(String name) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findByName'"); + @Cacheable(key = "#p0") + @Override + public Employee findById(Integer id) { + return super.findById(id); } + public Employee findByName(String name) { + try { + return async("findByName", name, String.class).handle((response, ex) -> { + Employee newEntity = createNewEntity(); + return updateValue(newEntity, response); + }).get(); + } catch (Exception e) { + throw new RuntimeException("查询实体失败:" + name, e); + } + } + + public Employee findByCode(String code) { + try { + return async("findByCode", code, String.class).handle((response, ex) -> { + if (ex != null) { + throw new RuntimeException("远程方法+findByCode+调用失败", ex); + } + Employee newEntity = createNewEntity(); + return updateValue(newEntity, response); + }).get(); + } catch (Exception e) { + throw new RuntimeException("查询实体失败:" + code, e); + } + } + + public List getRolesByEmployeeId(Integer id) { try { return async("getRolesByEmployeeId", List.of(id), List.of(Integer.class)).handle((response, ex) -> { @@ -44,15 +76,20 @@ public class EmployeeService extends QueryService { } } - public void updateActive(int sessionId) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'updateActive'"); + + @Caching(evict = { + @CacheEvict(key = "#p0.id"), + }) + @Override + public Employee save(Employee entity) { + return super.save(entity); } - public Employee findByCode(String personCode) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findByCode'"); + @Caching(evict = { + @CacheEvict(key = "#p0.id"), + }) + @Override + public void delete(Employee entity) { + super.delete(entity); } - - } diff --git a/client/src/main/java/com/ecep/contract/service/ProductTypeService.java b/client/src/main/java/com/ecep/contract/service/ProductTypeService.java index 15506e4..830e89b 100644 --- a/client/src/main/java/com/ecep/contract/service/ProductTypeService.java +++ b/client/src/main/java/com/ecep/contract/service/ProductTypeService.java @@ -1,16 +1,56 @@ package com.ecep.contract.service; +import com.ecep.contract.model.ContractType; +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.stereotype.Service; import com.ecep.contract.model.ProductType; import com.ecep.contract.vm.ProductTypeViewModel; -@Service -public class ProductTypeService extends QueryService { +import java.util.List; - public ProductType findByName(String name) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findByName'"); +@Service +@CacheConfig(cacheNames = "product-type") +public class ProductTypeService extends QueryService { + @Cacheable(key = "#p0") + @Override + public ProductType findById(Integer id) { + return super.findById(id); } + public ProductType findByName(String name) { + try { + return async("findByName", name, String.class).handle((response, ex) -> { + ProductType newEntity = createNewEntity(); + return updateValue(newEntity, response); + }).get(); + } catch (Exception e) { + throw new RuntimeException("查询实体失败" + name, e); + } + } + + @Cacheable(key = "'types'") + @Override + public List findAll() { + return super.findAll(); + } + + @Caching(evict = { + @CacheEvict(key = "#p0.id"), @CacheEvict(key = "'types'"), + }) + @Override + public ProductType save(ProductType entity) { + return super.save(entity); + } + + @Caching(evict = { + @CacheEvict(key = "#p0.id"), @CacheEvict(key = "'types'"), + }) + @Override + public void delete(ProductType entity) { + super.delete(entity); + } } diff --git a/client/src/main/java/com/ecep/contract/service/ProjectBidService.java b/client/src/main/java/com/ecep/contract/service/ProjectBidService.java index 300f3ce..a2f1dc2 100644 --- a/client/src/main/java/com/ecep/contract/service/ProjectBidService.java +++ b/client/src/main/java/com/ecep/contract/service/ProjectBidService.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.Project; @@ -12,8 +14,7 @@ import com.ecep.contract.vm.ProjectBidViewModel; public class ProjectBidService 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/ProjectCostService.java b/client/src/main/java/com/ecep/contract/service/ProjectCostService.java index 8b149a3..5d13598 100644 --- a/client/src/main/java/com/ecep/contract/service/ProjectCostService.java +++ b/client/src/main/java/com/ecep/contract/service/ProjectCostService.java @@ -43,11 +43,6 @@ public class ProjectCostService extends QueryService findAllByProject(Project project) { return findAll(ParamUtils.builder().equals("project", project.getId()).build(), Pageable.unpaged()).getContent(); } diff --git a/client/src/main/java/com/ecep/contract/service/ProjectService.java b/client/src/main/java/com/ecep/contract/service/ProjectService.java index 8d3df2d..9275f8c 100644 --- a/client/src/main/java/com/ecep/contract/service/ProjectService.java +++ b/client/src/main/java/com/ecep/contract/service/ProjectService.java @@ -1,13 +1,19 @@ package com.ecep.contract.service; +import com.ecep.contract.SpringApp; +import com.ecep.contract.model.Employee; +import com.ecep.contract.util.ProxyUtils; import org.springframework.stereotype.Service; import com.ecep.contract.model.Contract; import com.ecep.contract.model.Project; import com.ecep.contract.model.ProjectSaleType; import com.ecep.contract.vm.ProjectViewModel; +import org.springframework.util.StringUtils; import java.io.File; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; @Service @@ -15,11 +21,25 @@ public class ProjectService extends QueryService { public Project findByName(String name) { - throw new UnsupportedOperationException(); + try { + return async("findByName", name, String.class).handle((response, ex) -> { + Project newEntity = createNewEntity(); + return updateValue(newEntity, response); + }).get(); + } catch (Exception e) { + throw new RuntimeException("查询实体失败:" + name, e); + } } public Project findByCode(String code) { - throw new UnsupportedOperationException(); + try { + return async("findByCode", code, String.class).handle((response, ex) -> { + Project newEntity = createNewEntity(); + return updateValue(newEntity, response); + }).get(); + } catch (Exception e) { + throw new RuntimeException("查询实体失败:" + code, e); + } } public void applyCode(Project project, String code) { @@ -27,13 +47,63 @@ public class ProjectService extends QueryService { } public Project newInstanceByContract(Contract contract) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'newInstanceByContract'"); + Project project = new Project(); + project.setName(contract.getName()); + applyCode(project, contract.getCode()); + contract.setCreated(LocalDateTime.now()); + LocalDateTime created = contract.getCreated(); + if (created != null) { + project.setCreated(created.toLocalDate()); + } else { + project.setCreated(LocalDate.now()); + } + project.setCustomer(contract.getCompany()); + project.setApplicant(contract.getEmployee()); + return project; } public File searchPath(Project project) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'searchPath'"); + ProjectSaleType saleType = project.getSaleType(); + if (saleType == null) { + return null; + } + if (!ProxyUtils.isInitialized(saleType)) { + saleType = SpringApp.getBean(ProjectSaleTypeService.class).findById(saleType.getId()); + project.setSaleType(saleType); + } + if (!StringUtils.hasText(saleType.getPath())) { + return null; + } + File path = new File(saleType.getPath()); + if (saleType.isStoreByYear()) { + path = new File(path, "20" + project.getCodeYear()); + if (!path.exists()) { + path.mkdir();// 创建目录 + } + } + + String projectCode = makeProjectCode(project); + // 检索目录 + File[] files = path.listFiles(f -> f.isDirectory() && f.getName().contains(projectCode)); + if (files != null && files.length > 0) { + path = files[0]; + } + return path; + } + + + public String makeProjectCode(Project project) { + StringBuilder sb = new StringBuilder(); + sb.append(project.getSaleType().getCode()); + sb.append(project.getCodeYear()); + if (project.getCodeSequenceNumber() < 10) { + sb.append("0"); + } + if (project.getCodeSequenceNumber() < 100) { + sb.append("0"); + } + sb.append(project.getCodeSequenceNumber()); + return sb.toString(); } public int getNextCodeSequenceNumber(ProjectSaleType newValue, int i) { @@ -42,7 +112,7 @@ public class ProjectService extends QueryService { } public Project findBySaleTypeAndCodeYearAndCodeSequenceNumber(ProjectSaleType saleType, int codeYear, - int codeSequenceNumber) { + int codeSequenceNumber) { // TODO Auto-generated method stub throw new UnsupportedOperationException("Unimplemented method 'findBySaleTypeAndCodeYearAndCodeSequenceNumber'"); } 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 8bd2a70..418de6a 100644 --- a/client/src/main/java/com/ecep/contract/service/QueryService.java +++ b/client/src/main/java/com/ecep/contract/service/QueryService.java @@ -66,6 +66,9 @@ public class QueryService { + if (ex != null) { + throw new RuntimeException("保存实体失败", ex); + } if (response != null) { try { objectMapper.updateValue(entity, response); @@ -84,6 +87,9 @@ public class QueryService { + if (ex != null) { + throw new RuntimeException("删除实体失败", ex); + } if (response != null) { return updateValue(entity, response); } @@ -116,6 +122,9 @@ public class QueryService asyncFindById(Integer id) { return async("findById", id, Integer.class).handle((response, ex) -> { + if (ex != null) { + throw new RuntimeException("查询实体失败", ex); + } T newEntity = createNewEntity(); return updateValue(newEntity, response); }); @@ -145,6 +154,9 @@ public class QueryService> asyncFindAll(Map params, Pageable pageable) { // 调用async方法发送WebSocket请求,获取异步响应结果 return async("findAll", params, PageArgument.of(pageable)).handle((response, ex) -> { + if (ex != null) { + throw new RuntimeException("远程方法+findAll+调用失败", ex); + } try { // 将响应结果转换为PageContent对象,使用当前类的createNewEntity方法创建实体实例 PageContent pageContent = of(response, objectMapper, this::createNewEntity); @@ -186,6 +198,9 @@ public class QueryService { + if (ex != null) { + throw new RuntimeException("远程方法+count+调用失败", ex); + } // 将响应结果转换为Long类型并返回 return response.asLong(); }); diff --git a/client/src/main/java/com/ecep/contract/service/VendorFileTypeService.java b/client/src/main/java/com/ecep/contract/service/VendorFileTypeService.java index b631867..d3fd31f 100644 --- a/client/src/main/java/com/ecep/contract/service/VendorFileTypeService.java +++ b/client/src/main/java/com/ecep/contract/service/VendorFileTypeService.java @@ -1,7 +1,7 @@ package com.ecep.contract.service; -import com.ecep.contract.model.CompanyVendorFileTypeLocal; -import com.ecep.contract.vm.CompanyVendorFileTypeLocalViewModel; +import com.ecep.contract.model.VendorFileTypeLocal; +import com.ecep.contract.vm.VendorFileTypeLocalViewModel; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; @@ -12,28 +12,28 @@ import java.util.List; @Service @CacheConfig(cacheNames = "vendor-file-type") -public class CompanyVendorFileTypeService extends QueryService { +public class VendorFileTypeService extends QueryService { @Cacheable(key = "#p0") @Override - public CompanyVendorFileTypeLocal findById(Integer id) { + public VendorFileTypeLocal findById(Integer id) { return super.findById(id); } @Cacheable(key = "'all'") @Override - public List findAll() { + public List findAll() { return super.findAll(); } @Caching(put = {@CachePut(key = "#p0.id"), @CachePut(key = "'all'")}) @Override - public CompanyVendorFileTypeLocal save(CompanyVendorFileTypeLocal entity) { + public VendorFileTypeLocal save(VendorFileTypeLocal entity) { return super.save(entity); } @Caching(put = {@CachePut(key = "#p0.id"), @CachePut(key = "'all'")}) @Override - public void delete(CompanyVendorFileTypeLocal entity) { + public void delete(VendorFileTypeLocal entity) { super.delete(entity); } } 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 56ccc7d..f02cdc5 100644 --- a/client/src/main/java/com/ecep/contract/service/VendorGroupService.java +++ b/client/src/main/java/com/ecep/contract/service/VendorGroupService.java @@ -23,6 +23,9 @@ public class VendorGroupService extends QueryService { + if (ex != null) { + throw new RuntimeException("远程方法+findByCode+调用失败", ex); + } VendorGroup newEntity = newInstance(); return updateValue(newEntity, response); }).get(); diff --git a/client/src/main/java/com/ecep/contract/service/VendorTypeService.java b/client/src/main/java/com/ecep/contract/service/VendorTypeService.java index 31575a0..9a65a2b 100644 --- a/client/src/main/java/com/ecep/contract/service/VendorTypeService.java +++ b/client/src/main/java/com/ecep/contract/service/VendorTypeService.java @@ -1,12 +1,39 @@ package com.ecep.contract.service; -import com.ecep.contract.model.CompanyVendorFileTypeLocal; -import com.ecep.contract.vm.CompanyVendorFileTypeLocalViewModel; +import com.ecep.contract.model.VendorTypeLocal; +import com.ecep.contract.vm.VendorTypeLocalViewModel; import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; import org.springframework.stereotype.Service; -@Service -@CacheConfig(cacheNames = "vendor-file-type") -public class CompanyVendorFileTypeService extends QueryService { +import java.util.List; +@Service +@CacheConfig(cacheNames = "vendor-type") +public class VendorTypeService extends QueryService { + @Cacheable(key = "#p0") + @Override + public VendorTypeLocal findById(Integer id) { + return super.findById(id); + } + + @Cacheable(key = "'all'") + @Override + public List findAll() { + return super.findAll(); + } + + @Caching(put = {@CachePut(key = "#p0.id"), @CachePut(key = "'all'")}) + @Override + public VendorTypeLocal save(VendorTypeLocal entity) { + return super.save(entity); + } + + @Caching(put = {@CachePut(key = "#p0.id"), @CachePut(key = "'all'")}) + @Override + public void delete(VendorTypeLocal entity) { + super.delete(entity); + } } 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 86d8983..54836e2 100644 --- a/client/src/main/java/com/ecep/contract/task/ContractRepairTask.java +++ b/client/src/main/java/com/ecep/contract/task/ContractRepairTask.java @@ -46,21 +46,7 @@ public class ContractRepairTask extends Tasker implements WebSocketClien @Override protected Object execute(MessageHolder holder) throws Exception { updateTitle("修复合同 " + contract.toPrettyString()); - return callRemoteTask(holder); + return callRemoteTask(holder, getLocale(), contract.getId()); } - 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 1de1f12..c73b4db 100644 --- a/client/src/main/java/com/ecep/contract/task/ContractSyncTask.java +++ b/client/src/main/java/com/ecep/contract/task/ContractSyncTask.java @@ -37,20 +37,7 @@ public class ContractSyncTask extends Tasker implements WebSocketClientT 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; + return callRemoteTask(holder, getLocale()); } } 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 774f6bb..fe2e674 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.controller.project.cost.ProjectCostImportItemsFromContractsTasker; import com.ecep.contract.util.ProxyUtils; import org.springframework.util.StringUtils; @@ -731,15 +732,16 @@ public class ContractVerifyComm { // boolean needImport = false; - ProjectCost autoCost = getProjectCostService().findAutoCostByProject(project); + ProjectCostService projectCostService = getProjectCostService(); + ProjectCost autoCost = projectCostService.findAutoCostByProject(project); if (autoCost == null) { // 创建 V0 项目成本 - ProjectCost cost = getProjectCostService().newInstanceByProject(project); + ProjectCost cost = projectCostService.newInstanceByProject(project); cost.setVersion(0); cost.setApplicant(getEmployeeService().findById(EmployeeService.DEFAULT_SYSTEM_EMPLOYEE_ID)); cost.setApplyTime(LocalDateTime.now()); cost.setDescription("自动导入"); - autoCost = getProjectCostService().save(cost); + autoCost = projectCostService.save(cost); needImport = true; } else { // 检查 V0 项目成本 @@ -754,13 +756,21 @@ public class ContractVerifyComm { if (needImport && !autoCost.isImportLock()) { holder.debug("更新V0项目成本"); - getProjectCostService().updateAutoCost(project, holder); + ProjectCost cost = projectCostService.findAutoCostByProject(project); + if (cost == null) { + cost = projectCostService.newInstanceByProject(project); + cost.setVersion(0); + cost = projectCostService.save(cost); + } + ProjectCostImportItemsFromContractsTasker tasker = new ProjectCostImportItemsFromContractsTasker(); + tasker.setCost(cost); + } // 检查最新的项目成本,默认 V1 - ProjectCost latestCost = getProjectCostService().findLatestByProject(project); + ProjectCost latestCost = projectCostService.findLatestByProject(project); if (latestCost == null) { - ProjectCost cost = getProjectCostService().newInstanceByProject(project); + ProjectCost cost = projectCostService.newInstanceByProject(project); cost.setVersion(1); Employee applicant = project.getApplicant(); if (applicant == null) { @@ -768,7 +778,7 @@ public class ContractVerifyComm { } cost.setApplicant(applicant); cost.setApplyTime(project.getCreated().atTime(LocalTime.now())); - latestCost = getProjectCostService().save(cost); + latestCost = projectCostService.save(cost); } else { // if (latestCost.getGrossProfitMargin() <= 0) { diff --git a/client/src/main/java/com/ecep/contract/vm/CompanyVendorFileViewModel.java b/client/src/main/java/com/ecep/contract/vm/CompanyVendorFileViewModel.java index 58e600d..8219823 100644 --- a/client/src/main/java/com/ecep/contract/vm/CompanyVendorFileViewModel.java +++ b/client/src/main/java/com/ecep/contract/vm/CompanyVendorFileViewModel.java @@ -3,7 +3,7 @@ package com.ecep.contract.vm; import java.time.LocalDate; import java.util.Objects; -import com.ecep.contract.CompanyVendorFileType; +import com.ecep.contract.VendorFileType; import com.ecep.contract.model.CompanyVendor; import com.ecep.contract.model.CompanyVendorFile; @@ -21,7 +21,7 @@ public class CompanyVendorFileViewModel extends IdentityViewModel vendor = new SimpleObjectProperty<>(); - private SimpleObjectProperty type = new SimpleObjectProperty<>(); + private SimpleObjectProperty type = new SimpleObjectProperty<>(); private SimpleStringProperty filePath = new SimpleStringProperty(); diff --git a/client/src/main/java/com/ecep/contract/vm/VendorFileTypeLocalViewModel.java b/client/src/main/java/com/ecep/contract/vm/VendorFileTypeLocalViewModel.java index a6eda93..5c0e405 100644 --- a/client/src/main/java/com/ecep/contract/vm/VendorFileTypeLocalViewModel.java +++ b/client/src/main/java/com/ecep/contract/vm/VendorFileTypeLocalViewModel.java @@ -1,11 +1,11 @@ package com.ecep.contract.vm; -import com.ecep.contract.CompanyVendorFileType; -import com.ecep.contract.model.CompanyVendorFileTypeLocal; +import com.ecep.contract.VendorFileType; +import com.ecep.contract.model.VendorFileTypeLocal; import lombok.Data; import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = true) -public class CompanyVendorFileTypeLocalViewModel extends EnumViewModel { +public class VendorFileTypeLocalViewModel extends EnumViewModel { } diff --git a/client/src/main/java/com/ecep/contract/vm/VendorTypeLocalViewModel.java b/client/src/main/java/com/ecep/contract/vm/VendorTypeLocalViewModel.java index a6eda93..da291f0 100644 --- a/client/src/main/java/com/ecep/contract/vm/VendorTypeLocalViewModel.java +++ b/client/src/main/java/com/ecep/contract/vm/VendorTypeLocalViewModel.java @@ -1,11 +1,11 @@ package com.ecep.contract.vm; -import com.ecep.contract.CompanyVendorFileType; -import com.ecep.contract.model.CompanyVendorFileTypeLocal; +import com.ecep.contract.VendorType; +import com.ecep.contract.model.VendorTypeLocal; import lombok.Data; import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = true) -public class CompanyVendorFileTypeLocalViewModel extends EnumViewModel { +public class VendorTypeLocalViewModel extends EnumViewModel { } diff --git a/common/src/main/java/com/ecep/contract/VendorFileType.java b/common/src/main/java/com/ecep/contract/VendorFileType.java index 3f3012f..67698fe 100644 --- a/common/src/main/java/com/ecep/contract/VendorFileType.java +++ b/common/src/main/java/com/ecep/contract/VendorFileType.java @@ -1,12 +1,19 @@ package com.ecep.contract; -public enum CompanyVendorFileType { +/** + * 枚举类 VendorFileType,用于表示不同类型的供应商文件 + * 该枚举定义了两种文件类型:普通文件和评价表 + */ +public enum VendorFileType { /** * 普通文件,一般文件 + * 表示常规的供应商文件类型,不包含特殊用途或格式 */ General, /** * 评价表; 评估表 + * 用于供应商评估或评价的特定表格文件 + * 包含对供应商各方面表现的评估指标和内容 */ EvaluationForm; } diff --git a/common/src/main/java/com/ecep/contract/model/CompanyVendorFile.java b/common/src/main/java/com/ecep/contract/model/CompanyVendorFile.java index 0a50f28..8a4f2fd 100644 --- a/common/src/main/java/com/ecep/contract/model/CompanyVendorFile.java +++ b/common/src/main/java/com/ecep/contract/model/CompanyVendorFile.java @@ -4,7 +4,7 @@ import java.io.Serializable; import java.time.LocalDate; import java.util.Objects; -import com.ecep.contract.CompanyVendorFileType; +import com.ecep.contract.VendorFileType; import com.ecep.contract.util.HibernateProxyUtils; import jakarta.persistence.Column; @@ -30,7 +30,7 @@ import lombok.ToString; @Entity @Table(name = "COMPANY_VENDOR_FILE") @ToString -public class CompanyVendorFile implements CompanyBasicFile, Serializable { +public class CompanyVendorFile implements CompanyBasicFile, Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -44,7 +44,7 @@ public class CompanyVendorFile implements CompanyBasicFile implements Serializable { +public class VendorFileTypeLocal extends BaseEnumEntity implements Serializable { private static final long serialVersionUID = 1L; @Override public final boolean equals(Object object) { @@ -31,7 +31,7 @@ public class CompanyVendorFileTypeLocal extends BaseEnumEntity 文件类 * @return 是否修改了 * @see CompanyVendorFile - * @see CompanyVendorFileType + * @see VendorFileType * @see CompanyCustomerFile * @see CompanyCustomerFileType */ diff --git a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractFileTypeService.java b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractFileTypeService.java index 6897e3f..9e2e2e2 100644 --- a/server/src/main/java/com/ecep/contract/ds/contract/service/ContractFileTypeService.java +++ b/server/src/main/java/com/ecep/contract/ds/contract/service/ContractFileTypeService.java @@ -46,7 +46,7 @@ public class ContractFileTypeService @Cacheable(key = "'all-'+#p0.getLanguage()") public Map findAll(Locale locale) { - return repository.getCompleteMapByLocal(locale.getLanguage()); + return repository.getCompleteMapByLocal(locale.toLanguageTag()); } @Cacheable(key = "#p0") 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 1cd62de..2325805 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 @@ -31,10 +31,8 @@ public class ContractRepairTask extends AbstContractRepairTasker implements WebS } public void init(JsonNode argsNode) { - int contractId = argsNode.get(1).asInt(); + int contractId = argsNode.get(0).asInt(); contract = getCachedBean(ContractService.class).findById(contractId); - String lang = argsNode.get(2).asText(); - setLocale(Locale.forLanguageTag(lang)); } @Override 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 6b42c14..00bffe1 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 @@ -16,7 +16,6 @@ import lombok.Getter; import lombok.Setter; public class ContractVerifyTasker extends Tasker implements WebSocketServerTasker { - @Getter @Setter private Contract contract; @@ -64,7 +63,7 @@ public class ContractVerifyTasker extends Tasker implements WebSocketSer @Override public void init(JsonNode argsNode) { - int contractId = argsNode.get(1).asInt(); + int contractId = argsNode.get(0).asInt(); contract = getCachedBean(ContractService.class).findById(contractId); } diff --git a/server/src/main/java/com/ecep/contract/ds/project/ProjectCostImportItemsFromContractsTasker.java b/server/src/main/java/com/ecep/contract/ds/project/ProjectCostImportItemsFromContractsTasker.java index 837008c..875d2e8 100644 --- a/server/src/main/java/com/ecep/contract/ds/project/ProjectCostImportItemsFromContractsTasker.java +++ b/server/src/main/java/com/ecep/contract/ds/project/ProjectCostImportItemsFromContractsTasker.java @@ -8,9 +8,14 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Supplier; +import java.util.logging.Level; import java.util.stream.Collectors; +import com.ecep.contract.service.WebSocketServerTasker; +import com.ecep.contract.ui.MessageHolderImpl; +import com.fasterxml.jackson.databind.JsonNode; import org.hibernate.Hibernate; import com.ecep.contract.MessageHolder; @@ -32,22 +37,18 @@ import com.ecep.contract.util.TaxRateUtils; import lombok.Setter; -public class ProjectCostImportItemsFromContractsTasker extends Tasker { - @Setter - private ProjectCostService costService; - @Setter - private ContractService contractService; - @Setter - private ProjectCostItemService itemService; - @Setter - private ContractItemService contractItemService; +public class ProjectCostImportItemsFromContractsTasker extends Tasker implements WebSocketServerTasker { @Setter private Supplier currentUser; - - @Setter - private InventoryService inventoryService; @Setter ProjectCost cost; + AtomicBoolean verified = new AtomicBoolean(true); + + @Override + public void init(JsonNode argsNode) { + int contractId = argsNode.get(0).asInt(); + cost = getCachedBean(ProjectCostService.class).findById(contractId); + } @Override protected Void execute(MessageHolder holder) throws Exception { @@ -142,7 +143,7 @@ public class ProjectCostImportItemsFromContractsTasker extends Tasker { } private void compositeOut(Map> map, List results, - MessageHolder holder) { + MessageHolder holder) { // 根据存货匹配,可对多个相同的存货进行合并 for (Map.Entry> entry : map.entrySet()) { Inventory inventory = Hibernate.isInitialized(entry.getKey()) ? entry.getKey() @@ -336,42 +337,28 @@ public class ProjectCostImportItemsFromContractsTasker extends Tasker { } ProjectCostService getCostService() { - if (costService == null) { - costService = getBean(ProjectCostService.class); - } - return costService; + return getCachedBean(ProjectCostService.class); } public ProjectCostItemService getItemService() { - if (itemService == null) { - itemService = getBean(ProjectCostItemService.class); - } - return itemService; + return getCachedBean(ProjectCostItemService.class); } ContractService getContractService() { - if (contractService == null) { - contractService = getBean(ContractService.class); - } - return contractService; + return getCachedBean(ContractService.class); } ContractItemService getContractItemService() { - if (contractItemService == null) { - contractItemService = getBean(ContractItemService.class); - } - return contractItemService; + return getCachedBean(ContractItemService.class); } InventoryService getInventoryService() { - if (inventoryService == null) { - inventoryService = getBean(InventoryService.class); - } - return inventoryService; + return getCachedBean(InventoryService.class); } public ProjectCostItem save(ProjectCostItem entity) { return getItemService().save(entity); } + } 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 3f09293..9ed4b8b 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 @@ -298,46 +298,6 @@ public class ProjectService implements IEntityService, QueryService f.isDirectory() && f.getName().contains(projectCode)); - if (files != null && files.length > 0) { - path = files[0]; - } - return path; - } } diff --git a/server/src/main/java/com/ecep/contract/ds/vendor/repository/CompanyVendorFileRepository.java b/server/src/main/java/com/ecep/contract/ds/vendor/repository/CompanyVendorFileRepository.java index 38fc7b6..aa20cf2 100644 --- a/server/src/main/java/com/ecep/contract/ds/vendor/repository/CompanyVendorFileRepository.java +++ b/server/src/main/java/com/ecep/contract/ds/vendor/repository/CompanyVendorFileRepository.java @@ -6,7 +6,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.stereotype.Repository; -import com.ecep.contract.CompanyVendorFileType; +import com.ecep.contract.VendorFileType; import com.ecep.contract.model.CompanyVendor; import com.ecep.contract.model.CompanyVendorFile; @@ -16,7 +16,7 @@ public interface CompanyVendorFileRepository List findAllByVendorId(int vendorId); - List findAllByVendorAndType(CompanyVendor vendor, CompanyVendorFileType type); + List findAllByVendorAndType(CompanyVendor vendor, VendorFileType type); List findByVendorId(int vendorId); } \ No newline at end of file diff --git a/server/src/main/java/com/ecep/contract/ds/vendor/repository/CompanyVendorFileTypeLocalRepository.java b/server/src/main/java/com/ecep/contract/ds/vendor/repository/CompanyVendorFileTypeLocalRepository.java index f3fde62..29cca46 100644 --- a/server/src/main/java/com/ecep/contract/ds/vendor/repository/CompanyVendorFileTypeLocalRepository.java +++ b/server/src/main/java/com/ecep/contract/ds/vendor/repository/CompanyVendorFileTypeLocalRepository.java @@ -2,21 +2,21 @@ package com.ecep.contract.ds.vendor.repository; import org.springframework.stereotype.Repository; -import com.ecep.contract.CompanyVendorFileType; +import com.ecep.contract.VendorFileType; import com.ecep.contract.ds.other.repository.BaseEnumEntityRepository; -import com.ecep.contract.model.CompanyVendorFileTypeLocal; +import com.ecep.contract.model.VendorFileTypeLocal; @Repository public interface CompanyVendorFileTypeLocalRepository - extends BaseEnumEntityRepository { + extends BaseEnumEntityRepository { @Override - default CompanyVendorFileType[] getEnumConstants() { - return CompanyVendorFileType.values(); + default VendorFileType[] getEnumConstants() { + return VendorFileType.values(); } @Override - default CompanyVendorFileTypeLocal newEntity() { - return new CompanyVendorFileTypeLocal(); + default VendorFileTypeLocal newEntity() { + return new VendorFileTypeLocal(); } } \ No newline at end of file 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 21e59df..0d14665 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 @@ -7,7 +7,6 @@ import java.util.List; import java.util.function.Consumer; import com.ecep.contract.*; -import com.ecep.contract.model.CompanyVendorApprovedList; import com.ecep.contract.util.SpecificationUtils; import com.fasterxml.jackson.databind.JsonNode; import org.slf4j.Logger; @@ -65,7 +64,7 @@ public class CompanyVendorFileService implements IEntityService builder.equal(root.get("type"), type)); } spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "valid"); @@ -97,7 +96,7 @@ public class CompanyVendorFileService implements IEntityService findAllByVendorAndType(CompanyVendor vendor, CompanyVendorFileType type) { + public List findAllByVendorAndType(CompanyVendor vendor, VendorFileType type) { return repository.findAllByVendorAndType(vendor, type); } @@ -116,7 +115,7 @@ public class CompanyVendorFileService implements IEntityService files = findAllByVendorAndType(companyVendor, CompanyVendorFileType.EvaluationForm); + List files = findAllByVendorAndType(companyVendor, VendorFileType.EvaluationForm); if (files == null || files.isEmpty()) { holder.error("未见供应商评价"); return; @@ -161,7 +160,7 @@ public class CompanyVendorFileService implements IEntityService files = findAllByVendorAndType(companyVendor, CompanyVendorFileType.EvaluationForm); + List files = findAllByVendorAndType(companyVendor, VendorFileType.EvaluationForm); CompanyVendorFile latestFile = files.stream() .filter(v -> v.getSignDate() != null && v.isValid()) .max(Comparator.comparing(CompanyVendorFile::getSignDate)) 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 9b734ed..1a8c4ff 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 @@ -190,7 +190,7 @@ public class CompanyVendorService extends CompanyBasicService implements IEntity @Override protected > boolean fillFileAsDefaultType(F dbFile, File file, Consumer status) { - dbFile.setType((T) CompanyVendorFileType.General); + dbFile.setType((T) VendorFileType.General); fillFile(dbFile, file, null, status); companyVendorFileService.save((CompanyVendorFile) dbFile); return true; @@ -199,7 +199,7 @@ public class CompanyVendorService extends CompanyBasicService implements IEntity @Override protected > F fillFileType(File file, List fileList, Consumer status) { CompanyVendorFile vendorFile = new CompanyVendorFile(); - vendorFile.setType(CompanyVendorFileType.General); + vendorFile.setType(VendorFileType.General); vendorFile.setFilePath(file.getAbsolutePath()); fillFile(vendorFile, file, fileList, status); return (F) vendorFile; @@ -208,8 +208,8 @@ public class CompanyVendorService extends CompanyBasicService implements IEntity @Override protected > boolean setFileTypeAsEvaluationForm(F file) { T type = file.getType(); - if (type != CompanyVendorFileType.EvaluationForm) { - file.setType((T) CompanyVendorFileType.EvaluationForm); + if (type != VendorFileType.EvaluationForm) { + file.setType((T) VendorFileType.EvaluationForm); return true; } return false; 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 3a3d71f..e02388f 100644 --- a/server/src/main/java/com/ecep/contract/service/WebSocketServerTaskManager.java +++ b/server/src/main/java/com/ecep/contract/service/WebSocketServerTaskManager.java @@ -2,6 +2,7 @@ package com.ecep.contract.service; import com.ecep.contract.Message; import com.ecep.contract.constant.WebSocketConstant; +import com.ecep.contract.ui.Tasker; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; @@ -13,7 +14,11 @@ import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import java.io.IOException; +import java.util.Locale; import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @Service @@ -29,7 +34,9 @@ public class WebSocketServerTaskManager implements InitializingBean { public void afterPropertiesSet() throws Exception { taskClzMap = Map.of( "ContractSyncTask", "com.ecep.contract.cloud.u8.ContractSyncTask", - "ContractRepairTask", "com.ecep.contract.ds.contract.tasker.ContractRepairTask" + "ContractRepairTask", "com.ecep.contract.ds.contract.tasker.ContractRepairTask", + "ContractVerifyTask", "com.ecep.contract.ds.contract.tasker.ContractVerifyTask", + "ProjectCostImportItemsFromContractsTasker", "com.ecep.contract.ds.project.ProjectCostImportItemsFromContractsTasker" ); } @@ -62,7 +69,6 @@ public class WebSocketServerTaskManager implements InitializingBean { JsonNode argsNode = jsonNode.get(WebSocketConstant.ARGUMENTS_FIELD_NAME); String taskName = argsNode.get(0).asText(); - String clzName = taskClzMap.get(taskName); if (clzName == null) { throw new IllegalArgumentException("未知的任务类型: " + taskName); @@ -77,15 +83,32 @@ public class WebSocketServerTaskManager implements InitializingBean { throw new IllegalArgumentException("任务类型: " + taskName + ", class: " + clzName + " 实例化失败"); } + if (tasker instanceof Tasker t) { + String locale = argsNode.get(1).asText(); + t.setLocale(Locale.forLanguageTag(locale)); + } + if (tasker instanceof WebSocketServerTasker t) { t.setTitleHandler(title -> sendToSession(session, sessionId, "title", title)); t.setMessageHandler(msg -> sendMessageToSession(session, sessionId, msg)); 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); + t.init(argsNode.get(2)); } + + if (tasker instanceof Callable callable) { + Thread.ofVirtual().start(() -> { + try { + sendToSession(session, sessionId, "start"); + callable.call(); + sendToSession(session, sessionId, "done"); + } catch (Exception e) { + + throw new RuntimeException(e); + } + }); + } + } private boolean sendMessageToSession(WebSocketSession session, String sessionId, Message msg) {