From 543311c6769196d05a82008c28bd0e434e638780 Mon Sep 17 00:00:00 2001 From: songqq Date: Tue, 23 Sep 2025 18:24:00 +0800 Subject: [PATCH] =?UTF-8?q?refactor(controller):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=9E=9A=E4=B8=BE=E7=B1=BB=E5=9E=8B=E7=9B=B8=E5=85=B3=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=EF=BC=8C=E4=BC=98=E5=8C=96=E7=B1=BB=E5=9E=8B=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E5=92=8C=E6=98=BE=E7=A4=BA=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构枚举类型的处理逻辑,统一使用Vo对象替代Model对象 - 修改ComboBoxUtils初始化逻辑,支持更多类型转换 - 实现VendorCatalogStringConverter用于类型转换 - 更新ContractFileTypeListCell和ContractFileTypeTableCell显示逻辑 - 调整VendorTabSkinFile和CompanyVendorTabSkinBase使用新的类型转换方式 - 更新相关服务类接口,添加类型转换方法 - 修改FXML文件添加类型选择控件 --- .../contract/controller/ComboBoxUtils.java | 1 + .../list/cell/ContractFileTypeListCell.java | 39 ++++- .../ProjectSaleTypeRequireFilesTabSkin.java | 21 +-- .../controller/tab/ContractTabSkinFiles.java | 129 ++++----------- .../table/cell/ContractFileTypeTableCell.java | 52 +++++- .../vendor/CompanyVendorTabSkinBase.java | 21 ++- .../vendor/CompanyVendorWindowController.java | 6 +- .../controller/vendor/VendorTabSkinFile.java | 7 +- .../group/VendorGroupRequireFilesTabSkin.java | 23 +-- .../VendorCatalogStringConverter.java | 21 ++- .../service/ContractFileTypeService.java | 16 +- .../ecep/contract/service/IEntityService.java | 3 + .../service/VendorCatalogService.java | 24 ++- .../service/VendorFileTypeService.java | 26 ++- .../contract/service/VendorTypeService.java | 29 +++- .../contract/task/ContractVerifyComm.java | 10 +- .../vm/ContractFileTypeLocalViewModel.java | 7 +- .../vm/VendorFileTypeLocalViewModel.java | 4 +- .../resources/ui/company/vendor/vendor.fxml | 156 +++++++++--------- .../com/ecep/contract/vo/VendorCatalogVo.java | 3 +- docs/create_enum.md | 46 ++++++ 21 files changed, 396 insertions(+), 248 deletions(-) diff --git a/client/src/main/java/com/ecep/contract/controller/ComboBoxUtils.java b/client/src/main/java/com/ecep/contract/controller/ComboBoxUtils.java index 0286850..b2083ca 100644 --- a/client/src/main/java/com/ecep/contract/controller/ComboBoxUtils.java +++ b/client/src/main/java/com/ecep/contract/controller/ComboBoxUtils.java @@ -125,6 +125,7 @@ public class ComboBoxUtils { list.addAll(queryService.findAll()); comboBox.setItems(list); + EntityStringConverter converter = new EntityStringConverter<>(list); comboBox.setConverter(converter); diff --git a/client/src/main/java/com/ecep/contract/controller/list/cell/ContractFileTypeListCell.java b/client/src/main/java/com/ecep/contract/controller/list/cell/ContractFileTypeListCell.java index 3a81ad4..907da6f 100644 --- a/client/src/main/java/com/ecep/contract/controller/list/cell/ContractFileTypeListCell.java +++ b/client/src/main/java/com/ecep/contract/controller/list/cell/ContractFileTypeListCell.java @@ -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 + */ +public class ContractFileTypeListCell extends ListCell { + public static Callback, ListCell> 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()); + } + } + + } diff --git a/client/src/main/java/com/ecep/contract/controller/project/sale_type/ProjectSaleTypeRequireFilesTabSkin.java b/client/src/main/java/com/ecep/contract/controller/project/sale_type/ProjectSaleTypeRequireFilesTabSkin.java index 614890a..d01a251 100644 --- a/client/src/main/java/com/ecep/contract/controller/project/sale_type/ProjectSaleTypeRequireFilesTabSkin.java +++ b/client/src/main/java/com/ecep/contract/controller/project/sale_type/ProjectSaleTypeRequireFilesTabSkin.java @@ -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 fileTypesField; - private final ObservableMap 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 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) change -> { while (change.next()) { diff --git a/client/src/main/java/com/ecep/contract/controller/tab/ContractTabSkinFiles.java b/client/src/main/java/com/ecep/contract/controller/tab/ContractTabSkinFiles.java index 1fb2b91..ab0d4fb 100644 --- a/client/src/main/java/com/ecep/contract/controller/tab/ContractTabSkinFiles.java +++ b/client/src/main/java/com/ecep/contract/controller/tab/ContractTabSkinFiles.java @@ -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 fileTable_idColumn; - public TableColumn fileTable_typeColumn; + public TableColumn fileTable_typeColumn; public TableColumn fileTable_filePathColumn; public TableColumn fileTable_applyDateColumn; public TableColumn fileTable_descriptionColumn; @Setter private ContractFileService contractFileService; - private final ObservableMap 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) change -> { - List 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(); diff --git a/client/src/main/java/com/ecep/contract/controller/table/cell/ContractFileTypeTableCell.java b/client/src/main/java/com/ecep/contract/controller/table/cell/ContractFileTypeTableCell.java index 4b74f31..240f42f 100644 --- a/client/src/main/java/com/ecep/contract/controller/table/cell/ContractFileTypeTableCell.java +++ b/client/src/main/java/com/ecep/contract/controller/table/cell/ContractFileTypeTableCell.java @@ -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 extends AsyncUpdateTableCell { + private ContractFileTypeService contractFileTypeService; + + /** + * 创建一个用于表格列的单元格工厂 + */ + public static Callback, TableCell> 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(); + } } diff --git a/client/src/main/java/com/ecep/contract/controller/vendor/CompanyVendorTabSkinBase.java b/client/src/main/java/com/ecep/contract/controller/vendor/CompanyVendorTabSkinBase.java index 894e946..68f7a89 100644 --- a/client/src/main/java/com/ecep/contract/controller/vendor/CompanyVendorTabSkinBase.java +++ b/client/src/main/java/com/ecep/contract/controller/vendor/CompanyVendorTabSkinBase.java @@ -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 list = FXCollections.observableArrayList(); + ComboBox 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)) { diff --git a/client/src/main/java/com/ecep/contract/controller/vendor/CompanyVendorWindowController.java b/client/src/main/java/com/ecep/contract/controller/vendor/CompanyVendorWindowController.java index 35a07e0..2604337 100644 --- a/client/src/main/java/com/ecep/contract/controller/vendor/CompanyVendorWindowController.java +++ b/client/src/main/java/com/ecep/contract/controller/vendor/CompanyVendorWindowController.java @@ -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 catalogField; + public ComboBox catalogField; + public ComboBox typeField; public CheckBox protocolProviderField; public TextField pathField; public TextArea descriptionField; diff --git a/client/src/main/java/com/ecep/contract/controller/vendor/VendorTabSkinFile.java b/client/src/main/java/com/ecep/contract/controller/vendor/VendorTabSkinFile.java index 01735f9..2aef29c 100644 --- a/client/src/main/java/com/ecep/contract/controller/vendor/VendorTabSkinFile.java +++ b/client/src/main/java/com/ecep/contract/controller/vendor/VendorTabSkinFile.java @@ -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 observableMapByLocal = FXCollections - .observableMap(companyVendorFileService.getFileTypeLocalMap(getLocale())); + ObservableMap observableMapByLocal = FXCollections + .observableMap(getCachedBean(VendorFileTypeService.class).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/controller/vendor/group/VendorGroupRequireFilesTabSkin.java b/client/src/main/java/com/ecep/contract/controller/vendor/group/VendorGroupRequireFilesTabSkin.java index 77d8663..0533df4 100644 --- a/client/src/main/java/com/ecep/contract/controller/vendor/group/VendorGroupRequireFilesTabSkin.java +++ b/client/src/main/java/com/ecep/contract/controller/vendor/group/VendorGroupRequireFilesTabSkin.java @@ -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 fileTypesField; - private final ObservableMap 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 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) change -> { while (change.next()) { diff --git a/client/src/main/java/com/ecep/contract/converter/VendorCatalogStringConverter.java b/client/src/main/java/com/ecep/contract/converter/VendorCatalogStringConverter.java index cb4d3fc..1206d6e 100644 --- a/client/src/main/java/com/ecep/contract/converter/VendorCatalogStringConverter.java +++ b/client/src/main/java/com/ecep/contract/converter/VendorCatalogStringConverter.java @@ -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 { + 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); + } } 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 d580cc5..bc664f0 100644 --- a/client/src/main/java/com/ecep/contract/service/ContractFileTypeService.java +++ b/client/src/main/java/com/ecep/contract/service/ContractFileTypeService.java @@ -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 { +public class ContractFileTypeService extends QueryService { @Cacheable - public Map findAll(Locale locale) { - Map params = new HashMap<>(); - params.put("lang", locale.toLanguageTag()); - return findAll(params, Pageable.unpaged()).stream() - .collect(Collectors.toMap(ContractFileTypeLocal::getType, Function.identity())); + public Map 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); + } } diff --git a/client/src/main/java/com/ecep/contract/service/IEntityService.java b/client/src/main/java/com/ecep/contract/service/IEntityService.java index 7955ef6..12ca8f5 100644 --- a/client/src/main/java/com/ecep/contract/service/IEntityService.java +++ b/client/src/main/java/com/ecep/contract/service/IEntityService.java @@ -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 { Page findAll(Map params, Pageable pageable); + + StringConverter getStringConverter(); } diff --git a/client/src/main/java/com/ecep/contract/service/VendorCatalogService.java b/client/src/main/java/com/ecep/contract/service/VendorCatalogService.java index 17da670..dfdc0f4 100644 --- a/client/src/main/java/com/ecep/contract/service/VendorCatalogService.java +++ b/client/src/main/java/com/ecep/contract/service/VendorCatalogService.java @@ -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 { + + 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 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 getStringConverter() { + return stringConverter; + } + + } 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 d3fd31f..b82cf9f 100644 --- a/client/src/main/java/com/ecep/contract/service/VendorFileTypeService.java +++ b/client/src/main/java/com/ecep/contract/service/VendorFileTypeService.java @@ -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 { +public class VendorFileTypeService extends QueryService { @Cacheable(key = "#p0") @Override - public VendorFileTypeLocal findById(Integer id) { + public VendorFileTypeLocalVo findById(Integer id) { return super.findById(id); } @Cacheable(key = "'all'") @Override - public List findAll() { + public List findAll() { return super.findAll(); } @Caching(put = {@CachePut(key = "#p0.id"), @CachePut(key = "'all'")}) @Override - public 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 findAll(Locale locale) { + return findAll(ParamUtils.builder().equals("lang", locale.toLanguageTag()).build(), Pageable.unpaged()).stream() + .collect(Collectors.toMap(VendorFileTypeLocalVo::getType, Function.identity())); + } } diff --git a/client/src/main/java/com/ecep/contract/service/VendorTypeService.java b/client/src/main/java/com/ecep/contract/service/VendorTypeService.java index 47c9091..5304398 100644 --- a/client/src/main/java/com/ecep/contract/service/VendorTypeService.java +++ b/client/src/main/java/com/ecep/contract/service/VendorTypeService.java @@ -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 findAll() { @@ -57,4 +63,25 @@ public class VendorTypeService extends QueryService 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(); + } + }; + } } diff --git a/client/src/main/java/com/ecep/contract/task/ContractVerifyComm.java b/client/src/main/java/com/ecep/contract/task/ContractVerifyComm.java index 4849d60..c58c92d 100644 --- a/client/src/main/java/com/ecep/contract/task/ContractVerifyComm.java +++ b/client/src/main/java/com/ecep/contract/task/ContractVerifyComm.java @@ -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(); } diff --git a/client/src/main/java/com/ecep/contract/vm/ContractFileTypeLocalViewModel.java b/client/src/main/java/com/ecep/contract/vm/ContractFileTypeLocalViewModel.java index 9455bba..fc39f92 100644 --- a/client/src/main/java/com/ecep/contract/vm/ContractFileTypeLocalViewModel.java +++ b/client/src/main/java/com/ecep/contract/vm/ContractFileTypeLocalViewModel.java @@ -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 { +public class ContractFileTypeLocalViewModel extends EnumViewModel { 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()); diff --git a/client/src/main/java/com/ecep/contract/vm/VendorFileTypeLocalViewModel.java b/client/src/main/java/com/ecep/contract/vm/VendorFileTypeLocalViewModel.java index 5c0e405..f5f5654 100644 --- a/client/src/main/java/com/ecep/contract/vm/VendorFileTypeLocalViewModel.java +++ b/client/src/main/java/com/ecep/contract/vm/VendorFileTypeLocalViewModel.java @@ -1,11 +1,11 @@ package com.ecep.contract.vm; import com.ecep.contract.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 { +public class VendorFileTypeLocalViewModel extends EnumViewModel { } diff --git a/client/src/main/resources/ui/company/vendor/vendor.fxml b/client/src/main/resources/ui/company/vendor/vendor.fxml index 3ce1832..464f783 100644 --- a/client/src/main/resources/ui/company/vendor/vendor.fxml +++ b/client/src/main/resources/ui/company/vendor/vendor.fxml @@ -1,13 +1,28 @@ - - + + + + + + + + + + + + + + + + + + - + +
@@ -17,94 +32,72 @@ - + - - - - + + + + - - - - - - - - - - + + + + + + + + + + + -