From 9a8018c3fbc94f99d5d184c8cb1ef23d7366cea0 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期三, 29 四月 2026 17:02:38 +0800
Subject: [PATCH] #堆垛机任务执行优先级修改
---
src/main/java/com/zy/ai/service/impl/AutoTuneApplyServiceImpl.java | 204 ++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 171 insertions(+), 33 deletions(-)
diff --git a/src/main/java/com/zy/ai/service/impl/AutoTuneApplyServiceImpl.java b/src/main/java/com/zy/ai/service/impl/AutoTuneApplyServiceImpl.java
index 0adf162..6ae0467 100644
--- a/src/main/java/com/zy/ai/service/impl/AutoTuneApplyServiceImpl.java
+++ b/src/main/java/com/zy/ai/service/impl/AutoTuneApplyServiceImpl.java
@@ -5,6 +5,7 @@
import com.zy.ai.domain.autotune.AutoTuneApplyRequest;
import com.zy.ai.domain.autotune.AutoTuneApplyResult;
import com.zy.ai.domain.autotune.AutoTuneChangeCommand;
+import com.zy.ai.domain.autotune.AutoTuneControlModeSnapshot;
import com.zy.ai.domain.autotune.AutoTuneJobStatus;
import com.zy.ai.domain.autotune.AutoTuneRuleDefinition;
import com.zy.ai.domain.autotune.AutoTuneTargetType;
@@ -14,15 +15,14 @@
import com.zy.ai.service.AiAutoTuneChangeService;
import com.zy.ai.service.AiAutoTuneJobService;
import com.zy.ai.service.AutoTuneApplyService;
+import com.zy.ai.service.AutoTuneControlModeService;
import com.zy.asrs.entity.BasCrnp;
import com.zy.asrs.entity.BasDualCrnp;
import com.zy.asrs.entity.BasStation;
-import com.zy.asrs.entity.StationFlowCapacity;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.BasCrnpService;
import com.zy.asrs.service.BasDualCrnpService;
import com.zy.asrs.service.BasStationService;
-import com.zy.asrs.service.StationFlowCapacityService;
import com.zy.asrs.service.WrkMastService;
import com.zy.common.utils.RedisUtil;
import com.zy.core.enums.RedisKeyType;
@@ -50,9 +50,9 @@
private static final Logger LOGGER = LoggerFactory.getLogger(AutoTuneApplyServiceImpl.class);
private static final String PROMPT_SCENE_CODE = "auto_tune_apply";
- private static final String DIRECTION_OUT = "OUT";
private static final long APPLY_LOCK_SECONDS = 120L;
private static final String APPLY_LOCK_BUSY_REASON = "鐢宠璋冨弬閿佸け璐ワ紝閿佷笉鍙敤锛屽彲鑳藉凡鏈変换鍔℃垨 Redis 寮傚父";
+ private static final String ANALYSIS_ONLY_REJECT_REASON = "浠呭垎鏋愭ā寮忕姝㈠疄闄呭簲鐢�/鍥炴粴锛屾湭淇敼杩愯鍙傛暟";
private static final List<Long> FINAL_WRK_STS_LIST = Arrays.asList(
WrkStsType.COMPLETE_INBOUND.sts,
WrkStsType.SETTLE_INBOUND.sts,
@@ -69,13 +69,13 @@
@Autowired
private ConfigService configService;
@Autowired
+ private AutoTuneControlModeService autoTuneControlModeService;
+ @Autowired
private BasStationService basStationService;
@Autowired
private BasCrnpService basCrnpService;
@Autowired
private BasDualCrnpService basDualCrnpService;
- @Autowired
- private StationFlowCapacityService stationFlowCapacityService;
@Autowired
private WrkMastService wrkMastService;
@Autowired
@@ -86,17 +86,24 @@
@Override
public AutoTuneApplyResult apply(AutoTuneApplyRequest request) {
AutoTuneApplyRequest safeRequest = request == null ? new AutoTuneApplyRequest() : request;
+ AutoTuneControlModeSnapshot controlMode = currentControlModeSnapshot();
boolean dryRun = Boolean.TRUE.equals(safeRequest.getDryRun());
Date now = new Date();
AiAutoTuneJob job = createJob(safeRequest, dryRun, now);
if (dryRun) {
- return applyDryRun(safeRequest, job, now);
+ return applyDryRun(safeRequest, job, now, controlMode);
}
- return applyRealWithLock(safeRequest, job, now);
+ if (isAnalysisOnly(controlMode)) {
+ return rejectRealApplyForAnalysisOnly(safeRequest, job, now, controlMode);
+ }
+ return applyRealWithLock(safeRequest, job, now, controlMode);
}
- private AutoTuneApplyResult applyDryRun(AutoTuneApplyRequest request, AiAutoTuneJob job, Date now) {
+ private AutoTuneApplyResult applyDryRun(AutoTuneApplyRequest request,
+ AiAutoTuneJob job,
+ Date now,
+ AutoTuneControlModeSnapshot controlMode) {
List<ValidatedChange> validatedChanges = validateChanges(request, true, now);
ApplyPersistenceResult persistenceResult = persistApplyResultInTransaction(
job,
@@ -106,10 +113,13 @@
now,
false
);
- return buildResult(job, persistenceResult.getAuditChanges(), true);
+ return buildResult(job, persistenceResult.getAuditChanges(), true, controlMode);
}
- private AutoTuneApplyResult applyRealWithLock(AutoTuneApplyRequest request, AiAutoTuneJob job, Date now) {
+ private AutoTuneApplyResult applyRealWithLock(AutoTuneApplyRequest request,
+ AiAutoTuneJob job,
+ Date now,
+ AutoTuneControlModeSnapshot controlMode) {
if (request.getChanges() == null || request.getChanges().isEmpty()) {
ApplyPersistenceResult persistenceResult = persistApplyResultInTransaction(
job,
@@ -119,13 +129,13 @@
now,
false
);
- return buildResult(job, persistenceResult.getAuditChanges(), false);
+ return buildResult(job, persistenceResult.getAuditChanges(), false, controlMode);
}
String lockKey = RedisKeyType.AI_AUTO_TUNE_APPLY_LOCK.key;
String lockToken = UUID.randomUUID().toString();
if (!redisUtil.trySetStringIfAbsent(lockKey, lockToken, APPLY_LOCK_SECONDS)) {
- return rejectRealApplyForUnavailableLock(request, job, now, lockKey);
+ return rejectRealApplyForUnavailableLock(request, job, now, lockKey, controlMode);
}
try {
@@ -143,7 +153,7 @@
now,
false
);
- return buildResult(job, persistenceResult.getAuditChanges(), false);
+ return buildResult(job, persistenceResult.getAuditChanges(), false, controlMode);
}
try {
@@ -156,7 +166,7 @@
true
);
refreshSystemConfigCacheSafely(persistenceResult);
- return buildResult(job, persistenceResult.getAuditChanges(), false);
+ return buildResult(job, persistenceResult.getAuditChanges(), false, controlMode);
} catch (RuntimeException exception) {
markWriteFailure(validatedChanges, exception);
Date failureNow = new Date();
@@ -169,7 +179,7 @@
failureNow,
false
);
- return buildResult(failureJob, persistenceResult.getAuditChanges(), false);
+ return buildResult(failureJob, persistenceResult.getAuditChanges(), false, controlMode);
}
} finally {
redisUtil.compareAndDelete(lockKey, lockToken);
@@ -179,7 +189,8 @@
private AutoTuneApplyResult rejectRealApplyForUnavailableLock(AutoTuneApplyRequest request,
AiAutoTuneJob job,
Date now,
- String lockKey) {
+ String lockKey,
+ AutoTuneControlModeSnapshot controlMode) {
boolean lockKeyExists = redisUtil.hasKey(lockKey);
LOGGER.warn("鐢宠AI鑷姩璋冨弬 apply 閿佸け璐ワ紝lockKey={}, lockKeyExists={}", lockKey, lockKeyExists);
List<ValidatedChange> validatedChanges = buildLockBusyChanges(request);
@@ -191,7 +202,18 @@
now,
false
);
- return buildResult(job, persistenceResult.getAuditChanges(), false);
+ return buildResult(job, persistenceResult.getAuditChanges(), false, controlMode);
+ }
+
+ private AutoTuneApplyResult rejectRealApplyForAnalysisOnly(AutoTuneApplyRequest request,
+ AiAutoTuneJob job,
+ Date now,
+ AutoTuneControlModeSnapshot controlMode) {
+ ApplyPersistenceResult persistenceResult = persistAnalysisOnlyApplyRejectionInTransaction(job, request, now);
+ AutoTuneApplyResult result = buildResult(job, persistenceResult.getAuditChanges(), false, controlMode);
+ result.setAnalysisOnly(true);
+ result.setNoApply(true);
+ return result;
}
private List<ValidatedChange> buildLockBusyChanges(AutoTuneApplyRequest request) {
@@ -209,20 +231,24 @@
@Override
public AutoTuneApplyResult rollbackLastSuccessfulJob(String reason) {
+ AutoTuneControlModeSnapshot controlMode = currentControlModeSnapshot();
Date now = new Date();
AiAutoTuneJob rollbackJob = createRollbackJob(reason, now);
+ if (isAnalysisOnly(controlMode)) {
+ return rejectRollbackForAnalysisOnly(rollbackJob, now, controlMode);
+ }
String lockKey = RedisKeyType.AI_AUTO_TUNE_APPLY_LOCK.key;
String lockToken = UUID.randomUUID().toString();
if (!redisUtil.trySetStringIfAbsent(lockKey, lockToken, APPLY_LOCK_SECONDS)) {
- return rejectRollbackForUnavailableLock(reason, now, lockKey);
+ return rejectRollbackForUnavailableLock(reason, now, lockKey, controlMode);
}
try {
List<AiAutoTuneChange> sourceChanges = findLatestSuccessfulChanges();
if (sourceChanges.isEmpty()) {
persistNoRollbackSourceJobInTransaction(rollbackJob, now);
- return buildResult(rollbackJob, new ArrayList<>(), false);
+ return buildResult(rollbackJob, new ArrayList<>(), false, controlMode);
}
try {
RollbackPersistenceResult persistenceResult = persistRollbackResultInTransaction(
@@ -231,7 +257,7 @@
now
);
refreshRollbackConfigCacheSafely(persistenceResult);
- return buildResult(rollbackJob, persistenceResult.getRollbackChanges(), false);
+ return buildResult(rollbackJob, persistenceResult.getRollbackChanges(), false, controlMode);
} catch (RuntimeException exception) {
Date failureNow = new Date();
AiAutoTuneJob failureJob = createRollbackJob(reason, failureNow);
@@ -241,7 +267,7 @@
exception,
failureNow
);
- return buildResult(failureJob, persistenceResult.getRollbackChanges(), false);
+ return buildResult(failureJob, persistenceResult.getRollbackChanges(), false, controlMode);
}
} finally {
redisUtil.compareAndDelete(lockKey, lockToken);
@@ -250,7 +276,8 @@
private AutoTuneApplyResult rejectRollbackForUnavailableLock(String reason,
Date now,
- String lockKey) {
+ String lockKey,
+ AutoTuneControlModeSnapshot controlMode) {
boolean lockKeyExists = redisUtil.hasKey(lockKey);
LOGGER.warn("鐢宠AI鑷姩璋冨弬 rollback 閿佸け璐ワ紝lockKey={}, lockKeyExists={}", lockKey, lockKeyExists);
AiAutoTuneJob rollbackJob = createRollbackJob(reason, now);
@@ -258,7 +285,20 @@
rollbackJob,
now
);
- return buildResult(rollbackJob, persistenceResult.getRollbackChanges(), false);
+ return buildResult(rollbackJob, persistenceResult.getRollbackChanges(), false, controlMode);
+ }
+
+ private AutoTuneApplyResult rejectRollbackForAnalysisOnly(AiAutoTuneJob rollbackJob,
+ Date now,
+ AutoTuneControlModeSnapshot controlMode) {
+ RollbackPersistenceResult persistenceResult = persistAnalysisOnlyRollbackRejectionInTransaction(
+ rollbackJob,
+ now
+ );
+ AutoTuneApplyResult result = buildResult(rollbackJob, persistenceResult.getRollbackChanges(), false, controlMode);
+ result.setAnalysisOnly(true);
+ result.setNoApply(true);
+ return result;
}
private List<ValidatedChange> validateChanges(AutoTuneApplyRequest request, boolean dryRun, Date now) {
@@ -300,7 +340,7 @@
Integer maxValue = resolveMaxValue(validatedChange, rule, requestedValue);
if (maxValue == null) {
return validatedChange.reject("绔欑偣 " + validatedChange.getTargetId()
- + " 缂哄皯 OUT 鏂瑰悜 bufferCapacity锛屾棤娉曡瘉鏄� outTaskLimit 涓婇檺");
+ + " 缂哄皯 outBufferCapacity锛屾棤娉曡瘉鏄� outTaskLimit 涓婇檺");
}
if (requestedValue < rule.getMinValue() || requestedValue > maxValue) {
return validatedChange.reject(validatedChange.getTargetKey() + " 蹇呴』鍦� "
@@ -388,16 +428,11 @@
return rule.getMaxValue();
}
Integer targetId = parseTargetId(validatedChange.getTargetId(), rule.getTargetType());
- StationFlowCapacity capacity = stationFlowCapacityService.getOne(
- new QueryWrapper<StationFlowCapacity>()
- .eq("station_id", targetId)
- .eq("direction_code", DIRECTION_OUT)
- .last("limit 1")
- );
- if (capacity == null || capacity.getBufferCapacity() == null) {
+ BasStation station = basStationService.getById(targetId);
+ if (station == null || station.getOutBufferCapacity() == null) {
return requestedValue == 0 ? 0 : null;
}
- return Math.max(0, capacity.getBufferCapacity());
+ return Math.max(0, station.getOutBufferCapacity());
}
private Date findCooldownExpireTime(ValidatedChange validatedChange, Date now) {
@@ -565,6 +600,33 @@
});
}
+ private ApplyPersistenceResult persistAnalysisOnlyApplyRejectionInTransaction(AiAutoTuneJob job,
+ AutoTuneApplyRequest request,
+ Date now) {
+ TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
+ return transactionTemplate.execute(status -> {
+ saveJob(job);
+ List<AiAutoTuneChange> auditChanges = buildAnalysisOnlyApplyChanges(job.getId(), request, now);
+ saveAuditChanges(auditChanges);
+ finishAnalysisOnlyRejectedJob(job, auditChanges, now);
+ updateJob(job);
+ return new ApplyPersistenceResult(auditChanges, false);
+ });
+ }
+
+ private RollbackPersistenceResult persistAnalysisOnlyRollbackRejectionInTransaction(AiAutoTuneJob rollbackJob,
+ Date now) {
+ TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
+ return transactionTemplate.execute(status -> {
+ saveJob(rollbackJob);
+ List<AiAutoTuneChange> rollbackChanges = buildAnalysisOnlyRollbackChanges(rollbackJob.getId(), now);
+ saveAuditChanges(rollbackChanges);
+ finishAnalysisOnlyRejectedJob(rollbackJob, rollbackChanges, now);
+ updateJob(rollbackJob);
+ return new RollbackPersistenceResult(rollbackChanges, false);
+ });
+ }
+
private RollbackPersistenceResult rollbackChanges(Long rollbackJobId, List<AiAutoTuneChange> sourceChanges, Date now) {
List<AiAutoTuneChange> rollbackChanges = new ArrayList<>();
boolean refreshConfigCache = false;
@@ -597,6 +659,58 @@
rollbackChange.setRejectReason(APPLY_LOCK_BUSY_REASON);
rollbackChange.setCreateTime(now);
return List.of(rollbackChange);
+ }
+
+ private List<AiAutoTuneChange> buildAnalysisOnlyApplyChanges(Long jobId,
+ AutoTuneApplyRequest request,
+ Date now) {
+ List<AiAutoTuneChange> changes = new ArrayList<>();
+ List<AutoTuneChangeCommand> commands = request == null ? null : request.getChanges();
+ if (commands == null || commands.isEmpty()) {
+ changes.add(buildAnalysisOnlyChange(jobId, "analysis_only", "", "apply", null, now));
+ return changes;
+ }
+ for (AutoTuneChangeCommand command : commands) {
+ changes.add(buildAnalysisOnlyChange(
+ jobId,
+ normalizeText(command == null ? null : command.getTargetType()),
+ normalizeText(command == null ? null : command.getTargetId()),
+ normalizeText(command == null ? null : command.getTargetKey()),
+ command == null ? null : command.getNewValue(),
+ now
+ ));
+ }
+ return changes;
+ }
+
+ private List<AiAutoTuneChange> buildAnalysisOnlyRollbackChanges(Long jobId, Date now) {
+ AiAutoTuneChange rollbackChange = buildAnalysisOnlyChange(
+ jobId,
+ "analysis_only",
+ "",
+ "rollback",
+ null,
+ now
+ );
+ return List.of(rollbackChange);
+ }
+
+ private AiAutoTuneChange buildAnalysisOnlyChange(Long jobId,
+ String targetType,
+ String targetId,
+ String targetKey,
+ String requestedValue,
+ Date now) {
+ AiAutoTuneChange change = new AiAutoTuneChange();
+ change.setJobId(jobId);
+ change.setTargetType(targetType);
+ change.setTargetId(targetId);
+ change.setTargetKey(targetKey);
+ change.setRequestedValue(requestedValue);
+ change.setResultStatus(ChangeStatus.REJECTED.getCode());
+ change.setRejectReason(ANALYSIS_ONLY_REJECT_REASON);
+ change.setCreateTime(now);
+ return change;
}
private void refreshRollbackConfigCacheSafely(RollbackPersistenceResult persistenceResult) {
@@ -759,6 +873,17 @@
}
}
+ private void finishAnalysisOnlyRejectedJob(AiAutoTuneJob job, List<AiAutoTuneChange> changes, Date now) {
+ int rejectCount = Math.max(1, countRejected(changes));
+ job.setFinishTime(now);
+ job.setSuccessCount(0);
+ job.setRejectCount(rejectCount);
+ job.setIntervalAfter(readIntervalMinutes());
+ job.setStatus(AutoTuneJobStatus.REJECTED.getCode());
+ job.setSummary(ANALYSIS_ONLY_REJECT_REASON);
+ job.setErrorMessage(ANALYSIS_ONLY_REJECT_REASON);
+ }
+
private void finishRollbackJob(AiAutoTuneJob job, List<AiAutoTuneChange> changes, Date now) {
int successCount = countAccepted(changes);
int rejectCount = countRejected(changes);
@@ -886,11 +1011,16 @@
return !AutoTuneTriggerType.ROLLBACK.getCode().equals(job.getTriggerType());
}
- private AutoTuneApplyResult buildResult(AiAutoTuneJob job, List<AiAutoTuneChange> changes, boolean dryRun) {
+ private AutoTuneApplyResult buildResult(AiAutoTuneJob job,
+ List<AiAutoTuneChange> changes,
+ boolean dryRun,
+ AutoTuneControlModeSnapshot controlMode) {
AutoTuneApplyResult result = new AutoTuneApplyResult();
result.setDryRun(dryRun);
result.setSuccess(AutoTuneJobStatus.SUCCESS.getCode().equals(job.getStatus())
|| AutoTuneJobStatus.NO_CHANGE.getCode().equals(job.getStatus()));
+ result.setAnalysisOnly(isAnalysisOnly(controlMode));
+ result.setNoApply(false);
result.setJobId(job.getId());
result.setSummary(job.getSummary());
result.setSuccessCount(job.getSuccessCount());
@@ -994,6 +1124,14 @@
}
}
+ private AutoTuneControlModeSnapshot currentControlModeSnapshot() {
+ return autoTuneControlModeService.currentMode();
+ }
+
+ private boolean isAnalysisOnly(AutoTuneControlModeSnapshot controlMode) {
+ return controlMode == null || Boolean.TRUE.equals(controlMode.getAnalysisOnly());
+ }
+
private String toText(Integer value) {
return value == null ? null : String.valueOf(value);
}
--
Gitblit v1.9.1