SAP工艺路线同步优化

master
杨万里 13 hours ago
parent 52e68ac7f6
commit 0aed7fcf20

@ -91,7 +91,6 @@ public class RyTask {
public void getRouteTask(){
logger.info("++同步工艺+开始++getRouteTask+++++");
SapRouterQuery qo = new SapRouterQuery();
qo.setWerks("1000");
remoteSapService.sapRouterSync(qo);
}

@ -182,7 +182,37 @@ public class SapController extends BaseController {
@PostMapping("/sapRouterSync")
@Log(title = "工艺路线同步接口", businessType = BusinessType.SAP)
public R sapRouerSync(@RequestBody SapRouterQuery qo) {
return sapRouterService.sapRouterSync(qo);
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);
DynamicDataSourceContextHolder.push("master");
R<List<Map<String, String>>> dateSources0 = new R<>();
try {
dateSources0 = remoteUserService.getPoolNameList(sysUser);
}finally {
DynamicDataSourceContextHolder.poll();
}
List<Map<String, String>> dateSources = dateSources0.getData();
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);
});
}finally {
DynamicDataSourceContextHolder.poll();
}
}else {
qo.setAedat(DateFormatUtils.format(maxTime, "yyyyMMdd"));
R r = sapRouterService.sapRouterSync(qo);
}
return R.ok();
// return sapRouterService.sapRouterSync(qo);
}
/**

@ -1,6 +1,7 @@
package com.op.sap.service.impl;
import com.alibaba.csp.sentinel.util.StringUtil;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import com.op.common.core.domain.R;
import com.op.common.core.exception.ServiceException;
@ -8,6 +9,7 @@ import com.op.common.core.utils.DateUtils;
import com.op.common.core.utils.StringUtils;
import com.op.common.core.utils.bean.BeanValidators;
import com.op.common.core.utils.uuid.IdUtils;
import com.op.common.datascope.annotation.DataScope;
import com.op.sap.mapper.*;
import com.op.sap.service.SapRouterService;
import com.op.sap.util.SAPConnUtils;
@ -52,7 +54,7 @@ public class SapRouterServiceImpl implements SapRouterService {
@Override
public R sapRouterSync(SapRouterQuery sapRouterQuery) {
DynamicDataSourceContextHolder.push("ds_"+sapRouterQuery.getWerks());
DynamicDataSourceContextHolder.push("ds_"+sapRouterQuery.getWerks());
try {
int successNum = 0;
int failureNum = 0;
@ -315,7 +317,8 @@ public class SapRouterServiceImpl implements SapRouterService {
return R.fail(e.getMessage());
}
return R.ok(successMsg.toString());
}finally {
}
finally {
DynamicDataSourceContextHolder.poll();
}
}

@ -5,6 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.op.common.security.annotation.EnableCustomConfig;
import com.op.common.security.annotation.EnableRyFeignClients;
import com.op.common.swagger.annotation.EnableCustomSwagger2;
import org.springframework.scheduling.annotation.EnableAsync;
/**
*
@ -15,6 +16,7 @@ import com.op.common.swagger.annotation.EnableCustomSwagger2;
@EnableCustomSwagger2
@EnableRyFeignClients
@SpringBootApplication
@EnableAsync
public class TechnologyApplication {
public static void main(String[] args) {
SpringApplication.run(TechnologyApplication.class, args);

@ -1,6 +1,7 @@
package com.op.technology.controller;
import java.util.List;
import java.util.concurrent.Executor;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@ -26,15 +27,10 @@ import com.op.system.api.domain.sap.SapRouterQuery;
import com.op.technology.domain.ProRoute;
import com.op.technology.service.IProRouteProcessService;
import com.op.technology.service.IProRouteService;
import com.op.technology.service.SapRouteService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@ -60,6 +56,8 @@ public class ProRouteController extends BaseController {
private DynamicDatasourceCreator dynamicDatasourceCreator;
@Resource
private DynamicRoutingDataSource dynamicRoutingDataSource;
@Resource // 或 @Autowired
private SapRouteService sapRouteService;
/**
* 线
*/
@ -154,13 +152,29 @@ public class ProRouteController extends BaseController {
@Log(title = "手动执行同步SAP工艺路线", businessType = BusinessType.INSERT)
@RequiresPermissions("mes:pro:proroute:add")
@PostMapping("/sapProRouteProcess")
public AjaxResult sapProRouteProcess() {
SapRouterQuery qo = new SapRouterQuery();
R r = remoteSapService.sapRouterSync(qo);
if (r.getCode() == 200) {
return AjaxResult.success();
public AjaxResult sapProRouteProcess(@RequestHeader(value = "Poolname", required = false) String poolName) {
// SapRouterQuery qo = new SapRouterQuery();
// qo.setWerks(poolName.replace("ds_", ""));
// R r = remoteSapService.sapRouterSync(qo);
// if (r.getCode() == 200) {
// return AjaxResult.success("5分钟后查看工艺同步情况");
// }
// return AjaxResult.error("手动同步失败");
// 1. 参数处理
String werks = "";
if (poolName != null) {
werks = poolName.replace("ds_", "");
}
return AjaxResult.error("手动同步失败");
SapRouterQuery qo = new SapRouterQuery();
qo.setWerks(werks);
// 2. 【关键变化】调用异步 Service 方法
// 这行代码执行后会立即返回,不会等待 sapRouterSync 完成
sapRouteService.asyncExecuteSapSync(qo);
// 3. 立即返回成功提示
return AjaxResult.success("任务已提交后台执行预计耗时较长请5分钟后查看工艺同步情况。");
}
@PostMapping("/addDatasource")

@ -0,0 +1,39 @@
package com.op.technology.service;
import com.op.common.core.domain.R;
import com.op.system.api.RemoteSapService;
import com.op.system.api.domain.sap.SapRouterQuery;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
@Slf4j
public class SapRouteService {
@Resource
private RemoteSapService remoteSapService;
// 2. 添加 @Async 注解,表示该方法在独立线程池执行
@Async
public void asyncExecuteSapSync(SapRouterQuery qo) {
log.info("【异步任务开始】开始同步 SAP 工艺路线,工厂代码:{}", qo.getWerks());
try {
// 执行耗时操作
R r = remoteSapService.sapRouterSync(qo);
if (r.getCode() == 200) {
log.info("【异步任务成功】SAP 工艺路线同步成功");
// TODO: 可选:在这里更新数据库状态,标记任务为"成功"
} else {
log.error("【异步任务失败】SAP 工艺路线同步失败,原因:{}", r.getMsg());
// TODO: 可选:在这里更新数据库状态,标记任务为"失败"
}
} catch (Exception e) {
// 3. 必须捕获异常!否则线程会终止且前端无法感知,日志也会报错
log.error("【异步任务异常】执行 SAP 同步时发生系统异常", e);
// TODO: 可选:记录错误日志到数据库
}
}
}
Loading…
Cancel
Save