package com.ruoyi.production.enums; import lombok.Getter; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * 生产报工产品大类。 * *

报工只区分乐器大类(小提琴/中提琴/大提琴/贝斯),不再区分零件。 * 大类同时是「折合小提琴当量」折算的匹配键,因此这里的规范值必须与 * 前端下拉选项、{@code production_product_main.major_category} 落库值保持一致。

* *

本枚举是大类判定的唯一事实源:报工写入时按产品名称归类; * 工资核算与生产核算直接读取已落库的大类字段,不再各自做字符串比较。

* * @since 2026/09/24 */ @Getter public enum MajorCategoryEnum { VIOLIN("小提琴", "小提琴"), VIOLA("中提琴", "中提琴"), CELLO("大提琴", "大提琴"), BASS("贝斯", "贝斯", "贝司"); /** * 配件排除词:琴盒/琴套/弓盒等配件名称里可能出现「贝司」「大提套」等字样 * (如“SA贝司套”“SA大提套”),先排除,避免被误归入乐器大类。 */ private static final List ACCESSORY_EXCLUDES = List.of("琴盒", "琴套", "弓盒"); /** * 大类规范值 -> 该大类的产品名称匹配别名。 * 现场数据把「贝斯」写作「贝司」,故 BASS 配了两个别名。 */ private static final Map> CATEGORY_ALIASES = new LinkedHashMap<>(); static { for (MajorCategoryEnum item : values()) { CATEGORY_ALIASES.put(item.category, List.of(item.aliases)); } } /** 大类规范值,落库到 production_product_main.major_category */ private final String category; /** 用于匹配产品名称的别名,第一个与规范值相同 */ private final String[] aliases; MajorCategoryEnum(String category, String... aliases) { this.category = category; this.aliases = aliases; } /** * 按产品名称归入乐器大类。自底向上遍历产品树时逐层调用,命中即返回。 * * @param productName 产品名称,可为 null * @return 大类规范值;配件、非乐器产品、空值一律返回 null */ public static String match(String productName) { if (productName == null || productName.isEmpty()) { return null; } if (ACCESSORY_EXCLUDES.stream().anyMatch(productName::contains)) { return null; } for (Map.Entry> entry : CATEGORY_ALIASES.entrySet()) { for (String alias : entry.getValue()) { if (productName.contains(alias)) { return entry.getKey(); } } } return null; } /** * 按大类规范值取枚举。 * * @param category 大类规范值,可为 null * @return 对应枚举;null 或未知取值返回 null */ public static MajorCategoryEnum of(String category) { if (category == null || category.isEmpty()) { return null; } for (MajorCategoryEnum item : values()) { if (item.category.equals(category)) { return item; } } return null; } /** * 判断是否是乐器大类。报工未归类(大类为 null)时返回 false, * 由调用方走「非乐器产品」分支处理。 */ public static boolean isInstrument(String category) { return of(category) != null; } /** * 全部大类规范值,按枚举声明顺序。 */ public static List allCategories() { List categories = new ArrayList<>(values().length); for (MajorCategoryEnum item : values()) { categories.add(item.category); } return categories; } }