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;
}
}