From c69d3f1af2cfa939f30dcfdea181ad6b1767d7f2 Mon Sep 17 00:00:00 2001 From: songqq Date: Wed, 27 Aug 2025 19:36:30 +0800 Subject: [PATCH] =?UTF-8?q?refactor(ui):=20=E9=87=8D=E6=9E=84BaseControlle?= =?UTF-8?q?r=E5=8F=8A=E7=9B=B8=E5=85=B3=E7=BB=84=E4=BB=B6=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84=E5=92=8C?= =?UTF-8?q?=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构BaseController,移除冗余属性,引入bean缓存机制 新增LocalDateTimeConfig类处理日期时间配置 优化AbstEntityManagerSkin的分页和表格数据处理逻辑 调整ContractTabSkinBase的依赖注入方式,使用缓存bean 统一日期、数字和货币的格式化处理,使用CurrentEmployee的配置 --- .../contract/manager/CurrentEmployee.java | 94 ++++++++++++- .../u8/YongYouU8ConfigWindowController.java | 10 +- .../manager/cloud/u8/ctx/ContractCtx.java | 52 +++++-- .../controller/ContractTabSkinBase.java | 105 ++++++-------- .../controller/ContractWindowController.java | 29 ++-- .../manager/ds/other/LocalDateConfig.java | 4 - .../manager/ds/other/LocalDateTimeConfig.java | 51 +++++++ .../inventory/InventoryManagerSkin.java | 43 +++--- .../manager/ds/other/model/Employee.java | 52 +++++-- .../ds/other/service/SysConfService.java | 5 +- .../controller/CompanyVendorTabSkinBase.java | 14 +- .../manager/ui/AbstEntityManagerSkin.java | 131 +++++++++++++++--- .../manager/ui/AbstGenericTabSkin.java | 15 +- .../contract/manager/ui/BaseController.java | 48 ++++--- .../ui/tab/AbstEntityBasedTabSkin.java | 37 ++--- src/main/resources/ui/cloud/u8_config.fxml | 2 +- 16 files changed, 484 insertions(+), 208 deletions(-) create mode 100644 src/main/java/com/ecep/contract/manager/ds/other/LocalDateTimeConfig.java diff --git a/src/main/java/com/ecep/contract/manager/CurrentEmployee.java b/src/main/java/com/ecep/contract/manager/CurrentEmployee.java index 53e7686..83801b8 100644 --- a/src/main/java/com/ecep/contract/manager/CurrentEmployee.java +++ b/src/main/java/com/ecep/contract/manager/CurrentEmployee.java @@ -1,5 +1,6 @@ package com.ecep.contract.manager; +import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Locale; import java.util.concurrent.CompletableFuture; @@ -8,22 +9,28 @@ import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; import com.ecep.contract.manager.ds.other.model.Employee; import com.ecep.contract.manager.ds.other.model.EmployeeRole; import com.ecep.contract.manager.ds.other.service.EmployeeService; import com.ecep.contract.manager.ds.other.vo.EmployeeViewModel; +import com.ecep.contract.manager.util.MyDateTimeUtils; import javafx.application.Platform; import javafx.beans.property.SimpleListProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.collections.FXCollections; +import javafx.util.converter.CurrencyStringConverter; +import javafx.util.converter.LocalDateStringConverter; +import javafx.util.converter.LocalDateTimeStringConverter; +import javafx.util.converter.NumberStringConverter; import lombok.ToString; /** * 当前登录用户 */ -@ToString(of = {"id", "name", "email", "phone", "roles"}) +@ToString(callSuper = false, exclude = "roles") public class CurrentEmployee extends EmployeeViewModel { private static final Logger logger = LoggerFactory.getLogger(CurrentEmployee.class); /** @@ -34,24 +41,89 @@ public class CurrentEmployee extends EmployeeViewModel { * 角色 */ private SimpleListProperty roles = new SimpleListProperty<>(FXCollections.observableArrayList()); + + private DateTimeFormatter dateFormatter = DateTimeFormatter + .ofPattern(MyDateTimeUtils.DEFAULT_DATE_FORMAT_PATTERN); + private DateTimeFormatter dateTimeFormatter = DateTimeFormatter + .ofPattern(MyDateTimeUtils.DEFAULT_DATETIME_FORMAT_PATTERN); + private DateTimeFormatter timeFormatter = DateTimeFormatter + .ofPattern(MyDateTimeUtils.DEFAULT_TIME_FORMAT_PATTERN); + + private LocalDateStringConverter localDateStringConverter = new LocalDateStringConverter( + dateFormatter, null); + private LocalDateTimeStringConverter localDateTimeStringConverter = new LocalDateTimeStringConverter( + dateTimeFormatter, null); + + private NumberStringConverter numberStringConverter = new NumberStringConverter("#,##0.00"); + private CurrencyStringConverter currencyStringConverter = new CurrencyStringConverter("#,##0.00"); + /** * 是否系统管理员 */ public boolean isSystemAdministrator() { return roles.stream().anyMatch(EmployeeRole::isSystemAdministrator); } + /** * 语言环境属性 */ public SimpleObjectProperty localeProperty() { return locale; } + /** * 角色属性 */ public SimpleListProperty rolesProperty() { return roles; } + + @Override + protected void updateFrom(Employee v) { + super.updateFrom(v); + + // 根据用户的个人配置修改 + if (StringUtils.hasText(v.getLocale())) { + try { + localeProperty().set(Locale.forLanguageTag(v.getLocale())); + } catch (Exception e) { + handleException("解析设置用户区域设置失败," + v.getLocale(), e); + } + } + if (StringUtils.hasText(v.getDateFormatter())) { + try { + dateFormatter = DateTimeFormatter.ofPattern(v.getDateFormatter()); + localDateStringConverter = new LocalDateStringConverter(dateFormatter, null); + } catch (Exception e) { + handleException("解析设置用户日期格式失败," + v.getDateFormatter(), e); + } + } + if (StringUtils.hasText(v.getDateTimeFormatter())) { + try { + dateTimeFormatter = DateTimeFormatter.ofPattern(v.getDateTimeFormatter()); + localDateTimeStringConverter = new LocalDateTimeStringConverter(dateTimeFormatter, null); + } catch (Exception e) { + handleException("解析设置用户日期时间格式失败," + v.getDateTimeFormatter(), e); + } + } + + if (StringUtils.hasText(v.getNumberFormatter())) { + try { + numberStringConverter = new NumberStringConverter(localeProperty().get(), v.getNumberFormatter()); + } catch (Exception e) { + handleException("解析设置用户数字格式失败," + v.getNumberFormatter(), e); + } + } + + if (StringUtils.hasText(v.getCurrencyFormatter())) { + try { + currencyStringConverter = new CurrencyStringConverter(localeProperty().get(), v.getCurrencyFormatter()); + } catch (Exception e) { + handleException("解析设置用户货币格式失败," + v.getCurrencyFormatter(), e); + } + } + } + /** * 初始化 */ @@ -92,4 +164,24 @@ public class CurrentEmployee extends EmployeeViewModel { }, 10, 10, TimeUnit.SECONDS); return future; } + + private void handleException(String msg, Exception e) { + logger.warn(msg, e); + } + + public LocalDateStringConverter getLocalDateStringConverter() { + return localDateStringConverter; + } + + public LocalDateTimeStringConverter getLocalDateTimeStringConverter() { + return localDateTimeStringConverter; + } + + public NumberStringConverter getNumberStringConverter() { + return numberStringConverter; + } + + public CurrencyStringConverter getCurrencyStringConverter() { + return currencyStringConverter; + } } diff --git a/src/main/java/com/ecep/contract/manager/cloud/u8/YongYouU8ConfigWindowController.java b/src/main/java/com/ecep/contract/manager/cloud/u8/YongYouU8ConfigWindowController.java index fff2a25..c9bdd6e 100644 --- a/src/main/java/com/ecep/contract/manager/cloud/u8/YongYouU8ConfigWindowController.java +++ b/src/main/java/com/ecep/contract/manager/cloud/u8/YongYouU8ConfigWindowController.java @@ -7,6 +7,7 @@ import org.springframework.stereotype.Component; import com.ecep.contract.manager.cloud.u8.ctx.CompanyCtx; import com.ecep.contract.manager.cloud.u8.ctx.ContractCtx; import com.ecep.contract.manager.ds.other.LocalDateConfig; +import com.ecep.contract.manager.ds.other.LocalDateTimeConfig; import com.ecep.contract.manager.ds.other.StringConfig; import com.ecep.contract.manager.ui.BaseController; import com.ecep.contract.manager.ui.FxmlPath; @@ -25,7 +26,7 @@ public class YongYouU8ConfigWindowController extends BaseController { private DatePicker auto_create_company_after; @FXML - private DatePicker contract_latest_date; + private TextField contract_latest_date; @FXML private TextField contract_latest_id; @@ -42,15 +43,16 @@ public class YongYouU8ConfigWindowController extends BaseController { config1.setPicker(auto_create_company_after); config1.initialize(); - LocalDateConfig config2 = new LocalDateConfig(ContractCtx.KEY_SYNC_BY_LATEST_DATE); - config2.setPicker(contract_latest_date); + LocalDateTimeConfig config2 = new LocalDateTimeConfig(ContractCtx.KEY_SYNC_BY_LATEST_DATE); + config2.setTextField(contract_latest_date); + config2.setConverter(getCurrentEmployee().getLocalDateTimeStringConverter()); config2.initialize(); StringConfig config3 = new StringConfig(ContractCtx.KEY_SYNC_BY_LATEST_ID); config3.setTextField(contract_latest_id); config3.initialize(); - StringConfig config4 = new StringConfig("cloud.u8.sync.elapse"); + StringConfig config4 = new StringConfig(ContractCtx.KEY_SYNC_ELAPSE); config4.setTextField(sync_elapse); config4.initialize(); diff --git a/src/main/java/com/ecep/contract/manager/cloud/u8/ctx/ContractCtx.java b/src/main/java/com/ecep/contract/manager/cloud/u8/ctx/ContractCtx.java index 8d17601..189d9fb 100644 --- a/src/main/java/com/ecep/contract/manager/cloud/u8/ctx/ContractCtx.java +++ b/src/main/java/com/ecep/contract/manager/cloud/u8/ctx/ContractCtx.java @@ -1,11 +1,42 @@ package com.ecep.contract.manager.cloud.u8.ctx; +import static com.ecep.contract.manager.SpringApp.getBean; + +import java.io.File; +import java.text.NumberFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeParseException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.hibernate.Hibernate; +import org.springframework.util.StringUtils; + import com.ecep.contract.manager.cloud.u8.YongYouU8Service; import com.ecep.contract.manager.ds.company.CompanyFileUtils; import com.ecep.contract.manager.ds.company.model.Company; import com.ecep.contract.manager.ds.contract.ContractFileType; import com.ecep.contract.manager.ds.contract.ContractPayWay; -import com.ecep.contract.manager.ds.contract.model.*; +import com.ecep.contract.manager.ds.contract.model.Contract; +import com.ecep.contract.manager.ds.contract.model.ContractCatalog; +import com.ecep.contract.manager.ds.contract.model.ContractFile; +import com.ecep.contract.manager.ds.contract.model.ContractFileTypeLocal; +import com.ecep.contract.manager.ds.contract.model.ContractGroup; +import com.ecep.contract.manager.ds.contract.model.ContractItem; +import com.ecep.contract.manager.ds.contract.model.ContractKind; +import com.ecep.contract.manager.ds.contract.model.ContractPayPlan; +import com.ecep.contract.manager.ds.contract.model.ContractType; import com.ecep.contract.manager.ds.contract.service.ContractFileService; import com.ecep.contract.manager.ds.contract.service.ContractItemService; import com.ecep.contract.manager.ds.contract.service.ContractPayPlanService; @@ -27,22 +58,9 @@ import com.ecep.contract.manager.ui.MessageHolder; import com.ecep.contract.manager.util.MyDateTimeUtils; import com.ecep.contract.manager.util.NumberUtils; import com.ecep.contract.manager.util.TaxRateUtils; + import lombok.Getter; import lombok.Setter; -import org.hibernate.Hibernate; -import org.springframework.util.StringUtils; - -import java.io.File; -import java.text.NumberFormat; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.format.DateTimeParseException; -import java.util.*; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static com.ecep.contract.manager.SpringApp.getBean; /** * 合同上下文 @@ -61,6 +79,10 @@ public class ContractCtx extends AbstractYongYouU8Ctx { * 合同同步时是否使用最后更新的Id来判断更新范围,否则使用最后更新的合同日期来判断更新范围 */ public static final String KEY_SYNC_USE_LATEST_ID = KEY_PREFIX + "sync.use-latest-id"; + /** + * 合同同步时的时间间隔,单位:秒 + */ + public static final String KEY_SYNC_ELAPSE = KEY_PREFIX + "sync.elapse"; @Setter private ContractService contractService; diff --git a/src/main/java/com/ecep/contract/manager/ds/contract/controller/ContractTabSkinBase.java b/src/main/java/com/ecep/contract/manager/ds/contract/controller/ContractTabSkinBase.java index 8179d2e..232a2e7 100644 --- a/src/main/java/com/ecep/contract/manager/ds/contract/controller/ContractTabSkinBase.java +++ b/src/main/java/com/ecep/contract/manager/ds/contract/controller/ContractTabSkinBase.java @@ -1,5 +1,18 @@ package com.ecep.contract.manager.ds.contract.controller; +import java.io.File; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Objects; +import java.util.Optional; + +import org.controlsfx.control.textfield.TextFields; +import org.controlsfx.glyphfont.Glyph; +import org.hibernate.Hibernate; +import org.springframework.util.StringUtils; + import com.ecep.contract.manager.SpringApp; import com.ecep.contract.manager.ds.company.CompanyFileUtils; import com.ecep.contract.manager.ds.company.CompanyStringConverter; @@ -26,8 +39,8 @@ import com.ecep.contract.manager.ds.vendor.model.CompanyVendor; import com.ecep.contract.manager.ds.vendor.service.CompanyVendorService; import com.ecep.contract.manager.ds.vendor.service.VendorGroupService; import com.ecep.contract.manager.ui.tab.TabSkin; -import com.ecep.contract.manager.util.MyDateTimeUtils; import com.ecep.contract.manager.util.UITools; + import javafx.beans.binding.Bindings; import javafx.event.ActionEvent; import javafx.scene.control.Tab; @@ -36,34 +49,13 @@ import javafx.scene.control.TextInputDialog; import javafx.stage.DirectoryChooser; import javafx.util.StringConverter; import javafx.util.converter.LocalDateStringConverter; -import javafx.util.converter.LocalDateTimeStringConverter; import javafx.util.converter.NumberStringConverter; import lombok.Setter; -import org.controlsfx.control.textfield.TextFields; -import org.controlsfx.glyphfont.Glyph; -import org.hibernate.Hibernate; -import org.springframework.util.StringUtils; - -import java.io.File; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.util.*; /** - * + * 合同基础信息标签页 */ -public class ContractTabSkinBase - extends AbstContractBasedTabSkin - implements TabSkin { - - @Setter - private CompanyCustomerService companyCustomerService; - @Setter - private SaleTypeService saleTypeService; - @Setter - private ExtendVendorInfoService extendVendorInfoService; - @Setter - private VendorGroupService vendorGroupService; +public class ContractTabSkinBase extends AbstContractBasedTabSkin { public ContractTabSkinBase(ContractWindowController controller) { super(controller); @@ -88,7 +80,8 @@ public class ContractTabSkinBase return v == null ? "关联" : "打开"; })); - Glyph linkContractProjectBtnIcon = new Glyph("FontAwesome", viewModel.getProject().get() == null ? "UNLINK" : "LINK"); + Glyph linkContractProjectBtnIcon = new Glyph("FontAwesome", + viewModel.getProject().get() == null ? "UNLINK" : "LINK"); controller.linkContractProjectBtn.graphicProperty().set(linkContractProjectBtnIcon); linkContractProjectBtnIcon.iconProperty().bind(viewModel.getProject().map(v -> { return v == null ? "UNLINK" : "LINK"; @@ -124,7 +117,8 @@ public class ContractTabSkinBase if (!Hibernate.isInitialized(type)) { type = getContractService().findTypeById(type.getId()); } - return type.getCode() + " " + type.getCatalog() + " " + type.getName() + " " + type.getTitle() + "(" + type.getDirection() + ")"; + return type.getCode() + " " + type.getCatalog() + " " + type.getName() + " " + type.getTitle() + "(" + + type.getDirection() + ")"; })); controller.kindField.textProperty().bind(viewModel.getKind().map(kind -> { @@ -150,8 +144,10 @@ public class ContractTabSkinBase } return !Objects.equals(type.getDirection(), "收"); }, viewModel.getType())); - controller.openRelativeCompanyCustomerBtn.managedProperty().bind(controller.openRelativeCompanyCustomerBtn.disabledProperty().not()); - controller.openRelativeCompanyCustomerBtn.visibleProperty().bind(controller.openRelativeCompanyCustomerBtn.managedProperty()); + controller.openRelativeCompanyCustomerBtn.managedProperty() + .bind(controller.openRelativeCompanyCustomerBtn.disabledProperty().not()); + controller.openRelativeCompanyCustomerBtn.visibleProperty() + .bind(controller.openRelativeCompanyCustomerBtn.managedProperty()); // as vendor controller.openRelativeCompanyVendorBtn.setOnAction(this::onContractOpenRelativeCompanyVendorAction); @@ -169,10 +165,13 @@ public class ContractTabSkinBase } return !Objects.equals(type.getDirection(), "付"); }, viewModel.getType())); - controller.openRelativeCompanyVendorBtn.managedProperty().bind(controller.openRelativeCompanyVendorBtn.disabledProperty().not()); - controller.openRelativeCompanyVendorBtn.visibleProperty().bind(controller.openRelativeCompanyVendorBtn.managedProperty()); + controller.openRelativeCompanyVendorBtn.managedProperty() + .bind(controller.openRelativeCompanyVendorBtn.disabledProperty().not()); + controller.openRelativeCompanyVendorBtn.visibleProperty() + .bind(controller.openRelativeCompanyVendorBtn.managedProperty()); - LocalDateStringConverter localDateStringConverter = controller.localDateStringConverter; + LocalDateStringConverter localDateStringConverter = controller.getCurrentEmployee() + .getLocalDateStringConverter(); controller.setupDateField.setConverter(localDateStringConverter); controller.setupDateField.valueProperty().bindBidirectional(viewModel.getSetupDate()); @@ -202,21 +201,23 @@ public class ContractTabSkinBase initializeBaseTabProjectFieldAutoCompletion(controller.projectField); controller.pathField.textProperty().bind(viewModel.getPath()); -// controller.createdField.textProperty().bind(viewModel.getCreated().map(MyDateTimeUtils::format)); - DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(MyDateTimeUtils.DEFAULT_DATETIME_FORMAT_PATTERN); - controller.createdField.textProperty().bindBidirectional(viewModel.getCreated(), new LocalDateTimeStringConverter(dateTimeFormatter, null)); + controller.createdField.textProperty().bindBidirectional(viewModel.getCreated(), + controller.getCurrentEmployee().getLocalDateTimeStringConverter()); controller.guidField.textProperty().bind(viewModel.getGuid()); controller.descriptionField.textProperty().bindBidirectional(viewModel.getDescription()); - - NumberStringConverter numberStringConverter = new NumberStringConverter(controller.getLocale(), "#,##0.00"); + NumberStringConverter numberStringConverter = controller.getCurrentEmployee().getNumberStringConverter(); controller.amountField.textProperty().bindBidirectional(viewModel.getAmount(), numberStringConverter); - controller.totalQuantityField.textProperty().bindBidirectional(viewModel.getTotalQuantity(), numberStringConverter); + controller.totalQuantityField.textProperty().bindBidirectional(viewModel.getTotalQuantity(), + numberStringConverter); controller.totalAmountField.textProperty().bindBidirectional(viewModel.getTotalAmount(), numberStringConverter); - controller.totalUnTaxAmountField.textProperty().bindBidirectional(viewModel.getTotalUnTaxAmount(), numberStringConverter); - controller.execQuantityField.textProperty().bindBidirectional(viewModel.getExecQuantity(), numberStringConverter); + controller.totalUnTaxAmountField.textProperty().bindBidirectional(viewModel.getTotalUnTaxAmount(), + numberStringConverter); + controller.execQuantityField.textProperty().bindBidirectional(viewModel.getExecQuantity(), + numberStringConverter); controller.execAmountField.textProperty().bindBidirectional(viewModel.getExecAmount(), numberStringConverter); - controller.execUnTaxAmountField.textProperty().bindBidirectional(viewModel.getExecUnTaxAmount(), numberStringConverter); + controller.execUnTaxAmountField.textProperty().bindBidirectional(viewModel.getExecUnTaxAmount(), + numberStringConverter); controller.versionLabel.textProperty().bind(viewModel.getVersion().asString()); } @@ -264,7 +265,6 @@ public class ContractTabSkinBase return; } - project = new Project(); String name = viewModel.getName().get(); @@ -327,7 +327,6 @@ public class ContractTabSkinBase ContractWindowController.show(parent, controller.root.getScene().getWindow()); } - /** * 创建合同存储目录 */ @@ -470,7 +469,6 @@ public class ContractTabSkinBase CompanyVendorWindowController.show(companyVendor, null); } - private void initializeBaseTabCompanyFieldAutoCompletion(TextField textField) { CompanyStringConverter converter = SpringApp.getBean(CompanyStringConverter.class); UITools.autoCompletion(textField, viewModel.getCompany(), converter); @@ -498,12 +496,8 @@ public class ContractTabSkinBase UITools.autoCompletion(textField, viewModel.getProject(), converter::suggest, stringConverter); } - public CompanyCustomerService getCompanyCustomerService() { - if (companyCustomerService == null) { - companyCustomerService = SpringApp.getBean(CompanyCustomerService.class); - } - return companyCustomerService; + return controller.getCachedBean(CompanyCustomerService.class); } public ProjectService getProjectService() { @@ -511,23 +505,14 @@ public class ContractTabSkinBase } public SaleTypeService getSaleTypeService() { - if (saleTypeService == null) { - saleTypeService = SpringApp.getBean(SaleTypeService.class); - } - return saleTypeService; + return controller.getCachedBean(SaleTypeService.class); } public ExtendVendorInfoService getExtendVendorInfoService() { - if (extendVendorInfoService == null) { - extendVendorInfoService = SpringApp.getBean(ExtendVendorInfoService.class); - } - return extendVendorInfoService; + return controller.getCachedBean(ExtendVendorInfoService.class); } public VendorGroupService getVendorGroupService() { - if (vendorGroupService == null) { - vendorGroupService = SpringApp.getBean(VendorGroupService.class); - } - return vendorGroupService; + return controller.getCachedBean(VendorGroupService.class); } } diff --git a/src/main/java/com/ecep/contract/manager/ds/contract/controller/ContractWindowController.java b/src/main/java/com/ecep/contract/manager/ds/contract/controller/ContractWindowController.java index d7c6fdd..8a04038 100644 --- a/src/main/java/com/ecep/contract/manager/ds/contract/controller/ContractWindowController.java +++ b/src/main/java/com/ecep/contract/manager/ds/contract/controller/ContractWindowController.java @@ -1,5 +1,13 @@ package com.ecep.contract.manager.ds.contract.controller; +import java.io.File; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + import com.ecep.contract.manager.ds.company.controller.CompanyWindowController; import com.ecep.contract.manager.ds.company.model.Company; import com.ecep.contract.manager.ds.company.service.CompanyService; @@ -13,21 +21,19 @@ import com.ecep.contract.manager.ui.AbstEntityController; import com.ecep.contract.manager.ui.FxmlPath; import com.ecep.contract.manager.util.DesktopUtils; import com.ecep.contract.manager.util.UITools; + import javafx.collections.ObservableList; import javafx.event.ActionEvent; -import javafx.scene.control.*; +import javafx.scene.control.Button; +import javafx.scene.control.DatePicker; +import javafx.scene.control.Label; +import javafx.scene.control.Tab; +import javafx.scene.control.TabPane; +import javafx.scene.control.TextArea; +import javafx.scene.control.TextField; import javafx.scene.layout.BorderPane; import javafx.stage.Window; import javafx.stage.WindowEvent; -import javafx.util.converter.LocalDateStringConverter; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; - -import java.io.File; -import java.time.format.DateTimeFormatter; @Lazy @Scope("prototype") @@ -70,9 +76,6 @@ public class ContractWindowController @Autowired ProjectService projectService; - LocalDateStringConverter localDateStringConverter = new LocalDateStringConverter(DateTimeFormatter.ISO_LOCAL_DATE, null); - - public TextField nameField; public TextField guidField; public TextField codeField; diff --git a/src/main/java/com/ecep/contract/manager/ds/other/LocalDateConfig.java b/src/main/java/com/ecep/contract/manager/ds/other/LocalDateConfig.java index a8c65da..ffdb2f5 100644 --- a/src/main/java/com/ecep/contract/manager/ds/other/LocalDateConfig.java +++ b/src/main/java/com/ecep/contract/manager/ds/other/LocalDateConfig.java @@ -2,12 +2,8 @@ package com.ecep.contract.manager.ds.other; import java.time.LocalDate; import java.time.format.DateTimeFormatter; -import java.util.concurrent.CompletableFuture; -import com.ecep.contract.manager.Desktop; -import com.ecep.contract.manager.SpringApp; import com.ecep.contract.manager.ds.other.model.SysConf; -import com.ecep.contract.manager.ds.other.service.SysConfService; import javafx.beans.property.Property; import javafx.beans.property.SimpleObjectProperty; diff --git a/src/main/java/com/ecep/contract/manager/ds/other/LocalDateTimeConfig.java b/src/main/java/com/ecep/contract/manager/ds/other/LocalDateTimeConfig.java new file mode 100644 index 0000000..9ef08ec --- /dev/null +++ b/src/main/java/com/ecep/contract/manager/ds/other/LocalDateTimeConfig.java @@ -0,0 +1,51 @@ +package com.ecep.contract.manager.ds.other; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +import com.ecep.contract.manager.ds.other.model.SysConf; + +import javafx.beans.property.Property; +import javafx.beans.property.SimpleObjectProperty; +import javafx.beans.value.ObservableValue; +import javafx.scene.control.TextField; +import javafx.util.converter.LocalDateTimeStringConverter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@NoArgsConstructor +public class LocalDateTimeConfig extends AbstractConfigBounder { + Property property; + @Setter + javafx.util.StringConverter converter; + @Setter + TextField textField; + + public LocalDateTimeConfig(String string) { + key = string; + } + + @Override + public void initialize() { + textField.setDisable(true); + if (converter == null) { + converter = new LocalDateTimeStringConverter(DateTimeFormatter.ISO_LOCAL_DATE_TIME, null); + } + runAsync(() -> { + conf = getConfService().findById(key); + LocalDateTime dateTime = LocalDateTime.parse(conf.getValue()); + property = new SimpleObjectProperty<>(dateTime); + property.addListener(this::propertyChanged); + textField.textProperty().bindBidirectional(property, converter); + textField.setDisable(false); + }); + } + + void propertyChanged(ObservableValue observable, LocalDateTime oldValue, + LocalDateTime newValue) { + conf.setValue(newValue.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); + SysConf saved = getConfService().save(conf); + saved.getValue(); + } + +} diff --git a/src/main/java/com/ecep/contract/manager/ds/other/controller/inventory/InventoryManagerSkin.java b/src/main/java/com/ecep/contract/manager/ds/other/controller/inventory/InventoryManagerSkin.java index 6f36f89..ec06a2d 100644 --- a/src/main/java/com/ecep/contract/manager/ds/other/controller/inventory/InventoryManagerSkin.java +++ b/src/main/java/com/ecep/contract/manager/ds/other/controller/inventory/InventoryManagerSkin.java @@ -1,5 +1,7 @@ package com.ecep.contract.manager.ds.other.controller.inventory; +import java.util.function.Function; + import com.ecep.contract.manager.ds.other.EntityStringConverter; import com.ecep.contract.manager.ds.other.model.Inventory; import com.ecep.contract.manager.ds.other.model.InventoryCatalog; @@ -7,10 +9,9 @@ import com.ecep.contract.manager.ds.other.service.InventoryCatalogService; import com.ecep.contract.manager.ds.other.service.InventoryService; import com.ecep.contract.manager.ds.other.vo.InventoryViewModel; import com.ecep.contract.manager.ui.AbstEntityManagerSkin; -import com.ecep.contract.manager.ui.table.EditableEntityTableTabSkin; -import com.ecep.contract.manager.ui.ManagerSkin; -import com.ecep.contract.manager.ui.util.LocalDateFieldTableCell; import com.ecep.contract.manager.ui.table.cell.LocalDateTimeTableCell; +import com.ecep.contract.manager.ui.util.LocalDateFieldTableCell; + import javafx.beans.property.Property; import javafx.event.ActionEvent; import javafx.scene.control.TableColumn; @@ -19,11 +20,8 @@ import javafx.util.converter.CurrencyStringConverter; import javafx.util.converter.NumberStringConverter; import lombok.Setter; -import java.util.function.Function; - -public class InventoryManagerSkin - extends AbstEntityManagerSkin - implements ManagerSkin, EditableEntityTableTabSkin { +public class InventoryManagerSkin extends + AbstEntityManagerSkin { @Setter private InventoryCatalogService catalogService; @@ -69,7 +67,8 @@ public class InventoryManagerSkin controller.specificationColumn.setCellValueFactory(param -> param.getValue().getSpecification()); controller.specificationColumn.setCellFactory(TextFieldTableCell.forTableColumn()); - controller.specificationColumn.setOnEditCommit(event -> onColumnEditCommit(event, InventoryViewModel::getSpecification)); + controller.specificationColumn + .setOnEditCommit(event -> onColumnEditCommit(event, InventoryViewModel::getSpecification)); controller.unitColumn.setCellValueFactory(param -> param.getValue().getUnit()); controller.unitColumn.setCellFactory(TextFieldTableCell.forTableColumn()); @@ -77,44 +76,48 @@ public class InventoryManagerSkin controller.purchaseTaxRateColumn.setCellValueFactory(param -> param.getValue().getPurchaseTaxRate()); controller.purchaseTaxRateColumn.setCellFactory(TextFieldTableCell.forTableColumn(new NumberStringConverter())); - controller.purchaseTaxRateColumn.setOnEditCommit(event -> onColumnEditCommit(event, InventoryViewModel::getPurchaseTaxRate)); + controller.purchaseTaxRateColumn + .setOnEditCommit(event -> onColumnEditCommit(event, InventoryViewModel::getPurchaseTaxRate)); controller.purchasePriceColumn.setCellValueFactory(param -> param.getValue().getPurchasePrice()); controller.purchasePriceColumn.setCellFactory(TextFieldTableCell.forTableColumn(new CurrencyStringConverter())); -// controller.purchasePriceColumn.setOnEditCommit(event -> onColumnEditCommit(event, InventoryViewModel::getPurchasePrice)); - + // controller.purchasePriceColumn.setOnEditCommit(event -> + // onColumnEditCommit(event, InventoryViewModel::getPurchasePrice)); controller.saleTaxRateColumn.setCellValueFactory(param -> param.getValue().getSaleTaxRate()); controller.saleTaxRateColumn.setCellFactory(TextFieldTableCell.forTableColumn(new NumberStringConverter())); - controller.saleTaxRateColumn.setOnEditCommit(event -> onColumnEditCommit(event, InventoryViewModel::getSaleTaxRate)); + controller.saleTaxRateColumn + .setOnEditCommit(event -> onColumnEditCommit(event, InventoryViewModel::getSaleTaxRate)); controller.salePriceColumn.setCellValueFactory(param -> param.getValue().getSalePrice()); controller.salePriceColumn.setCellFactory(TextFieldTableCell.forTableColumn(new CurrencyStringConverter())); -// controller.salePriceColumn.setOnEditCommit(event -> onColumnEditCommit(event, InventoryViewModel::getSalePrice)); + // controller.salePriceColumn.setOnEditCommit(event -> onColumnEditCommit(event, + // InventoryViewModel::getSalePrice)); controller.createTimeColumn.setCellValueFactory(param -> param.getValue().getCreateTime()); controller.createTimeColumn.setCellFactory(LocalDateFieldTableCell.forTableColumn()); - controller.createTimeColumn.setOnEditCommit(event -> onColumnEditCommit(event, InventoryViewModel::getCreateTime)); + controller.createTimeColumn + .setOnEditCommit(event -> onColumnEditCommit(event, InventoryViewModel::getCreateTime)); controller.updateDateColumn.setCellValueFactory(param -> param.getValue().getUpdateDate()); controller.updateDateColumn.setCellFactory(param -> new LocalDateTimeTableCell<>()); - controller.updateDateColumn.setOnEditCommit(event -> onColumnEditCommit(event, InventoryViewModel::getUpdateDate)); + controller.updateDateColumn + .setOnEditCommit(event -> onColumnEditCommit(event, InventoryViewModel::getUpdateDate)); controller.descriptionColumn.setCellValueFactory(param -> param.getValue().getDescription()); controller.descriptionColumn.setCellFactory(TextFieldTableCell.forTableColumn()); - controller.descriptionColumn.setOnEditCommit(event -> onColumnEditCommit(event, InventoryViewModel::getDescription)); + controller.descriptionColumn + .setOnEditCommit(event -> onColumnEditCommit(event, InventoryViewModel::getDescription)); } private void onColumnEditCommit( TableColumn.CellEditEvent event, - Function> supplier - ) { + Function> supplier) { InventoryViewModel row = event.getRowValue(); supplier.apply(row).setValue(event.getNewValue()); saveRowData(row); } - @Override protected void onTableRowDoubleClickedAction(InventoryViewModel item) { showInOwner(InventoryWindowController.class, item); diff --git a/src/main/java/com/ecep/contract/manager/ds/other/model/Employee.java b/src/main/java/com/ecep/contract/manager/ds/other/model/Employee.java index a01c9de..f46275c 100644 --- a/src/main/java/com/ecep/contract/manager/ds/other/model/Employee.java +++ b/src/main/java/com/ecep/contract/manager/ds/other/model/Employee.java @@ -56,19 +56,36 @@ public class Employee implements Entity, IdentityEntity, NamedEntity { @Column(name = "LEAVE_DATE") private LocalDate leaveDate; + @Column(name = "LOCALE") + private String locale; + + @Column(name = "DATE_FORMATTER") + private String dateFormatter; + + @Column(name = "DATETIME_FORMATTER") + private String dateTimeFormatter; + + @Column(name = "TIME_FORMATTER") + private String timeFormatter; + + @Column(name = "TIME_ZONE") + private String timeZone; + + @Column(name = "NUMBER_FORMATTER") + private String numberFormatter; + + @Column(name = "CURRENCY_FORMATTER") + private String currencyFormatter; + /** * 员工是否活跃的状态 */ @Column(name = "IS_ACTIVE", nullable = false) private boolean isActive; - @ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.MERGE }) - @JoinTable( - name = "EMPLOYEE_ROLES", - joinColumns = @JoinColumn(name = "EMPLOYEE_ID"), - inverseJoinColumns = @JoinColumn(name = "ROLE_ID") - ) - private java.util.List roles = new java.util.ArrayList<>(); + @ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.MERGE }) + @JoinTable(name = "EMPLOYEE_ROLES", joinColumns = @JoinColumn(name = "EMPLOYEE_ID"), inverseJoinColumns = @JoinColumn(name = "ROLE_ID")) + private java.util.List roles = new java.util.ArrayList<>(); @Override public String toPrettyString() { @@ -80,17 +97,26 @@ public class Employee implements Entity, IdentityEntity, NamedEntity { @Override public final boolean equals(Object object) { - if (this == object) return true; - if (object == null) return false; - Class oEffectiveClass = object instanceof HibernateProxy ? ((HibernateProxy) object).getHibernateLazyInitializer().getPersistentClass() : object.getClass(); - Class thisEffectiveClass = this instanceof HibernateProxy ? ((HibernateProxy) this).getHibernateLazyInitializer().getPersistentClass() : this.getClass(); - if (thisEffectiveClass != oEffectiveClass) return false; + if (this == object) + return true; + if (object == null) + return false; + Class oEffectiveClass = object instanceof HibernateProxy + ? ((HibernateProxy) object).getHibernateLazyInitializer().getPersistentClass() + : object.getClass(); + Class thisEffectiveClass = this instanceof HibernateProxy + ? ((HibernateProxy) this).getHibernateLazyInitializer().getPersistentClass() + : this.getClass(); + if (thisEffectiveClass != oEffectiveClass) + return false; Employee employee = (Employee) object; return getId() != null && Objects.equals(getId(), employee.getId()); } @Override public final int hashCode() { - return this instanceof HibernateProxy ? ((HibernateProxy) this).getHibernateLazyInitializer().getPersistentClass().hashCode() : getClass().hashCode(); + return this instanceof HibernateProxy + ? ((HibernateProxy) this).getHibernateLazyInitializer().getPersistentClass().hashCode() + : getClass().hashCode(); } } diff --git a/src/main/java/com/ecep/contract/manager/ds/other/service/SysConfService.java b/src/main/java/com/ecep/contract/manager/ds/other/service/SysConfService.java index f527887..2b8b516 100644 --- a/src/main/java/com/ecep/contract/manager/ds/other/service/SysConfService.java +++ b/src/main/java/com/ecep/contract/manager/ds/other/service/SysConfService.java @@ -16,6 +16,7 @@ import com.ecep.contract.manager.ds.other.repository.SysConfRepository; @Service @CacheConfig(cacheNames = "sys_conf") public class SysConfService { + @Lazy @Autowired private SysConfRepository repository; @@ -25,7 +26,7 @@ public class SysConfService { @CacheEvict(key = "#p0.id") public SysConf save(SysConf conf) { - return repository.save(conf); + return repository.save(conf); } @CacheEvict(key = "#p0") @@ -100,6 +101,4 @@ public class SysConfService { return "1".equalsIgnoreCase(conf.getValue()); } } - - } diff --git a/src/main/java/com/ecep/contract/manager/ds/vendor/controller/CompanyVendorTabSkinBase.java b/src/main/java/com/ecep/contract/manager/ds/vendor/controller/CompanyVendorTabSkinBase.java index 806f7f4..ef9e11a 100644 --- a/src/main/java/com/ecep/contract/manager/ds/vendor/controller/CompanyVendorTabSkinBase.java +++ b/src/main/java/com/ecep/contract/manager/ds/vendor/controller/CompanyVendorTabSkinBase.java @@ -14,11 +14,13 @@ import com.ecep.contract.manager.ds.vendor.service.CompanyVendorService; import com.ecep.contract.manager.ds.vendor.vo.CompanyVendorViewModel; import com.ecep.contract.manager.ui.tab.AbstEntityBasedTabSkin; import com.ecep.contract.manager.ui.ComboBoxUtils; +import com.ecep.contract.manager.util.MyDateTimeUtils; import com.ecep.contract.manager.util.UITools; import javafx.event.ActionEvent; import javafx.scene.control.Tab; import javafx.scene.control.TextField; import javafx.util.converter.LocalDateStringConverter; +import javafx.util.converter.LocalDateTimeStringConverter; import java.time.format.DateTimeFormatter; import java.util.List; @@ -36,7 +38,7 @@ public class CompanyVendorTabSkinBase return controller.baseInfoTab; } - CompanyContactService getCompanyContactService(){ + CompanyContactService getCompanyContactService() { if (companyContactService == null) { companyContactService = SpringApp.getBean(CompanyContactService.class); } @@ -45,14 +47,15 @@ public class CompanyVendorTabSkinBase @Override public void initializeTab() { - // initializeBaseTabCompanyFieldAutoCompletion(controller.companyField); + // initializeBaseTabCompanyFieldAutoCompletion(controller.companyField); LocalDateStringConverter converter = new LocalDateStringConverter(DateTimeFormatter.ISO_LOCAL_DATE, null); controller.developDateField.setConverter(converter); controller.developDateField.valueProperty().bindBidirectional(viewModel.getDevelopDate()); - List vendorTypeLocals = getCompanyVendorService().findAllTypes(controller.getLocale().toLanguageTag()); + List vendorTypeLocals = getCompanyVendorService() + .findAllTypes(controller.getLocale().toLanguageTag()); ComboBoxUtils.initialComboBox(controller.catalogField, vendorTypeLocals, true); ComboBoxUtils.bindComboBox(controller.catalogField, viewModel.getType(), vendorTypeLocals); @@ -62,7 +65,10 @@ public class CompanyVendorTabSkinBase controller.pathField.textProperty().bind(viewModel.getPath()); controller.descriptionField.textProperty().bindBidirectional(viewModel.getDescription()); - controller.createdField.textProperty().bind(createStringBinding(viewModel.getCreated())); + DateTimeFormatter dateTimeFormatter = DateTimeFormatter + .ofPattern(MyDateTimeUtils.DEFAULT_DATETIME_FORMAT_PATTERN); + controller.createdField.textProperty().bindBidirectional(viewModel.getCreated(), + new LocalDateTimeStringConverter(dateTimeFormatter, null)); controller.versionLabel.textProperty().bind(viewModel.getVersion().asString()); controller.relativeCompanyBtn.disableProperty().bind(viewModel.getCompany().isNull()); diff --git a/src/main/java/com/ecep/contract/manager/ui/AbstEntityManagerSkin.java b/src/main/java/com/ecep/contract/manager/ui/AbstEntityManagerSkin.java index 4295cd1..4f42c40 100644 --- a/src/main/java/com/ecep/contract/manager/ui/AbstEntityManagerSkin.java +++ b/src/main/java/com/ecep/contract/manager/ui/AbstEntityManagerSkin.java @@ -8,8 +8,6 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.function.Function; -import com.ecep.contract.manager.ui.table.EditableEntityTableTabSkin; -import com.ecep.contract.manager.ui.table.TableTabSkin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.domain.Page; @@ -20,6 +18,8 @@ import org.springframework.data.jpa.domain.Specification; import com.ecep.contract.manager.ds.other.model.IdentityEntity; import com.ecep.contract.manager.ds.other.vo.IdentityViewModel; +import com.ecep.contract.manager.ui.table.EditableEntityTableTabSkin; +import com.ecep.contract.manager.ui.table.TableTabSkin; import com.ecep.contract.manager.util.TableViewUtils; import com.ecep.contract.manager.util.UITools; @@ -43,12 +43,15 @@ import javafx.scene.input.KeyEvent; import javafx.util.converter.NumberStringConverter; /** + * 实体管理器皮肤 + * 提供了实体管理器的基本功能,如查询、新增、删除、修改、分页等 + * * @param Entity 的类型 * @param Entity 对应的ViewModel - * @param Skin 的类型 + * @param Skin 的类型 * @param */ -public abstract class AbstEntityManagerSkin, Skin extends ManagerSkin, C extends AbstManagerWindowController> +public abstract class AbstEntityManagerSkin, SKIN extends ManagerSkin, C extends AbstManagerWindowController> implements ManagerSkin, TableTabSkin, EditableEntityTableTabSkin { private static final Logger logger = LoggerFactory.getLogger(AbstEntityManagerSkin.class); /** @@ -61,6 +64,10 @@ public abstract class AbstEntityManagerSkin loadTableDataSetFuture; public AbstEntityManagerSkin(C controller) { this.controller = controller; @@ -195,8 +202,6 @@ public abstract class AbstEntityManagerSkin void acceptCellEditEvent(TableColumn.CellEditEvent event, Function> function) { + /** + * 处理单元格编辑事件 + * + * @param + * @param event + * @param propGetter + */ + protected void acceptCellEditEvent(TableColumn.CellEditEvent event, + Function> propGetter) { TV row = event.getRowValue(); - Property property = function.apply(row); + Property property = propGetter.apply(row); property.setValue(event.getNewValue()); try { saveRowData(row); @@ -327,21 +340,47 @@ public abstract class AbstEntityManagerSkin service = getViewModelService(); getViewModelService().delete(entity); } + /** + * 保存行数据 + * + * @param entity + * @return + */ public T saveRowData(T entity) { + if (entity == null) { + return null; + } + ViewModelService service = getViewModelService(); return getViewModelService().save(entity); } - // 记录延时任务信息 - private ScheduledFuture loadTableDataSetFuture; - @Override public void loadTableDataSet() { loadTableDataSet(false); @@ -392,31 +431,41 @@ public abstract class AbstEntityManagerSkin models) { long timeMillis = System.currentTimeMillis(); // 清除所有选择状态,避免选择状态混乱 if (getTableView() != null && getTableView().getSelectionModel() != null) { getTableView().getSelectionModel().clearSelection(); } - + // 先清空再设置新数据,避免数据叠加 dataSet.clear(); if (models != null) { dataSet.addAll(models); } - + // 强制刷新表格布局 if (getTableView() != null) { getTableView().requestLayout(); getTableView().refresh(); } - + long timeCost = System.currentTimeMillis() - timeMillis; if (logger.isDebugEnabled()) { logger.debug("update table dataSet cost: {} ms", timeCost); } } + /** + * 加载表格数据 + * + * @return + */ protected List loadTableData() { Specification spec = getSpecification(); ViewModelService service = getViewModelService(); @@ -433,16 +482,24 @@ public abstract class AbstEntityManagerSkin getViewModelService() { ViewModelService service = controller.getViewModelService(); if (service == null) { - if (logger.isWarnEnabled()) { - logger.warn("ViewModelService is null"); - } + throw new IllegalArgumentException("ViewModelService is null"); } return service; } + /** + * 获取查询条件 + * + * @return + */ public Specification getSpecification() { TextField field = controller.searchKeyField; if (field != null) { @@ -451,8 +508,14 @@ public abstract class AbstEntityManagerSkin getSpecification(String searchText) { - return controller.getViewModelService().getSpecification(searchText); + return getViewModelService().getSpecification(searchText); } /** @@ -463,6 +526,11 @@ public abstract class AbstEntityManagerSkin page) { Platform.runLater(() -> { controller.previousPageBtn.setDisable(!page.hasPrevious()); @@ -473,19 +541,44 @@ public abstract class AbstEntityManagerSkin getTableOrders() { return TableViewUtils.getOrders(getTableView()); } + /** + * 获取表格排序 + * + * @return + */ public Sort getSortByTable() { + if (getTableView() == null) { + return Sort.unsorted(); + } return Sort.by(getTableOrders()); } + /** + * 获取分页参数 + * + * @return + */ public Pageable getPageable() { Sort sort = getSortByTable(); return currentPageable.withSort(sort); } + /** + * 显示在当前窗口为父窗口的新窗口 + * + * @param 控制器类型 + * @param clz 控制器类 + * @param model 数据 + */ protected > void showInOwner(Class clz, TV model) { BaseController.show(clz, model, getTableView().getScene().getWindow()); } diff --git a/src/main/java/com/ecep/contract/manager/ui/AbstGenericTabSkin.java b/src/main/java/com/ecep/contract/manager/ui/AbstGenericTabSkin.java index 580e330..50f0cbd 100644 --- a/src/main/java/com/ecep/contract/manager/ui/AbstGenericTabSkin.java +++ b/src/main/java/com/ecep/contract/manager/ui/AbstGenericTabSkin.java @@ -1,11 +1,13 @@ package com.ecep.contract.manager.ui; +import java.util.Locale; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeansException; + import com.ecep.contract.manager.ui.tab.TabSkin; import com.ecep.contract.manager.util.UITools; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Locale; public abstract class AbstGenericTabSkin implements TabSkin { private static final Logger logger = LoggerFactory.getLogger(AbstGenericTabSkin.class); @@ -18,6 +20,10 @@ public abstract class AbstGenericTabSkin implements Ta this.controller = controller; } + public T getCachedBean(Class requiredType) throws BeansException { + return controller.getCachedBean(requiredType); + } + protected void setStatus(String status) { controller.setStatus(status); } @@ -38,4 +44,5 @@ public abstract class AbstGenericTabSkin implements Ta } UITools.showExceptionAndWait(message, ex); } + } diff --git a/src/main/java/com/ecep/contract/manager/ui/BaseController.java b/src/main/java/com/ecep/contract/manager/ui/BaseController.java index 80b033a..53cd17b 100644 --- a/src/main/java/com/ecep/contract/manager/ui/BaseController.java +++ b/src/main/java/com/ecep/contract/manager/ui/BaseController.java @@ -15,6 +15,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.BeansException; +import com.ecep.contract.manager.CurrentEmployee; import com.ecep.contract.manager.Desktop; import com.ecep.contract.manager.SpringApp; import com.ecep.contract.manager.ds.other.model.Employee; @@ -37,7 +38,6 @@ import javafx.stage.Stage; import javafx.stage.Window; import javafx.stage.WindowEvent; import lombok.Getter; -import lombok.Setter; public class BaseController { private static final Logger logger = LoggerFactory.getLogger(BaseController.class); @@ -163,7 +163,8 @@ public class BaseController { } public CompletableFuture runAsync(Runnable runnable) { - return CompletableFuture.runAsync(runnable, Desktop.instance.getExecutorService()).exceptionally(this::handleException); + return CompletableFuture.runAsync(runnable, Desktop.instance.getExecutorService()) + .exceptionally(this::handleException); } /** @@ -182,33 +183,30 @@ public class BaseController { private String stageKey; public Label leftStatusLabel; public Label rightStatusLabel; - - @Getter - @Setter - private Locale locale = Locale.getDefault(); - - @Setter - private SysConfService confService; - @Setter - private EmployeeService employeeService; private Employee currentUser; + private HashMap, Object> cachedBeans = new HashMap<>(); + protected T getBean(Class requiredType) throws BeansException { return SpringApp.getBean(requiredType); } - public SysConfService getConfService() { - if (confService == null) { - confService = getBean(SysConfService.class); + @SuppressWarnings("unchecked") + public T getCachedBean(Class requiredType) throws BeansException { + Object object = cachedBeans.get(requiredType); + if (object == null) { + object = getBean(requiredType); + cachedBeans.put(requiredType, object); } - return confService; + return (T) object; + } + + public SysConfService getConfService() { + return getCachedBean(SysConfService.class); } public EmployeeService getEmployeeService() { - if (employeeService == null) { - employeeService = getBean(EmployeeService.class); - } - return employeeService; + return getCachedBean(EmployeeService.class); } public Employee getCurrentUser() { @@ -218,6 +216,18 @@ public class BaseController { return currentUser; } + public CurrentEmployee getCurrentEmployee() { + return Desktop.instance.getActiveEmployee(); + } + + public Locale getLocale() { + CurrentEmployee currentEmployee = getCurrentEmployee(); + if (currentEmployee == null) { + return Locale.getDefault(); + } + return currentEmployee.localeProperty().get(); + } + public String getMessage(String code, Object... args) { return SpringApp.getMessage(code, args, getLocale()); } diff --git a/src/main/java/com/ecep/contract/manager/ui/tab/AbstEntityBasedTabSkin.java b/src/main/java/com/ecep/contract/manager/ui/tab/AbstEntityBasedTabSkin.java index be864c2..35851ab 100644 --- a/src/main/java/com/ecep/contract/manager/ui/tab/AbstEntityBasedTabSkin.java +++ b/src/main/java/com/ecep/contract/manager/ui/tab/AbstEntityBasedTabSkin.java @@ -1,5 +1,13 @@ package com.ecep.contract.manager.ui.tab; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.concurrent.CompletableFuture; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; + import com.ecep.contract.manager.ds.other.model.IdentityEntity; import com.ecep.contract.manager.ds.other.vo.IdentityViewModel; import com.ecep.contract.manager.ui.AbstEntityController; @@ -7,26 +15,15 @@ import com.ecep.contract.manager.ui.AbstGenericTabSkin; import com.ecep.contract.manager.ui.BaseController; import com.ecep.contract.manager.ui.FxmlPath; import com.ecep.contract.manager.util.FxmlUtils; -import com.ecep.contract.manager.util.MyDateTimeUtils; import com.ecep.contract.manager.util.UITools; + import javafx.application.Platform; -import javafx.beans.binding.Bindings; -import javafx.beans.binding.StringBinding; import javafx.beans.property.BooleanProperty; -import javafx.beans.property.Property; import javafx.event.ActionEvent; import javafx.scene.Node; import javafx.scene.control.Tab; import lombok.Getter; import lombok.Setter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.BeanUtils; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.time.LocalDateTime; -import java.util.concurrent.CompletableFuture; public abstract class AbstEntityBasedTabSkin, T extends IdentityEntity, V extends IdentityViewModel> extends AbstGenericTabSkin { @@ -184,20 +181,4 @@ public abstract class AbstEntityBasedTabSkin property) { - LocalDateTime dateTime = property.getValue(); - if (dateTime == null) { - return ""; - } - return MyDateTimeUtils.format(dateTime); - } - - protected StringBinding createStringBinding(Property property) { - return Bindings.createStringBinding( - () -> localDateTimeFormatter(property), - property); - } - - } diff --git a/src/main/resources/ui/cloud/u8_config.fxml b/src/main/resources/ui/cloud/u8_config.fxml index ed3592a..4bbf4ce 100644 --- a/src/main/resources/ui/cloud/u8_config.fxml +++ b/src/main/resources/ui/cloud/u8_config.fxml @@ -29,7 +29,7 @@