Junjie
2 天以前 63b01db83d9aad8a15276b4236a9a22e4aeef065
src/main/java/com/zy/ai/service/impl/AutoTuneCoordinatorServiceImpl.java
@@ -2,12 +2,16 @@
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zy.ai.domain.autotune.AutoTuneControlModeSnapshot;
import com.zy.ai.domain.autotune.AutoTuneJobStatus;
import com.zy.ai.domain.autotune.AutoTuneTriggerType;
import com.zy.ai.entity.AiAutoTuneMcpCall;
import com.zy.ai.entity.AiAutoTuneJob;
import com.zy.ai.enums.AiPromptScene;
import com.zy.ai.service.AiAutoTuneJobService;
import com.zy.ai.service.AiAutoTuneMcpCallService;
import com.zy.ai.service.AutoTuneAgentService;
import com.zy.ai.service.AutoTuneControlModeService;
import com.zy.ai.service.AutoTuneCoordinatorService;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.WrkMastService;
@@ -21,6 +25,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.LinkedHashMap;
@@ -33,16 +38,12 @@
@RequiredArgsConstructor
public class AutoTuneCoordinatorServiceImpl implements AutoTuneCoordinatorService {
    private static final String CONFIG_ENABLED = "aiAutoTuneEnabled";
    private static final String CONFIG_INTERVAL_MINUTES = "aiAutoTuneIntervalMinutes";
    private static final String DEFAULT_ENABLED = "N";
    private static final int DEFAULT_INTERVAL_MINUTES = 10;
    private static final int MIN_INTERVAL_MINUTES = 5;
    private static final int MAX_INTERVAL_MINUTES = 60;
    private static final int RUNNING_LOCK_SECONDS = 20 * 60;
    private static final long SYSTEM_USER_ID = 9527L;
    private static final int SUMMARY_MAX_LENGTH = 512;
    private static final int ERROR_MESSAGE_MAX_LENGTH = 1024;
    private static final List<Long> FINAL_WRK_STS_LIST = Arrays.asList(
            WrkStsType.COMPLETE_INBOUND.sts,
            WrkStsType.SETTLE_INBOUND.sts,
@@ -53,8 +54,10 @@
    );
    private final ConfigService configService;
    private final AutoTuneControlModeService autoTuneControlModeService;
    private final WrkMastService wrkMastService;
    private final AiAutoTuneJobService aiAutoTuneJobService;
    private final AiAutoTuneMcpCallService aiAutoTuneMcpCallService;
    private final AutoTuneAgentService autoTuneAgentService;
    private final RedisUtil redisUtil;
    private final OperateLogService operateLogService;
@@ -115,14 +118,8 @@
    }
    private boolean isEnabled() {
        String enabled = configService.getConfigValue(CONFIG_ENABLED, DEFAULT_ENABLED);
        if (enabled == null) {
            return false;
        }
        String normalized = enabled.trim();
        return "Y".equalsIgnoreCase(normalized)
                || "true".equalsIgnoreCase(normalized)
                || "1".equals(normalized);
        AutoTuneControlModeSnapshot controlMode = autoTuneControlModeService.currentMode();
        return controlMode != null && Boolean.TRUE.equals(controlMode.getEnabled());
    }
    private int resolveIntervalMinutes() {
@@ -191,6 +188,7 @@
    }
    private AutoTuneAgentService.AutoTuneAgentResult failedAgentResult(String triggerType, Exception exception) {
        AutoTuneControlModeSnapshot controlMode = autoTuneControlModeService.currentMode();
        AutoTuneAgentService.AutoTuneAgentResult result = new AutoTuneAgentService.AutoTuneAgentResult();
        result.setSuccess(false);
        result.setTriggerType(triggerType);
@@ -201,6 +199,14 @@
        result.setCompletionTokens(0L);
        result.setTotalTokens(0L);
        result.setMaxRoundsReached(false);
        result.setAnalysisOnly(controlMode.getAnalysisOnly());
        result.setAllowApply(controlMode.getAllowApply());
        result.setExecutionMode(controlMode.getModeCode());
        result.setActualApplyCalled(false);
        result.setRollbackCalled(false);
        result.setSuccessCount(0);
        result.setRejectCount(0);
        result.setMcpCalls(new ArrayList<>());
        return result;
    }
