feat: 实现SMB文件服务并优化合同文件管理

- 新增SmbFileService服务类,支持SMB/CIFS协议的文件操作
- 修改合同文件管理逻辑,支持SMB路径检查与目录创建
- 优化BankTableCell实现工厂模式并更新相关文档
- 调整Redis配置并添加连接测试
- 修复合同发票视图模型的时间处理问题
- 更新项目版本至0.0.134-SNAPSHOT
This commit is contained in:
2025-11-12 16:32:03 +08:00
parent 1cb0edbd07
commit e761990ebf
22 changed files with 877 additions and 50 deletions

View File

@@ -53,7 +53,6 @@ public class WebSocketClientService {
@Getter
@Setter
private long readTimeout = 30000;
private String webSocketUrl = "ws://localhost:8080/ws";
private boolean isActive = false; // 标记连接是否活跃
private ScheduledFuture<?> heartbeatTask; // 心跳任务
private ScheduledFuture<?> reconnectFuture; // 修改类型为CompletableFuture<Void>
@@ -248,6 +247,8 @@ public class WebSocketClientService {
try {
// 构建WebSocket请求包含认证信息
var myProperties = SpringApp.getBean(MyProperties.class);
String webSocketUrl = "ws://" + myProperties.getServerHost() + ":" + myProperties.getServerPort() + "/ws";
Request request = new Request.Builder()
.url(webSocketUrl)
.build();

View File

@@ -62,8 +62,9 @@ public class CompanyTabSkinBankAccount
bankAccountSearchBtn.setOnAction(this::onTableRefreshAction);
bankAccountTable_idColumn.setCellValueFactory(param -> param.getValue().getId());
bankAccountTable_bankColumn.setCellValueFactory(param -> param.getValue().getBankId());
bankAccountTable_bankColumn.setCellFactory(param -> new BankTableCell<>(getBankService()));
bankAccountTable_bankColumn.setCellFactory(BankTableCell.forTableColumn(getBankService()));
bankAccountTable_openingBankColumn.setCellValueFactory(param -> param.getValue().getOpeningBank());
bankAccountTable_accountColumn.setCellValueFactory(param -> param.getValue().getAccount());

View File

@@ -1,20 +1,39 @@
package com.ecep.contract.controller.table.cell;
import com.ecep.contract.SpringApp;
import com.ecep.contract.service.BankService;
import com.ecep.contract.vo.BankVo;
import javafx.util.Callback;
import lombok.NoArgsConstructor;
import static com.ecep.contract.SpringApp.getBean;
/**
* 银行单元格
*/
@NoArgsConstructor
public class BankTableCell<T> extends AsyncUpdateTableCell<T, Integer, BankVo> {
/**
* 创建单元格工厂
*
* @param bankService 银行服务
* @return 单元格工厂
*/
public static <V> Callback<javafx.scene.control.TableColumn<V, Integer>, javafx.scene.control.TableCell<V, Integer>> forTableColumn(
BankService bankService) {
return param -> new BankTableCell<V>(bankService);
}
public BankTableCell(BankService service) {
setService(service);
}
@Override
protected BankService getServiceBean() {
return SpringApp.getBean(BankService.class);
return getBean(BankService.class);
}
@Override
public String format(BankVo entity) {
return getService().getStringConverter().toString(entity);
}
}

View File

@@ -1,11 +1,13 @@
package com.ecep.contract.vm;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Objects;
import com.ecep.contract.util.NumberUtils;
import com.ecep.contract.vo.ContractInvoiceVo;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import lombok.Data;
@@ -20,6 +22,11 @@ public class ContractInvoiceViewModel extends IdentityViewModel<ContractInvoiceV
* 关联的合同对象, Contract
*/
private final SimpleObjectProperty<Integer> contract = new SimpleObjectProperty<>();
/**
* 关联的合同项目对象, ContractItem
*/
private final SimpleObjectProperty<Integer> contractItem = new SimpleObjectProperty<>();
/**
* 关联的发票对象, Invoice
*/
@@ -46,7 +53,7 @@ public class ContractInvoiceViewModel extends IdentityViewModel<ContractInvoiceV
invoice.set(v.getInvoiceId());
amount.set(v.getAmount() != null ? v.getAmount() : 0.0);
remark.set(v.getRemark());
createDate.set(v.getSetupDate());
updateDate.set(v.getUpdateDate());
creator.set(v.getSetupPersonId());
updater.set(v.getUpdatePersonId());
@@ -85,23 +92,27 @@ public class ContractInvoiceViewModel extends IdentityViewModel<ContractInvoiceV
v.setRemark(remark.get());
modified = true;
}
if (!Objects.equals(creator.get(), v.getSetupPersonId())) {
v.setSetupPersonId(creator.get());
modified = true;
}
if (!Objects.equals(updater.get(), v.getUpdatePersonId())) {
v.setUpdatePersonId(updater.get());
modified = true;
}
if (!Objects.equals(createDate.get(), v.getSetupDate())) {
v.setSetupDate(createDate.get());
modified = true;
}
if (!Objects.equals(updateDate.get(), v.getUpdateDate())) {
v.setUpdateDate(updateDate.get());
modified = true;
}
if (!Objects.equals(creator.get(), v.getSetupPersonId())) {
v.setSetupPersonId(creator.get());
modified = true;
}
if (!Objects.equals(updater.get(), v.getUpdatePersonId())) {
v.setUpdatePersonId(updater.get());
modified = true;
}
return modified;
}