feat: 实现节假日服务功能并更新项目版本

refactor(CloudRkManagerWindowController): 简化任务初始化逻辑
feat(HolidayService): 添加节假日调整和检查功能
feat(HolidayTable): 实现Voable接口并添加toVo方法
feat(HolidayTableRepository): 添加节假日查询方法
docs: 添加服务器端Service类规则文档
build: 更新项目版本至0.0.101-SNAPSHOT
This commit is contained in:
2025-10-10 10:21:51 +08:00
parent e49952a63c
commit 0dcc9236a8
14 changed files with 744 additions and 62 deletions

View File

@@ -65,32 +65,12 @@ public class CloudRkManagerWindowController
getTitle().set("数据源:集团相关方");
}
private void initializeTask(Task<Object> task, String prefix, Consumer<String> consumer) {
task.setOnScheduled(e -> {
consumer.accept("正在从相关方平台同步" + prefix + ",请稍后...");
});
task.setOnRunning(e -> {
consumer.accept("开始" + prefix + "...");
});
task.setOnSucceeded(e -> {
consumer.accept(prefix + "完成...");
});
task.exceptionProperty().addListener((observable, oldValue, newValue) -> {
consumer.accept(newValue.getMessage());
logger.error("{} 发生异常", prefix, newValue);
});
SpringApp.getBean(ScheduledExecutorService.class).submit(task);
consumer.accept("任务已创建...");
}
public void onDataRepairAction(ActionEvent event) {
}
public void onSyncAction(ActionEvent event) {
CloudRkSyncTask task = new CloudRkSyncTask();
UITools.showTaskDialogAndWait("同步数据", task, consumer -> {
initializeTask(task, "同步数据", msg -> consumer.accept(Message.info(msg)));
});
UITools.showTaskDialogAndWait("同步数据", task, null);
}
@Override

View File

@@ -1,15 +1,71 @@
package com.ecep.contract.service;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import com.ecep.contract.WebSocketClientService;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/**
* 节假日服务类
*
* @author System
*/
@Lazy
@Service
@RequiredArgsConstructor
@Slf4j
public class HolidayService {
@Autowired
private WebSocketClientService webSocketClientService;
@Autowired
protected ObjectMapper objectMapper;
/**
* 调整日期到工作日
*
* @param date 要调整的日期
* @return 调整的日期
*/
public LocalDate adjustToWorkDay(LocalDate date) {
throw new RuntimeException("Not implemented");
if (date == null) {
return null;
}
try {
JsonNode json = webSocketClientService.invoke("holidayService", "adjustToWorkDay", date).get();
if (json != null && !json.isEmpty()) {
return objectMapper.convertValue(json, LocalDate.class);
}
} catch (Exception e) {
log.error("调整日期到工作日失败: {}", e.getMessage(), e);
}
// 如果调用失败,使用客户端本地逻辑作为后备
return adjustToWorkDayLocally(date);
}
/**
* 客户端本地日期调整逻辑,作为服务器调用失败的后备方案
*
* @param date 要调整的日期
* @return 调整的日期
*/
private LocalDate adjustToWorkDayLocally(LocalDate date) {
while (date.getDayOfWeek() == DayOfWeek.SATURDAY || date.getDayOfWeek() == DayOfWeek.SUNDAY) {
date = date.plusDays(1);
}
return date;
}
}

View File

@@ -1,5 +1,6 @@
package com.ecep.contract.service;
import java.io.File;
import java.time.LocalDate;
import java.util.Comparator;
import java.util.List;
@@ -7,6 +8,8 @@ import java.util.Locale;
import java.util.Map;
import java.util.function.Consumer;
import com.ecep.contract.SpringApp;
import com.ecep.contract.vo.ContractVo;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
@@ -22,13 +25,62 @@ import com.ecep.contract.vo.VendorVo;
@Service
public class VendorFileService extends QueryService<VendorFileVo, CompanyVendorFileViewModel> {
public LocalDate getNextSignDate(VendorVo companyVendor, Consumer<String> state) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'getNextSignDate'");
}
public Map<VendorFileType, VendorFileTypeLocal> getFileTypeLocalMap(Locale locale) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'getFileTypeLocalMap'");
public LocalDate getNextSignDate(VendorVo vendor, Consumer<String> state) {
LocalDate miniContractDate = LocalDate.of(2022, 1, 1);
// 检索全部合同
ContractService contractService = SpringApp.getBean(ContractService.class);
List<ContractVo> contractList = contractService.findAllByCompanyVendor(vendor, null, null);
if (contractList.isEmpty()) {
state.accept("未发现已登记的合同");
return null;
}
// 检索评价表
List<VendorFileVo> files = findAllByVendorAndType(vendor, VendorFileType.EvaluationForm);
VendorFileVo latestFile = files.stream()
.filter(v -> v.getSignDate() != null && v.isValid())
.max(Comparator.comparing(VendorFileVo::getSignDate))
.orElse(null);
// 没有有效的评价表的评价日期
if (latestFile == null) {
state.accept("未发现有效的评价表");
// 返回最早的合同日期
ContractVo firstContract = contractList.stream()
.filter(v -> v.getSetupDate() != null && !v.getSetupDate().isBefore(miniContractDate))
.min(Comparator.comparing(ContractVo::getSetupDate))
.orElse(null);
if (firstContract == null) {
state.accept("最早的合同不存在?");
return null;
}
LocalDate setupDate = firstContract.getSetupDate();
state.accept("依据合同 " + firstContract.getCode() + " 的日期 " + setupDate + " 推算");
return SpringApp.getBean(HolidayService.class).adjustToWorkDay(setupDate.plusDays(-7));
}
// 检查失效日期起的第一个合同
LocalDate nextInValidDate = latestFile.getSignDate().plusYears(1);
File file = new File(latestFile.getFilePath());
state.accept("依据 " + file.getName() + " 的失效期 " + nextInValidDate + " 检索合同");
List<ContractVo> matchedContracts = contractList.stream()
.filter(v -> v.getSetupDate().isAfter(nextInValidDate)).toList();
// 没有在失效日期后的合同时,使用失效日期
if (matchedContracts.isEmpty()) {
state.accept("未发现失效期 " + nextInValidDate + " 后的合同");
return null;
}
state.accept("发现匹配合同 " + matchedContracts.size() + "");
// 按时间取最早一个
ContractVo firstContract = matchedContracts.stream()
.min(Comparator.comparing(ContractVo::getSetupDate))
.orElse(null);
LocalDate setupDate = firstContract.getSetupDate();
state.accept("匹配失效期 " + nextInValidDate + " 后的第一个合同 " + firstContract.getCode());
state.accept("依据合同 " + firstContract.getCode() + " 的日期 " + setupDate + " 推算");
return SpringApp.getBean(HolidayService.class).adjustToWorkDay(setupDate.plusDays(-7));
}
public void verify(VendorVo companyVendor, LocalDate verifyDate, MessageHolder holder) {