@@ -224,20 +230,18 @@
        Integer intervalMinutes = resolveIntervalMinutes();
        AiAutoTuneJob job = new AiAutoTuneJob();
        job.setTriggerType(AutoTuneTriggerType.normalize(triggerType));
        job.setStatus(Boolean.TRUE.equals(agentResult.getSuccess())
                ? AutoTuneJobStatus.SUCCESS.getCode()
                : AutoTuneJobStatus.FAILED.getCode());
        job.setStatus(resolveAuditStatus(agentResult));
        job.setStartTime(startTime == null ? finishTime : startTime);
        job.setFinishTime(finishTime);
        job.setHasActiveTasks(resolveHasActiveTasksForAudit());
        job.setPromptSceneCode(AiPromptScene.AUTO_TUNE_DISPATCH.getCode());
        job.setSummary(limitText(agentResult.getSummary(), SUMMARY_MAX_LENGTH));
        job.setSummary(agentResult.getSummary());
        job.setIntervalBefore(intervalMinutes);
        job.setIntervalAfter(intervalMinutes);
        job.setSuccessCount(0);
        job.setRejectCount(0);
        if (!Boolean.TRUE.equals(agentResult.getSuccess())) {
            job.setErrorMessage(limitText(agentResult.getSummary(), ERROR_MESSAGE_MAX_LENGTH));
        job.setSuccessCount(safeCount(agentResult.getSuccessCount()));
        job.setRejectCount(safeCount(agentResult.getRejectCount()));
        if (isErrorAuditStatus(job.getStatus())) {
            job.setErrorMessage(agentResult.getSummary());
        }
        job.setLlmCallCount(agentResult.getLlmCallCount() == null ? 0 : agentResult.getLlmCallCount());
        job.setPromptTokens(toSafeInteger(agentResult.getPromptTokens()));
@@ -246,7 +250,94 @@
        job.setCreateTime(job.getStartTime());
        if (!aiAutoTuneJobService.save(job)) {
            log.warn("Auto tune coordinator failed to save agent run audit");
            return;
        }
        safeWriteMcpCallAudit(job.getId(), agentResult);
    }
    private void safeWriteMcpCallAudit(Long agentJobId, AutoTuneAgentService.AutoTuneAgentResult agentResult) {
        try {
            writeMcpCallAudit(agentJobId, agentResult);
        } catch (Exception exception) {
            log.warn("Auto tune coordinator failed to write MCP call audit", exception);
        }
    }
    private void writeMcpCallAudit(Long agentJobId, AutoTuneAgentService.AutoTuneAgentResult agentResult) {
        if (agentJobId == null || agentResult == null || agentResult.getMcpCalls() == null
                || agentResult.getMcpCalls().isEmpty()) {
            return;
        }
        List<AiAutoTuneMcpCall> mcpCalls = new ArrayList<>();
        Date createTime = new Date();
        for (AutoTuneAgentService.McpCallResult callResult : agentResult.getMcpCalls()) {
            mcpCalls.add(toMcpCallEntity(agentJobId, callResult, createTime));
        }
        if (!aiAutoTuneMcpCallService.saveBatch(mcpCalls)) {
            log.warn("Auto tune coordinator failed to save MCP call audit");
        }
    }
    private AiAutoTuneMcpCall toMcpCallEntity(Long agentJobId,
                                              AutoTuneAgentService.McpCallResult callResult,
                                              Date createTime) {
        AiAutoTuneMcpCall mcpCall = new AiAutoTuneMcpCall();
        mcpCall.setAgentJobId(agentJobId);
        mcpCall.setCallSeq(callResult.getCallSeq());
        mcpCall.setToolName(callResult.getToolName());
        mcpCall.setStatus(callResult.getStatus());
        mcpCall.setDryRun(toTinyInt(callResult.getDryRun()));
        mcpCall.setApplyJobId(callResult.getApplyJobId());
        mcpCall.setSuccessCount(safeCount(callResult.getSuccessCount()));
        mcpCall.setRejectCount(safeCount(callResult.getRejectCount()));
        mcpCall.setDurationMs(callResult.getDurationMs());
        mcpCall.setRequestJson(callResult.getRequestJson());
        mcpCall.setResponseJson(callResult.getResponseJson());
        mcpCall.setErrorMessage(callResult.getErrorMessage());
        mcpCall.setCreateTime(createTime);
        return mcpCall;
    }
    private Integer toTinyInt(Boolean value) {
        if (value == null) {
            return null;
        }
        return value ? 1 : 0;
    }
    private String resolveAuditStatus(AutoTuneAgentService.AutoTuneAgentResult agentResult) {
        int successCount = safeCount(agentResult.getSuccessCount());
        int rejectCount = safeCount(agentResult.getRejectCount());
        if (!Boolean.TRUE.equals(agentResult.getSuccess())) {
            if (successCount > 0 && rejectCount > 0) {
                return AutoTuneJobStatus.PARTIAL_SUCCESS.getCode();
            }
            if (rejectCount > 0) {
                return AutoTuneJobStatus.REJECTED.getCode();
            }
            return AutoTuneJobStatus.FAILED.getCode();
        }
        if (successCount > 0 && rejectCount > 0) {
            return AutoTuneJobStatus.PARTIAL_SUCCESS.getCode();
        }
        if (rejectCount > 0) {
            return AutoTuneJobStatus.REJECTED.getCode();
        }
        if (Boolean.TRUE.equals(agentResult.getActualApplyCalled())
                || Boolean.TRUE.equals(agentResult.getRollbackCalled())) {
            return AutoTuneJobStatus.SUCCESS.getCode();
        }
        return AutoTuneJobStatus.NO_CHANGE.getCode();
    }
    private boolean isErrorAuditStatus(String status) {
        return AutoTuneJobStatus.FAILED.getCode().equals(status)
                || AutoTuneJobStatus.REJECTED.getCode().equals(status)
                || AutoTuneJobStatus.PARTIAL_SUCCESS.getCode().equals(status);
    }
    private int safeCount(Integer value) {
        return value == null ? 0 : value;
    }
    private int resolveHasActiveTasksForAudit() {
@@ -269,13 +360,6 @@
            return Integer.MIN_VALUE;
        }
        return value.intValue();
    }
    private String limitText(String value, int maxLength) {
        if (value == null || value.length() <= maxLength) {
            return value;
        }
        return value.substring(0, maxLength);
    }
    private void safeWriteOperateLog(AutoTuneAgentService.AutoTuneAgentResult agentResult) {
@@ -310,6 +394,9 @@
    private Map<String, Object> buildRequestSummary(AutoTuneAgentService.AutoTuneAgentResult agentResult) {
        Map<String, Object> request = new LinkedHashMap<>();
        request.put("trigger", agentResult.getTriggerType());
        request.put("analysisOnly", agentResult.getAnalysisOnly());
        request.put("allowApply", agentResult.getAllowApply());
        request.put("executionMode", agentResult.getExecutionMode());
        return request;
    }
@@ -317,12 +404,20 @@
        Map<String, Object> response = new LinkedHashMap<>();
        response.put("success", agentResult.getSuccess());
        response.put("summary", agentResult.getSummary());
        response.put("analysisOnly", agentResult.getAnalysisOnly());
        response.put("allowApply", agentResult.getAllowApply());
        response.put("executionMode", agentResult.getExecutionMode());
        response.put("toolCallCount", agentResult.getToolCallCount());
        response.put("llmCallCount", agentResult.getLlmCallCount());
        response.put("promptTokens", agentResult.getPromptTokens());
        response.put("completionTokens", agentResult.getCompletionTokens());
        response.put("totalTokens", agentResult.getTotalTokens());
        response.put("maxRoundsReached", agentResult.getMaxRoundsReached());
        response.put("actualApplyCalled", agentResult.getActualApplyCalled());
        response.put("rollbackCalled", agentResult.getRollbackCalled());
        response.put("successCount", agentResult.getSuccessCount());
        response.put("rejectCount", agentResult.getRejectCount());
        response.put("mcpCallCount", agentResult.getMcpCalls() == null ? 0 : agentResult.getMcpCalls().size());
        return response;
    }
}