refactor(controller): 重构枚举类型相关代码,优化类型转换和显示逻辑

重构枚举类型的处理逻辑,统一使用Vo对象替代Model对象
- 修改ComboBoxUtils初始化逻辑,支持更多类型转换
- 实现VendorCatalogStringConverter用于类型转换
- 更新ContractFileTypeListCell和ContractFileTypeTableCell显示逻辑
- 调整VendorTabSkinFile和CompanyVendorTabSkinBase使用新的类型转换方式
- 更新相关服务类接口,添加类型转换方法
- 修改FXML文件添加类型选择控件
This commit is contained in:
2025-09-23 18:24:00 +08:00
parent 73cbb4e19e
commit 543311c676
21 changed files with 396 additions and 248 deletions

View File

@@ -125,6 +125,7 @@ public class ComboBoxUtils {
list.addAll(queryService.findAll());
comboBox.setItems(list);
EntityStringConverter<T> converter = new EntityStringConverter<>(list);
comboBox.setConverter(converter);

View File

@@ -1,4 +1,41 @@
package com.ecep.contract.controller.list.cell;
public class ContractFileTypeListCell {
import com.ecep.contract.ContractFileType;
import com.ecep.contract.Desktop;
import com.ecep.contract.service.ContractFileTypeService;
import com.ecep.contract.vo.ContractFileTypeLocalVo;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.util.Callback;
/**
* @param <T>
*/
public class ContractFileTypeListCell<T> extends ListCell<ContractFileType> {
public static Callback<ListView<ContractFileType>, ListCell<ContractFileType>> forListView(ContractFileTypeService typeService) {
return listView -> new ContractFileTypeListCell<>(typeService);
}
private final ContractFileTypeService service;
public ContractFileTypeListCell(ContractFileTypeService service) {
this.service = service;
}
@Override
protected void updateItem(ContractFileType item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setText(null);
return;
}
ContractFileTypeLocalVo local = service.findByType(Desktop.instance.getActiveEmployee().localeProperty().get(), item);
if (local == null) {
setText(item.name());
} else {
setText(local.getValue());
}
}
}

View File

@@ -3,6 +3,7 @@ package com.ecep.contract.controller.project.sale_type;
import java.util.Arrays;
import java.util.List;
import com.ecep.contract.controller.list.cell.ContractFileTypeListCell;
import org.controlsfx.control.ListSelectionView;
import com.ecep.contract.ContractFileType;
@@ -36,8 +37,6 @@ public class ProjectSaleTypeRequireFilesTabSkin extends AbstProjectSaleTypeBased
private final SimpleBooleanProperty changed = new SimpleBooleanProperty(false);
private ListSelectionView<ContractFileType> fileTypesField;
private final ObservableMap<ContractFileType, ContractFileTypeLocal> fileTypeLocalMap = FXCollections
.observableHashMap();
@Setter
private ProjectSaleTypeRequireFileTypeService requireFileTypeService;
@@ -63,7 +62,6 @@ public class ProjectSaleTypeRequireFilesTabSkin extends AbstProjectSaleTypeBased
public void initializeTab() {
initializeListView();
loadSelectedRoles();
fileTypeLocalMap.putAll(getCachedBean(ContractFileTypeService.class).findAll(getLocale()));
}
private void loadSelectedRoles() {
@@ -79,22 +77,7 @@ public class ProjectSaleTypeRequireFilesTabSkin extends AbstProjectSaleTypeBased
List<ContractFileType> types = Arrays.stream(ContractFileType.values())
.filter(ContractFileType::isSupportCustomer).toList();
fileTypesField.getSourceItems().setAll(types);
fileTypesField.setCellFactory(param -> new ListCell<>() {
@Override
protected void updateItem(ContractFileType item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setText(null);
} else {
ContractFileTypeLocal local = fileTypeLocalMap.get(item);
if (local == null) {
setText(item.name());
} else {
setText(local.getValue());
}
}
}
});
fileTypesField.setCellFactory(ContractFileTypeListCell.forListView(getCachedBean(ContractFileTypeService.class)));
fileTypesField.getTargetItems().addListener((ListChangeListener<ContractFileType>) change -> {
while (change.next()) {

View File

@@ -1,16 +1,28 @@
package com.ecep.contract.controller.tab;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import javax.imageio.ImageIO;
import com.ecep.contract.*;
import com.ecep.contract.constant.ContractConstant;
import com.ecep.contract.controller.contract.AbstContractTableTabSkin;
import com.ecep.contract.controller.contract.ContractWindowController;
import com.ecep.contract.controller.table.EditableEntityTableTabSkin;
import com.ecep.contract.controller.table.cell.ContractFileTypeTableCell;
import com.ecep.contract.controller.table.cell.LocalDateFieldTableCell;
import com.ecep.contract.model.ContractFileTypeLocal;
import com.ecep.contract.service.ContractFileService;
import com.ecep.contract.service.ContractFileTypeService;
import com.ecep.contract.util.FxmlPath;
import com.ecep.contract.util.UITools;
import com.ecep.contract.vm.ContractFileViewModel;
import com.ecep.contract.vo.ContractFileTypeLocalVo;
import com.ecep.contract.vo.ContractFileVo;
import com.ecep.contract.vo.ContractVo;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.scene.control.*;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.stage.WindowEvent;
import javafx.util.StringConverter;
import lombok.Setter;
import org.apache.pdfbox.Loader;
import org.apache.pdfbox.io.IOUtils;
import org.apache.pdfbox.io.MemoryUsageSetting;
@@ -25,46 +37,15 @@ import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.springframework.util.StringUtils;
import com.ecep.contract.ContractFileType;
import com.ecep.contract.ContractPayWay;
import com.ecep.contract.DesktopUtils;
import com.ecep.contract.MyDateTimeUtils;
import com.ecep.contract.SpringApp;
import com.ecep.contract.constant.ContractConstant;
import com.ecep.contract.controller.contract.AbstContractTableTabSkin;
import com.ecep.contract.controller.contract.ContractWindowController;
import com.ecep.contract.controller.table.EditableEntityTableTabSkin;
import com.ecep.contract.controller.table.cell.LocalDateFieldTableCell;
import com.ecep.contract.model.Contract;
import com.ecep.contract.model.ContractFile;
import com.ecep.contract.model.ContractFileTypeLocal;
import com.ecep.contract.service.ContractFileService;
import com.ecep.contract.service.ContractFileTypeService;
import com.ecep.contract.util.FxmlPath;
import com.ecep.contract.util.UITools;
import com.ecep.contract.vm.ContractFileViewModel;
import com.ecep.contract.vo.ContractFileVo;
import com.ecep.contract.vo.ContractVo;
import javafx.beans.binding.Bindings;
import javafx.collections.FXCollections;
import javafx.collections.MapChangeListener;
import javafx.collections.ObservableList;
import javafx.collections.ObservableMap;
import javafx.event.ActionEvent;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.Tab;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.stage.WindowEvent;
import javafx.util.StringConverter;
import lombok.Setter;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* 合同文件
@@ -82,15 +63,13 @@ public class ContractTabSkinFiles
public Menu fileTable_menu_change_type;
public Menu fileTable_menu_change_type_and_name;
public TableColumn<ContractFileViewModel, Number> fileTable_idColumn;
public TableColumn<ContractFileViewModel, ContractFileTypeLocal> fileTable_typeColumn;
public TableColumn<ContractFileViewModel, ContractFileType> fileTable_typeColumn;
public TableColumn<ContractFileViewModel, String> fileTable_filePathColumn;
public TableColumn<ContractFileViewModel, LocalDate> fileTable_applyDateColumn;
public TableColumn<ContractFileViewModel, String> fileTable_descriptionColumn;
@Setter
private ContractFileService contractFileService;
private final ObservableMap<ContractFileType, ContractFileTypeLocal> fileTypeLocalMap = FXCollections
.observableHashMap();
public ContractTabSkinFiles(ContractWindowController controller) {
super(controller);
@@ -150,44 +129,9 @@ public class ContractTabSkinFiles
fileTable_idColumn.setReorderable(false);
fileTable_typeColumn
.setCellValueFactory(param -> Bindings.valueAt(fileTypeLocalMap, param.getValue().getType()));
.setCellValueFactory(param -> param.getValue().getType());
fileTable_typeColumn
.setCellFactory(param -> new TextFieldTableCell<>(new ContractFileTypeLocalStringConverter()));
// 监听 type map 变化
fileTypeLocalMap
.addListener((MapChangeListener<? super ContractFileType, ? super ContractFileTypeLocal>) change -> {
List<ContractFileTypeLocal> types = fileTypeLocalMap.values().stream().filter(typeLocal -> {
ContractFileType type = typeLocal.getType();
if (type == null) {
return false;
}
if (isCustomer && !type.isSupportCustomer()) {
return false;
}
return !isVendor || type.isSupportVendor();
}).toList();
fileTable_menu_change_type.getItems().setAll(types.stream()
.map(typeLocal -> {
MenuItem item = new MenuItem();
item.setText(typeLocal.getValue());
item.getProperties().put("typeLocal", typeLocal);
item.setOnAction(this::onFileTableContextMenuChangeTypeAndNameAction);
return item;
}).toList());
fileTable_menu_change_type_and_name.getItems().setAll(types.stream()
.filter(typeLocal -> StringUtils.hasText(typeLocal.getSuggestFileName()))
.map(typeLocal -> {
MenuItem item = new MenuItem();
item.setText(typeLocal.getValue());
item.getProperties().put("typeLocal", typeLocal);
item.getProperties().put("rename", true);
item.setOnAction(this::onFileTableContextMenuChangeTypeAndNameAction);
return item;
}).toList());
});
.setCellFactory(ContractFileTypeTableCell.forTableColumn(getCachedBean(ContractFileTypeService.class)));
fileTable_typeColumn.setEditable(false);
/* 文件名编辑器 */
@@ -249,7 +193,6 @@ public class ContractTabSkinFiles
createVendorContractRequestByTemplateUpdateMenuItem(),
createVendorContractApplyByTemplateUpdateMenuItem());
fileTypeLocalMap.putAll(getCachedBean(ContractFileTypeService.class).findAll(getLocale()));
super.initializeTab();
}
@@ -508,7 +451,7 @@ public class ContractTabSkinFiles
file.setApplyDate(LocalDate.now());
String fileName = item.getText();
ContractFileTypeLocal local = fileTypeLocalMap.get(ContractFileType.CostForm);
ContractFileTypeLocalVo local = getCachedBean(ContractFileTypeService.class).findByType(getLocale(), ContractFileType.CostForm);
if (local != null) {
if (StringUtils.hasText(local.getSuggestFileName())) {
fileName = local.getSuggestFileName();

View File

@@ -1,4 +1,54 @@
package com.ecep.contract.controller.table.cell;
public class ContractFileTypeTableCell {
import com.ecep.contract.ContractFileType;
import com.ecep.contract.SpringApp;
import com.ecep.contract.service.ContractFileTypeService;
import com.ecep.contract.vo.ContractFileTypeLocalVo;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.util.Callback;
/**
* 合同文件类型单元格,用于在表格中显示合同文件类型信息
*/
public class ContractFileTypeTableCell<T> extends AsyncUpdateTableCell<T, ContractFileType, ContractFileTypeLocalVo> {
private ContractFileTypeService contractFileTypeService;
/**
* 创建一个用于表格列的单元格工厂
*/
public static <T> Callback<TableColumn<T, ContractFileType>, TableCell<T, ContractFileType>> forTableColumn(
ContractFileTypeService service) {
return param -> new ContractFileTypeTableCell<>(service);
}
public ContractFileTypeTableCell() {
}
public ContractFileTypeTableCell(ContractFileTypeService service) {
setService(service);
}
@Override
protected ContractFileTypeService getServiceBean() {
if (contractFileTypeService == null) {
contractFileTypeService = SpringApp.getBean(ContractFileTypeService.class);
}
return contractFileTypeService;
}
@Override
protected ContractFileTypeLocalVo initialize() {
ContractFileType item = getItem();
ContractFileTypeLocalVo localVo = getServiceBean().findByType(com.ecep.contract.Desktop.instance.getActiveEmployee().localeProperty().get(), item);
return localVo;
}
@Override
public String format(ContractFileTypeLocalVo entity) {
if (entity == null) {
return null;
}
return entity.getValue();
}
}

View File

@@ -5,12 +5,14 @@ import java.util.List;
import com.ecep.contract.MyDateTimeUtils;
import com.ecep.contract.SpringApp;
import com.ecep.contract.VendorType;
import com.ecep.contract.controller.ComboBoxUtils;
import com.ecep.contract.controller.company.CompanyWindowController;
import com.ecep.contract.controller.tab.AbstEntityBasedTabSkin;
import com.ecep.contract.model.VendorTypeLocal;
import com.ecep.contract.service.CompanyContactService;
import com.ecep.contract.service.CompanyVendorService;
import com.ecep.contract.service.VendorCatalogService;
import com.ecep.contract.service.VendorTypeService;
import com.ecep.contract.util.UITools;
import com.ecep.contract.vm.CompanyVendorViewModel;
@@ -18,7 +20,11 @@ import com.ecep.contract.vm.CompanyViewModel;
import com.ecep.contract.vo.CompanyVendorVo;
import com.ecep.contract.vo.CompanyVo;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Tab;
import javafx.util.converter.LocalDateStringConverter;
import javafx.util.converter.LocalDateTimeStringConverter;
@@ -52,7 +58,9 @@ public class CompanyVendorTabSkinBase
controller.developDateField.setConverter(converter);
controller.developDateField.valueProperty().bindBidirectional(viewModel.getDevelopDate());
ComboBoxUtils.initialComboBox(controller.catalogField, viewModel.getCatalog(), getCachedBean(VendorTypeService.class), true);
ComboBoxUtils.initialComboBox(controller.catalogField, viewModel.getCatalog(), getCachedBean(VendorCatalogService.class), true);
initialTypeComboBox();
controller.protocolProviderField.selectedProperty().bindBidirectional(viewModel.getProtocolProvider());
UITools.autoCompletion(controller.contactField, viewModel.getContact(), getCompanyContactService());
@@ -81,6 +89,17 @@ public class CompanyVendorTabSkinBase
controller.pathAsNameBtn.setOnAction(this::onPathSameAsNameAction);
}
private void initialTypeComboBox() {
VendorTypeService typeService = getCachedBean(VendorTypeService.class);
ObservableList<VendorType> list = FXCollections.observableArrayList();
ComboBox<VendorType> comboBox = controller.typeField;
list.add(null);
list.addAll(VendorType.values());
comboBox.setItems(list);
comboBox.setConverter(typeService.getTypeStringConverter());
comboBox.valueProperty().bindBidirectional(viewModel.getType());
}
public void onCreatePathAction(ActionEvent event) {
CompanyVendorVo companyVendor = getEntity();
if (getCompanyVendorService().makePathAbsent(companyVendor)) {

View File

@@ -2,6 +2,9 @@ package com.ecep.contract.controller.vendor;
import java.io.File;
import com.ecep.contract.VendorType;
import com.ecep.contract.model.VendorCatalog;
import com.ecep.contract.vo.VendorCatalogVo;
import com.ecep.contract.vo.VendorTypeLocalVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -56,7 +59,8 @@ public class CompanyVendorWindowController extends AbstEntityController<CompanyV
public Tab fileTab;
public Tab entityTab;
public ComboBox<VendorTypeLocalVo> catalogField;
public ComboBox<VendorCatalogVo> catalogField;
public ComboBox<VendorType> typeField;
public CheckBox protocolProviderField;
public TextField pathField;
public TextArea descriptionField;

View File

@@ -6,10 +6,12 @@ import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import com.ecep.contract.service.VendorFileTypeService;
import com.ecep.contract.util.ProxyUtils;
import com.ecep.contract.vo.CompanyVendorFileVo;
import com.ecep.contract.vo.CompanyVendorVo;
import com.ecep.contract.vo.CompanyVo;
import com.ecep.contract.vo.VendorFileTypeLocalVo;
import org.springframework.util.StringUtils;
import com.ecep.contract.VendorFileType;
@@ -94,8 +96,9 @@ public class VendorTabSkinFile
table.disableProperty().bind(viewModel.getPath().isEmpty());
fileTable_idColumn.setCellValueFactory(param -> param.getValue().getId());
ObservableMap<VendorFileType, VendorFileTypeLocal> observableMapByLocal = FXCollections
.observableMap(companyVendorFileService.getFileTypeLocalMap(getLocale()));
ObservableMap<VendorFileType, VendorFileTypeLocalVo> observableMapByLocal = FXCollections
.observableMap(getCachedBean(VendorFileTypeService.class).findAll(getLocale()));
fileTable_typeColumn.setCellValueFactory(param -> Bindings.valueAt(observableMapByLocal,
param.getValue().getType()).map(BaseEnumEntity::getValue));

View File

@@ -3,6 +3,8 @@ package com.ecep.contract.controller.vendor.group;
import java.util.Arrays;
import java.util.List;
import com.ecep.contract.controller.list.cell.ContractFileTypeListCell;
import com.ecep.contract.vo.ContractFileTypeLocalVo;
import org.controlsfx.control.ListSelectionView;
import com.ecep.contract.ContractFileType;
@@ -32,8 +34,6 @@ public class VendorGroupRequireFilesTabSkin extends AbstVendorGroupBasedTabSkin
private final SimpleBooleanProperty changed = new SimpleBooleanProperty(false);
private ListSelectionView<ContractFileType> fileTypesField;
private final ObservableMap<ContractFileType, ContractFileTypeLocal> fileTypeLocalMap = FXCollections
.observableHashMap();
public VendorGroupRequireFilesTabSkin(VendorGroupWindowController controller) {
super(controller);
@@ -54,7 +54,6 @@ public class VendorGroupRequireFilesTabSkin extends AbstVendorGroupBasedTabSkin
public void initializeTab() {
initializeListView();
loadSelectedRoles();
fileTypeLocalMap.putAll(getContractFileTypeService().findAll(getLocale()));
}
private void loadSelectedRoles() {
@@ -68,23 +67,9 @@ public class VendorGroupRequireFilesTabSkin extends AbstVendorGroupBasedTabSkin
List<ContractFileType> types = Arrays.stream(ContractFileType.values())
.filter(ContractFileType::isSupportVendor).toList();
fileTypesField.getSourceItems().setAll(types);
fileTypesField.setCellFactory(param -> new ListCell<>() {
@Override
protected void updateItem(ContractFileType item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setText(null);
} else {
ContractFileTypeLocal local = fileTypeLocalMap.get(item);
if (local == null) {
setText(item.name());
} else {
setText(local.getValue());
}
}
}
});
fileTypesField.setCellFactory(ContractFileTypeListCell.forListView(getCachedBean(ContractFileTypeService.class)));
fileTypesField.getTargetItems().addListener((ListChangeListener<ContractFileType>) change -> {
while (change.next()) {

View File

@@ -1,4 +1,23 @@
package com.ecep.contract.converter;
public class VendorCatalogStringConverter {
import com.ecep.contract.service.VendorCatalogService;
import com.ecep.contract.vo.VendorCatalogVo;
import javafx.util.StringConverter;
public class VendorCatalogStringConverter extends StringConverter<VendorCatalogVo> {
private final VendorCatalogService service;
public VendorCatalogStringConverter(VendorCatalogService service) {
this.service = service;
}
@Override
public String toString(VendorCatalogVo object) {
return object.getName();
}
@Override
public VendorCatalogVo fromString(String string) {
return service.findByName(string);
}
}

View File

@@ -6,6 +6,8 @@ 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.Cacheable;
import org.springframework.data.domain.Pageable;
@@ -17,14 +19,16 @@ import com.ecep.contract.vm.ContractFileTypeLocalViewModel;
@Service
@CacheConfig(cacheNames = "contract-file-type")
public class ContractFileTypeService extends QueryService<ContractFileTypeLocal, ContractFileTypeLocalViewModel> {
public class ContractFileTypeService extends QueryService<ContractFileTypeLocalVo, ContractFileTypeLocalViewModel> {
@Cacheable
public Map<ContractFileType, ContractFileTypeLocal> findAll(Locale locale) {
Map<String, Object> params = new HashMap<>();
params.put("lang", locale.toLanguageTag());
return findAll(params, Pageable.unpaged()).stream()
.collect(Collectors.toMap(ContractFileTypeLocal::getType, Function.identity()));
public Map<ContractFileType, ContractFileTypeLocalVo> findAll(Locale locale) {
return findAll(ParamUtils.builder().equals("lang", locale.toLanguageTag()).build(), Pageable.unpaged()).stream()
.collect(Collectors.toMap(ContractFileTypeLocalVo::getType, Function.identity()));
}
@Cacheable
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);
}
}

View File

@@ -3,6 +3,7 @@ package com.ecep.contract.service;
import java.util.List;
import java.util.Map;
import javafx.util.StringConverter;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
@@ -17,4 +18,6 @@ public interface IEntityService<T> {
Page<T> findAll(Map<String, Object> params, Pageable pageable);
StringConverter<T> getStringConverter();
}

View File

@@ -2,10 +2,14 @@ package com.ecep.contract.service;
import java.util.List;
import com.ecep.contract.converter.VendorCatalogStringConverter;
import com.ecep.contract.util.ParamUtils;
import javafx.util.StringConverter;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import com.ecep.contract.vm.VendorCatalogViewModel;
@@ -14,27 +18,41 @@ import com.ecep.contract.vo.VendorCatalogVo;
@Service
@CacheConfig(cacheNames = "vendor-catalog")
public class VendorCatalogService extends QueryService<VendorCatalogVo, VendorCatalogViewModel> {
private final VendorCatalogStringConverter stringConverter = new VendorCatalogStringConverter(this);
@Override
@Cacheable(key = "#id")
public VendorCatalogVo findById(Integer id) {
return super.findById(id);
}
public VendorCatalogVo findByName(String string) {
return findAll(ParamUtils.builder().equals("name", string).build(), Pageable.ofSize(1)).stream().findFirst().orElse(null);
}
@Override
@Cacheable(key = "all")
@Cacheable(key = "'all'")
public List<VendorCatalogVo> findAll() {
return super.findAll();
}
@Caching(evict = { @CacheEvict(key = "all"), @CacheEvict(key = "#entity.id") })
@Caching(evict = {@CacheEvict(key = "'all'"), @CacheEvict(key = "#entity.id")})
@Override
public VendorCatalogVo save(VendorCatalogVo entity) {
return super.save(entity);
}
@Caching(evict = { @CacheEvict(key = "all"), @CacheEvict(key = "#entity.id") })
@Caching(evict = {@CacheEvict(key = "'all'"), @CacheEvict(key = "#entity.id")})
@Override
public void delete(VendorCatalogVo entity) {
super.delete(entity);
}
@Override
public StringConverter<VendorCatalogVo> getStringConverter() {
return stringConverter;
}
}

View File

@@ -1,39 +1,55 @@
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.util.ParamUtils;
import com.ecep.contract.vm.VendorFileTypeLocalViewModel;
import com.ecep.contract.vo.CompanyFileTypeLocalVo;
import com.ecep.contract.vo.VendorFileTypeLocalVo;
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;
@Service
@CacheConfig(cacheNames = "vendor-file-type")
public class VendorFileTypeService extends QueryService<VendorFileTypeLocal, VendorFileTypeLocalViewModel> {
public class VendorFileTypeService extends QueryService<VendorFileTypeLocalVo, VendorFileTypeLocalViewModel> {
@Cacheable(key = "#p0")
@Override
public VendorFileTypeLocal findById(Integer id) {
public VendorFileTypeLocalVo findById(Integer id) {
return super.findById(id);
}
@Cacheable(key = "'all'")
@Override
public List<VendorFileTypeLocal> findAll() {
public List<VendorFileTypeLocalVo> findAll() {
return super.findAll();
}
@Caching(put = {@CachePut(key = "#p0.id"), @CachePut(key = "'all'")})
@Override
public VendorFileTypeLocal save(VendorFileTypeLocal entity) {
public VendorFileTypeLocalVo save(VendorFileTypeLocalVo entity) {
return super.save(entity);
}
@Caching(put = {@CachePut(key = "#p0.id"), @CachePut(key = "'all'")})
@Override
public void delete(VendorFileTypeLocal entity) {
public void delete(VendorFileTypeLocalVo entity) {
super.delete(entity);
}
@Cacheable
public Map<VendorFileType, VendorFileTypeLocalVo> findAll(Locale locale) {
return findAll(ParamUtils.builder().equals("lang", locale.toLanguageTag()).build(), Pageable.unpaged()).stream()
.collect(Collectors.toMap(VendorFileTypeLocalVo::getType, Function.identity()));
}
}

View File

@@ -1,5 +1,6 @@
package com.ecep.contract.service;
import com.ecep.contract.SpringApp;
import com.ecep.contract.VendorType;
import com.ecep.contract.converter.VendorTypeStringConverter;
import com.ecep.contract.util.ParamUtils;
@@ -24,12 +25,17 @@ public class VendorTypeService extends QueryService<VendorTypeLocalVo, VendorTyp
return super.findById(id);
}
@Cacheable(key = "'type-'+#p0.ordinal()")
@Cacheable(key = "'type-'+#p0.ordinal()", condition = "#p0 != null")
public VendorTypeLocalVo findByType(VendorType type) {
return findAll(ParamUtils.builder().equals("type", type).build(), Pageable.ofSize(1)).stream().findFirst()
.orElse(null);
}
public VendorTypeLocalVo findByValue(String string) {
return findAll(ParamUtils.builder().equals("value", string).build(), Pageable.ofSize(1)).stream().findFirst()
.orElse(null);
}
@Cacheable(key = "'all'")
@Override
public List<VendorTypeLocalVo> findAll() {
@@ -57,4 +63,25 @@ public class VendorTypeService extends QueryService<VendorTypeLocalVo, VendorTyp
return findAll(ParamUtils.builder().equals("lang", locale.toLanguageTag()).equals("value", string).build(), Pageable.ofSize(1))
.stream().findFirst().orElse(null);
}
public StringConverter<VendorType> getTypeStringConverter() {
return new StringConverter<>() {
final VendorTypeService service = SpringApp.getBean(VendorTypeService.class);
@Override
public String toString(VendorType object) {
if (object == null) {
return "";
}
VendorTypeLocalVo localVo = service.findByType(object);
return localVo.getValue();
}
@Override
public VendorType fromString(String string) {
VendorTypeLocalVo localVo = service.findByValue(string);
return localVo.getType();
}
};
}
}

View File

@@ -502,16 +502,12 @@ public class ContractVerifyComm {
}
}
ContractFileTypeLocal getFileTypeLocal(ContractFileType type) {
if (fileTypeLocalMap == null) {
fileTypeLocalMap = FXCollections
.observableMap(getContractFileTypeService().findAll(getLocale()));
}
return fileTypeLocalMap.get(type);
ContractFileTypeLocalVo getFileTypeLocal(ContractFileType type) {
return getContractFileTypeService().findByType(getLocale(), type);
}
String getFileTypeLocalValue(ContractFileType type) {
ContractFileTypeLocal fileTypeLocal = getFileTypeLocal(type);
ContractFileTypeLocalVo fileTypeLocal = getFileTypeLocal(type);
if (fileTypeLocal == null) {
return type.name();
}

View File

@@ -5,6 +5,7 @@ import java.util.Objects;
import com.ecep.contract.ContractFileType;
import com.ecep.contract.model.ContractFileTypeLocal;
import com.ecep.contract.vo.ContractFileTypeLocalVo;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import lombok.Data;
@@ -12,17 +13,17 @@ import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class ContractFileTypeLocalViewModel extends EnumViewModel<ContractFileType, ContractFileTypeLocal> {
public class ContractFileTypeLocalViewModel extends EnumViewModel<ContractFileType, ContractFileTypeLocalVo> {
private SimpleStringProperty suggestFileName = new SimpleStringProperty();
@Override
protected void updateFrom(ContractFileTypeLocal v) {
protected void updateFrom(ContractFileTypeLocalVo v) {
super.updateFrom(v);
suggestFileName.set(v.getSuggestFileName());
}
@Override
public boolean copyTo(ContractFileTypeLocal v) {
public boolean copyTo(ContractFileTypeLocalVo v) {
boolean ret = super.copyTo(v);
if (!Objects.equals(suggestFileName.get(), v.getSuggestFileName())) {
v.setSuggestFileName(suggestFileName.get());

View File

@@ -1,11 +1,11 @@
package com.ecep.contract.vm;
import com.ecep.contract.VendorFileType;
import com.ecep.contract.model.VendorFileTypeLocal;
import com.ecep.contract.vo.VendorFileTypeLocalVo;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public class VendorFileTypeLocalViewModel extends EnumViewModel<VendorFileType, VendorFileTypeLocal> {
public class VendorFileTypeLocalViewModel extends EnumViewModel<VendorFileType, VendorFileTypeLocalVo> {
}

View File

@@ -1,13 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.DatePicker?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.control.ToolBar?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.paint.Color?>
<?import javafx.scene.text.Font?>
<BorderPane fx:id="root" maxHeight="900" maxWidth="1024" minHeight="300" minWidth="200" prefHeight="600.0"
prefWidth="800.0" xmlns="http://javafx.com/javafx/22" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="com.ecep.contract.controller.vendor.CompanyVendorWindowController">
<BorderPane fx:id="root" maxHeight="900" maxWidth="1024" minHeight="300" minWidth="200" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/22" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.ecep.contract.controller.vendor.CompanyVendorWindowController">
<center>
<TabPane fx:id="tabPane" tabClosingPolicy="UNAVAILABLE" tabMaxWidth="100.0" tabMinWidth="40.0">
<tabs>
@@ -17,94 +32,72 @@
<content>
<VBox>
<children>
<GridPane maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308"
minWidth="150.0" VBox.vgrow="NEVER">
<GridPane maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minWidth="150.0" VBox.vgrow="NEVER">
<columnConstraints>
<ColumnConstraints halignment="CENTER" hgrow="NEVER" maxWidth="200.0"
minWidth="80.0" prefWidth="120.0"/>
<ColumnConstraints hgrow="ALWAYS" maxWidth="1.7976931348623157E308"
minWidth="50.0" prefWidth="180.0"/>
<ColumnConstraints halignment="CENTER" hgrow="NEVER" maxWidth="200.0"
minWidth="80.0" prefWidth="120.0"/>
<ColumnConstraints hgrow="ALWAYS" maxWidth="1.7976931348623157E308"
minWidth="50.0" prefWidth="180.0"/>
<ColumnConstraints halignment="CENTER" hgrow="NEVER" maxWidth="200.0" minWidth="80.0" prefWidth="120.0" />
<ColumnConstraints hgrow="ALWAYS" maxWidth="1.7976931348623157E308" minWidth="50.0" prefWidth="180.0" />
<ColumnConstraints halignment="CENTER" hgrow="NEVER" maxWidth="200.0" minWidth="80.0" prefWidth="120.0" />
<ColumnConstraints hgrow="ALWAYS" maxWidth="1.7976931348623157E308" minWidth="50.0" prefWidth="180.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints fillHeight="false" minHeight="30.0" prefHeight="30.0"
vgrow="NEVER"/>
<RowConstraints fillHeight="false" minHeight="30.0" prefHeight="30.0"
vgrow="NEVER"/>
<RowConstraints fillHeight="false" minHeight="30.0" prefHeight="30.0"
vgrow="NEVER"/>
<RowConstraints fillHeight="false" minHeight="30.0" prefHeight="30.0"
vgrow="NEVER"/>
<RowConstraints fillHeight="false" minHeight="30.0" prefHeight="30.0"
vgrow="NEVER"/>
<RowConstraints fillHeight="false" minHeight="30.0" prefHeight="30.0"
vgrow="NEVER"/>
<RowConstraints fillHeight="false" minHeight="30.0" prefHeight="30.0"
vgrow="NEVER"/>
<RowConstraints fillHeight="false" maxHeight="1.7976931348623157E308"
minHeight="30.0" prefHeight="120.0" vgrow="NEVER"/>
<RowConstraints fillHeight="false" minHeight="30.0" prefHeight="30.0"
vgrow="NEVER"/>
<RowConstraints fillHeight="false" maxHeight="1.7976931348623157E308"
minHeight="30.0" prefHeight="42.0" vgrow="NEVER"/>
<RowConstraints fillHeight="false" minHeight="30.0" prefHeight="30.0" vgrow="NEVER" />
<RowConstraints fillHeight="false" minHeight="30.0" prefHeight="30.0" vgrow="NEVER" />
<RowConstraints fillHeight="false" minHeight="30.0" prefHeight="30.0" vgrow="NEVER" />
<RowConstraints fillHeight="false" minHeight="30.0" prefHeight="30.0" vgrow="NEVER" />
<RowConstraints fillHeight="false" minHeight="30.0" prefHeight="30.0" vgrow="NEVER" />
<RowConstraints fillHeight="false" minHeight="30.0" prefHeight="30.0" vgrow="NEVER" />
<RowConstraints fillHeight="false" minHeight="30.0" prefHeight="30.0" vgrow="NEVER" />
<RowConstraints fillHeight="false" minHeight="30.0" prefHeight="30.0" vgrow="NEVER" />
<RowConstraints fillHeight="false" maxHeight="1.7976931348623157E308" minHeight="30.0" prefHeight="120.0" vgrow="NEVER" />
<RowConstraints fillHeight="false" minHeight="30.0" prefHeight="30.0" vgrow="NEVER" />
<RowConstraints fillHeight="false" maxHeight="1.7976931348623157E308" minHeight="30.0" prefHeight="42.0" vgrow="NEVER" />
</rowConstraints>
<children>
<Label text="分组"/>
<ComboBox fx:id="catalogField" GridPane.columnIndex="1"/>
<Label text="分组" />
<ComboBox fx:id="catalogField" GridPane.columnIndex="1" />
<Label text="联系人" GridPane.rowIndex="3"/>
<TextField fx:id="contactField" GridPane.columnIndex="1"
GridPane.rowIndex="3"/>
<Label text="分类" GridPane.rowIndex="1" />
<ComboBox fx:id="typeField" GridPane.columnIndex="1" GridPane.rowIndex="1" />
<Label text="发展日期" GridPane.rowIndex="2"/>
<DatePicker fx:id="developDateField" promptText="yyyy-MM-dd"
GridPane.columnIndex="1" GridPane.rowIndex="2"/>
<Label layoutX="20.0" layoutY="28.0" text="备注" GridPane.rowIndex="7"/>
<Label text="采购的产品" GridPane.rowIndex="4"/>
<TextField fx:id="purchaseField" GridPane.columnIndex="1"
GridPane.columnSpan="3" GridPane.rowIndex="4"/>
<Label text="存储文件夹" GridPane.rowIndex="5"/>
<TextField fx:id="pathField" GridPane.columnIndex="1"
GridPane.columnSpan="3" GridPane.rowIndex="5">
<Label text="联系人" GridPane.rowIndex="4" />
<TextField fx:id="contactField" GridPane.columnIndex="1" GridPane.rowIndex="4" />
<Label text="发展日期" GridPane.rowIndex="3" />
<DatePicker fx:id="developDateField" promptText="yyyy-MM-dd" GridPane.columnIndex="1" GridPane.rowIndex="3" />
<Label layoutX="20.0" layoutY="28.0" text="备注" GridPane.rowIndex="8" />
<Label text="采购的产品" GridPane.rowIndex="5" />
<TextField fx:id="purchaseField" GridPane.columnIndex="1" GridPane.columnSpan="3" GridPane.rowIndex="5" />
<Label text="存储文件夹" GridPane.rowIndex="6" />
<TextField fx:id="pathField" GridPane.columnIndex="1" GridPane.columnSpan="3" GridPane.rowIndex="6">
<GridPane.margin>
<Insets/>
<Insets />
</GridPane.margin>
</TextField>
<TextArea fx:id="descriptionField" GridPane.columnIndex="1"
GridPane.columnSpan="3" GridPane.rowIndex="7"/>
<HBox alignment="CENTER_RIGHT" spacing="5.0" GridPane.columnIndex="1"
GridPane.columnSpan="3" GridPane.rowIndex="9">
<TextArea fx:id="descriptionField" GridPane.columnIndex="1" GridPane.columnSpan="3" GridPane.rowIndex="8" />
<HBox alignment="CENTER_RIGHT" spacing="5.0" GridPane.columnIndex="1" GridPane.columnSpan="3" GridPane.rowIndex="10">
<children>
</children>
</HBox>
<Label text="创建日期" GridPane.rowIndex="8"/>
<TextField fx:id="createdField" promptText="yyyy-MM-dd"
GridPane.columnIndex="1" GridPane.rowIndex="8"/>
<Label fx:id="versionLabel" text="\@Version" GridPane.rowIndex="9"/>
<HBox alignment="CENTER_RIGHT" spacing="5.0" GridPane.columnIndex="1"
GridPane.columnSpan="3" GridPane.rowIndex="6">
<Label text="创建日期" GridPane.rowIndex="9" />
<TextField fx:id="createdField" promptText="yyyy-MM-dd" GridPane.columnIndex="1" GridPane.rowIndex="9" />
<Label fx:id="versionLabel" text="\@Version" GridPane.rowIndex="10" />
<HBox alignment="CENTER_RIGHT" spacing="5.0" GridPane.columnIndex="1" GridPane.columnSpan="3" GridPane.rowIndex="7">
<children>
<Button fx:id="createPathBtn" mnemonicParsing="false"
text="创建目录"/>
<Button fx:id="changePathBtn" mnemonicParsing="false"
text="变更目录"/>
<Button fx:id="pathAsNameBtn" mnemonicParsing="false"
text="与合同名称同名"/>
<Button fx:id="createPathBtn" mnemonicParsing="false" text="创建目录" />
<Button fx:id="changePathBtn" mnemonicParsing="false" text="变更目录" />
<Button fx:id="pathAsNameBtn" mnemonicParsing="false" text="与合同名称同名" />
</children>
</HBox>
<Label text="协议供货商" GridPane.rowIndex="1"/>
<CheckBox fx:id="protocolProviderField" mnemonicParsing="false"
GridPane.columnIndex="1" GridPane.rowIndex="1"/>
<Label text="协议供货商" GridPane.rowIndex="2" />
<CheckBox fx:id="protocolProviderField" mnemonicParsing="false" GridPane.columnIndex="1" GridPane.rowIndex="2" />
</children>
<VBox.margin>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0"/>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</VBox.margin>
</GridPane>
<Pane prefHeight="50.0" prefWidth="200.0"/>
<Pane prefHeight="50.0" prefWidth="200.0" />
</children>
</VBox>
</content>
@@ -121,29 +114,28 @@
<top>
<ToolBar prefHeight="40.0" prefWidth="200.0" BorderPane.alignment="CENTER">
<items>
<Button onAction="#onCompanyVendorOpenInExplorerAction" text="打开目录(_F)"/>
<Button fx:id="saveBtn" disable="true" text="保存(_S)"/>
<Button fx:id="relativeCompanyBtn" text="关联公司(_L)"/>
<Button onAction="#onCompanyVendorOpenInExplorerAction" text="打开目录(_F)" />
<Button fx:id="saveBtn" disable="true" text="保存(_S)" />
<Button fx:id="relativeCompanyBtn" text="关联公司(_L)" />
</items>
</ToolBar>
</top>
<bottom>
<HBox id="HBox" alignment="CENTER_LEFT" spacing="5.0">
<children>
<Label fx:id="leftStatusLabel" maxHeight="1.7976931348623157E308" text="Left status"
HBox.hgrow="ALWAYS">
<Label fx:id="leftStatusLabel" maxHeight="1.7976931348623157E308" text="Left status" HBox.hgrow="ALWAYS">
<font>
<Font size="11.0" fx:id="x3"/>
<Font size="11.0" fx:id="x3" />
</font>
<textFill>
<Color red="0.625" green="0.625" blue="0.625" fx:id="x4"/>
<Color red="0.625" green="0.625" blue="0.625" fx:id="x4" />
</textFill>
</Label>
<Pane HBox.hgrow="ALWAYS"/>
<Label fx:id="rightStatusLabel" font="$x3" text="Right status" textFill="$x4" HBox.hgrow="NEVER"/>
<Pane HBox.hgrow="ALWAYS" />
<Label fx:id="rightStatusLabel" font="$x3" text="Right status" textFill="$x4" HBox.hgrow="NEVER" />
</children>
<padding>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0"/>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
</padding>
</HBox>
</bottom>

View File

@@ -3,10 +3,11 @@ package com.ecep.contract.vo;
import com.ecep.contract.VendorType;
import com.ecep.contract.model.IdentityEntity;
import com.ecep.contract.model.NamedEntity;
import lombok.Data;
@Data
public class VendorCatalogVo implements IdentityEntity {
public class VendorCatalogVo implements IdentityEntity, NamedEntity {
private Integer id;
private String name;
private String code;

View File

@@ -0,0 +1,46 @@
枚举对象
# 枚举类型清单
- common/src/main/java/com/ecep/contract/VendorType.java
- common/src/main/java/com/ecep/contract/VendorFileType.java
- common/src/main/java/com/ecep/contract/ProjectFileType.java
- common/src/main/java/com/ecep/contract/CompanyFileType.java
- common/src/main/java/com/ecep/contract/ContractFileType.java
- common/src/main/java/com/ecep/contract/CustomerFIleType.java
# Server 模块
## Repository
- server/src/main/java/com/ecep/contract/ds/vendor/repository/VendorTypeLocalRepository.java
## Service
- server/src/main/java/com/ecep/contract/ds/vendor/service/VendorTypeService.java
# Client 模块
## View Model
- client/src/main/java/com/ecep/contract/vm/VendorTypeLocalViewModel.java
## StringConverter
- client/src/main/java/com/ecep/contract/converter/VendorTypeStringConverter.java
## VOView Object
- common/src/main/java/com/ecep/contract/vo/VendorTypeLocalVo.java
## TableCell 表格单元格渲染
- common/src/main/java/com/ecep/contract/controller/table/cell/VendorTypeTableCell.java
# Common 模块
- common/src/main/java/com/ecep/contract/model/VendorTypeLocal.java
# 其他
本文中的所有文件在项目路径下