package com.zy.common.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import java.util.ArrayList; import java.util.List; /** * AGV配置属性 * * @author system */ @Data @Configuration @ConfigurationProperties(prefix = "agv") public class AgvProperties { /** * 是否发送任务 */ private boolean sendTask = false; /** * 东侧配置 */ private RobotGroupConfig east = new RobotGroupConfig(); /** * 西侧配置 */ private RobotGroupConfig west = new RobotGroupConfig(); /** * whs_type映射配置 * 1: 入库区(东侧),2: 缓存区(西侧) */ private WhsTypeMapping whsTypeMapping = new WhsTypeMapping(); /** * 站点分配策略配置 */ private SiteAllocationStrategy siteAllocation = new SiteAllocationStrategy(); /** * 库位前缀配置 */ private LocationPrefix locationPrefix = new LocationPrefix(); /** * AGV呼叫重试配置 */ private AgvCallRetry callRetry = new AgvCallRetry(); /** * whs_type映射配置内部类 */ @Data public static class WhsTypeMapping { /** * 入库区对应的whs_type值(默认1) */ private Long inboundArea = 1L; /** * 缓存区对应的whs_type值(默认2) */ private Long cacheArea = 2L; } /** * 机器人组配置内部类 */ @Data public static class RobotGroupConfig { /** * 机器人组编号 */ private String robotGroup = ""; /** * 站点列表 */ private List stations = new ArrayList<>(); /** * 侧边显示名称(用于日志和提示信息,如"东侧"、"西侧") */ private String displayName = ""; } /** * 获取东侧站点列表(兼容旧代码) */ public List getEastStations() { return east != null ? east.getStations() : new ArrayList<>(); } /** * 获取西侧站点列表(兼容旧代码) */ public List getWestStations() { return west != null ? west.getStations() : new ArrayList<>(); } /** * 获取东侧机器人组编号(兼容旧代码) */ public String getRobotGroupEast() { return east != null && east.getRobotGroup() != null && !east.getRobotGroup().isEmpty() ? east.getRobotGroup() : "Group-001"; } /** * 获取西侧机器人组编号(兼容旧代码) */ public String getRobotGroupWest() { return west != null && west.getRobotGroup() != null && !west.getRobotGroup().isEmpty() ? west.getRobotGroup() : "Group-002"; } /** * 获取东侧显示名称 */ public String getEastDisplayName() { return east != null && east.getDisplayName() != null && !east.getDisplayName().isEmpty() ? east.getDisplayName() : "东侧"; } /** * 获取西侧显示名称 */ public String getWestDisplayName() { return west != null && west.getDisplayName() != null && !west.getDisplayName().isEmpty() ? west.getDisplayName() : "西侧"; } /** * 站点分配策略配置内部类 */ @Data public static class SiteAllocationStrategy { /** * 分配策略类型 * round-robin: 轮询分配(平均分配) * least-task: 最少任务优先(默认) * random: 随机分配 */ private String strategy = "least-task"; /** * 是否启用平均分配 * true: 当多个站点任务数相同时,使用轮询分配 * false: 总是选择第一个(任务最少的) */ private boolean enableRoundRobin = true; } /** * 库位前缀配置内部类 */ @Data public static class LocationPrefix { /** * CA前缀:只做入库的库位前缀(默认"CA") */ private String inboundOnly = "CA"; /** * WA前缀:会被出库分配缓存区的库位前缀(默认"WA") */ private String cacheArea = "WA"; } /** * AGV呼叫重试配置内部类 */ @Data public static class AgvCallRetry { /** * 是否启用重试机制 * true: 启用重试,失败后会自动重试 * false: 不启用重试,失败后直接停止(默认) */ private boolean enabled = false; /** * 最大重试次数 * 当呼叫AGV失败时,最多重试多少次后停止 * 默认值:3次 */ private int maxRetryCount = 3; /** * 重试间隔时间(秒) * 每次重试之间的等待时间 * 默认值:5秒 */ private int retryIntervalSeconds = 5; } }