diff --git a/nl-framework/nl-common/src/main/java/cn/code/nl/framework/common/pojo/AcsBaseReqDTO.java b/nl-framework/nl-common/src/main/java/cn/code/nl/framework/common/pojo/AcsBaseReqDTO.java
index 23fff4ab..750e420b 100644
--- a/nl-framework/nl-common/src/main/java/cn/code/nl/framework/common/pojo/AcsBaseReqDTO.java
+++ b/nl-framework/nl-common/src/main/java/cn/code/nl/framework/common/pojo/AcsBaseReqDTO.java
@@ -2,13 +2,15 @@ package cn.code.nl.framework.common.pojo;
import lombok.Data;
+import java.io.Serializable;
+
/**
* 基础DTO对象
* @Author: liyongde
* @Date: 2026/7/24 8:49
*/
@Data
-public class AcsBaseReqDTO {
+public class AcsBaseReqDTO implements Serializable {
/**
* 请求号: traceId
*/
diff --git a/nl-framework/nl-common/src/main/java/cn/code/nl/framework/common/pojo/AcsBaseRespDTO.java b/nl-framework/nl-common/src/main/java/cn/code/nl/framework/common/pojo/AcsBaseRespDTO.java
index 91c763ea..1d41351c 100644
--- a/nl-framework/nl-common/src/main/java/cn/code/nl/framework/common/pojo/AcsBaseRespDTO.java
+++ b/nl-framework/nl-common/src/main/java/cn/code/nl/framework/common/pojo/AcsBaseRespDTO.java
@@ -2,13 +2,15 @@ package cn.code.nl.framework.common.pojo;
import lombok.Data;
+import java.io.Serializable;
+
/**
* acs返回基础对象
* @Author: liyongde
* @Date: 2026/7/24 10:27
*/
@Data
-public class AcsBaseRespDTO {
+public class AcsBaseRespDTO implements Serializable {
/**
* 是否整体成功
*/
@@ -23,4 +25,15 @@ public class AcsBaseRespDTO {
* 响应消息
*/
private String msg;
+
+ /**
+ * 请求号: traceId
+ */
+ private String traceId;
+
+ /**
+ *
+ * 时间
+ */
+ private Long timestamp;
}
diff --git a/nl-framework/nl-spring-boot-starter-execute/pom.xml b/nl-framework/nl-spring-boot-starter-execute/pom.xml
index 945c3e26..093829fa 100644
--- a/nl-framework/nl-spring-boot-starter-execute/pom.xml
+++ b/nl-framework/nl-spring-boot-starter-execute/pom.xml
@@ -18,6 +18,12 @@
nl-common
+
+ cn.nl.cloud
+ nl-module-infra-api
+ ${revision}
+
+
org.springframework.boot
diff --git a/nl-framework/nl-spring-boot-starter-execute/src/main/java/cn/code/nl/framework/execute/config/NlExecuteRpcAutoConfiguration.java b/nl-framework/nl-spring-boot-starter-execute/src/main/java/cn/code/nl/framework/execute/config/NlExecuteRpcAutoConfiguration.java
index dd878f0d..81398424 100644
--- a/nl-framework/nl-spring-boot-starter-execute/src/main/java/cn/code/nl/framework/execute/config/NlExecuteRpcAutoConfiguration.java
+++ b/nl-framework/nl-spring-boot-starter-execute/src/main/java/cn/code/nl/framework/execute/config/NlExecuteRpcAutoConfiguration.java
@@ -2,6 +2,7 @@ package cn.code.nl.framework.execute.config;
import cn.code.nl.framework.execute.biz.api.lms.LmsTaskCommonApi;
import cn.code.nl.framework.execute.biz.api.wms.WmsTaskCommonApi;
+import cn.code.nl.module.infra.api.config.ConfigApi;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.cloud.openfeign.EnableFeignClients;
@@ -13,6 +14,6 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
* @Date: 2026/7/15
*/
@AutoConfiguration
-@EnableFeignClients(clients = {LmsTaskCommonApi.class, WmsTaskCommonApi.class})
+@EnableFeignClients(clients = {LmsTaskCommonApi.class, WmsTaskCommonApi.class, ConfigApi.class})
public class NlExecuteRpcAutoConfiguration {
}
diff --git a/nl-framework/nl-common/src/main/java/cn/code/nl/framework/common/util/http/AcsUtil.java b/nl-framework/nl-spring-boot-starter-execute/src/main/java/cn/code/nl/framework/execute/util/http/AcsUtil.java
similarity index 50%
rename from nl-framework/nl-common/src/main/java/cn/code/nl/framework/common/util/http/AcsUtil.java
rename to nl-framework/nl-spring-boot-starter-execute/src/main/java/cn/code/nl/framework/execute/util/http/AcsUtil.java
index 0ada5947..d5706684 100644
--- a/nl-framework/nl-common/src/main/java/cn/code/nl/framework/common/util/http/AcsUtil.java
+++ b/nl-framework/nl-spring-boot-starter-execute/src/main/java/cn/code/nl/framework/execute/util/http/AcsUtil.java
@@ -1,33 +1,49 @@
-package cn.code.nl.framework.common.util.http;
+package cn.code.nl.framework.execute.util.http;
-import cn.code.nl.framework.common.exception.ServerException;
import cn.code.nl.framework.common.exception.ServiceException;
+import cn.code.nl.framework.common.pojo.AcsBaseRespDTO;
+import cn.code.nl.framework.common.util.http.HttpUtils;
import cn.code.nl.framework.common.util.json.JsonUtils;
+import cn.code.nl.framework.common.util.spring.SpringUtils;
+import cn.code.nl.module.infra.api.config.ConfigApi;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
+import lombok.extern.slf4j.Slf4j;
-import java.net.ConnectException;
-import java.net.NoRouteToHostException;
-import java.net.SocketException;
-import java.net.SocketTimeoutException;
-import java.net.UnknownHostException;
+import java.net.*;
import java.util.Collections;
import java.util.Map;
/**
* ACS 调用工具
*/
+@Slf4j
public class AcsUtil {
+ /**
+ * ACS 开关配置
+ */
+ private static final String ACS_SWITCH_CONFIG_KEY = "acs_switch_config";
+
+ /**
+ * ACS 不启用
+ */
+ private static final String ACS_DISABLED = "0";
+
/**
* 发送 POST 请求并解析响应
*
* @param serverAddress ACS 服务地址
- * @param api API 路径
- * @param request 请求参数
- * @param responseType 响应类型
+ * @param api API 路径
+ * @param request 请求参数
+ * @param responseType 响应类型
* @return 响应对象
*/
public static T post(String serverAddress, String api, Object request, Class responseType) {
+ if (isAcsDisabled()) {
+ return buildDefaultSuccessResponse(responseType);
+ }
String url = buildUrl(serverAddress, api);
String response;
try {
@@ -41,6 +57,40 @@ public class AcsUtil {
return JsonUtils.parseObject(response, responseType);
}
+ /**
+ * 判断是否关闭 ACS
+ */
+ private static boolean isAcsDisabled() {
+ String configValue = getAcsSwitchConfigValue();
+ return StrUtil.equals(ACS_DISABLED, configValue);
+ }
+
+ /**
+ * 获取 ACS 开关配置
+ */
+ private static String getAcsSwitchConfigValue() {
+ try {
+ ConfigApi configApi = SpringUtils.getBean("configApi");
+ String checkedData = configApi.getConfigValueByKey(ACS_SWITCH_CONFIG_KEY).getCheckedData();
+ return ObjectUtil.isEmpty(checkedData) ? ACS_DISABLED : checkedData;
+ } catch (Exception ex) {
+ log.error("获取 ACS 开关配置失败", ex);
+ return ACS_DISABLED;
+ }
+ }
+
+ /**
+ * 构建默认成功响应
+ */
+ private static T buildDefaultSuccessResponse(Class responseType) {
+ AcsBaseRespDTO response = new AcsBaseRespDTO();
+ response.setSuccess(true);
+ response.setCode("200");
+ response.setTraceId(IdUtil.simpleUUID());
+ response.setTimestamp(System.currentTimeMillis());
+ return JsonUtils.convertObject(response, responseType);
+ }
+
/**
* 拼接服务地址和 API
*/
diff --git a/nl-module-system/nl-module-system-api/src/main/java/cn/code/nl/module/system/enums/LogRecordConstants.java b/nl-module-system/nl-module-system-api/src/main/java/cn/code/nl/module/system/enums/LogRecordConstants.java
index 75fdbaf9..864db26c 100644
--- a/nl-module-system/nl-module-system-api/src/main/java/cn/code/nl/module/system/enums/LogRecordConstants.java
+++ b/nl-module-system/nl-module-system-api/src/main/java/cn/code/nl/module/system/enums/LogRecordConstants.java
@@ -39,4 +39,8 @@ public interface LogRecordConstants {
String TASK_INFO = "任务信息";
String TASK_INFO_OPERATE_TYPE = "操作任务状态";
String TASK_INFO_OPERATE_SUCCESS = "{{#loginUserNickname}}对任务操作了{{#operateName}}";
+ String TASK_INFO_ACS_OPERATE_SUCCESS = "ACS 操作任务 {{#operateName}}";
+ String TASK_INFO_ACS_EXECUTE_SUCCESS = "ACS {{#operateName}}";
+ String TASK_INFO_CREATE_BY_RPC = "{{#ownerService}} 创建了任务";
+ String TASK_INFO_CALL_BY_RPC = "{{#ownerService}} 回调任务:{{#taskId}}";
}
diff --git a/nl-module-system/nl-module-system-server/src/main/java/cn/code/nl/module/system/controller/admin/logger/OperateLogController.java b/nl-module-system/nl-module-system-server/src/main/java/cn/code/nl/module/system/controller/admin/logger/OperateLogController.java
index 31b6e3fc..6429fb41 100644
--- a/nl-module-system/nl-module-system-server/src/main/java/cn/code/nl/module/system/controller/admin/logger/OperateLogController.java
+++ b/nl-module-system/nl-module-system-server/src/main/java/cn/code/nl/module/system/controller/admin/logger/OperateLogController.java
@@ -7,6 +7,8 @@ import cn.code.nl.framework.common.pojo.PageResult;
import cn.code.nl.framework.common.util.object.BeanUtils;
import cn.code.nl.framework.excel.core.util.ExcelUtils;
import cn.code.nl.framework.translate.core.TranslateUtils;
+import cn.code.nl.module.system.api.logger.dto.OperateLogPageReqDTO;
+import cn.code.nl.module.system.api.logger.dto.OperateLogRespDTO;
import cn.code.nl.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO;
import cn.code.nl.module.system.controller.admin.logger.vo.operatelog.OperateLogRespVO;
import cn.code.nl.module.system.dal.dataobject.logger.OperateLogDO;
@@ -58,6 +60,15 @@ public class OperateLogController {
return success(BeanUtils.toBean(pageResult, OperateLogRespVO.class));
}
+ @GetMapping("/page2")
+ @Operation(summary = "查看操作日志分页列表2")
+ @PreAuthorize("@ss.hasPermission('system:operate-log:query')")
+ @TransMethodResult
+ public CommonResult> getOperateLogPage(OperateLogPageReqDTO pageReqDTO) {
+ PageResult operateLogPage = operateLogService.getOperateLogPage(pageReqDTO);
+ return success(BeanUtils.toBean(operateLogPage, OperateLogRespDTO.class));
+ }
+
@Operation(summary = "导出操作日志")
@GetMapping("/export-excel")
@PreAuthorize("@ss.hasPermission('system:operate-log:export')")
diff --git a/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/api/TransportTaskApi.java b/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/api/TransportTaskApi.java
index e6567d05..c9579ac9 100644
--- a/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/api/TransportTaskApi.java
+++ b/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/api/TransportTaskApi.java
@@ -39,6 +39,10 @@ public interface TransportTaskApi {
@Operation(summary = "根据 taskId 下发搬运任务")
CommonResult issueTransportTask(@RequestParam("taskId") Long taskId);
+ @PostMapping(PREFIX + "/issue-rollback")
+ @Operation(summary = "根据 taskId 下发搬运任务可回滚")
+ CommonResult issueTransportTaskRollBack(@RequestParam("taskId") Long taskId);
+
@GetMapping(PREFIX + "/getTaskById")
@Operation(summary = "根据 taskId 查询任务")
CommonResult getTaskById(@RequestParam("taskId") Long taskId);
diff --git a/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/enums/ErrorCodeConstants.java b/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/enums/ErrorCodeConstants.java
index 6d7f5290..78f3e2a0 100644
--- a/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/enums/ErrorCodeConstants.java
+++ b/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/enums/ErrorCodeConstants.java
@@ -17,5 +17,13 @@ public interface ErrorCodeConstants {
ErrorCode TRANSPORT_TASK_OPERATION_NOT_SUPPORTED = new ErrorCode(5006, "不支持的任务操作类型");
ErrorCode TRANSPORT_TASK_ALREADY_FINAL = new ErrorCode(5007, "任务已处于终态,不允许操作");
ErrorCode TRANSPORT_TASK_AUTO_ISSUE_NOT_ALLOW_MANUAL = new ErrorCode(5008, "自动任务不允许手动下发");
+ ErrorCode TRANSPORT_TASK_OPERATING = new ErrorCode(5009, "任务标识为:{}的任务正在操作中!");
+ ErrorCode TRANSPORT_TASK_ISSUE_FAILED = new ErrorCode(5010, "任务下发失败,失败原因:{}");
+ ErrorCode TRANSPORT_TASK_ACS_SERVER_ADDRESS_NOT_CONFIGURED = new ErrorCode(5011, "未配置 ACS 服务地址:{}");
+ ErrorCode TRANSPORT_TASK_ACS_OPERATE_CHECK_FAILED = new ErrorCode(5012, "ACS操作校验失败");
+ ErrorCode TRANSPORT_TASK_PRODUCT_AREA_EMPTY = new ErrorCode(5013, "{}生产区域为空,无法获取 ACS 服务地址");
+ ErrorCode TRANSPORT_TASK_ACS_OPERATE_CHECK_RESULT_EMPTY = new ErrorCode(5014, "ACS 操作校验返回为空");
+ ErrorCode TRANSPORT_TASK_ACS_OPERATE_NOT_ALLOW = new ErrorCode(5015, "ACS 不允许执行该操作,原因:{}");
+ ErrorCode TRANSPORT_TASK_OPERATION_FAILED = new ErrorCode(5016, "任务操作失败,失败原因:{}");
}
diff --git a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/api/TransportTaskApiImpl.java b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/api/TransportTaskApiImpl.java
index bd873ea6..707e80c1 100644
--- a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/api/TransportTaskApiImpl.java
+++ b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/api/TransportTaskApiImpl.java
@@ -44,6 +44,12 @@ public class TransportTaskApiImpl implements TransportTaskApi {
return success(true);
}
+ @Override
+ public CommonResult issueTransportTaskRollBack(Long taskId) {
+ transportTaskService.issueTransportTaskRollBack(taskId);
+ return success(true);
+ }
+
@Override
public CommonResult getTaskById(Long taskId) {
return success(transportTaskService.getTaskInfoById(taskId));
diff --git a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/manage/TransportTaskBusinessOperationManager.java b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/manage/TransportTaskBusinessOperationManager.java
index 7c492c2c..d8ba7978 100644
--- a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/manage/TransportTaskBusinessOperationManager.java
+++ b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/manage/TransportTaskBusinessOperationManager.java
@@ -1,6 +1,5 @@
package cn.code.nl.module.task.manage;
-import cn.code.nl.framework.common.exception.ServiceException;
import cn.code.nl.framework.common.pojo.CommonResult;
import cn.code.nl.framework.execute.biz.api.TaskCommonApi;
import cn.code.nl.framework.execute.biz.dto.TaskStatusCallApiReqDTO;
@@ -22,6 +21,8 @@ import java.util.EnumMap;
import java.util.Map;
import java.util.function.BiFunction;
+import static cn.code.nl.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.code.nl.module.task.enums.ErrorCodeConstants.TRANSPORT_TASK_OPERATING;
import static cn.code.nl.module.task.framework.common.util.TaskUtil.isAllowedFrom;
/**
@@ -81,7 +82,7 @@ public class TransportTaskBusinessOperationManager {
}
}
} else {
- throw new ServiceException(5007, "任务标识为:" + task.getTaskId() + "的任务正在操作中!");
+ throw exception(TRANSPORT_TASK_OPERATING, task.getTaskId());
}
}
diff --git a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/manage/TransportTaskIssueManager.java b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/manage/TransportTaskIssueManager.java
index 53af8afe..2cb22d7d 100644
--- a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/manage/TransportTaskIssueManager.java
+++ b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/manage/TransportTaskIssueManager.java
@@ -2,8 +2,8 @@ package cn.code.nl.module.task.manage;
import cn.code.nl.framework.common.exception.ServiceException;
import cn.code.nl.framework.common.pojo.CommonResult;
-import cn.code.nl.framework.common.util.http.AcsUtil;
import cn.code.nl.framework.common.util.json.JsonUtils;
+import cn.code.nl.framework.execute.util.http.AcsUtil;
import cn.code.nl.module.infra.api.config.ConfigApi;
import cn.code.nl.module.task.dal.dataobject.transporttask.TransportTaskDO;
import cn.code.nl.module.task.dal.mysql.transporttask.TransportTaskMapper;
@@ -24,7 +24,11 @@ import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
+import static cn.code.nl.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.code.nl.module.task.enums.AcsApiConstants.ACS_TASK_API;
+import static cn.code.nl.module.task.enums.ErrorCodeConstants.TRANSPORT_TASK_ACS_SERVER_ADDRESS_NOT_CONFIGURED;
+import static cn.code.nl.module.task.enums.ErrorCodeConstants.TRANSPORT_TASK_ISSUE_FAILED;
+import static cn.code.nl.module.task.enums.ErrorCodeConstants.TRANSPORT_TASK_PRODUCT_AREA_EMPTY;
/**
* 搬运任务下发管理器
@@ -57,6 +61,29 @@ public class TransportTaskIssueManager {
taskMap.forEach(this::issueProductAreaTasks);
}
+ /**
+ * 下发单个任务到 ACS,失败时直接抛出异常
+ *
+ * @param task 待下发任务
+ */
+ public void issueTask(TransportTaskDO task) {
+ if (StrUtil.isBlank(task.getProductArea())) {
+ throw exception(TRANSPORT_TASK_PRODUCT_AREA_EMPTY, "任务下发失败,失败原因:");
+ }
+ List acsTasks = List.of(AcsTaskUtil.buildAcsTaskDTO(task));
+ String requestJson = JsonUtils.toJsonString(acsTasks);
+ try {
+ String serverAddress = getAcsServerAddress(task.getProductArea());
+ AcsIssueResultRespDTO result = AcsUtil.post(serverAddress, ACS_TASK_API, acsTasks, AcsIssueResultRespDTO.class);
+ handleSingleIssueResult(task, result);
+ } catch (ServiceException ex) {
+ throw ex;
+ } catch (Exception ex) {
+ log.error("下发单个任务失败,productArea={},tasks={}", task.getProductArea(), requestJson, ex);
+ throw exception(TRANSPORT_TASK_ISSUE_FAILED, ex.getMessage());
+ }
+ }
+
/**
* 下发单个生产区域的任务
*
@@ -87,7 +114,7 @@ public class TransportTaskIssueManager {
CommonResult result = configApi.getConfigValueByKey(configKey);
String serverAddress = result.getCheckedData();
if (StrUtil.isBlank(serverAddress)) {
- throw new ServiceException(500, "未配置 ACS 服务地址:" + configKey);
+ throw exception(TRANSPORT_TASK_ACS_SERVER_ADDRESS_NOT_CONFIGURED, configKey);
}
return serverAddress;
}
@@ -125,6 +152,27 @@ public class TransportTaskIssueManager {
}
}
+ /**
+ * 处理单个任务的 ACS 下发响应
+ *
+ * @param task 本次下发任务
+ * @param result ACS 响应
+ */
+ private void handleSingleIssueResult(TransportTaskDO task, AcsIssueResultRespDTO result) {
+ if (result == null) {
+ throw exception(TRANSPORT_TASK_ISSUE_FAILED, "ACS 返回为空");
+ }
+ String resultJson = JsonUtils.toJsonString(result);
+ if (Boolean.TRUE.equals(result.getSuccess())) {
+ transportTaskMapper.updateIssueResult(task.getTaskId(), TransportTaskStatusEnum.ISSUED.getCode(), resultJson, null);
+ return;
+ }
+ String errorMessage = CollUtil.isNotEmpty(result.getFailedTasks())
+ ? result.getFailedTasks().get(0).getErrorMessage()
+ : result.getMsg();
+ throw exception(TRANSPORT_TASK_ISSUE_FAILED, StrUtil.blankToDefault(errorMessage, "ACS 下发失败"));
+ }
+
/**
* 更新任务为下发失败
*
diff --git a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/manage/TransportTaskOperateCheckManager.java b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/manage/TransportTaskOperateCheckManager.java
index bd6085bd..afd369f7 100644
--- a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/manage/TransportTaskOperateCheckManager.java
+++ b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/manage/TransportTaskOperateCheckManager.java
@@ -2,8 +2,8 @@ package cn.code.nl.module.task.manage;
import cn.code.nl.framework.common.exception.ServiceException;
import cn.code.nl.framework.common.pojo.CommonResult;
-import cn.code.nl.framework.common.util.http.AcsUtil;
import cn.code.nl.framework.common.util.json.JsonUtils;
+import cn.code.nl.framework.execute.util.http.AcsUtil;
import cn.code.nl.module.infra.api.config.ConfigApi;
import cn.code.nl.module.task.dal.dataobject.transporttask.TransportTaskDO;
import cn.code.nl.module.task.enums.TaskOperationTypeEnum;
@@ -14,7 +14,13 @@ import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
+import static cn.code.nl.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.code.nl.module.task.enums.AcsApiConstants.ACS_OPERATE_CHECK_API;
+import static cn.code.nl.module.task.enums.ErrorCodeConstants.TRANSPORT_TASK_ACS_OPERATE_CHECK_FAILED;
+import static cn.code.nl.module.task.enums.ErrorCodeConstants.TRANSPORT_TASK_ACS_OPERATE_CHECK_RESULT_EMPTY;
+import static cn.code.nl.module.task.enums.ErrorCodeConstants.TRANSPORT_TASK_ACS_OPERATE_NOT_ALLOW;
+import static cn.code.nl.module.task.enums.ErrorCodeConstants.TRANSPORT_TASK_ACS_SERVER_ADDRESS_NOT_CONFIGURED;
+import static cn.code.nl.module.task.enums.ErrorCodeConstants.TRANSPORT_TASK_PRODUCT_AREA_EMPTY;
/**
* PC 端任务操作 ACS 校验管理器
@@ -50,7 +56,7 @@ public class TransportTaskOperateCheckManager {
throw ex;
} catch (Exception ex) {
log.error("ACS 操作校验请求失败,reqDTO={}", JsonUtils.toJsonString(reqDTO), ex);
- throw new ServiceException(500, "ACS操作校验失败");
+ throw exception(TRANSPORT_TASK_ACS_OPERATE_CHECK_FAILED);
}
handleCheckResult(reqDTO, result);
}
@@ -71,13 +77,13 @@ public class TransportTaskOperateCheckManager {
*/
private String getAcsServerAddress(String productArea) {
if (StrUtil.isBlank(productArea)) {
- throw new ServiceException(500, "生产区域为空,无法获取 ACS 服务地址");
+ throw exception(TRANSPORT_TASK_PRODUCT_AREA_EMPTY, "");
}
String configKey = productArea + ACS_SERVER_ADDRESS_CONFIG_SUFFIX;
CommonResult result = configApi.getConfigValueByKey(configKey);
String serverAddress = result.getCheckedData();
if (StrUtil.isBlank(serverAddress)) {
- throw new ServiceException(500, "未配置 ACS 服务地址:" + configKey);
+ throw exception(TRANSPORT_TASK_ACS_SERVER_ADDRESS_NOT_CONFIGURED, configKey);
}
return serverAddress;
}
@@ -99,7 +105,7 @@ public class TransportTaskOperateCheckManager {
*/
private void handleCheckResult(AcsOperateCheckReqDTO reqDTO, AcsOperateCheckRespDTO result) {
if (result == null) {
- throw new ServiceException(500, "ACS 操作校验返回为空");
+ throw exception(TRANSPORT_TASK_ACS_OPERATE_CHECK_RESULT_EMPTY);
}
Boolean enableOperate = getEnableOperate(result);
if (Boolean.TRUE.equals(enableOperate)) {
@@ -108,7 +114,7 @@ public class TransportTaskOperateCheckManager {
String message = getMessage(result);
log.warn("ACS 拒绝 PC 端任务操作,reqDTO={},result={}",
JsonUtils.toJsonString(reqDTO), JsonUtils.toJsonString(result));
- throw new ServiceException(500, message);
+ throw exception(TRANSPORT_TASK_ACS_OPERATE_NOT_ALLOW, message);
}
/**
diff --git a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/manage/TransportTaskOperationManager.java b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/manage/TransportTaskOperationManager.java
index 28e334b5..5158daf8 100644
--- a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/manage/TransportTaskOperationManager.java
+++ b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/manage/TransportTaskOperationManager.java
@@ -28,6 +28,8 @@ import java.util.function.BiConsumer;
import static cn.code.nl.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.code.nl.module.task.enums.ErrorCodeConstants.TRANSPORT_TASK_AUTO_ISSUE_NOT_ALLOW_MANUAL;
+import static cn.code.nl.module.task.enums.ErrorCodeConstants.TRANSPORT_TASK_OPERATING;
+import static cn.code.nl.module.task.enums.ErrorCodeConstants.TRANSPORT_TASK_OPERATION_FAILED;
import static cn.code.nl.module.task.enums.ErrorCodeConstants.TRANSPORT_TASK_STATUS_NOT_ALLOW;
import static cn.code.nl.module.task.framework.common.util.TaskUtil.isAllowedFrom;
@@ -86,14 +88,14 @@ public class TransportTaskOperationManager {
throw serviceException;
}
log.error("[messageResend][执行异常][lockKey={}]", task.getTaskId(), ex);
- throw new ServiceException(500, ex.getMessage());
+ throw exception(TRANSPORT_TASK_OPERATION_FAILED, ex.getMessage());
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
} else {
- throw new ServiceException(5007, "任务标识为:" + task.getTaskId() + "的任务正在操作中!");
+ throw exception(TRANSPORT_TASK_OPERATING, task.getTaskId());
}
}
diff --git a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskCallbackServiceImpl.java b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskCallbackServiceImpl.java
index 1c5e53c4..b406f330 100644
--- a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskCallbackServiceImpl.java
+++ b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskCallbackServiceImpl.java
@@ -5,12 +5,16 @@ import cn.code.nl.module.task.dal.mysql.transporttask.TransportTaskMapper;
import cn.code.nl.module.task.dto.TaskCallbackResultReqDTO;
import cn.code.nl.module.task.enums.CallbackStatusEnum;
import cn.code.nl.module.task.enums.TransportTaskStatusEnum;
+import com.mzt.logapi.context.LogRecordContext;
+import com.mzt.logapi.starter.annotation.LogRecord;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import jakarta.annotation.Resource;
+import static cn.code.nl.module.system.enums.LogRecordConstants.*;
+
/**
* 业务回调结果处理服务实现
*
@@ -25,6 +29,10 @@ public class TransportTaskCallbackServiceImpl implements TransportTaskCallbackSe
private TransportTaskMapper transportTaskMapper;
@Override
+ @LogRecord(type = TASK_INFO,
+ subType = TASK_INFO_OPERATE_TYPE,
+ bizNo = "{{#reqDTO.taskId}}",
+ success = TASK_INFO_CALL_BY_RPC)
public void receiveCallbackResult(TaskCallbackResultReqDTO reqDTO) {
// 1. 查询任务
TransportTaskDO task = transportTaskMapper.selectById(reqDTO.getTaskId());
@@ -62,6 +70,10 @@ public class TransportTaskCallbackServiceImpl implements TransportTaskCallbackSe
}
transportTaskMapper.updateById(task);
+
+ LogRecordContext.putVariable("ownerService", task.getOwnerService());
+ LogRecordContext.putVariable("taskId", task.getTaskId());
+
log.info("业务回调结果已处理, taskId={}, result={}, newStatus={}",
reqDTO.getTaskId(), reqDTO.getResult(), task.getTaskStatus());
}
diff --git a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskFeedbackServiceImpl.java b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskFeedbackServiceImpl.java
index d1f519de..b4a1c84a 100644
--- a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskFeedbackServiceImpl.java
+++ b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskFeedbackServiceImpl.java
@@ -1,6 +1,5 @@
package cn.code.nl.module.task.service.transporttask;
-import cn.code.nl.framework.common.exception.ServiceException;
import cn.code.nl.framework.execute.biz.vo.AcsApplyActionRespVO;
import cn.code.nl.module.task.dal.dataobject.transporttask.TransportTaskDO;
import cn.code.nl.module.task.dal.mysql.transporttask.TransportTaskMapper;
@@ -11,14 +10,16 @@ import cn.code.nl.module.task.enums.TransportTaskStatusEnum;
import cn.code.nl.module.task.manage.TransportTaskBusinessOperationManager;
import cn.code.nl.module.task.manage.TransportTaskOperationManager;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.mzt.logapi.context.LogRecordContext;
+import com.mzt.logapi.starter.annotation.LogRecord;
+import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
-import jakarta.annotation.Resource;
-
import static cn.code.nl.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.code.nl.module.system.enums.LogRecordConstants.*;
import static cn.code.nl.module.task.enums.ErrorCodeConstants.TRANSPORT_TASK_NOT_EXISTS_ID;
/**
@@ -46,6 +47,10 @@ public class TransportTaskFeedbackServiceImpl implements TransportTaskFeedbackSe
@Override
@Transactional(rollbackFor = Exception.class)
+ @LogRecord(type = TASK_INFO,
+ subType = TASK_INFO_OPERATE_TYPE,
+ bizNo = "{{#reqDTO.taskId}}",
+ success = TASK_INFO_ACS_OPERATE_SUCCESS)
public void receiveAcsFeedback(AcsFeedbackReqDTO reqDTO) {
TransportTaskDO task = getTaskForFeedback(reqDTO);
saveResultParam(task, reqDTO);
@@ -58,10 +63,15 @@ public class TransportTaskFeedbackServiceImpl implements TransportTaskFeedbackSe
return;
}
transportTaskOperationManager.dispatchOperation(task, type, reqDTO);
+ LogRecordContext.putVariable("operateName", type.getName());
}
@Override
@Transactional(rollbackFor = Exception.class)
+ @LogRecord(type = TASK_INFO,
+ subType = TASK_INFO_OPERATE_TYPE,
+ bizNo = "{{#reqDTO.taskId}}",
+ success = TASK_INFO_ACS_EXECUTE_SUCCESS)
public AcsApplyActionRespVO receiveAcsBusinessFeedback(AcsFeedbackReqDTO reqDTO) {
TransportTaskDO task = getTaskForFeedback(reqDTO);
if (isFinalTask(task, reqDTO)) {
@@ -77,6 +87,7 @@ public class TransportTaskFeedbackServiceImpl implements TransportTaskFeedbackSe
reqDTO.getTaskId(), reqDTO.getStatus());
return buildResp(task);
}
+ LogRecordContext.putVariable("operateName", type.getName());
return transportTaskBusinessOperationManager.dispatchOperation(task, type, reqDTO);
}
diff --git a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskService.java b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskService.java
index 92d41856..27057427 100644
--- a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskService.java
+++ b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskService.java
@@ -82,6 +82,12 @@ public interface TransportTaskService {
* @param taskId 任务ID
*/
void issueTransportTask(Long taskId);
+ /**
+ * 根据任务ID下发搬运任务到 ACS 报错回滚
+ *
+ * @param taskId 任务ID
+ */
+ void issueTransportTaskRollBack(Long taskId);
/**
* 根据 taskId 查询任务全量信息(RPC 用,自动过滤逻辑删除,查不到返回 null)
diff --git a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskServiceImpl.java b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskServiceImpl.java
index 8181a758..f752f284 100644
--- a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskServiceImpl.java
+++ b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskServiceImpl.java
@@ -1,9 +1,12 @@
package cn.code.nl.module.task.service.transporttask;
+import cn.code.nl.framework.common.pojo.CommonResult;
import cn.code.nl.framework.common.pojo.PageResult;
import cn.code.nl.framework.common.util.object.BeanUtils;
import cn.code.nl.framework.security.core.util.SecurityFrameworkUtils;
import cn.code.nl.module.base.api.classstandard.ClassStandardApi;
+import cn.code.nl.module.base.api.codegen.CodeGenApi;
+import cn.code.nl.module.base.api.codegen.dto.CodeGenerateReqDTO;
import cn.code.nl.module.task.controller.admin.transporttask.vo.TransportTaskOperateReqVO;
import cn.code.nl.module.task.controller.admin.transporttask.vo.TransportTaskPageReqVO;
import cn.code.nl.module.task.controller.admin.transporttask.vo.TransportTaskSaveReqVO;
@@ -34,9 +37,7 @@ import java.util.List;
import static cn.code.nl.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.code.nl.module.system.enums.LogRecordConstants.*;
-import static cn.code.nl.module.task.enums.ErrorCodeConstants.TRANSPORT_TASK_ALREADY_FINAL;
-import static cn.code.nl.module.task.enums.ErrorCodeConstants.TRANSPORT_TASK_NOT_EXISTS;
-import static cn.code.nl.module.task.enums.ErrorCodeConstants.TRANSPORT_TASK_OPERATION_NOT_SUPPORTED;
+import static cn.code.nl.module.task.enums.ErrorCodeConstants.*;
/**
* 搬运任务 Service 实现类
@@ -63,6 +64,9 @@ public class TransportTaskServiceImpl implements TransportTaskService {
@Resource
private ClassStandardApi classStandardApi;
+ @Resource
+ private CodeGenApi codeGenApi;
+
@Override
public Long createTransportTask(TransportTaskSaveReqVO createReqVO) {
TransportTaskDO transportTask = BeanUtils.toBean(createReqVO, TransportTaskDO.class);
@@ -71,8 +75,16 @@ public class TransportTaskServiceImpl implements TransportTaskService {
}
@Override
+ @LogRecord(type = TASK_INFO,
+ subType = TASK_INFO_OPERATE_TYPE,
+ bizNo = "{{_ret}}",
+ success = TASK_INFO_CREATE_BY_RPC)
public Long createTransportTaskByRpc(TransportTaskCreateReqDTO reqDTO) {
TransportTaskDO task = BeanUtils.toBean(reqDTO, TransportTaskDO.class);
+ CodeGenerateReqDTO codeGenerateReqDTO = new CodeGenerateReqDTO();
+ codeGenerateReqDTO.setRuleCode("TASK_CODE");
+ CommonResult generate = codeGenApi.generate(codeGenerateReqDTO);
+ task.setTaskCode(generate.getCheckedData());
task.setTaskStatus(reqDTO.getIsCreateFinish()
? TransportTaskStatusEnum.READY.getCode()
: TransportTaskStatusEnum.CREATED.getCode());
@@ -81,6 +93,7 @@ public class TransportTaskServiceImpl implements TransportTaskService {
task.setCreateMode("RPC");
transportTaskMapper.insert(task);
+ LogRecordContext.putVariable("ownerService", task.getOwnerService());
return task.getTaskId();
}
@@ -184,6 +197,15 @@ public class TransportTaskServiceImpl implements TransportTaskService {
transportTaskOperationManager.dispatchOperation(task, TaskOperationTypeEnum.ISSUE, reqDTO);
}
+ @Override
+ public void issueTransportTaskRollBack(Long taskId) {
+ TransportTaskDO task = transportTaskMapper.selectById(taskId);
+ if (task == null) {
+ throw exception(TRANSPORT_TASK_NOT_EXISTS);
+ }
+ transportTaskIssueManager.issueTask(task);
+ }
+
@Override
public TaskInfoDTO getTaskInfoById(Long taskId) {
TransportTaskDO task = transportTaskMapper.selectById(taskId);
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/system/operate-log/index.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/system/operate-log/index.ts
index 8b84a260..df3c58b6 100644
--- a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/system/operate-log/index.ts
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/system/operate-log/index.ts
@@ -33,6 +33,14 @@ export function getOperateLogPage(params: PageParam) {
);
}
+/** 查询操作日志列表2 */
+export function getOperateLogPage2(params: PageParam) {
+ return requestClient.get>(
+ '/system/operate-log/page2',
+ { params },
+ );
+}
+
/** 导出操作日志 */
export function exportOperateLog(params: any) {
return requestClient.download('/system/operate-log/export-excel', { params });
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/task/transporttask/index.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/task/transporttask/index.ts
index 93edf5f8..930b32dd 100644
--- a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/task/transporttask/index.ts
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/task/transporttask/index.ts
@@ -5,6 +5,7 @@ import { requestClient } from '#/api/request';
export namespace TaskTransportTaskApi {
/** 搬运任务信息 */
export interface TransportTask {
+ id?: number | string;
taskId?: string;
taskCode?: string; // 任务编码
taskName: string; // 任务名称
@@ -52,7 +53,7 @@ export function getTransportTaskPage(params: PageParam) {
}
/** 查询搬运任务详情 */
-export function getTransportTask(id: number) {
+export function getTransportTask(id: number | string) {
return requestClient.get(
`/task/transport-task/get?id=${id}`,
);
@@ -69,12 +70,12 @@ export function updateTransportTask(data: TaskTransportTaskApi.TransportTask) {
}
/** 删除搬运任务 */
-export function deleteTransportTask(id: number) {
+export function deleteTransportTask(id: number | string) {
return requestClient.delete(`/task/transport-task/delete?id=${id}`);
}
/** 批量删除搬运任务 */
-export function deleteTransportTaskList(ids: number[]) {
+export function deleteTransportTaskList(ids: Array) {
return requestClient.delete(
`/task/transport-task/delete-list?ids=${ids.join(',')}`,
);
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/task/transporttask/index.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/task/transporttask/index.vue
index 49ffe9c3..4fff0fad 100644
--- a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/task/transporttask/index.vue
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/task/transporttask/index.vue
@@ -1,15 +1,28 @@