From 0aed7fcf20cb599e1a00a9d0f49a2cf816322e0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E4=B8=87=E9=87=8C?= <1726150332@qq.com> Date: Mon, 23 Mar 2026 17:29:50 +0800 Subject: [PATCH] =?UTF-8?q?SAP=E5=B7=A5=E8=89=BA=E8=B7=AF=E7=BA=BF?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/op/job/task/RyTask.java | 1 - .../com/op/sap/controller/SapController.java | 32 +++++++++++++- .../service/impl/SapRouterServiceImpl.java | 7 +++- .../op/technology/TechnologyApplication.java | 2 + .../controller/ProRouteController.java | 42 ++++++++++++------- .../technology/service/SapRouteService.java | 39 +++++++++++++++++ 6 files changed, 105 insertions(+), 18 deletions(-) create mode 100644 op-modules/op-technology/src/main/java/com/op/technology/service/SapRouteService.java diff --git a/op-modules/op-job/src/main/java/com/op/job/task/RyTask.java b/op-modules/op-job/src/main/java/com/op/job/task/RyTask.java index 286bbac88..a89a5a0da 100644 --- a/op-modules/op-job/src/main/java/com/op/job/task/RyTask.java +++ b/op-modules/op-job/src/main/java/com/op/job/task/RyTask.java @@ -91,7 +91,6 @@ public class RyTask { public void getRouteTask(){ logger.info("++同步工艺+开始++getRouteTask+++++"); SapRouterQuery qo = new SapRouterQuery(); - qo.setWerks("1000"); remoteSapService.sapRouterSync(qo); } diff --git a/op-modules/op-sap/src/main/java/com/op/sap/controller/SapController.java b/op-modules/op-sap/src/main/java/com/op/sap/controller/SapController.java index e812dc596..6454c1cd4 100644 --- a/op-modules/op-sap/src/main/java/com/op/sap/controller/SapController.java +++ b/op-modules/op-sap/src/main/java/com/op/sap/controller/SapController.java @@ -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>> dateSources0 = new R<>(); + try { + dateSources0 = remoteUserService.getPoolNameList(sysUser); + }finally { + DynamicDataSourceContextHolder.poll(); + } + List> 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); } /** diff --git a/op-modules/op-sap/src/main/java/com/op/sap/service/impl/SapRouterServiceImpl.java b/op-modules/op-sap/src/main/java/com/op/sap/service/impl/SapRouterServiceImpl.java index 2c6a8a31a..dbb38edd1 100644 --- a/op-modules/op-sap/src/main/java/com/op/sap/service/impl/SapRouterServiceImpl.java +++ b/op-modules/op-sap/src/main/java/com/op/sap/service/impl/SapRouterServiceImpl.java @@ -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(); } } diff --git a/op-modules/op-technology/src/main/java/com/op/technology/TechnologyApplication.java b/op-modules/op-technology/src/main/java/com/op/technology/TechnologyApplication.java index fb3aa6666..160d980e6 100644 --- a/op-modules/op-technology/src/main/java/com/op/technology/TechnologyApplication.java +++ b/op-modules/op-technology/src/main/java/com/op/technology/TechnologyApplication.java @@ -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); diff --git a/op-modules/op-technology/src/main/java/com/op/technology/controller/ProRouteController.java b/op-modules/op-technology/src/main/java/com/op/technology/controller/ProRouteController.java index f37f669b7..87d14e442 100644 --- a/op-modules/op-technology/src/main/java/com/op/technology/controller/ProRouteController.java +++ b/op-modules/op-technology/src/main/java/com/op/technology/controller/ProRouteController.java @@ -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") diff --git a/op-modules/op-technology/src/main/java/com/op/technology/service/SapRouteService.java b/op-modules/op-technology/src/main/java/com/op/technology/service/SapRouteService.java new file mode 100644 index 000000000..18056a79c --- /dev/null +++ b/op-modules/op-technology/src/main/java/com/op/technology/service/SapRouteService.java @@ -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: 可选:记录错误日志到数据库 + } + } +}