feat: 实现文件类型枚举的本地化支持

新增文件类型枚举的本地化功能,包括供应商、项目、公司、合同和客户文件类型。添加了相关的SQL表结构、Repository、Service、ViewModel和StringConverter实现。同时更新了文档说明如何创建和使用枚举类型的本地化功能。

修改了客户文件类型的相关代码,统一使用CustomerFileTypeLocalVo替代原有的CompanyCustomerFileTypeLocal,优化了代码结构和一致性。添加了文件类型枚举的缓存支持,提高了性能。

更新了create_enum.md文档,详细说明了文件类型枚举本地化的实现方式和相关组件清单。
This commit is contained in:
2025-09-23 22:34:59 +08:00
parent 4b8c1d4038
commit 57fbae90c5
27 changed files with 633 additions and 42 deletions

View File

@@ -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<CustomerFileType, CompanyCustomerFileTypeLocal> observableMapByLocal = FXCollections
ObservableMap<CustomerFileType, CustomerFileTypeLocalVo> observableMapByLocal = FXCollections
.observableMap(fileTypeService.findAll(getLocale()));
fileTable_typeColumn.setCellValueFactory(param -> Bindings.valueAt(observableMapByLocal,
param.getValue().getType()).map(BaseEnumEntity::getValue));

View File

@@ -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<CompanyFileTypeLocalVo> {
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);
}
}

View File

@@ -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<ContractFileTypeLocalVo> {
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);
}
}

View File

@@ -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<CustomerFileTypeLocalVo> {
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);
}
}

View File

@@ -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<ProjectFileTypeLocalVo> {
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);
}
}

View File

@@ -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<VendorFileTypeLocalVo> {
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);
}
}

View File

@@ -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<CompanyCustomerFileTypeLocal, CompanyCustomerFileTypeLocalViewModel>{
@CacheConfig(cacheNames = "company-customer-file-type")
public class CompanyCustomerFileTypeService
extends QueryService<CustomerFileTypeLocalVo, CompanyCustomerFileTypeLocalViewModel> {
private final StringConverter<CustomerFileTypeLocalVo> 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<CustomerFileTypeLocalVo> 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<CustomerFileType, CompanyCustomerFileTypeLocal> findAll(Locale locale) {
public Map<CustomerFileType, CustomerFileTypeLocalVo> findAll(Locale locale) {
Map<String, Object> 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<CustomerFileTypeLocalVo> 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);
}
}

View File

@@ -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<CompanyFileTypeLocalVo, CompanyFileTypeLocalViewModel> {
private final StringConverter<CompanyFileTypeLocalVo> stringConverter = new CompanyFileTypeStringConverter(this);
@Cacheable(key = "#p0")
@Override
public CompanyFileTypeLocalVo findById(Integer id) {
return super.findById(id);
}
@Cacheable(key = "'all'")
@Override
public List<CompanyFileTypeLocalVo> 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<CompanyFileType, CompanyFileTypeLocalVo> 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<CompanyFileTypeLocalVo> 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);
}
}

View File

@@ -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<ContractFileTypeLocalVo, ContractFileTypeLocalViewModel> {
private final StringConverter<ContractFileTypeLocalVo> 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<ContractFileTypeLocalVo> 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<ContractFileType, ContractFileTypeLocalVo> findAll(Locale locale) {
@@ -31,4 +59,14 @@ public class ContractFileTypeService extends QueryService<ContractFileTypeLocalV
public ContractFileTypeLocalVo findByType(Locale locale, ContractFileType type) {
return findAll(ParamUtils.builder().equals("lang", locale.toLanguageTag()).equals("type", type).build(), Pageable.ofSize(1)).stream().findFirst().orElse(null);
}
@Override
public StringConverter<ContractFileTypeLocalVo> 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);
}
}

View File

@@ -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<ProjectFileTypeLocalVo, ProjectFileTypeLocalViewModel> {
private final StringConverter<ProjectFileTypeLocalVo> stringConverter = new ProjectFileTypeStringConverter(this);
@Cacheable(key = "#p0")
@Override
public ProjectFileTypeLocalVo findById(Integer id) {
return super.findById(id);
}
@Cacheable(key = "'all'")
@Override
public List<ProjectFileTypeLocalVo> 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<ProjectFileType, ProjectFileTypeLocalVo> 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<ProjectFileTypeLocalVo> 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);
}
}

View File

@@ -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<VendorFileTypeLocalVo, VendorFileTypeLocalViewModel> {
private final StringConverter<VendorFileTypeLocalVo> stringConverter = new VendorFileTypeStringConverter(this);
@Cacheable(key = "#p0")
@Override
public VendorFileTypeLocalVo findById(Integer id) {
@@ -52,4 +52,14 @@ public class VendorFileTypeService extends QueryService<VendorFileTypeLocalVo, V
return findAll(ParamUtils.builder().equals("lang", locale.toLanguageTag()).build(), Pageable.unpaged()).stream()
.collect(Collectors.toMap(VendorFileTypeLocalVo::getType, Function.identity()));
}
@Override
public StringConverter<VendorFileTypeLocalVo> 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);
}
}

View File

@@ -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<CustomerFileType, CompanyCustomerFileTypeLocal> {
public class CompanyCustomerFileTypeLocalViewModel extends EnumViewModel<CustomerFileType, CustomerFileTypeLocalVo> {
}

View File

@@ -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<CustomerFileType, CustomerFileTypeLocalVo> {
}

View File

@@ -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<ProjectFileType, ProjectFileTypeLocalVo> {
}