From 073605b6d62363dd7d48f5ca047a1d401418574a Mon Sep 17 00:00:00 2001
From: zzw <228544128@qq.com>
Date: 星期日, 04 十月 2026 17:34:06 +0800
Subject: [PATCH] docs: record 2026-10-04 integration commit

---
 emergency-repair-server/src/main/java/com/emergencyrepair/system/service/ButtonPermissionCatalog.java |  117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 117 insertions(+), 0 deletions(-)

diff --git a/emergency-repair-server/src/main/java/com/emergencyrepair/system/service/ButtonPermissionCatalog.java b/emergency-repair-server/src/main/java/com/emergencyrepair/system/service/ButtonPermissionCatalog.java
new file mode 100644
index 0000000..d530fa1
--- /dev/null
+++ b/emergency-repair-server/src/main/java/com/emergencyrepair/system/service/ButtonPermissionCatalog.java
@@ -0,0 +1,117 @@
+package com.emergencyrepair.system.service;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Declarative catalog of the operation buttons each page exposes.
+ * Menu management uses it to create MENU_TYPE=2 entries automatically.
+ */
+@Component
+public class ButtonPermissionCatalog {
+    @Data
+    @AllArgsConstructor
+    public static class ButtonDefinition {
+        private String code;
+        private String name;
+    }
+
+    private static final Map<String, List<ButtonDefinition>> CATALOG = new LinkedHashMap<>();
+
+    static {
+        put("/dashboard",
+                def("dashboard:query", "\u67e5\u8be2"));
+        put("/fault/report",
+                def("fault:report:query", "\u67e5\u8be2"),
+                def("fault:report:add", "\u65b0\u589e"),
+                def("fault:report:edit", "\u4fee\u6539"),
+                def("fault:report:delete", "\u5220\u9664"),
+                def("fault:report:export", "\u5bfc\u51fa"),
+                def("fault:report:report", "\u4e0a\u62a5"));
+        put("/fault/review",
+                def("fault:review:query", "\u67e5\u8be2"),
+                def("fault:review:audit", "\u5ba1\u6838"),
+                def("fault:review:edit", "\u4fee\u6539"),
+                def("fault:review:cancel", "\u9500\u9879"));
+        put("/fault/approval/cmb",
+                def("fault:approval:query", "\u67e5\u8be2"),
+                def("fault:approval:approve", "\u5ba1\u6279"));
+        put("/fault/approval/jcc-assistant",
+                def("fault:approval:query", "\u67e5\u8be2"),
+                def("fault:approval:approve", "\u5ba1\u6279"));
+        put("/fault/approval/jcc-director",
+                def("fault:approval:query", "\u67e5\u8be2"),
+                def("fault:approval:approve", "\u5ba1\u6279"));
+        put("/fault/dispatch",
+                def("fault:dispatch:query", "\u67e5\u8be2"),
+                def("fault:dispatch:dispatch", "\u4e00\u952e\u6d3e\u5355"));
+        put("/fault/completion",
+                def("fault:completion:query", "\u67e5\u8be2"),
+                def("fault:completion:status", "\u5b8c\u5de5\u72b6\u6001\u8bbe\u7f6e"),
+                def("fault:completion:score", "rk_T\u5458\u8bc4\u5206"));
+        put("/completion/report",
+                def("completion:report:save", "\u4fdd\u5b58"),
+                def("completion:report:submit", "\u63d0\u4ea4"));
+        put("/acceptance/application",
+                def("acceptance:application:query", "\u67e5\u8be2"),
+                def("acceptance:application:apply", "\u7533\u8bf7"));
+        put("/acceptance/inspector",
+                def("acceptance:inspector:query", "\u67e5\u8be2"),
+                def("acceptance:inspector:pass", "\u901a\u8fc7"),
+                def("acceptance:inspector:reject", "\u6253\u56de"));
+        put("/acceptance/leader",
+                def("acceptance:leader:query", "\u67e5\u8be2"),
+                def("acceptance:leader:pass", "\u901a\u8fc7"),
+                def("acceptance:leader:reject", "\u6253\u56de"));
+        put("/acceptance/print",
+                def("acceptance:print:query", "\u67e5\u8be2"),
+                def("acceptance:print:print", "\u6253\u5370"));
+        put("/acceptance/rating",
+                def("acceptance:rating:query", "\u67e5\u8be2"),
+                def("acceptance:rating:grade", "\u8bc4\u7ea7"));
+        put("/reports/overview", def("report:common:query", "\u67e5\u8be2"), def("report:common:export", "\u5bfc\u51fa"));
+        put("/reports/top-equipment", def("report:common:query", "\u67e5\u8be2"), def("report:common:export", "\u5bfc\u51fa"));
+        put("/reports/by-team", def("report:common:query", "\u67e5\u8be2"), def("report:common:export", "\u5bfc\u51fa"));
+        put("/reports/contractors", def("report:common:query", "\u67e5\u8be2"), def("report:common:export", "\u5bfc\u51fa"));
+        put("/reports/trend", def("report:common:query", "\u67e5\u8be2"), def("report:common:export", "\u5bfc\u51fa"));
+        put("/system/product-tree", def("system:tree:add", "\u65b0\u589e"), def("system:tree:edit", "\u7f16\u8f91"), def("system:tree:delete", "\u5220\u9664"));
+        put("/system/base-equipment", def("system:tree:add", "\u65b0\u589e"), def("system:tree:edit", "\u7f16\u8f91"), def("system:tree:delete", "\u5220\u9664"));
+        put("/system/engineering-majors", def("system:major:add", "\u65b0\u589e"), def("system:major:edit", "\u7f16\u8f91"), def("system:major:delete", "\u5220\u9664"));
+        put("/system/team-majors", def("system:major:add", "\u65b0\u589e"), def("system:major:edit", "\u7f16\u8f91"), def("system:major:delete", "\u5220\u9664"));
+        put("/system/users", def("system:users:query", "\u67e5\u8be2"), def("system:users:assign", "\u89d2\u8272\u6388\u6743"));
+        put("/system/roles", def("system:roles:add", "\u65b0\u589e"), def("system:roles:edit", "\u7f16\u8f91"), def("system:roles:delete", "\u5220\u9664"));
+        put("/system/roles", def("system:roles:add", "\u65b0\u589e"), def("system:roles:edit", "\u7f16\u8f91"), def("system:roles:delete", "\u5220\u9664"), def("system:roles:assign", "\u7528\u6237\u8bbe\u7f6e"));
+        put("/system/menus", def("system:menus:add", "\u65b0\u589e"), def("system:menus:edit", "\u7f16\u8f91"), def("system:menus:delete", "\u5220\u9664"), def("system:menus:buttons", "\u83dc\u5355\u6309\u94ae\u540c\u6b65"));
+        put("/system/menu-permissions", def("system:menu-permissions:save", "\u4fdd\u5b58\u6388\u6743"));
+        put("/system/login-logs", def("system:login-logs:query", "\u67e5\u8be2"), def("system:login-logs:export", "\u5bfc\u51fa"));
+        put("/system/operation-logs", def("system:operation-logs:query", "\u67e5\u8be2"), def("system:operation-logs:export", "\u5bfc\u51fa"));
+    }
+
+    private static void put(String url, ButtonDefinition... definitions) {
+        List<ButtonDefinition> list = new ArrayList<>();
+        Collections.addAll(list, definitions);
+        CATALOG.put(url, Collections.unmodifiableList(list));
+    }
+
+    private static ButtonDefinition def(String code, String name) {
+        return new ButtonDefinition(code, name);
+    }
+
+    public List<ButtonDefinition> buttonsFor(String url) {
+        if (url == null) {
+            return Collections.emptyList();
+        }
+        return CATALOG.getOrDefault(url, Collections.emptyList());
+    }
+
+    public Map<String, List<ButtonDefinition>> catalog() {
+        return CATALOG;
+    }
+}

--
Gitblit v1.9.1