List<ProcessData> processList = mesClient.getProcessList().getData(); 帮我用java写一个每天0点同步的定时任务 存入数据库 有就更新,没有就新增,没有,我们有,我们这边就删除掉
时间: 2025-06-25 11:28:13 浏览: 24
为了实现每天0点从 `mesClient` 获取工序数据并将其与本地数据库进行同步的任务,可以按照以下步骤操作:
### 1. 定义定时任务类
使用 Spring 框架中的 `@Scheduled` 注解来定义每天凌晨执行一次的任务。
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Component
public class ProcessSyncTask {
@Autowired
private MesClient mesClient;
@Autowired
private ProcessMainRepository processMainRepository;
@Autowired
private ProcessParameterRepository processParameterRepository;
/**
* 每天0点同步工序数据到数据库
*/
@Scheduled(cron = "0 0 0 * * ?")
public void syncProcessData() {
try {
List<ProcessData> remoteProcesses = mesClient.getProcessList().getData();
// 获取所有本地存储的工序id集合
List<Long> localProcessIds = processMainRepository.findAllProcessIds();
// 远程工序id集合
Map<Long, ProcessData> remoteProcessMap = remoteProcesses.stream()
.collect(Collectors.toMap(ProcessData::getProcessId, process -> process));
// 同步主表数据
for (Long processId : localProcessIds) {
if (!remoteProcessMap.containsKey(processId)) {
// 如果远程不存在该记录,则删除本地记录及其参数
processParameterRepository.deleteByProcessId(processId);
processMainRepository.deleteById(processId);
}
}
// 插入或更新远程数据到本地
for (ProcessData processData : remoteProcesses) {
saveOrUpdateProcess(processData);
}
System.out.println("同步完成!");
} catch (Exception e) {
e.printStackTrace();
System.err.println("同步失败:" + e.getMessage());
}
}
private void saveOrUpdateProcess(ProcessData processData) {
ProcessMain processMain = processMainRepository.findById(processData.getProcessId())
.orElse(new ProcessMain());
// 设置基础信息和主要业务字段
BeanUtils.copyProperties(processData, processMain);
// 特殊处理某些字段(例如枚举值)
if ("Y".equalsIgnoreCase(processData.getFirstCheck())) {
processMain.setFirstCheck('Y');
} else {
processMain.setFirstCheck('N');
}
// ... 类似地设置其他需要特殊处理的字段 ...
// 更新排序字段为sort而非sort_order以匹配实体属性名
processMain.setSortOrder(processData.getSort());
// 保存主表
processMainRepository.save(processMain);
// 删除原有参数再插入新参数保证一致性
processParameterRepository.deleteByProcessId(processMain.getProcessId());
if (processData.getProcessParameterList() != null) {
for (ProcessParameter param : processData.getProcessParameterList()) {
param.setProcessId(processMain.getProcessId());
processParameterRepository.save(param);
}
}
}
}
```
### 2. 添加必要的 Repository 接口
确保你有一个用于访问 `process_main` 和 `process_parameter` 表的 JPA 或 MyBatis Repository 接口。
#### ProcessMainRepository.java:
```java
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface ProcessMainRepository extends JpaRepository<ProcessMain, Long> {
List<Long> findAllProcessIds();
}
```
#### ProcessParameterRepository.java:
```java
import org.springframework.data.jpa.repository.JpaRepository;
public interface ProcessParameterRepository extends JpaRepository<ProcessParameter, Integer> {
void deleteByProcessId(Long processId);
}
```
### 3. 实体类调整
确保 `ProcessMain` 实体类中包含了所有必要的字段映射,并且与数据库表结构一致。特别是注意字段命名应该遵循 Java 的驼峰命名法。
以上代码实现了每天0点自动同步远端MES系统的工序数据至本地数据库的功能,同时会根据实际情况进行插入、更新或者删除操作。请注意根据实际项目环境适当调整相关配置及逻辑细节。
阅读全文
相关推荐












请分析以下代码中“编辑”按钮为什么没有用?编辑 <button type="button" class="close" data-dismiss="modal" aria-label="Close">×</button> 烹饪分类信息编辑 <form class="form-horizontal" name="cookClassEditForm" id="cookClassEditForm" enctype="multipart/form-data" method="post" class="mar_t15"> <label for="cookClass_cookClassId_edit" class="col-md-3 text-right">分类id:</label> <input type="text" id="cookClass_cookClassId_edit" name="cookClass.cookClassId" class="form-control" placeholder="请输入分类id" readOnly> <label for="cookClass_className_edit" class="col-md-3 text-right">分类名称:</label> <input type="text" id="cookClass_className_edit" name="cookClass.className" class="form-control" placeholder="请输入分类名称"> <label for="cookClass_cookClassDesc_edit" class="col-md-3 text-right">烹饪分类介绍:</label> <textarea id="cookClass_cookClassDesc_edit" name="cookClass.cookClassDesc" rows="8" class="form-control" placeholder="请输入烹饪分类介绍"></textarea> </form> <style>#cookClassEditForm .form-group {margin-bottom:5px;} </style> <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button> <button type="button" class="btn btn-primary" onclick="ajaxCookClassModify();">提交</button> function cookClassEdit(cookClassId) { $.ajax({ url : basePath + "CookClass/" + cookClassId + "/update", type : "get", dataType: "json", success : function (cookClass, response, status) { if (cookClass) { $("#cookClass_cookClassId_edit").val(cookClass.cookClassId); $("#cookClass_className_edit").val(cookClass.className); $("#cookClass_cookClassDesc_edit").val(cookClass.cookClassDesc); $('#cookClassEditDialog').modal('show'); } else { alert("获取信息失败!"); } } }); } function ajaxCookClassModify() { $.ajax({ url : basePath + "CookClass/" + $("#cookClass_cookClassId_edit").val() + "/update", type : "post", dataType: "json", data: new FormData($("#cookClassEditForm")[0]), success : function (obj, response, status) { if(obj.success){ alert("信息修改成功!"); location.href= basePath + "CookClass/frontlist"; }else{ alert(obj.message); } }, processData: false, contentType: false, }); }







