package logic import ( "errors" "sort" "strconv" "strings" ) // FullProcessSeq 全部 12 个工位的完整组合(按顺序执行) const FullProcessSeq = "1,2,3,4,5,6,7,8,9,10,11,12" // ProcessSeqMaxStation 工位组合允许的最大工位号(工位主数据可自行扩展,故放宽上限)。 const ProcessSeqMaxStation = 999 // ParseProcessSeq 解析工位组合字符串为升序去重的工位码列表。 // 唯一格式:逗号分隔 "1,3,5" / "10,11,12"。传送带不回走,故组合天然按工位号升序执行。 // 工位号取值 1..ProcessSeqMaxStation:工位主数据可扩展到 14、15…(虚拟工位仅记录,不连 PLC)。 func ParseProcessSeq(s string) []int { s = strings.TrimSpace(s) if s == "" { return nil } seen := map[int]bool{} out := make([]int, 0, 12) for _, p := range strings.Split(s, ",") { p = strings.TrimSpace(p) if p == "" { continue } n, err := strconv.Atoi(p) if err != nil || n < 1 || n > ProcessSeqMaxStation || seen[n] { continue } seen[n] = true out = append(out, n) } sort.Ints(out) return out } // NormalizeProcessSeq 规范化:解析后重排为逗号分隔升序,非法/空返回空串。 func NormalizeProcessSeq(s string) string { codes := ParseProcessSeq(s) if len(codes) == 0 { return "" } parts := make([]string, len(codes)) for i, c := range codes { parts[i] = strconv.Itoa(c) } return strings.Join(parts, ",") } // ValidateProcessSeq 校验工位组合:非空、按工位号升序执行(工位号上限见 ProcessSeqMaxStation)。 func ValidateProcessSeq(s string) error { if len(ParseProcessSeq(s)) == 0 { return errors.New("工位组合不能为空,请至少选择一个工位") } return nil }