refactor(配置管理): 重构配置绑定组件结构并添加布尔类型支持
将原有配置绑定组件重构为泛型抽象基类,统一处理不同类型配置的绑定逻辑。新增BooleanConfig支持布尔类型配置,并优化了LocalDateTimeConfig的转换器处理。 重构后的AbstractConfigBounder提供通用属性绑定和变更处理,子类只需实现特定类型的双向绑定逻辑。同时调整了相关UI界面,添加了布尔配置开关控件。
This commit is contained in:
@@ -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();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -145,18 +145,6 @@ public class ContractService implements ViewModelService<Contract, ContractViewM
|
||||
return contractRepository.findByProjectIdAndPayWay(project.getId(), ContractPayWay.RECEIVE).orElse(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新合同最新ID和日期
|
||||
*/
|
||||
public void updateLatestIdAndDate(Integer latestId, LocalDateTime latestDate) {
|
||||
if (latestId != null) {
|
||||
confService.set(ContractCtx.KEY_SYNC_BY_LATEST_ID, String.valueOf(latestId));
|
||||
}
|
||||
if (latestDate != null) {
|
||||
confService.set(ContractCtx.KEY_SYNC_BY_LATEST_DATE, latestDate.toString());
|
||||
}
|
||||
}
|
||||
|
||||
public File getBasePath() {
|
||||
return new File(confService.getString(CONTRACT_BASE_PATH));
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.ecep.contract.manager.ds.other;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
import com.ecep.contract.manager.Desktop;
|
||||
@@ -7,13 +8,37 @@ 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.ObjectProperty;
|
||||
import javafx.beans.property.Property;
|
||||
import javafx.beans.property.SimpleBooleanProperty;
|
||||
import javafx.beans.property.SimpleDoubleProperty;
|
||||
import javafx.beans.property.SimpleIntegerProperty;
|
||||
import javafx.beans.property.SimpleObjectProperty;
|
||||
import javafx.beans.property.SimpleStringProperty;
|
||||
import javafx.beans.value.ObservableValue;
|
||||
import javafx.scene.control.Control;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
public abstract class AbstractConfigBounder implements ConfigBounder {
|
||||
public abstract class AbstractConfigBounder<T> implements ConfigBounder {
|
||||
@Setter
|
||||
private SysConfService confService;
|
||||
String key;
|
||||
SysConf conf;
|
||||
@Getter
|
||||
@Setter
|
||||
Control control;
|
||||
@Getter
|
||||
@Setter
|
||||
javafx.util.StringConverter<T> converter;
|
||||
@Setter
|
||||
Property<T> property;
|
||||
ObjectProperty<LocalDateTime> modified = new SimpleObjectProperty<>(this, "modified");
|
||||
ObjectProperty<LocalDateTime> created = new SimpleObjectProperty<>(this, "created");
|
||||
|
||||
public AbstractConfigBounder(String key) {
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> 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<T> property = getProperty();
|
||||
property.addListener(this::propertyChanged);
|
||||
bindBidirectional(property);
|
||||
modified.set(conf.getModified());
|
||||
created.set(conf.getCreated());
|
||||
getControl().setDisable(false);
|
||||
}
|
||||
|
||||
public Property<T> getProperty() {
|
||||
if (property == null) {
|
||||
T value = getConverter().fromString(conf.getValue());
|
||||
property = createProperty(value);
|
||||
setProperty(property);
|
||||
}
|
||||
return property;
|
||||
}
|
||||
|
||||
public ObjectProperty<LocalDateTime> getModifiedProperty() {
|
||||
return modified;
|
||||
}
|
||||
|
||||
public ObjectProperty<LocalDateTime> getCreatedProperty() {
|
||||
return created;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected Property<T> createProperty(T value) {
|
||||
if (value instanceof Boolean b) {
|
||||
return (Property<T>) new SimpleBooleanProperty(b);
|
||||
} else if (value instanceof Integer i) {
|
||||
return (Property<T>) new SimpleIntegerProperty(i);
|
||||
} else if (value instanceof Double d) {
|
||||
return (Property<T>) new SimpleDoubleProperty(d);
|
||||
} else if (value instanceof String s) {
|
||||
return (Property<T>) new SimpleStringProperty(s);
|
||||
}
|
||||
return new SimpleObjectProperty<>(value);
|
||||
}
|
||||
|
||||
abstract void bindBidirectional(Property<T> property);
|
||||
|
||||
void propertyChanged(ObservableValue<? extends T> 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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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<Boolean> {
|
||||
public BooleanConfig(String key) {
|
||||
super(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ToggleSwitch getControl() {
|
||||
return (ToggleSwitch) super.getControl();
|
||||
}
|
||||
|
||||
@Override
|
||||
public StringConverter<Boolean> getConverter() {
|
||||
StringConverter<Boolean> converter = super.getConverter();
|
||||
if (converter == null) {
|
||||
converter = new BooleanStringConverter();
|
||||
setConverter(converter);
|
||||
}
|
||||
return converter;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Property<Boolean> createProperty(Boolean value) {
|
||||
// fixbug when value is null
|
||||
value = value == null ? false : value;
|
||||
return super.createProperty(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
void bindBidirectional(Property<Boolean> property) {
|
||||
getControl().selectedProperty().bindBidirectional(property);
|
||||
}
|
||||
}
|
||||
@@ -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<LocalDate> property;
|
||||
@Setter
|
||||
javafx.util.StringConverter<LocalDate> converter;
|
||||
@Setter
|
||||
DatePicker picker;
|
||||
|
||||
public class LocalDateConfig extends AbstractConfigBounder<LocalDate> {
|
||||
|
||||
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<LocalDate> getConverter() {
|
||||
StringConverter<LocalDate> 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<? extends LocalDate> observable, LocalDate oldValue, LocalDate newValue) {
|
||||
conf.setValue(converter.toString(newValue));
|
||||
SysConf saved = getConfService().save(conf);
|
||||
saved.getValue();
|
||||
@Override
|
||||
void bindBidirectional(Property<LocalDate> property) {
|
||||
getControl().valueProperty().bindBidirectional(property);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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<LocalDateTime> property;
|
||||
public class LocalDateTimeConfig extends AbstractConfigBounder<LocalDateTime> {
|
||||
@Getter
|
||||
@Setter
|
||||
javafx.util.StringConverter<LocalDateTime> converter;
|
||||
@Setter
|
||||
TextField textField;
|
||||
private javafx.util.StringConverter<LocalDateTime> 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<LocalDateTime> getConverter() {
|
||||
javafx.util.StringConverter<LocalDateTime> 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<? extends LocalDateTime> 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<LocalDateTime> property) {
|
||||
StringConverter<LocalDateTime> converter = getControlConverter();
|
||||
if (converter == null) {
|
||||
converter = getConverter();
|
||||
}
|
||||
getControl().textProperty().bindBidirectional(property, converter);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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<String> property;
|
||||
public class StringConfig extends AbstractConfigBounder<String> {
|
||||
|
||||
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<? extends String> observable, String oldValue, String newValue) {
|
||||
conf.setValue(newValue);
|
||||
SysConf saved = getConfService().save(conf);
|
||||
saved.getValue();
|
||||
@Override
|
||||
public StringConverter<String> getConverter() {
|
||||
StringConverter<String> converter = super.getConverter();
|
||||
if (converter == null) {
|
||||
converter = new StringConverter<String>() {
|
||||
@Override
|
||||
public String toString(String object) {
|
||||
return object;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String fromString(String string) {
|
||||
return string;
|
||||
}
|
||||
};
|
||||
setConverter(converter);
|
||||
}
|
||||
return converter;
|
||||
}
|
||||
|
||||
@Override
|
||||
void bindBidirectional(Property<String> property) {
|
||||
getControl().textProperty().bindBidirectional(property);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -7,10 +7,10 @@
|
||||
<?import javafx.scene.layout.GridPane?>
|
||||
<?import javafx.scene.layout.RowConstraints?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import org.controlsfx.control.ToggleSwitch?>
|
||||
|
||||
<VBox prefHeight="400.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/22" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.ecep.contract.manager.cloud.u8.YongYouU8ConfigWindowController">
|
||||
<children>
|
||||
<Label text="用友U8配置" />
|
||||
<GridPane>
|
||||
<columnConstraints>
|
||||
<ColumnConstraints halignment="RIGHT" hgrow="SOMETIMES" minWidth="50.0" prefWidth="250.0" />
|
||||
@@ -21,19 +21,25 @@
|
||||
<RowConstraints fillHeight="false" minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints fillHeight="false" minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints fillHeight="false" minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints fillHeight="false" minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<Label text="同步时未创建的公司时开发日期在此之后的自动创建" />
|
||||
<Label text="同步时公司未创建时, 公司开发日期在此之后的自动创建" GridPane.columnIndex="2" GridPane.rowIndex="1" />
|
||||
<DatePicker fx:id="auto_create_company_after" GridPane.columnIndex="2" />
|
||||
<Label text="cloud.u8.contract.latestDate" GridPane.rowIndex="1" />
|
||||
<TextField fx:id="contract_latest_date" GridPane.columnIndex="2" GridPane.rowIndex="1" />
|
||||
<Label text="cloud.u8.contract.latestId" GridPane.rowIndex="2" />
|
||||
<TextField fx:id="contract_latest_id" GridPane.columnIndex="2" GridPane.rowIndex="2" />
|
||||
<Label text="cloud.u8.sync.elapse" GridPane.rowIndex="3" />
|
||||
<TextField fx:id="sync_elapse" GridPane.columnIndex="2" GridPane.rowIndex="3" />
|
||||
<Label text="cloud.u8.contract.latestDate" GridPane.rowIndex="4" />
|
||||
<TextField fx:id="contract_latest_date" GridPane.columnIndex="2" GridPane.rowIndex="4" />
|
||||
<Label text="cloud.u8.contract.latestId" GridPane.rowIndex="5" />
|
||||
<TextField fx:id="contract_latest_id" GridPane.columnIndex="2" GridPane.rowIndex="5" />
|
||||
<Label text="cloud.u8.sync.elapse" GridPane.rowIndex="6" />
|
||||
<TextField fx:id="sync_elapse" GridPane.columnIndex="2" GridPane.rowIndex="6" />
|
||||
<Label text="创建在此之后日期的公司" />
|
||||
<ToggleSwitch fx:id="use_latest_id" GridPane.columnIndex="2" GridPane.rowIndex="2" />
|
||||
<Label text="使用latestId同步" GridPane.rowIndex="2" />
|
||||
<Label text="合同同步时是否使用最后更新的Id来判断更新范围,否则使用最后更新的合同日期来判断更新范围" GridPane.columnIndex="2" GridPane.rowIndex="3" />
|
||||
</children>
|
||||
</GridPane>
|
||||
</children>
|
||||
|
||||
Reference in New Issue
Block a user