From ac966af3d126d59081d119e05ba02f946257f669 Mon Sep 17 00:00:00 2001
From: ai_xiaopei <xiaopei@aisim.cn>
Date: Sun, 26 Jul 2026 23:22:36 +0800
Subject: [PATCH] fix: 移除所有help中的等号格式

---
 internal/classify/reorg.go |  173 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 173 insertions(+), 0 deletions(-)

diff --git a/internal/classify/reorg.go b/internal/classify/reorg.go
new file mode 100644
index 0000000..80fc219
--- /dev/null
+++ b/internal/classify/reorg.go
@@ -0,0 +1,173 @@
+package classify
+
+import (
+	"encoding/json"
+	"fmt"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"strings"
+)
+
+// Migration 单个迁移项
+type Migration struct {
+	Source string `json:"source"`
+	Target string `json:"target"`
+}
+
+// MigrationPlan 迁移计划
+type MigrationPlan struct {
+	Total      int         `json:"total"`
+	Migrations []Migration `json:"migrations"`
+}
+
+// LoadClassification 加载分类结果
+func LoadClassification(vaultPath, filename string) (*ClassificationResult, error) {
+	path := filepath.Join(vaultPath, filename)
+	data, err := os.ReadFile(path)
+	if err != nil {
+		return nil, fmt.Errorf("读取文件失败: %w", err)
+	}
+
+	var result ClassificationResult
+	if err := json.Unmarshal(data, &result); err != nil {
+		return nil, fmt.Errorf("解析 JSON 失败: %w", err)
+	}
+
+	return &result, nil
+}
+
+// GenerateMigrationPlan 生成迁移计划
+func GenerateMigrationPlan(vaultPath string, classification *ClassificationResult) (*MigrationPlan, error) {
+	plan := &MigrationPlan{
+		Total:      len(classification.Items),
+		Migrations: []Migration{},
+	}
+
+	// 跟踪已使用的目标路径
+	usedTargets := make(map[string]bool)
+
+	for _, item := range classification.Items {
+		// 根据 platform 和 device 生成目标路径
+		targetDir := getTargetDir(item.Platform, item.Device)
+		baseName := filepath.Base(item.Path)
+		targetPath := filepath.Join(targetDir, baseName)
+
+		// 如果目标路径已使用,添加数字后缀直到找到唯一路径
+		counter := 1
+		for usedTargets[targetPath] {
+			counter++
+			ext := filepath.Ext(baseName)
+			nameWithoutExt := strings.TrimSuffix(baseName, ext)
+			targetPath = filepath.Join(targetDir, fmt.Sprintf("%s_%d%s", nameWithoutExt, counter, ext))
+		}
+		usedTargets[targetPath] = true
+
+		plan.Migrations = append(plan.Migrations, Migration{
+			Source: item.Path,
+			Target: targetPath,
+		})
+	}
+
+	return plan, nil
+}
+
+// getTargetDir 根据平台和设备获取目标目录
+func getTargetDir(platform, device string) string {
+	// 平台目录映射(支持中文和英文标识符)
+	platformDir := map[string]string{
+		// 英文标识符
+		"elc":         "电子秤平台",
+		"ops":         "运营管理平台",
+		"both":        "共有硬件",
+		"third_party": "第三方平台",
+		"general":     "通用",
+		// 中文标识符
+		"电子秤平台":   "电子秤平台",
+		"运营管理平台": "运营管理平台",
+		"共有":         "共有硬件",
+		"第三方平台":   "第三方平台",
+		"通用":         "通用",
+	}
+
+	// 设备目录映射(支持中文和英文标识符)
+	deviceDir := map[string]string{
+		// 英文标识符
+		"scale":         "电子秤",
+		"gun":           "智能枪",
+		"valve":         "智能阀",
+		"box":           "艾信盒子",
+		"app_safety":    "安全用气App",
+		"app_delivery":  "易配送App",
+		"app_assistant": "艾信助手App",
+		"app_lpg":       "艾信LPG小程序",
+		"app_shipping":  "艾信发货小程序",
+		"none":          "通用",
+		// 中文标识符
+		"电子秤":          "电子秤",
+		"智能枪":          "智能枪",
+		"智能阀":          "智能阀",
+		"艾信盒子":        "艾信盒子",
+		"安全用气App":     "安全用气App",
+		"易配送App":       "易配送App",
+		"艾信助手App":     "艾信助手App",
+		"艾信LPG小程序":   "艾信LPG小程序",
+		"艾信发货小程序":  "艾信发货小程序",
+		"无":              "通用",
+		"综合":            "通用",
+	}
+
+	pDir := platformDir[platform]
+	if pDir == "" {
+		pDir = "通用"
+	}
+
+	dDir := deviceDir[device]
+	if dDir == "" {
+		dDir = "通用"
+	}
+
+	return filepath.Join(pDir, dDir)
+}
+
+// SaveMigrationPlan 保存迁移计划
+func SaveMigrationPlan(vaultPath string, plan *MigrationPlan) error {
+	path := filepath.Join(vaultPath, "migration-plan.json")
+	data, err := json.MarshalIndent(plan, "", "  ")
+	if err != nil {
+		return err
+	}
+
+	return os.WriteFile(path, data, 0644)
+}
+
+// ExecuteMigration 执行迁移
+func ExecuteMigration(vaultPath string, plan *MigrationPlan) error {
+	for i, migration := range plan.Migrations {
+		fmt.Printf("[%d/%d] 移动 %s -> %s\n", i+1, len(plan.Migrations), migration.Source, migration.Target)
+
+		sourcePath := filepath.Join(vaultPath, migration.Source)
+		targetPath := filepath.Join(vaultPath, migration.Target)
+
+		// 检查源文件是否存在
+		if _, err := os.Stat(sourcePath); os.IsNotExist(err) {
+			fmt.Printf("  跳过(源文件不存在)\n")
+			continue
+		}
+
+		// 创建目标目录
+		targetDir := filepath.Dir(targetPath)
+		if err := os.MkdirAll(targetDir, 0755); err != nil {
+			return fmt.Errorf("创建目录失败: %w", err)
+		}
+
+		// 使用 git mv 保留历史
+		cmd := exec.Command("git", "mv", sourcePath, targetPath)
+		cmd.Dir = vaultPath
+		if output, err := cmd.CombinedOutput(); err != nil {
+			return fmt.Errorf("git mv 失败: %w\n%s", err, output)
+		}
+	}
+
+	return nil
+}

--
Gitblit v1.9.1