From 57fbae90c5f3dc152ae32d710613ebfa7b9c8d1c Mon Sep 17 00:00:00 2001 From: songqq Date: Tue, 23 Sep 2025 22:34:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E6=9E=9A=E4=B8=BE=E7=9A=84=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E5=8C=96=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增文件类型枚举的本地化功能,包括供应商、项目、公司、合同和客户文件类型。添加了相关的SQL表结构、Repository、Service、ViewModel和StringConverter实现。同时更新了文档说明如何创建和使用枚举类型的本地化功能。 修改了客户文件类型的相关代码,统一使用CustomerFileTypeLocalVo替代原有的CompanyCustomerFileTypeLocal,优化了代码结构和一致性。添加了文件类型枚举的缓存支持,提高了性能。 更新了create_enum.md文档,详细说明了文件类型枚举本地化的实现方式和相关组件清单。 --- .../customer/CustomerTabSkinFile.java | 4 +- .../CompanyFileTypeStringConverter.java | 24 +++++ .../ContractFileTypeStringConverter.java | 24 +++++ .../CustomerFileTypeStringConverter.java | 28 ++++++ .../ProjectFileTypeStringConverter.java | 25 +++++ .../VendorFileTypeStringConverter.java | 24 +++++ .../CompanyCustomerFileTypeService.java | 69 ++++++++++--- .../service/CompanyFileTypeService.java | 61 +++++++++--- .../service/ContractFileTypeService.java | 46 ++++++++- .../service/ProjectFileTypeService.java | 69 +++++++++++++ .../service/VendorFileTypeService.java | 16 ++- ...CompanyCustomerFileTypeLocalViewModel.java | 5 +- .../vm/CustomerFileTypeLocalViewModel.java | 11 +++ .../vm/ProjectFileTypeLocalViewModel.java | 12 +++ client/src/main/resources/messages.properties | 2 + .../main/resources/messages_zh_CN.properties | 2 + .../contract/vo/ContractFileTypeLocalVo.java | 1 - .../contract/vo/CustomerFileTypeLocalVo.java | 3 + docs/create_enum.md | 75 ++++++++++++-- docs/db/CompanyFileTypeLocal.sql | 9 ++ docs/db/ContractFileTypeLocal.sql | 11 +++ docs/db/CustomerFileTypeLocal.sql | 9 ++ docs/db/ProjectFileTypeLocal.sql | 9 ++ docs/db/VendorFileTypeLocal.sql | 9 ++ docs/db/VendorTypeLocal.sql | 9 ++ .../CustomerFileTypeLocalRepository.java | 20 ++++ .../service/CustomerFileTypeService.java | 98 +++++++++++++++++++ 27 files changed, 633 insertions(+), 42 deletions(-) create mode 100644 client/src/main/java/com/ecep/contract/converter/CompanyFileTypeStringConverter.java create mode 100644 client/src/main/java/com/ecep/contract/converter/ContractFileTypeStringConverter.java create mode 100644 client/src/main/java/com/ecep/contract/converter/CustomerFileTypeStringConverter.java create mode 100644 client/src/main/java/com/ecep/contract/converter/ProjectFileTypeStringConverter.java create mode 100644 client/src/main/java/com/ecep/contract/converter/VendorFileTypeStringConverter.java create mode 100644 client/src/main/java/com/ecep/contract/service/ProjectFileTypeService.java create mode 100644 client/src/main/java/com/ecep/contract/vm/CustomerFileTypeLocalViewModel.java create mode 100644 client/src/main/java/com/ecep/contract/vm/ProjectFileTypeLocalViewModel.java create mode 100644 docs/db/CompanyFileTypeLocal.sql create mode 100644 docs/db/ContractFileTypeLocal.sql create mode 100644 docs/db/CustomerFileTypeLocal.sql create mode 100644 docs/db/ProjectFileTypeLocal.sql create mode 100644 docs/db/VendorFileTypeLocal.sql create mode 100644 docs/db/VendorTypeLocal.sql create mode 100644 server/src/main/java/com/ecep/contract/ds/customer/repository/CustomerFileTypeLocalRepository.java create mode 100644 server/src/main/java/com/ecep/contract/ds/customer/service/CustomerFileTypeService.java 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 6814399..81a84f0 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 @@ -17,7 +17,6 @@ import com.ecep.contract.SpringApp; import com.ecep.contract.constant.CompanyCustomerConstant; import com.ecep.contract.controller.table.EditableEntityTableTabSkin; import com.ecep.contract.model.BaseEnumEntity; -import com.ecep.contract.model.CompanyCustomerFileTypeLocal; import com.ecep.contract.service.CompanyCustomerEvaluationFormFileService; import com.ecep.contract.service.CompanyCustomerFileService; import com.ecep.contract.service.CompanyCustomerFileTypeService; @@ -31,6 +30,7 @@ import com.ecep.contract.vo.CompanyCustomerEvaluationFormFileVo; import com.ecep.contract.vo.CompanyCustomerFileVo; import com.ecep.contract.vo.CompanyCustomerVo; import com.ecep.contract.vo.CompanyVo; +import com.ecep.contract.vo.CustomerFileTypeLocalVo; import javafx.application.Platform; import javafx.beans.binding.Bindings; @@ -106,7 +106,7 @@ 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 observableMapByLocal = FXCollections .observableMap(fileTypeService.findAll(getLocale())); fileTable_typeColumn.setCellValueFactory(param -> Bindings.valueAt(observableMapByLocal, param.getValue().getType()).map(BaseEnumEntity::getValue)); diff --git a/client/src/main/java/com/ecep/contract/converter/CompanyFileTypeStringConverter.java b/client/src/main/java/com/ecep/contract/converter/CompanyFileTypeStringConverter.java new file mode 100644 index 0000000..f22d066 --- /dev/null +++ b/client/src/main/java/com/ecep/contract/converter/CompanyFileTypeStringConverter.java @@ -0,0 +1,24 @@ +package com.ecep.contract.converter; + +import com.ecep.contract.Desktop; +import com.ecep.contract.service.CompanyFileTypeService; +import com.ecep.contract.vo.CompanyFileTypeLocalVo; +import javafx.util.StringConverter; + +public class CompanyFileTypeStringConverter extends StringConverter { + private final CompanyFileTypeService service; + + public CompanyFileTypeStringConverter(CompanyFileTypeService service) { + this.service = service; + } + + @Override + public String toString(CompanyFileTypeLocalVo object) { + return object.getValue(); + } + + @Override + public CompanyFileTypeLocalVo fromString(String string) { + return service.findByLocaleAndValue(Desktop.instance.getActiveEmployee().localeProperty().get(), string); + } +} \ No newline at end of file diff --git a/client/src/main/java/com/ecep/contract/converter/ContractFileTypeStringConverter.java b/client/src/main/java/com/ecep/contract/converter/ContractFileTypeStringConverter.java new file mode 100644 index 0000000..0ba5703 --- /dev/null +++ b/client/src/main/java/com/ecep/contract/converter/ContractFileTypeStringConverter.java @@ -0,0 +1,24 @@ +package com.ecep.contract.converter; + +import com.ecep.contract.Desktop; +import com.ecep.contract.service.ContractFileTypeService; +import com.ecep.contract.vo.ContractFileTypeLocalVo; +import javafx.util.StringConverter; + +public class ContractFileTypeStringConverter extends StringConverter { + private final ContractFileTypeService service; + + public ContractFileTypeStringConverter(ContractFileTypeService service) { + this.service = service; + } + + @Override + public String toString(ContractFileTypeLocalVo object) { + return object.getValue(); + } + + @Override + public ContractFileTypeLocalVo fromString(String string) { + return service.findByLocaleAndValue(Desktop.instance.getActiveEmployee().localeProperty().get(), string); + } +} \ No newline at end of file diff --git a/client/src/main/java/com/ecep/contract/converter/CustomerFileTypeStringConverter.java b/client/src/main/java/com/ecep/contract/converter/CustomerFileTypeStringConverter.java new file mode 100644 index 0000000..24598cd --- /dev/null +++ b/client/src/main/java/com/ecep/contract/converter/CustomerFileTypeStringConverter.java @@ -0,0 +1,28 @@ +package com.ecep.contract.converter; + +import com.ecep.contract.Desktop; +import com.ecep.contract.service.CompanyCustomerFileTypeService; +import com.ecep.contract.vo.CustomerFileTypeLocalVo; + +import javafx.util.StringConverter; + +/** + * 客户文件类型字符串转换器 + */ +public class CustomerFileTypeStringConverter extends StringConverter { + private final CompanyCustomerFileTypeService service; + + public CustomerFileTypeStringConverter(CompanyCustomerFileTypeService service) { + this.service = service; + } + + @Override + public String toString(CustomerFileTypeLocalVo object) { + return object.getValue(); + } + + @Override + public CustomerFileTypeLocalVo fromString(String string) { + return service.findByLocaleAndValue(Desktop.instance.getActiveEmployee().localeProperty().get(), string); + } +} \ No newline at end of file diff --git a/client/src/main/java/com/ecep/contract/converter/ProjectFileTypeStringConverter.java b/client/src/main/java/com/ecep/contract/converter/ProjectFileTypeStringConverter.java new file mode 100644 index 0000000..431df16 --- /dev/null +++ b/client/src/main/java/com/ecep/contract/converter/ProjectFileTypeStringConverter.java @@ -0,0 +1,25 @@ +package com.ecep.contract.converter; + +import com.ecep.contract.Desktop; +import com.ecep.contract.service.ProjectFileTypeService; +import com.ecep.contract.vo.ProjectFileTypeLocalVo; + +import javafx.util.StringConverter; + +public class ProjectFileTypeStringConverter extends StringConverter { + private final ProjectFileTypeService service; + + public ProjectFileTypeStringConverter(ProjectFileTypeService service) { + this.service = service; + } + + @Override + public String toString(ProjectFileTypeLocalVo object) { + return object.getValue(); + } + + @Override + public ProjectFileTypeLocalVo fromString(String string) { + return service.findByLocaleAndValue(Desktop.instance.getActiveEmployee().localeProperty().get(), string); + } +} \ No newline at end of file diff --git a/client/src/main/java/com/ecep/contract/converter/VendorFileTypeStringConverter.java b/client/src/main/java/com/ecep/contract/converter/VendorFileTypeStringConverter.java new file mode 100644 index 0000000..511cf40 --- /dev/null +++ b/client/src/main/java/com/ecep/contract/converter/VendorFileTypeStringConverter.java @@ -0,0 +1,24 @@ +package com.ecep.contract.converter; + +import com.ecep.contract.Desktop; +import com.ecep.contract.service.VendorFileTypeService; +import com.ecep.contract.vo.VendorFileTypeLocalVo; +import javafx.util.StringConverter; + +public class VendorFileTypeStringConverter extends StringConverter { + private final VendorFileTypeService service; + + public VendorFileTypeStringConverter(VendorFileTypeService service) { + this.service = service; + } + + @Override + public String toString(VendorFileTypeLocalVo object) { + return object.getValue(); + } + + @Override + public VendorFileTypeLocalVo fromString(String string) { + return service.findByLocaleAndValue(Desktop.instance.getActiveEmployee().localeProperty().get(), string); + } +} \ No newline at end of file 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 9a9a4e0..6ab2a9f 100644 --- a/client/src/main/java/com/ecep/contract/service/CompanyCustomerFileTypeService.java +++ b/client/src/main/java/com/ecep/contract/service/CompanyCustomerFileTypeService.java @@ -1,27 +1,72 @@ package com.ecep.contract.service; -import com.ecep.contract.CustomerFileType; -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; +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.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import com.ecep.contract.CustomerFileType; +import com.ecep.contract.converter.CustomerFileTypeStringConverter; +import com.ecep.contract.util.ParamUtils; +import com.ecep.contract.vm.CompanyCustomerFileTypeLocalViewModel; +import com.ecep.contract.vo.CustomerFileTypeLocalVo; + +import javafx.util.StringConverter; + @Service -@CacheConfig(cacheNames = "company-file-type") -public class CompanyCustomerFileTypeService extends QueryService{ +@CacheConfig(cacheNames = "company-customer-file-type") +public class CompanyCustomerFileTypeService + extends QueryService { + private final StringConverter stringConverter = new CustomerFileTypeStringConverter(this); + + @Cacheable(key = "#p0") + @Override + public CustomerFileTypeLocalVo findById(Integer id) { + return super.findById(id); + } + + @Cacheable(key = "'all'") + @Override + public java.util.List findAll() { + return super.findAll(); + } + + @Caching(put = { @CachePut(key = "#p0.id"), @CachePut(key = "'all'") }) + @Override + public CustomerFileTypeLocalVo save(CustomerFileTypeLocalVo entity) { + return super.save(entity); + } + + @Caching(put = { @CachePut(key = "#p0.id"), @CachePut(key = "'all'") }) + @Override + public void delete(CustomerFileTypeLocalVo entity) { + super.delete(entity); + } + @Cacheable - public Map findAll(Locale locale) { + 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())); + .collect(Collectors.toMap(CustomerFileTypeLocalVo::getType, Function.identity())); + } + + @Override + public StringConverter getStringConverter() { + return stringConverter; + } + + public CustomerFileTypeLocalVo findByLocaleAndValue(Locale locale, String string) { + return findAll(ParamUtils.builder().equals("lang", locale.toLanguageTag()).equals("value", string).build(), + Pageable.ofSize(1)) + .stream().findFirst().orElse(null); } } diff --git a/client/src/main/java/com/ecep/contract/service/CompanyFileTypeService.java b/client/src/main/java/com/ecep/contract/service/CompanyFileTypeService.java index 22f859b..56d0d94 100644 --- a/client/src/main/java/com/ecep/contract/service/CompanyFileTypeService.java +++ b/client/src/main/java/com/ecep/contract/service/CompanyFileTypeService.java @@ -1,29 +1,66 @@ package com.ecep.contract.service; -import java.util.HashMap; +import com.ecep.contract.CompanyFileType; +import com.ecep.contract.converter.CompanyFileTypeStringConverter; +import com.ecep.contract.util.ParamUtils; +import com.ecep.contract.vm.CompanyFileTypeLocalViewModel; +import com.ecep.contract.vo.CompanyFileTypeLocalVo; +import javafx.util.StringConverter; +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.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; -import com.ecep.contract.util.ParamUtils; -import com.ecep.contract.vo.CompanyFileTypeLocalVo; -import org.springframework.cache.annotation.CacheConfig; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; - -import com.ecep.contract.CompanyFileType; -import com.ecep.contract.model.CompanyFileTypeLocal; -import com.ecep.contract.vm.CompanyFileTypeLocalViewModel; - @Service @CacheConfig(cacheNames = "company-file-type") public class CompanyFileTypeService extends QueryService { + private final StringConverter stringConverter = new CompanyFileTypeStringConverter(this); + + @Cacheable(key = "#p0") + @Override + public CompanyFileTypeLocalVo 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 CompanyFileTypeLocalVo save(CompanyFileTypeLocalVo entity) { + return super.save(entity); + } + + @Caching(put = {@CachePut(key = "#p0.id"), @CachePut(key = "'all'")}) + @Override + public void delete(CompanyFileTypeLocalVo entity) { + super.delete(entity); + } @Cacheable public Map findAll(Locale locale) { return findAll(ParamUtils.builder().equals("lang", locale.toLanguageTag()).build(), Pageable.unpaged()).stream() .collect(Collectors.toMap(CompanyFileTypeLocalVo::getType, Function.identity())); } + + @Override + public StringConverter getStringConverter() { + return stringConverter; + } + + public CompanyFileTypeLocalVo findByLocaleAndValue(Locale locale, String string) { + return findAll(ParamUtils.builder().equals("lang", locale.toLanguageTag()).equals("value", string).build(), Pageable.ofSize(1)) + .stream().findFirst().orElse(null); + } } diff --git a/client/src/main/java/com/ecep/contract/service/ContractFileTypeService.java b/client/src/main/java/com/ecep/contract/service/ContractFileTypeService.java index bc664f0..8611ccd 100644 --- a/client/src/main/java/com/ecep/contract/service/ContractFileTypeService.java +++ b/client/src/main/java/com/ecep/contract/service/ContractFileTypeService.java @@ -1,25 +1,53 @@ package com.ecep.contract.service; -import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; -import com.ecep.contract.util.ParamUtils; -import com.ecep.contract.vo.ContractFileTypeLocalVo; 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.data.domain.Pageable; import org.springframework.stereotype.Service; import com.ecep.contract.ContractFileType; -import com.ecep.contract.model.ContractFileTypeLocal; +import com.ecep.contract.converter.ContractFileTypeStringConverter; +import com.ecep.contract.util.ParamUtils; import com.ecep.contract.vm.ContractFileTypeLocalViewModel; +import com.ecep.contract.vo.ContractFileTypeLocalVo; + +import javafx.util.StringConverter; @Service @CacheConfig(cacheNames = "contract-file-type") public class ContractFileTypeService extends QueryService { + private final StringConverter stringConverter = new ContractFileTypeStringConverter(this); + + @Cacheable(key = "#p0") + @Override + public ContractFileTypeLocalVo findById(Integer id) { + return super.findById(id); + } + + @Cacheable(key = "'all'") + @Override + public java.util.List findAll() { + return super.findAll(); + } + + @Caching(put = { @CachePut(key = "#p0.id"), @CachePut(key = "'all'") }) + @Override + public ContractFileTypeLocalVo save(ContractFileTypeLocalVo entity) { + return super.save(entity); + } + + @Caching(put = { @CachePut(key = "#p0.id"), @CachePut(key = "'all'") }) + @Override + public void delete(ContractFileTypeLocalVo entity) { + super.delete(entity); + } @Cacheable public Map findAll(Locale locale) { @@ -31,4 +59,14 @@ public class ContractFileTypeService extends QueryService getStringConverter() { + return stringConverter; + } + + public ContractFileTypeLocalVo findByLocaleAndValue(Locale locale, String string) { + return findAll(ParamUtils.builder().equals("lang", locale.toLanguageTag()).equals("value", string).build(), Pageable.ofSize(1)) + .stream().findFirst().orElse(null); + } } diff --git a/client/src/main/java/com/ecep/contract/service/ProjectFileTypeService.java b/client/src/main/java/com/ecep/contract/service/ProjectFileTypeService.java new file mode 100644 index 0000000..973f451 --- /dev/null +++ b/client/src/main/java/com/ecep/contract/service/ProjectFileTypeService.java @@ -0,0 +1,69 @@ +package com.ecep.contract.service; + +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +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.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import com.ecep.contract.ProjectFileType; +import com.ecep.contract.converter.ProjectFileTypeStringConverter; +import com.ecep.contract.util.ParamUtils; +import com.ecep.contract.vm.ProjectFileTypeLocalViewModel; +import com.ecep.contract.vo.ProjectFileTypeLocalVo; + +import javafx.util.StringConverter; + +@Service +@CacheConfig(cacheNames = "project-file-type") +public class ProjectFileTypeService extends QueryService { + private final StringConverter stringConverter = new ProjectFileTypeStringConverter(this); + + @Cacheable(key = "#p0") + @Override + public ProjectFileTypeLocalVo 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 ProjectFileTypeLocalVo save(ProjectFileTypeLocalVo entity) { + return super.save(entity); + } + + @Caching(put = { @CachePut(key = "#p0.id"), @CachePut(key = "'all'") }) + @Override + public void delete(ProjectFileTypeLocalVo entity) { + super.delete(entity); + } + + @Cacheable + public Map findAll(Locale locale) { + return findAll(ParamUtils.builder().equals("lang", locale.toLanguageTag()).build(), Pageable.unpaged()).stream() + .collect(Collectors.toMap(ProjectFileTypeLocalVo::getType, Function.identity())); + } + + @Override + public StringConverter getStringConverter() { + return stringConverter; + } + + public ProjectFileTypeLocalVo findByLocaleAndValue(Locale locale, String string) { + return findAll(ParamUtils.builder().equals("lang", locale.toLanguageTag()).equals("value", string).build(), + Pageable.ofSize(1)) + .stream().findFirst().orElse(null); + } +} \ No newline at end of file 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 b82cf9f..6718df6 100644 --- a/client/src/main/java/com/ecep/contract/service/VendorFileTypeService.java +++ b/client/src/main/java/com/ecep/contract/service/VendorFileTypeService.java @@ -1,12 +1,11 @@ package com.ecep.contract.service; -import com.ecep.contract.CompanyFileType; import com.ecep.contract.VendorFileType; -import com.ecep.contract.model.VendorFileTypeLocal; +import com.ecep.contract.converter.VendorFileTypeStringConverter; import com.ecep.contract.util.ParamUtils; import com.ecep.contract.vm.VendorFileTypeLocalViewModel; -import com.ecep.contract.vo.CompanyFileTypeLocalVo; import com.ecep.contract.vo.VendorFileTypeLocalVo; +import javafx.util.StringConverter; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; @@ -23,6 +22,7 @@ import java.util.stream.Collectors; @Service @CacheConfig(cacheNames = "vendor-file-type") public class VendorFileTypeService extends QueryService { + private final StringConverter stringConverter = new VendorFileTypeStringConverter(this); @Cacheable(key = "#p0") @Override public VendorFileTypeLocalVo findById(Integer id) { @@ -52,4 +52,14 @@ public class VendorFileTypeService extends QueryService getStringConverter() { + return stringConverter; + } + + public VendorFileTypeLocalVo findByLocaleAndValue(Locale locale, String string) { + return findAll(ParamUtils.builder().equals("lang", locale.toLanguageTag()).equals("value", string).build(), Pageable.ofSize(1)) + .stream().findFirst().orElse(null); + } } 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 d0d4981..c814e67 100644 --- a/client/src/main/java/com/ecep/contract/vm/CompanyCustomerFileTypeLocalViewModel.java +++ b/client/src/main/java/com/ecep/contract/vm/CompanyCustomerFileTypeLocalViewModel.java @@ -1,12 +1,13 @@ package com.ecep.contract.vm; import com.ecep.contract.CustomerFileType; -import com.ecep.contract.model.CompanyCustomerFileTypeLocal; +import com.ecep.contract.vo.CustomerFileTypeLocalVo; + import lombok.Data; import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = true) -public class CompanyCustomerFileTypeLocalViewModel extends EnumViewModel { +public class CompanyCustomerFileTypeLocalViewModel extends EnumViewModel { } diff --git a/client/src/main/java/com/ecep/contract/vm/CustomerFileTypeLocalViewModel.java b/client/src/main/java/com/ecep/contract/vm/CustomerFileTypeLocalViewModel.java new file mode 100644 index 0000000..4a6dbfd --- /dev/null +++ b/client/src/main/java/com/ecep/contract/vm/CustomerFileTypeLocalViewModel.java @@ -0,0 +1,11 @@ +package com.ecep.contract.vm; + +import com.ecep.contract.CustomerFileType; +import com.ecep.contract.vo.CustomerFileTypeLocalVo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class CustomerFileTypeLocalViewModel extends EnumViewModel { +} \ No newline at end of file diff --git a/client/src/main/java/com/ecep/contract/vm/ProjectFileTypeLocalViewModel.java b/client/src/main/java/com/ecep/contract/vm/ProjectFileTypeLocalViewModel.java new file mode 100644 index 0000000..4416fe3 --- /dev/null +++ b/client/src/main/java/com/ecep/contract/vm/ProjectFileTypeLocalViewModel.java @@ -0,0 +1,12 @@ +package com.ecep.contract.vm; + +import com.ecep.contract.ProjectFileType; +import com.ecep.contract.vo.ProjectFileTypeLocalVo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class ProjectFileTypeLocalViewModel extends EnumViewModel { +} \ No newline at end of file diff --git a/client/src/main/resources/messages.properties b/client/src/main/resources/messages.properties index d881162..8360031 100644 --- a/client/src/main/resources/messages.properties +++ b/client/src/main/resources/messages.properties @@ -3,3 +3,5 @@ ui.vendor.type=Type ui.vendor.description=Description ui.customer.title=[{0}] {1} Customer +ui.customer.type=Type +ui.customer.description=Description diff --git a/client/src/main/resources/messages_zh_CN.properties b/client/src/main/resources/messages_zh_CN.properties index 7a49f89..1be0ff9 100644 --- a/client/src/main/resources/messages_zh_CN.properties +++ b/client/src/main/resources/messages_zh_CN.properties @@ -3,3 +3,5 @@ ui.vendor.type=类型 ui.vendor.description=描述 ui.customer.title=[{0}] {1} 客户 +ui.customer.type=类型 +ui.customer.description=描述 diff --git a/common/src/main/java/com/ecep/contract/vo/ContractFileTypeLocalVo.java b/common/src/main/java/com/ecep/contract/vo/ContractFileTypeLocalVo.java index e97475a..cdeeb04 100644 --- a/common/src/main/java/com/ecep/contract/vo/ContractFileTypeLocalVo.java +++ b/common/src/main/java/com/ecep/contract/vo/ContractFileTypeLocalVo.java @@ -1,6 +1,5 @@ package com.ecep.contract.vo; -import com.ecep.contract.VendorFileType; import com.ecep.contract.model.BaseEnumEntity; import com.ecep.contract.model.IdentityEntity; import com.ecep.contract.ContractFileType; diff --git a/common/src/main/java/com/ecep/contract/vo/CustomerFileTypeLocalVo.java b/common/src/main/java/com/ecep/contract/vo/CustomerFileTypeLocalVo.java index 60c435d..56906a1 100644 --- a/common/src/main/java/com/ecep/contract/vo/CustomerFileTypeLocalVo.java +++ b/common/src/main/java/com/ecep/contract/vo/CustomerFileTypeLocalVo.java @@ -3,9 +3,12 @@ package com.ecep.contract.vo; import com.ecep.contract.CustomerFileType; import com.ecep.contract.model.BaseEnumEntity; import com.ecep.contract.model.IdentityEntity; + import lombok.Data; +import lombok.EqualsAndHashCode; @Data +@EqualsAndHashCode(callSuper = true) public class CustomerFileTypeLocalVo extends BaseEnumEntity implements IdentityEntity { diff --git a/docs/create_enum.md b/docs/create_enum.md index 33b29f1..8e1badf 100644 --- a/docs/create_enum.md +++ b/docs/create_enum.md @@ -1,4 +1,4 @@ -枚举对象 +按枚举型的实现本地化 # 枚举类型清单 @@ -11,42 +11,105 @@ # Server 模块 -## Repository + + + +## Repository - server/src/main/java/com/ecep/contract/ds/vendor/repository/VendorTypeLocalRepository.java +- server/src/main/java/com/ecep/contract/ds/vendor/repository/VendorFileTypeLocalRepository.java +- server/src/main/java/com/ecep/contract/ds/project/repository/ProjectFileTypeLocalRepository.java +- server/src/main/java/com/ecep/contract/ds/company/repository/CompanyFileTypeLocalRepository.java +- server/src/main/java/com/ecep/contract/ds/contract/repository/ContractFileTypeLocalRepository.java +- server/src/main/java/com/ecep/contract/ds/customer/repository/CustomerFileTypeLocalRepository.java ## Service - server/src/main/java/com/ecep/contract/ds/vendor/service/VendorTypeService.java +- server/src/main/java/com/ecep/contract/ds/vendor/service/VendorFileTypeService.java +- server/src/main/java/com/ecep/contract/ds/project/service/ProjectFileTypeService.java +- server/src/main/java/com/ecep/contract/ds/company/service/CompanyFileTypeService.java +- server/src/main/java/com/ecep/contract/ds/contract/service/ContractFileTypeService.java +- server/src/main/java/com/ecep/contract/ds/customer/service/CustomerFileTypeService.java # Client 模块 ## View Model - 所在目录: D:\idea-workspace\Contract-Manager\client\src\main\java\com\ecep\contract\vm +- extends EnumViewModel<枚举类, Vo> + + +### 清单 - client\src\main\java\com\ecep\contract\vm\VendorTypeLocalViewModel.java +- client\src/main/java/com/ecep/contract/vm/VendorFileTypeLocalViewModel.java +- client\src/main/java/com/ecep/contract/vm/ProjectFileTypeLocalViewModel.java +- client\src/main/java/com/ecep/contract/vm/CompanyFileTypeLocalViewModel.java +- client\src/main/java/com/ecep/contract/vm/ContractFileTypeLocalViewModel.java +- client\src/main/java/com/ecep/contract/vm/CustomerFileTypeLocalViewModel.java ## StringConverter +所在目录 client/src/main/java/com/ecep/contract/converter/ +package com.ecep.contract.converter; +### 清单 - client/src/main/java/com/ecep/contract/converter/VendorTypeStringConverter.java +- client/src/main/java/com/ecep/contract/converter/VendorFileTypeStringConverter.java +- client/src/main/java/com/ecep/contract/converter/ProjectFileTypeStringConverter.java +- client/src/main/java/com/ecep/contract/converter/CompanyFileTypeStringConverter.java +- client/src/main/java/com/ecep/contract/converter/ContractFileTypeStringConverter.java +- client/src/main/java/com/ecep/contract/converter/CustomerFileTypeStringConverter.java ## TableCell 表格单元格渲染 - -- common/src/main/java/com/ecep/contract/controller/table/cell/VendorTypeTableCell.java +### 要求 +- 需实现 forTableColumn 静态方法,用于创建表格列的单元格工厂。 +- 表格列的单元格工厂需要接收一个 Service 实例,用于从数据库中获取枚举类型的本地化信息。 +- 表格列的单元格工厂需要实现 Callback 接口,用于创建单元格实例。 +- 表格列的单元格工厂需要在 forTableColumn 方法中接收 Service 实例,用于从数据库中获取枚举类型的本地化信息。 +### 清单 +- client/src/main/java/com/ecep/contract/controller/table/cell/VendorTypeTableCell.java +- client/src/main/java/com/ecep/contract/controller/table/cell/VendorFileTypeTableCell.java +- client/src/main/java/com/ecep/contract/controller/table/cell/ProjectFileTypeTableCell.java +- client/src/main/java/com/ecep/contract/controller/table/cell/CompanyFileTypeTableCell.java +- client/src/main/java/com/ecep/contract/controller/table/cell/ContractFileTypeTableCell.java +- client/src/main/java/com/ecep/contract/controller/table/cell/CustomerFileTypeTableCell.java ## Service -定义注解 @CacheConfig +需要定义注解 @CacheConfig +需要实现 findByLocaleAndValue 方法 -- client/src/main/java/com/ecep/contract/ds/vendor/service/VendorTypeService.java +- client/src/main/java/com/ecep/contract/service/VendorTypeService.java +- client/src/main/java/com/ecep/contract/service/VendorFileTypeService.java +- client/src/main/java/com/ecep/contract/service/ProjectFileTypeService.java +- client/src/main/java/com/ecep/contract/service/CompanyFileTypeService.java +- client/src/main/java/com/ecep/contract/service/ContractFileTypeService.java +- client/src/main/java/com/ecep/contract/service/CompanyCustomerFileTypeService.java # Common 模块 ## Entity 类, 枚举类型的本地化 - common/src/main/java/com/ecep/contract/model/VendorTypeLocal.java +- common/src/main/java/com/ecep/contract/model/VendorFileTypeLocal.java +- common/src/main/java/com/ecep/contract/model/ProjectFileTypeLocal.java +- common/src/main/java/com/ecep/contract/model/CompanyFileTypeLocal.java +- common/src/main/java/com/ecep/contract/model/ContractFileTypeLocal.java +- common/src/main/java/com/ecep/contract/model/CustomerFileTypeLocal.java + +### SQL +每个Entity类创建一个对应的SQL文件,文件名格式为:Entity类名 + .sql,例如:VendorTypeLocal.sql +存储在 docs/db/ 目录下 +数据表名已经定义在 Entity 类的 @Table 注解中 +字段名已经定义在 Entity 类的 @Column 注解中,包括父类的字段 + ## VO(View Object) - common/src/main/java/com/ecep/contract/vo/VendorTypeLocalVo.java +- common/src/main/java/com/ecep/contract/vo/VendorFileTypeLocalVo.java +- common/src/main/java/com/ecep/contract/vo/ProjectFileTypeLocalVo.java +- common/src/main/java/com/ecep/contract/vo/CompanyFileTypeLocalVo.java +- common/src/main/java/com/ecep/contract/vo/ContractFileTypeLocalVo.java +- common/src/main/java/com/ecep/contract/vo/CustomerFileTypeLocalVo.java # 其他 diff --git a/docs/db/CompanyFileTypeLocal.sql b/docs/db/CompanyFileTypeLocal.sql new file mode 100644 index 0000000..b2653c4 --- /dev/null +++ b/docs/db/CompanyFileTypeLocal.sql @@ -0,0 +1,9 @@ +CREATE TABLE if not exists supplier_ms.COMPANY_FILE_TYPE_LOCAL +( + ID INT AUTO_INCREMENT NOT NULL, + TYPE VARCHAR(255) NOT NULL comment '枚举类型', + LANG VARCHAR(255) NOT NULL comment '语言', + VALUE VARCHAR(255) NOT NULL comment '本地化值', + CONSTRAINT pk_company_file_type_local PRIMARY KEY (ID), + CONSTRAINT uq_company_file_type_local UNIQUE KEY (TYPE, LANG) +); \ No newline at end of file diff --git a/docs/db/ContractFileTypeLocal.sql b/docs/db/ContractFileTypeLocal.sql new file mode 100644 index 0000000..948be97 --- /dev/null +++ b/docs/db/ContractFileTypeLocal.sql @@ -0,0 +1,11 @@ +CREATE TABLE if not exists supplier_ms.CONTRACT_FILE_TYPE_LOCAL +( + ID INT AUTO_INCREMENT NOT NULL, + TYPE VARCHAR(255) NOT NULL comment '枚举类型', + LANG VARCHAR(255) NOT NULL comment '语言', + VALUE VARCHAR(255) NOT NULL comment '本地化值', + SUGGEST_FILE_NAME VARCHAR(255) NULL comment '建议的文件名', + DESCRIPTION VARCHAR(255) NULL comment '描述', + CONSTRAINT pk_contract_file_type_local PRIMARY KEY (ID), + CONSTRAINT uq_contract_file_type_local UNIQUE KEY (TYPE, LANG) +); \ No newline at end of file diff --git a/docs/db/CustomerFileTypeLocal.sql b/docs/db/CustomerFileTypeLocal.sql new file mode 100644 index 0000000..fa3dcc9 --- /dev/null +++ b/docs/db/CustomerFileTypeLocal.sql @@ -0,0 +1,9 @@ +CREATE TABLE if not exists supplier_ms.CUSTOMER_FILE_TYPE_LOCAL +( + ID INT AUTO_INCREMENT NOT NULL, + TYPE VARCHAR(255) NOT NULL comment '枚举类型', + LANG VARCHAR(255) NOT NULL comment '语言', + VALUE VARCHAR(255) NOT NULL comment '本地化值', + CONSTRAINT pk_customer_file_type_local PRIMARY KEY (ID), + CONSTRAINT uq_customer_file_type_local UNIQUE KEY (TYPE, LANG) +); \ No newline at end of file diff --git a/docs/db/ProjectFileTypeLocal.sql b/docs/db/ProjectFileTypeLocal.sql new file mode 100644 index 0000000..78ffe65 --- /dev/null +++ b/docs/db/ProjectFileTypeLocal.sql @@ -0,0 +1,9 @@ +CREATE TABLE if not exists supplier_ms.PROJECT_FILE_TYPE_LOCAL +( + ID INT AUTO_INCREMENT NOT NULL, + TYPE VARCHAR(255) NOT NULL comment '枚举类型', + LANG VARCHAR(255) NOT NULL comment '语言', + VALUE VARCHAR(255) NOT NULL comment '本地化值', + CONSTRAINT pk_project_file_type_local PRIMARY KEY (ID), + CONSTRAINT uq_project_file_type_local UNIQUE KEY (TYPE, LANG) +); \ No newline at end of file diff --git a/docs/db/VendorFileTypeLocal.sql b/docs/db/VendorFileTypeLocal.sql new file mode 100644 index 0000000..28bc53d --- /dev/null +++ b/docs/db/VendorFileTypeLocal.sql @@ -0,0 +1,9 @@ +CREATE TABLE if not exists supplier_ms.COMPANY_VENDOR_FILE_TYPE_LOCAL +( + ID INT AUTO_INCREMENT NOT NULL, + TYPE VARCHAR(255) NOT NULL comment '枚举类型', + LANG VARCHAR(255) NOT NULL comment '语言', + VALUE VARCHAR(255) NOT NULL comment '本地化值', + CONSTRAINT pk_company_vendor_file_type_local PRIMARY KEY (ID), + CONSTRAINT uq_company_vendor_file_type_local UNIQUE KEY (TYPE, LANG) +); \ No newline at end of file diff --git a/docs/db/VendorTypeLocal.sql b/docs/db/VendorTypeLocal.sql new file mode 100644 index 0000000..74e4a98 --- /dev/null +++ b/docs/db/VendorTypeLocal.sql @@ -0,0 +1,9 @@ +CREATE TABLE if not exists supplier_ms.VENDOR_TYPE_LOCAL +( + ID INT AUTO_INCREMENT NOT NULL, + TYPE VARCHAR(255) NOT NULL comment '枚举类型', + LANG VARCHAR(255) NOT NULL comment '语言', + VALUE VARCHAR(255) NOT NULL comment '本地化值', + CONSTRAINT pk_vendor_type_local PRIMARY KEY (ID), + CONSTRAINT uq_vendor_type_local UNIQUE KEY (TYPE, LANG) +); \ No newline at end of file diff --git a/server/src/main/java/com/ecep/contract/ds/customer/repository/CustomerFileTypeLocalRepository.java b/server/src/main/java/com/ecep/contract/ds/customer/repository/CustomerFileTypeLocalRepository.java new file mode 100644 index 0000000..c3d3dad --- /dev/null +++ b/server/src/main/java/com/ecep/contract/ds/customer/repository/CustomerFileTypeLocalRepository.java @@ -0,0 +1,20 @@ +package com.ecep.contract.ds.customer.repository; + +import org.springframework.stereotype.Repository; + +import com.ecep.contract.CustomerFileType; +import com.ecep.contract.ds.other.repository.BaseEnumEntityRepository; +import com.ecep.contract.model.CustomerFileTypeLocal; + +@Repository +public interface CustomerFileTypeLocalRepository extends BaseEnumEntityRepository { + @Override + default CustomerFileType[] getEnumConstants() { + return CustomerFileType.values(); + } + + @Override + default CustomerFileTypeLocal newEntity() { + return new CustomerFileTypeLocal(); + } +} \ No newline at end of file diff --git a/server/src/main/java/com/ecep/contract/ds/customer/service/CustomerFileTypeService.java b/server/src/main/java/com/ecep/contract/ds/customer/service/CustomerFileTypeService.java new file mode 100644 index 0000000..d7350cd --- /dev/null +++ b/server/src/main/java/com/ecep/contract/ds/customer/service/CustomerFileTypeService.java @@ -0,0 +1,98 @@ +package com.ecep.contract.ds.customer.service; + +import java.util.Locale; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import com.ecep.contract.CustomerFileType; +import com.ecep.contract.IEntityService; +import com.ecep.contract.QueryService; +import com.ecep.contract.constant.ServiceConstant; +import com.ecep.contract.ds.customer.repository.CustomerFileTypeLocalRepository; +import com.ecep.contract.model.CustomerFileTypeLocal; +import com.ecep.contract.util.SpecificationUtils; +import com.fasterxml.jackson.databind.JsonNode; + +@Lazy +@Service +@CacheConfig(cacheNames = "customer-file-type") +public class CustomerFileTypeService implements IEntityService, QueryService { + @Lazy + @Autowired + private CustomerFileTypeLocalRepository repository; + + @Override + public Page findAll(JsonNode paramsNode, Pageable pageable) { + Specification spec = null; + if (paramsNode.has(ServiceConstant.KEY_SEARCH_TEXT)) { + spec = getSpecification(paramsNode.get(ServiceConstant.KEY_SEARCH_TEXT).asText()); + } + + if (paramsNode.has("type")) { + spec = SpecificationUtils.and(spec, (root, query, builder) -> builder.equal(root.get("type"), CustomerFileType.valueOf(paramsNode.get("type").asText()))); + } + + // field + spec = SpecificationUtils.andFieldEqualParam(spec, paramsNode, "lang", "value"); + return findAll(spec, pageable); + } + + @Cacheable(key = "#p0") + @Override + public CustomerFileTypeLocal findById(Integer id) { + return repository.findById(id).orElse(null); + } + + @Override + public Page findAll(Specification spec, Pageable pageable) { + return repository.findAll(spec, pageable); + } + + @Cacheable(key = "'all-'+#p0.toLanguageTag()") + public Map findAll(Locale locale) { + return repository.getCompleteMapByLocal(locale.toLanguageTag()); + } + + @Override + public Specification getSpecification(String searchText) { + if (!StringUtils.hasText(searchText)) { + return null; + } + return (root, query, builder) -> { + return + // builder.or( + builder.like(root.get("type"), "%" + searchText + "%") + // ) + ; + }; + } + + @Caching(evict = { + @CacheEvict(key = "#p0.id"), + @CacheEvict(key = "'all-'+#p0.getLang()") + }) + @Override + public void delete(CustomerFileTypeLocal entity) { + repository.delete(entity); + } + + @Caching(evict = { + @CacheEvict(key = "#p0.id"), + @CacheEvict(key = "'all-'+#p0.getLang()") + }) + @Override + public CustomerFileTypeLocal save(CustomerFileTypeLocal entity) { + return repository.save(entity); + } +} \ No newline at end of file