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 @@