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..cc318a52 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 @@ -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..eb6f3a13 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 @@ -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/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..5a3a48df 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 @@ -184,6 +184,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 @@