Junjie
2026-04-27 5663fadb528b1a5770abb1b339090d7b5463a857
fix: align auto tune config seeds and active task snapshot
3个文件已修改
67 ■■■■ 已修改文件
src/main/java/com/zy/ai/service/impl/AutoTuneSnapshotServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/sql/20260427_add_ai_auto_tune_sys_configs.sql 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/zy/ai/service/impl/AutoTuneSnapshotServiceImplTest.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/ai/service/impl/AutoTuneSnapshotServiceImpl.java
@@ -100,14 +100,16 @@
            return Collections.emptyList();
        }
        QueryWrapper<WrkMast> wrapper = new QueryWrapper<>();
        wrapper.notIn("wrk_sts", Arrays.asList(
                WrkStsType.COMPLETE_INBOUND.sts,
                WrkStsType.SETTLE_INBOUND.sts,
                WrkStsType.COMPLETE_OUTBOUND.sts,
                WrkStsType.SETTLE_OUTBOUND.sts,
                WrkStsType.COMPLETE_LOC_MOVE.sts,
                WrkStsType.COMPLETE_CRN_MOVE.sts
        ));
        wrapper.and(query -> query.notIn("wrk_sts", Arrays.asList(
                        WrkStsType.COMPLETE_INBOUND.sts,
                        WrkStsType.SETTLE_INBOUND.sts,
                        WrkStsType.COMPLETE_OUTBOUND.sts,
                        WrkStsType.SETTLE_OUTBOUND.sts,
                        WrkStsType.COMPLETE_LOC_MOVE.sts,
                        WrkStsType.COMPLETE_CRN_MOVE.sts
                ))
                .or()
                .isNull("wrk_sts"));
        return safeList(wrkMastService.list(wrapper));
    }
src/main/resources/sql/20260427_add_ai_auto_tune_sys_configs.sql
@@ -27,11 +27,21 @@
    WHERE code = 'aiAutoTunePromptLogLimit'
);
INSERT INTO sys_config(name, code, value, type, status, select_type)
SELECT '输送站出库任务全局上限', 'conveyorStationTaskLimit', '0', 1, 1, 'system'
FROM dual
WHERE NOT EXISTS (
    SELECT 1
    FROM sys_config
    WHERE code = 'conveyorStationTaskLimit'
);
SELECT id, name, code, value, type, status, select_type
FROM sys_config
WHERE code IN (
    'aiAutoTuneEnabled',
    'aiAutoTuneIntervalMinutes',
    'aiAutoTunePromptLogLimit'
    'aiAutoTunePromptLogLimit',
    'conveyorStationTaskLimit'
)
ORDER BY code;
src/test/java/com/zy/ai/service/impl/AutoTuneSnapshotServiceImplTest.java
@@ -1,20 +1,37 @@
package com.zy.ai.service.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.zy.asrs.entity.BasStation;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.WrkMastService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.springframework.test.util.ReflectionTestUtils;
import java.util.Arrays;
import java.util.Collections;
import java.util.Map;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
class AutoTuneSnapshotServiceImplTest {
    private AutoTuneSnapshotServiceImpl service;
    @BeforeEach
    void setUp() {
        service = new AutoTuneSnapshotServiceImpl();
    }
    @Test
    void buildStationOutTaskLimitMapPreservesNullZeroAndNegativeLimits() {
        AutoTuneSnapshotServiceImpl service = new AutoTuneSnapshotServiceImpl();
        Map<String, Integer> result = service.buildStationOutTaskLimitMap(Arrays.asList(
                station(101, null),
                station(102, 0),
@@ -28,6 +45,22 @@
        assertEquals(5, result.get("104"));
    }
    @Test
    void loadActiveTasksIncludesNullWrkStatusInGroupedCondition() {
        WrkMastService wrkMastService = mock(WrkMastService.class);
        when(wrkMastService.list(any(Wrapper.class))).thenReturn(Collections.emptyList());
        ReflectionTestUtils.setField(service, "wrkMastService", wrkMastService);
        ReflectionTestUtils.invokeMethod(service, "loadActiveTasks");
        ArgumentCaptor<Wrapper<WrkMast>> wrapperCaptor = ArgumentCaptor.forClass(Wrapper.class);
        verify(wrkMastService).list(wrapperCaptor.capture());
        String sqlSegment = wrapperCaptor.getValue().getSqlSegment();
        String normalizedSqlSegment = sqlSegment.replaceAll("\\s+", " ");
        assertTrue(normalizedSqlSegment.contains("(wrk_sts NOT IN"));
        assertTrue(normalizedSqlSegment.contains("OR wrk_sts IS NULL"));
    }
    private BasStation station(Integer stationId, Integer outTaskLimit) {
        BasStation station = new BasStation();
        station.setStationId(stationId);