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 c9bdd6e..28adb33 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 @@ -1,11 +1,13 @@ package com.ecep.contract.manager.cloud.u8; +import org.controlsfx.control.ToggleSwitch; import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Scope; 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.BooleanConfig; import com.ecep.contract.manager.ds.other.LocalDateConfig; import com.ecep.contract.manager.ds.other.LocalDateTimeConfig; import com.ecep.contract.manager.ds.other.StringConfig; @@ -33,29 +35,37 @@ public class YongYouU8ConfigWindowController extends BaseController { @FXML private TextField sync_elapse; + @FXML + private ToggleSwitch use_latest_id; + + LocalDateConfig config1 = new LocalDateConfig(CompanyCtx.AUTO_CREATE_COMPANY_AFTER); + LocalDateTimeConfig config2 = new LocalDateTimeConfig(ContractCtx.KEY_SYNC_BY_LATEST_DATE); + StringConfig config3 = new StringConfig(ContractCtx.KEY_SYNC_BY_LATEST_ID); + StringConfig config4 = new StringConfig(ContractCtx.KEY_SYNC_ELAPSE); + BooleanConfig config5 = new BooleanConfig(ContractCtx.KEY_SYNC_USE_LATEST_ID); @Override public void onShown(WindowEvent windowEvent) { super.onShown(windowEvent); getTitle().set("用友U8配置"); - LocalDateConfig config1 = new LocalDateConfig(CompanyCtx.AUTO_CREATE_COMPANY_AFTER); - config1.setPicker(auto_create_company_after); + auto_create_company_after.setConverter(getCurrentEmployee().getLocalDateStringConverter()); + config1.setControl(auto_create_company_after); config1.initialize(); - LocalDateTimeConfig config2 = new LocalDateTimeConfig(ContractCtx.KEY_SYNC_BY_LATEST_DATE); - config2.setTextField(contract_latest_date); - config2.setConverter(getCurrentEmployee().getLocalDateTimeStringConverter()); + config2.setControl(contract_latest_date); + config2.setControlConverter(getCurrentEmployee().getLocalDateTimeStringConverter()); config2.initialize(); - StringConfig config3 = new StringConfig(ContractCtx.KEY_SYNC_BY_LATEST_ID); - config3.setTextField(contract_latest_id); + config3.setControl(contract_latest_id); config3.initialize(); - StringConfig config4 = new StringConfig(ContractCtx.KEY_SYNC_ELAPSE); - config4.setTextField(sync_elapse); + config4.setControl(sync_elapse); config4.initialize(); + config5.setControl(use_latest_id); + config5.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 189d9fb..26f870a 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 @@ -104,21 +104,18 @@ public class ContractCtx extends AbstractYongYouU8Ctx { private InventoryCtx inventoryCtx; @Setter private ProjectCtx projectCtx; - @Getter @Setter private int vendorEntityUpdateDelayDays = 1; @Getter @Setter private int customerEntityUpdateDelayDays = 1; - public ContractService getContractService() { if (contractService == null) { contractService = getBean(ContractService.class); } return contractService; } - ContractItemService getContractItemService() { if (contractItemService == null) { contractItemService = getBean(ContractItemService.class); diff --git a/src/main/java/com/ecep/contract/manager/ds/contract/service/ContractService.java b/src/main/java/com/ecep/contract/manager/ds/contract/service/ContractService.java index f98c505..040dd47 100644 --- a/src/main/java/com/ecep/contract/manager/ds/contract/service/ContractService.java +++ b/src/main/java/com/ecep/contract/manager/ds/contract/service/ContractService.java @@ -145,18 +145,6 @@ public class ContractService implements ViewModelService implements ConfigBounder { @Setter private SysConfService confService; String key; SysConf conf; + @Getter + @Setter + Control control; + @Getter + @Setter + javafx.util.StringConverter converter; + @Setter + Property property; + ObjectProperty modified = new SimpleObjectProperty<>(this, "modified"); + ObjectProperty created = new SimpleObjectProperty<>(this, "created"); + + public AbstractConfigBounder(String key) { + this.key = key; + } @Override public CompletableFuture runAsync(Runnable runnable) { @@ -30,4 +55,70 @@ public abstract class AbstractConfigBounder implements ConfigBounder { } return confService; } + + @Override + public void initialize() { + getControl().setDisable(true); + runAsync(this::asyncHandle); + } + + protected void asyncHandle() { + conf = getConfService().findById(key); + if (conf == null) { + conf = new SysConf(); + conf.setId(key); + conf.setCreated(LocalDateTime.now()); + conf.setModified(LocalDateTime.now()); + conf = getConfService().save(conf); + } + Property property = getProperty(); + property.addListener(this::propertyChanged); + bindBidirectional(property); + modified.set(conf.getModified()); + created.set(conf.getCreated()); + getControl().setDisable(false); + } + + public Property getProperty() { + if (property == null) { + T value = getConverter().fromString(conf.getValue()); + property = createProperty(value); + setProperty(property); + } + return property; + } + + public ObjectProperty getModifiedProperty() { + return modified; + } + + public ObjectProperty getCreatedProperty() { + return created; + } + + @SuppressWarnings("unchecked") + protected Property createProperty(T value) { + if (value instanceof Boolean b) { + return (Property) new SimpleBooleanProperty(b); + } else if (value instanceof Integer i) { + return (Property) new SimpleIntegerProperty(i); + } else if (value instanceof Double d) { + return (Property) new SimpleDoubleProperty(d); + } else if (value instanceof String s) { + return (Property) new SimpleStringProperty(s); + } + return new SimpleObjectProperty<>(value); + } + + abstract void bindBidirectional(Property property); + + void propertyChanged(ObservableValue observable, T oldValue, + T newValue) { + conf.setValue(getConverter().toString(newValue)); + conf.setModified(LocalDateTime.now()); + SysConf saved = getConfService().save(conf); + modified.set(saved.getModified()); + created.set(saved.getCreated()); + } + } diff --git a/src/main/java/com/ecep/contract/manager/ds/other/BooleanConfig.java b/src/main/java/com/ecep/contract/manager/ds/other/BooleanConfig.java new file mode 100644 index 0000000..ff887fd --- /dev/null +++ b/src/main/java/com/ecep/contract/manager/ds/other/BooleanConfig.java @@ -0,0 +1,40 @@ +package com.ecep.contract.manager.ds.other; + +import org.controlsfx.control.ToggleSwitch; + +import javafx.beans.property.Property; +import javafx.util.StringConverter; +import javafx.util.converter.BooleanStringConverter; + +public class BooleanConfig extends AbstractConfigBounder { + public BooleanConfig(String key) { + super(key); + } + + @Override + public ToggleSwitch getControl() { + return (ToggleSwitch) super.getControl(); + } + + @Override + public StringConverter getConverter() { + StringConverter converter = super.getConverter(); + if (converter == null) { + converter = new BooleanStringConverter(); + setConverter(converter); + } + return converter; + } + + @Override + protected Property createProperty(Boolean value) { + // fixbug when value is null + value = value == null ? false : value; + return super.createProperty(value); + } + + @Override + void bindBidirectional(Property property) { + getControl().selectedProperty().bindBidirectional(property); + } +} 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 ffdb2f5..577dee3 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 @@ -3,51 +3,35 @@ package com.ecep.contract.manager.ds.other; import java.time.LocalDate; 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.DatePicker; +import javafx.util.StringConverter; import javafx.util.converter.LocalDateStringConverter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@NoArgsConstructor -public class LocalDateConfig extends AbstractConfigBounder { - Property property; - @Setter - javafx.util.StringConverter converter; - @Setter - DatePicker picker; +public class LocalDateConfig extends AbstractConfigBounder { public LocalDateConfig(String string) { - key = string; + super(string); } @Override - public void initialize() { - picker.setDisable(true); + public DatePicker getControl() { + return (DatePicker) super.getControl(); + } + + @Override + public StringConverter getConverter() { + StringConverter converter = super.getConverter(); if (converter == null) { converter = new LocalDateStringConverter(DateTimeFormatter.ISO_LOCAL_DATE, null); + setConverter(converter); } - picker.setConverter(converter); - runAsync(() -> { - conf = getConfService().findById(key); - LocalDate date = converter.fromString(conf.getValue()); - property = new SimpleObjectProperty<>(date); - property.addListener(this::propertyChanged); - picker.valueProperty().bindBidirectional(property); - picker.setDisable(false); - }); + return converter; } - void propertyChanged(ObservableValue observable, LocalDate oldValue, LocalDate newValue) { - conf.setValue(converter.toString(newValue)); - SysConf saved = getConfService().save(conf); - saved.getValue(); + @Override + void bindBidirectional(Property property) { + getControl().valueProperty().bindBidirectional(property); } - } \ No newline at end of file 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 index 9ef08ec..1210fca 100644 --- a/src/main/java/com/ecep/contract/manager/ds/other/LocalDateTimeConfig.java +++ b/src/main/java/com/ecep/contract/manager/ds/other/LocalDateTimeConfig.java @@ -3,49 +3,43 @@ 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.StringConverter; import javafx.util.converter.LocalDateTimeStringConverter; -import lombok.NoArgsConstructor; +import lombok.Getter; import lombok.Setter; -@NoArgsConstructor -public class LocalDateTimeConfig extends AbstractConfigBounder { - Property property; +public class LocalDateTimeConfig extends AbstractConfigBounder { + @Getter @Setter - javafx.util.StringConverter converter; - @Setter - TextField textField; + private javafx.util.StringConverter controlConverter; public LocalDateTimeConfig(String string) { - key = string; + super(string); } @Override - public void initialize() { - textField.setDisable(true); + public TextField getControl() { + return (TextField) super.getControl(); + } + + @Override + public javafx.util.StringConverter getConverter() { + javafx.util.StringConverter converter = super.getConverter(); if (converter == null) { converter = new LocalDateTimeStringConverter(DateTimeFormatter.ISO_LOCAL_DATE_TIME, null); + setConverter(converter); } - 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); - }); + return converter; } - void propertyChanged(ObservableValue observable, LocalDateTime oldValue, - LocalDateTime newValue) { - conf.setValue(newValue.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); - SysConf saved = getConfService().save(conf); - saved.getValue(); + @Override + void bindBidirectional(Property property) { + StringConverter converter = getControlConverter(); + if (converter == null) { + converter = getConverter(); + } + getControl().textProperty().bindBidirectional(property, converter); } - } diff --git a/src/main/java/com/ecep/contract/manager/ds/other/StringConfig.java b/src/main/java/com/ecep/contract/manager/ds/other/StringConfig.java index a7e71bf..bb0a5c6 100644 --- a/src/main/java/com/ecep/contract/manager/ds/other/StringConfig.java +++ b/src/main/java/com/ecep/contract/manager/ds/other/StringConfig.java @@ -1,42 +1,42 @@ package com.ecep.contract.manager.ds.other; -import com.ecep.contract.manager.ds.other.model.SysConf; - import javafx.beans.property.Property; -import javafx.beans.property.SimpleStringProperty; -import javafx.beans.value.ObservableValue; import javafx.scene.control.TextField; -import lombok.NoArgsConstructor; -import lombok.Setter; +import javafx.util.StringConverter; -@NoArgsConstructor -public class StringConfig extends AbstractConfigBounder { - @Setter - private TextField textField; - - String key; - SysConf conf; - - Property property; +public class StringConfig extends AbstractConfigBounder { public StringConfig(String string) { - key = string; + super(string); } - public void initialize() { - textField.setDisable(true); - runAsync(() -> { - conf = getConfService().findById(key); - property = new SimpleStringProperty(conf.getValue()); - property.addListener(this::propertyChanged); - textField.textProperty().bindBidirectional(property); - textField.setDisable(false); - }); + @Override + public TextField getControl() { + return (TextField) super.getControl(); } - void propertyChanged(ObservableValue observable, String oldValue, String newValue) { - conf.setValue(newValue); - SysConf saved = getConfService().save(conf); - saved.getValue(); + @Override + public StringConverter getConverter() { + StringConverter converter = super.getConverter(); + if (converter == null) { + converter = new StringConverter() { + @Override + public String toString(String object) { + return object; + } + + @Override + public String fromString(String string) { + return string; + } + }; + setConverter(converter); + } + return converter; + } + + @Override + void bindBidirectional(Property property) { + getControl().textProperty().bindBidirectional(property); } } diff --git a/src/main/java/com/ecep/contract/manager/ds/other/model/SysConf.java b/src/main/java/com/ecep/contract/manager/ds/other/model/SysConf.java index 114ae6f..795ea26 100644 --- a/src/main/java/com/ecep/contract/manager/ds/other/model/SysConf.java +++ b/src/main/java/com/ecep/contract/manager/ds/other/model/SysConf.java @@ -1,14 +1,15 @@ package com.ecep.contract.manager.ds.other.model; +import java.time.LocalDateTime; + +import org.hibernate.annotations.ColumnDefault; + import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; import lombok.Getter; import lombok.Setter; -import org.hibernate.annotations.ColumnDefault; - -import java.time.Instant; @Getter @Setter @@ -24,9 +25,9 @@ public class SysConf { @ColumnDefault("CURRENT_TIMESTAMP") @Column(name = "MODIFIED") - private Instant modified; + private LocalDateTime modified; @Column(name = "CREATED") - private Instant created; + private LocalDateTime created; } \ No newline at end of file diff --git a/src/main/resources/ui/cloud/u8_config.fxml b/src/main/resources/ui/cloud/u8_config.fxml index 4bbf4ce..6dc4f54 100644 --- a/src/main/resources/ui/cloud/u8_config.fxml +++ b/src/main/resources/ui/cloud/u8_config.fxml @@ -7,10 +7,10 @@ + -