SAP工艺路线同步优化

master
杨万里 1 week ago
parent 9d22ddc9ca
commit 238e123e82

@ -35,6 +35,8 @@ import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import static org.reflections.Reflections.log;
@RestController
@RequestMapping("/sap")
public class SapController extends BaseController {
@ -185,34 +187,64 @@ public class SapController extends BaseController {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_YEAR, -1);
Date maxTime = calendar.getTime();
if (qo.getWerks() == null) {
SysUser sysUser = new SysUser();
sysUser.setUserId(1L);
// 1. 获取主数据源下的工厂列表
DynamicDataSourceContextHolder.push("master");
R<List<Map<String, String>>> dateSources0 = new R<>();
R<List<Map<String, String>>> dataSourceResult;
try {
dateSources0 = remoteUserService.getPoolNameList(sysUser);
dataSourceResult = remoteUserService.getPoolNameList(sysUser);
} catch (Exception e) {
log.error("获取数据源列表失败", e);
return R.fail("获取工厂列表异常");
} finally {
DynamicDataSourceContextHolder.poll();
DynamicDataSourceContextHolder.poll(); // 释放主数据源
}
List<Map<String, String>> dateSources = dateSources0.getData();
List<Map<String, String>> dataSources = dataSourceResult.getData();
if (dataSources == null || dataSources.isEmpty()) {
return R.ok("未找到可同步的工厂");
}
// 2. 遍历工厂进行同步
StringBuilder resultMsg = new StringBuilder();
for (Map<String, String> dataSource : dataSources) {
String poolName = dataSource.get("poolName");
if (poolName == null) continue;
// 使用 try-finally 确保每个数据源都能正确释放(防止 ThreadLocal 泄漏)
try {
dateSources.forEach(dateSource -> {
logger.info("++++++++++++" + dateSource.get("poolName") + "++++工艺路线开始++++++++++");
DynamicDataSourceContextHolder.push(dateSource.get("poolName"));// 这是数据源的key
qo.setWerks(dateSource.get("poolName").replace("ds_", ""));//工厂
qo.setAedat(DateFormatUtils.format(maxTime, "yyyyMMdd"));
R r = sapRouterService.sapRouterSync(qo);
});
DynamicDataSourceContextHolder.push(poolName);
logger.info("++++++++++++ {} ++++工艺路线开始++++++++++", poolName);
// 构造本次同步的参数
SapRouterQuery subQuery = new SapRouterQuery();
// 复制通用参数...
subQuery.setWerks(poolName.replace("ds_", ""));
subQuery.setAedat(DateFormatUtils.format(maxTime, "yyyyMMdd"));
// 执行同步
R r = sapRouterService.sapRouterSync(subQuery);
resultMsg.append(poolName).append(":").append(r.getMsg()).append("; ");
} catch (Exception e) {
log.error("工厂 {} 同步失败", poolName, e);
resultMsg.append(poolName).append(":失败-").append(e.getMessage()).append("; ");
} finally {
DynamicDataSourceContextHolder.poll();
DynamicDataSourceContextHolder.poll(); // 核心:确保释放
}
}
return R.ok(resultMsg.toString());
} else {
qo.setAedat(DateFormatUtils.format(maxTime, "yyyyMMdd"));
R r = sapRouterService.sapRouterSync(qo);
// 单工厂同步逻辑
// qo.setAedat(DateFormatUtils.format(maxTime, "yyyyMMdd"));
return sapRouterService.sapRouterSync(qo);
}
return R.ok();
// return sapRouterService.sapRouterSync(qo);
}
/**

Loading…
Cancel
Save