feat(auto-tools): 增强路径管理和排序功能

- 添加rootName支持,实现更精确的路径层级管理
- 新增generatedKey函数统一处理路径键值生成逻辑
- 修复路径过滤条件,正确处理parentId匹配
- 更新JSON配置结构,增加root_name字段支持
- 完善排序规则,支持多层级(rootName->parentName->name)排序
- 优化去重逻辑,完整比较所有路径属性
- 更新文档说明,添加详细的语法配置指南
This commit is contained in:
yan
2026-01-20 19:52:55 +08:00
parent 29ef5fd672
commit 4079542e79
2 changed files with 61 additions and 17 deletions

View File

@@ -207,7 +207,19 @@ sequenceDiagram
| team_hoe_ground | 文本 | 锄地特化队伍配置(语法:父文件夹->子文件夹=队伍名,... | 敌人与魔物->蕈兽=蕈兽队 |
| team_seven_elements | 文本 | 七元素队伍(矿物,火,水,风,雷,草,冰,岩) | 按顺序填写 |
| is_debug | 复选框 | 开发者模式(详细日志) | 调试时开启 |
## 语法说明
- order_rules 执行顺序规则
1. `rootName` 根目录下层文件夹名称,`parentName` 父目录名称,`name` 文件夹名称
2. 建议语法:`rootName->parentName->name=1,rootName->parentName->name2=2`
3. `rootName=parentName`时 语法`rootName->parentName->name=1`不可用, 请使用 `parentName->name=1` 语法
4. `rootName->name=1` 语法不支持, `name=1`语法支持
5. 匹配精度:`rootName->parentName->name` > `parentName->name`> `name` > 默认顺序
- team_hoe_ground 锄地特化队伍配置
1. `rootName` 根目录下层文件夹名称,`parentName` 父目录名称,`name` 文件夹名称
2. 建议语法:`rootName->parentName->name=队伍名,rootName->parentName->name2=队伍名`
3. `rootName=parentName`时 语法`rootName->parentName->name=队伍名`不可用, 请使用 `parentName->name=队伍名` 语法
4. `rootName->name=队伍名` 语法不支持, `name=队伍名`语法支持
5. 匹配精度:`rootName->parentName->name` > `parentName->name`> `name` > 默认顺序
## (可选)额外json配置
### 配置项order_rules
@@ -219,6 +231,8 @@ sequenceDiagram
{
"uid": "",
//账号UID
"root_name": "",
//根文件夹下对应的文件夹名称
"parent_name": "",
//父文件夹名称
"name": "",
@@ -238,6 +252,8 @@ sequenceDiagram
{
"uid": "",
//账号UID
"root_name": "",
//根文件夹下对应的文件夹名称
"parent_name": "",
//父文件夹名称
"name": "",

View File

@@ -313,7 +313,7 @@ async function initRefresh(settingsConfig) {
// prefix = br + `${"=".repeat(localLine)}${item.parentName}${"=".repeat(localLine)}\n` + br
}
// const p = idx === 0 ? "【地图追踪】\n" : `${prefix}[${item.parent_name}-${item.name}]\n`
const p = `${prefix}${(item.rootName&&item.name!==item.rootName)?"《"+item.rootName+"》->":""}[${item.name}]\n`
const p = `${prefix}${(item.rootName && item.name !== item.rootName) ? "《" + item.rootName + "》->" : ""}[${item.name}]\n`
idx++
let leveJson = {
name: `${name}`,
@@ -321,10 +321,15 @@ async function initRefresh(settingsConfig) {
label: `${p}选择要执行的${item.level + 1}级路径`,
options: []
}
// let filter = PATH_JSON_LIST.filter(list_item => list_item.id === item.parentId).find();
// if (filter) {
let filter = PATH_JSON_LIST.filter(list_item => list_item.id !== item.parentId).find();
if (filter) {
// filter.levelName = name || undefined
// }
PATH_JSON_LIST.forEach(list_item => {
if (list_item.id === item.parentId) {
list_item.levelName = name || undefined
}
})
}
// leveJson.options = leveJson.options.concat(item.child_names)
leveJson.options = [...item.child_names]
if (leveJson.options && leveJson.options.length > 0) {
@@ -674,12 +679,23 @@ async function initRun(config_run) {
// const {label} = multiCheckboxMap.get(settingsName);
// const as_name = getBracketContent(label)//父名称 如:晶蝶
function generatedKey(item) {
const separator = "->";
if (item.parentName) {
if (item.rootName && item.parentName !== item.rootName) {
return `${item.rootName}${separator}${item.parentName}${separator}${item.name}`;
}
return `${item.parentName}${separator}${item.name}`;
}
return item.name;
}
function groupByParentAndName(list) {
const map = new Map();
list.forEach(item => {
const key = `${item.parentName}->${item.name}`;
// const key = `${item.parentName}->${item.name}`;
const key = generatedKey(item);
if (!map.has(key)) map.set(key, []);
map.get(key).push(item);
});
@@ -701,24 +717,29 @@ async function initRun(config_run) {
// {
// uid:"",
// parent_name:"",
// root_name: "",
// name:"",
// team_name:""
// } json支持
const teamHoeGroundList = JSON.parse(file.readTextSync(json_path_name.HoeGround)) ?? [{
uid: "",
parent_name: "",
name: "",
parent_name: undefined,
root_name: undefined,
name: undefined,
team_name: ""
}]
teamHoeGroundList.filter(item => item.uid === Record.uid).forEach(item => team.HoeGroundMap.set(`${item.parent_name}->${item.name}`, item.team_name))
teamHoeGroundList.filter(item => item.uid !== Record.uid).forEach(item => {
const key = generatedKey(item);
team.HoeGroundMap.set(key, item.team_name)
})
log.info(`{0}加载完成`, json_path_name.HoeGround)
} catch (e) {
}
// 排序
const orderMap = new Map()
try {
// 支持多条规则,例如: "parentName->name1=1,parentName->name2=2"
const orderStr = settings.order_rules || "parentName->name=1"
// 支持多条规则,例如: "rootName->parentName->name1=1,rootName->parentName->name2=2"
const orderStr = settings.order_rules || "rootName->parentName->name=1"
orderStr.split(",").forEach(item => {
const [key, order] = item.split("=");
orderMap.set(key, parseInt(order))
@@ -730,24 +751,31 @@ async function initRun(config_run) {
// {
// uid:"",
// parent_name:"",
// root_name: "",
// name:"",
// order:0
// } json支持
const orderList = JSON.parse(file.readTextSync(json_path_name.PathOrder)) ?? [{
uid: "",
parent_name: "",
name: "",
parent_name: undefined,
root_name: undefined,
name: undefined,
order: 0
}]
orderList.filter(item => item.uid === Record.uid).forEach(item => orderMap.set(`${item.parent_name}->${item.name}`, item.order))
orderList.filter(item => item.uid !== Record.uid).forEach(item => {
const key = generatedKey(item);
orderMap.set(key, item.order)
})
log.info(`{0}加载完成`, json_path_name.PathOrder)
} catch (e) {
}
groups.sort((a, b) => {
const a_key = `${a.parentName}->${a.name}`;
const a_key = `${a.root_name && a.parent_name !== a.root_name ? a.root_name + "->" + a.parent_name : a.parent_name}->${a.name}`;
const b_key = `${b.root_name && b.parent_name !== b.root_name ? b.root_name + "->" + b.parent_name : b.parent_name}->${b.name}`;
const orderA = orderMap.get(a_key) ?? 9999; // 没在 JSON 中的排到最后
const b_key = `${b.parentName}->${b.name}`;
const orderB = orderMap.get(b_key) ?? 9999;
if (orderA === orderB) {
return a_key.localeCompare(b_key);
@@ -1169,7 +1197,7 @@ function parseDate(dateString) {
// 优化后的函数
function addUniquePath(obj, list = PATHING_ALL) {
const existingIndex = list.findIndex(item =>
item.level === obj.level && item.name === obj.name && item.parentName === obj.parentName&& item.rootName === obj.rootName
item.level === obj.level && item.name === obj.name && item.parentName === obj.parentName && item.rootName === obj.rootName
);
if (existingIndex === -1) {