From c7d92d01b02f6b26b17dc77b217f0ffe39615ebe Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 03 六月 2026 09:13:43 +0800
Subject: [PATCH] feat(staff): 修改员工入职服务接口增加用户添加标识参数
---
src/main/java/com/ruoyi/util/ProjectPlanDocGenerator.java | 121 +
src/main/resources/static/测试报告.xml | 553 ++++++
src/main/resources/static/需求说明书.xml | 456 +++++
src/main/java/com/ruoyi/util/RequirementDocGenerator.java | 137 +
src/main/java/com/ruoyi/util/SystemDesignDocGenerator.java | 211 ++
src/main/resources/static/系统设计说明书.xml | 602 ++++++
src/main/resources/static/项目计划书.xml | 356 ++++
src/main/resources/static/技术软件开发文档.xml | 1398 ++++++++++++++++
src/main/java/com/ruoyi/util/TestReportDocGenerator.java | 190 ++
src/main/resources/static/服务器运维记录.xml | 702 ++++++++
src/main/java/com/ruoyi/util/TechDevDocGenerator.java | 208 ++
src/main/java/com/ruoyi/util/ServerOpsDocGenerator.java | 255 ++
12 files changed, 5,189 insertions(+), 0 deletions(-)
diff --git a/src/main/java/com/ruoyi/util/ProjectPlanDocGenerator.java b/src/main/java/com/ruoyi/util/ProjectPlanDocGenerator.java
new file mode 100644
index 0000000..23444b3
--- /dev/null
+++ b/src/main/java/com/ruoyi/util/ProjectPlanDocGenerator.java
@@ -0,0 +1,121 @@
+package com.ruoyi.util;
+
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import freemarker.template.TemplateExceptionHandler;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+
+public class ProjectPlanDocGenerator {
+
+ public static void main(String[] args) throws Exception {
+ // 鐢熸垚椤圭洰璁″垝鏂囨。
+ generateProjectPlan();
+ }
+
+ public static void generateProjectPlan() throws Exception {
+ Configuration cfg = new Configuration(Configuration.VERSION_2_3_32);
+ cfg.setClassForTemplateLoading(ProjectPlanDocGenerator.class, "/static");
+ cfg.setDefaultEncoding("UTF-8");
+ cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
+
+ // 鍑嗗鏁版嵁
+ Map<String, Object> data = new HashMap<>();
+
+ // 椤圭洰鍩烘湰淇℃伅
+ data.put("projectName", "浜у搧搴撳瓨绠$悊绯荤粺");
+ data.put("projectVersion", "V1.0");
+ data.put("docDate", "2026骞�6鏈�");
+
+ // 閲岀▼纰戝垪琛�
+ List<Map<String, String>> milestones = new ArrayList<>();
+ milestones.add(createMilestone("M1", "闇�姹傚垎鏋�", "涓氬姟璋冪爺銆侀渶姹傛枃妗g紪鍐�", "绗�1-2鍛�", "闇�姹傝鏍艰鏄庝功"));
+ milestones.add(createMilestone("M2", "绯荤粺璁捐", "鏋舵瀯璁捐銆佹暟鎹簱璁捐銆佹帴鍙h璁�", "绗�3-4鍛�", "璁捐鏂囨。銆佹暟鎹簱鑴氭湰"));
+ milestones.add(createMilestone("M3", "鍩虹妯″潡", "鐢ㄦ埛鏉冮檺銆侀儴闂ㄥ矖浣嶃�佺郴缁熼厤缃�", "绗�5-6鍛�", "鍩虹妯″潡鍙繍琛岀増鏈�"));
+ milestones.add(createMilestone("M4", "搴撳瓨绠$悊", "鍏ュ簱銆佸嚭搴撱�佸簱瀛樼洏鐐广�佹壒鍙风鐞�", "绗�7-9鍛�", "搴撳瓨妯″潡鍙繍琛岀増鏈�"));
+ milestones.add(createMilestone("M5", "閲囪喘閿�鍞�", "閲囪喘鍙拌处銆侀攢鍞姤浠枫�佸彂璐х鐞�", "绗�10-12鍛�", "閲囪喘閿�鍞ā鍧�"));
+ milestones.add(createMilestone("M6", "璐ㄦ璁惧", "璐ㄩ噺妫�楠屻�佽澶囦繚鍏汇�佽閲忓櫒鍏�", "绗�13-15鍛�", "璐ㄦ璁惧妯″潡"));
+ milestones.add(createMilestone("M7", "浜轰簨鍗忓悓", "鍛樺伐绠$悊銆佸悎鍚岀鐞嗐�佸鎵规祦绋�", "绗�16-18鍛�", "浜轰簨鍗忓悓妯″潡"));
+ milestones.add(createMilestone("M8", "绯荤粺闆嗘垚", "妯″潡鑱旇皟銆佹帴鍙e鎺ャ�佹暟鎹縼绉�", "绗�19-20鍛�", "闆嗘垚娴嬭瘯鎶ュ憡"));
+ milestones.add(createMilestone("M9", "涓婄嚎閮ㄧ讲", "鐢熶骇鐜閮ㄧ讲銆佺敤鎴峰煿璁�", "绗�21-22鍛�", "姝e紡涓婄嚎杩愯"));
+ data.put("milestones", milestones);
+
+ // 浜哄憳瀹夋帓
+ List<Map<String, String>> team = new ArrayList<>();
+ team.add(createTeamMember("椤圭洰缁忕悊", "寮燲X", "椤圭洰缁熺銆佽繘搴︽妸鎺с�侀闄╃鐞�"));
+ team.add(createTeamMember("浜у搧缁忕悊", "鏉嶺X", "闇�姹傛⒊鐞嗐�佸師鍨嬭璁°�侀獙鏀舵祴璇�"));
+ team.add(createTeamMember("鍚庣寮�鍙�", "鐜媂X", "鍚庣鏋舵瀯銆佹牳蹇冩ā鍧楀紑鍙�"));
+ team.add(createTeamMember("鍚庣寮�鍙�", "璧礨X", "涓氬姟妯″潡寮�鍙戙�佹帴鍙e鎺�"));
+ team.add(createTeamMember("鍓嶇寮�鍙�", "闄圶X", "鍓嶇椤甸潰銆佷氦浜掑疄鐜�"));
+ team.add(createTeamMember("娴嬭瘯宸ョ▼甯�", "鍒榅X", "娴嬭瘯鐢ㄤ緥銆佸姛鑳芥祴璇曘�佸洖褰掓祴璇�"));
+ team.add(createTeamMember("杩愮淮宸ョ▼甯�", "鍛╔X", "鐜閮ㄧ讲銆佹湇鍔″櫒缁存姢"));
+ data.put("team", team);
+
+ // 璇勫缁撹
+ List<Map<String, String>> reviewResults = new ArrayList<>();
+ reviewResults.add(createReviewResult("闇�姹傚畬鏁存��", "閫氳繃", "鏍稿績鍔熻兘宸叉槑纭�"));
+ reviewResults.add(createReviewResult("鎶�鏈彲琛屾��", "閫氳繃", "鎶�鏈爤鎴愮啛绋冲畾"));
+ reviewResults.add(createReviewResult("杩涘害鍚堢悊鎬�", "閫氳繃", "閲岀▼纰戝垝鍒嗘竻鏅�"));
+ reviewResults.add(createReviewResult("璧勬簮閰嶇疆", "閫氳繃", "浜哄憳鍒嗗伐鏄庣‘"));
+ data.put("reviewResults", reviewResults);
+
+ // 寰呭姙浜嬮」
+ List<Map<String, String>> actionItems = new ArrayList<>();
+ actionItems.add(createActionItem("1", "瀹屽杽閲囪喘妯″潡瀹℃壒娴佺▼", "鐜媂X", "X鏈圶鏃�"));
+ actionItems.add(createActionItem("2", "纭搴撳瓨棰勮闃堝�奸厤缃�", "鏉嶺X", "X鏈圶鏃�"));
+ actionItems.add(createActionItem("3", "琛ュ厖璁惧淇濆吇瀹氭椂浠诲姟闇�姹�", "璧礨X", "X鏈圶鏃�"));
+ data.put("actionItems", actionItems);
+
+ // 鍔犺浇妯℃澘骞剁敓鎴�
+ Template template = cfg.getTemplate("椤圭洰璁″垝涔�.xml");
+ StringWriter out = new StringWriter();
+ template.process(data, out);
+
+ // 淇濆瓨涓篸ocx
+ String outputPath = "D:/鐗涢┈/鏂囨。/project_plan.docx";
+ File outputFile = new File(outputPath);
+ try (FileOutputStream fos = new FileOutputStream(outputFile);
+ OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
+ osw.write(out.toString());
+ }
+
+ System.out.println("鏂囨。鐢熸垚鎴愬姛: " + outputPath);
+ }
+
+ private static Map<String, String> createMilestone(String id, String name, String content, String time, String deliverable) {
+ Map<String, String> map = new HashMap<>();
+ map.put("id", id);
+ map.put("name", name);
+ map.put("content", content);
+ map.put("time", time);
+ map.put("deliverable", deliverable);
+ return map;
+ }
+
+ private static Map<String, String> createTeamMember(String role, String name, String duty) {
+ Map<String, String> map = new HashMap<>();
+ map.put("role", role);
+ map.put("name", name);
+ map.put("duty", duty);
+ return map;
+ }
+
+ private static Map<String, String> createReviewResult(String item, String result, String remark) {
+ Map<String, String> map = new HashMap<>();
+ map.put("item", item);
+ map.put("result", result);
+ map.put("remark", remark);
+ return map;
+ }
+
+ private static Map<String, String> createActionItem(String no, String content, String owner, String deadline) {
+ Map<String, String> map = new HashMap<>();
+ map.put("no", no);
+ map.put("content", content);
+ map.put("owner", owner);
+ map.put("deadline", deadline);
+ return map;
+ }
+}
diff --git a/src/main/java/com/ruoyi/util/RequirementDocGenerator.java b/src/main/java/com/ruoyi/util/RequirementDocGenerator.java
new file mode 100644
index 0000000..231c542
--- /dev/null
+++ b/src/main/java/com/ruoyi/util/RequirementDocGenerator.java
@@ -0,0 +1,137 @@
+package com.ruoyi.util;
+
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import freemarker.template.TemplateExceptionHandler;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+
+public class RequirementDocGenerator {
+
+ public static void main(String[] args) throws Exception {
+ generateRequirementDoc();
+ }
+
+ public static void generateRequirementDoc() throws Exception {
+ Configuration cfg = new Configuration(Configuration.VERSION_2_3_32);
+ cfg.setClassForTemplateLoading(RequirementDocGenerator.class, "/static");
+ cfg.setDefaultEncoding("UTF-8");
+ cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
+
+ Map<String, Object> data = new HashMap<>();
+
+ // 椤圭洰鍩烘湰淇℃伅
+ data.put("projectName", "浜у搧搴撳瓨绠$悊绯荤粺");
+ data.put("projectVersion", "V1.0");
+ data.put("docDate", "2026骞�6鏈�");
+
+ // 搴撳瓨绠$悊鍔熻兘
+ List<Map<String, String>> inventoryFeatures = new ArrayList<>();
+ inventoryFeatures.add(createFeature("INV-001", "鍏ュ簱绠$悊", "鏀寔閲囪喘鍏ュ簱銆佺敓浜у叆搴撱�侀��璐у叆搴撶瓑澶氱鍏ュ簱鏂瑰紡锛岃嚜鍔ㄧ敓鎴愬叆搴撳崟鍙凤紝鏀寔鎵瑰彿绠$悊"));
+ inventoryFeatures.add(createFeature("INV-002", "鍑哄簱绠$悊", "鏀寔閿�鍞嚭搴撱�佺敓浜ч鏂欍�佽皟鎷ㄥ嚭搴撶瓑锛屾敮鎸佸厛杩涘厛鍑恒�佹壒娆″嚭搴撶瓥鐣�"));
+ inventoryFeatures.add(createFeature("INV-003", "搴撳瓨鐩樼偣", "鏀寔瀹氭湡鐩樼偣銆佸姩鎬佺洏鐐癸紝鑷姩鐢熸垚鐩樼偣宸紓鎶ュ憡"));
+ inventoryFeatures.add(createFeature("INV-004", "搴撳瓨棰勮", "鏀寔搴撳瓨涓婁笅闄愰璀︺�佹晥鏈熼璀︺�佸憜婊炲簱瀛橀璀�"));
+ inventoryFeatures.add(createFeature("INV-005", "搴撳瓨鏌ヨ", "鏀寔澶氱淮搴﹀簱瀛樻煡璇紝瀹炴椂搴撳瓨銆佸巻鍙插簱瀛樸�佹壒娆″簱瀛�"));
+ data.put("inventoryFeatures", inventoryFeatures);
+
+ // 閲囪喘閿�鍞姛鑳�
+ List<Map<String, String>> purchaseFeatures = new ArrayList<>();
+ purchaseFeatures.add(createFeature("PUR-001", "閲囪喘鍙拌处", "閲囪喘鐢宠銆佽浠锋瘮浠枫�侀噰璐鍗曘�佸埌璐ч獙鏀跺叏娴佺▼绠$悊"));
+ purchaseFeatures.add(createFeature("PUR-002", "渚涘簲鍟嗙鐞�", "渚涘簲鍟嗘。妗堛�佽祫璐ㄧ鐞嗐�佽瘎浼拌�冩牳"));
+ purchaseFeatures.add(createFeature("PUR-003", "閿�鍞姤浠�", "瀹㈡埛绠$悊銆佹姤浠峰崟銆侀攢鍞鍗曠鐞�"));
+ purchaseFeatures.add(createFeature("PUR-004", "鍙戣揣绠$悊", "鍙戣揣鍗曘�佺墿娴佽窡韪�佺鏀剁‘璁�"));
+ purchaseFeatures.add(createFeature("PUR-005", "鍞悗绠$悊", "閫�鎹㈣揣澶勭悊銆佸敭鍚庢湇鍔¤褰�"));
+ data.put("purchaseFeatures", purchaseFeatures);
+
+ // 璐ㄦ璁惧鍔熻兘
+ List<Map<String, String>> qualityFeatures = new ArrayList<>();
+ qualityFeatures.add(createFeature("QA-001", "璐ㄩ噺妫�楠�", "鏉ユ枡妫�楠屻�佽繃绋嬫楠屻�佹垚鍝佹楠岋紝鏀寔妫�楠岄」鐩厤缃�"));
+ qualityFeatures.add(createFeature("QA-002", "涓嶅悎鏍煎鐞�", "涓嶅悎鏍煎搧鐧昏銆佸鐞嗘祦绋嬨�佸師鍥犲垎鏋�"));
+ qualityFeatures.add(createFeature("QA-003", "璁惧鍙拌处", "璁惧妗f銆佹妧鏈弬鏁般�侀檮浠剁鐞�"));
+ qualityFeatures.add(createFeature("QA-004", "璁惧淇濆吇", "淇濆吇璁″垝銆佷繚鍏讳换鍔°�佷繚鍏昏褰曘�侀獙鏀剁‘璁�"));
+ qualityFeatures.add(createFeature("QA-005", "璁¢噺鍣ㄥ叿", "璁¢噺鍣ㄥ叿鍙拌处銆佹瀹氳鍒掋�佹瀹氳褰�"));
+ data.put("qualityFeatures", qualityFeatures);
+
+ // 浜轰簨鍗忓悓鍔熻兘
+ List<Map<String, String>> staffFeatures = new ArrayList<>();
+ staffFeatures.add(createFeature("HR-001", "鍛樺伐绠$悊", "鍛樺伐妗f銆佸叆鑱岀鑱屻�佸悎鍚岀鐞�"));
+ staffFeatures.add(createFeature("HR-002", "鑰冨嫟绠$悊", "鎵撳崱璁板綍銆佽鍋囧鎵广�佸姞鐝鐞�"));
+ staffFeatures.add(createFeature("HR-003", "瀹℃壒娴佺▼", "鑷畾涔夊鎵规祦绋嬨�佸緟鍔炴彁閱掋�佹祦绋嬭拷婧�"));
+ staffFeatures.add(createFeature("HR-004", "浼氳瀹ょ鐞�", "浼氳瀹ら绾︺�佷細璁邯瑕併�侀�氱煡鍏憡"));
+ staffFeatures.add(createFeature("HR-005", "瑙勭珷鍒跺害", "鍒跺害鍙戝竷銆侀槄璇荤‘璁ゃ�佹枃浠跺綊妗�"));
+ data.put("staffFeatures", staffFeatures);
+
+ // AI鏅鸿兘鍖栧姛鑳�
+ List<Map<String, String>> aiFeatures = new ArrayList<>();
+ aiFeatures.add(createFeature("AI-001", "鏅鸿兘瀹㈡湇", "鍩轰簬澶ц瑷�妯″瀷鐨勬櫤鑳介棶绛旓紝7x24灏忔椂鍦ㄧ嚎鏈嶅姟"));
+ aiFeatures.add(createFeature("AI-002", "搴撳瓨棰勬祴", "鍩轰簬鍘嗗彶鏁版嵁鐨勫簱瀛橀渶姹傞娴嬶紝鏅鸿兘琛ヨ揣寤鸿"));
+ aiFeatures.add(createFeature("AI-003", "閿�鍞娴�", "鏈哄櫒瀛︿範椹卞姩鐨勯攢鍞秼鍔垮垎鏋愶紝杈呭姪鍐崇瓥"));
+ aiFeatures.add(createFeature("AI-004", "寮傚父妫�娴�", "鑷姩璇嗗埆寮傚父浜ゆ槗銆佸紓甯稿簱瀛樺彉鍔�"));
+ aiFeatures.add(createFeature("AI-005", "鏅鸿兘鏂囨。", "OCR璇嗗埆閲囪喘鍗曘�佸彂璐у崟锛岃嚜鍔ㄥ綍鍏ョ郴缁�"));
+ aiFeatures.add(createFeature("AI-006", "璇煶褰曞叆", "璇煶杞枃瀛楋紝蹇�熷綍鍏ヨ鍗曞拰搴撳瓨淇℃伅"));
+ data.put("aiFeatures", aiFeatures);
+
+ // 鐢ㄦ埛瑙掕壊
+ List<Map<String, String>> userRoles = new ArrayList<>();
+ userRoles.add(createRole("绯荤粺绠$悊鍛�", "绯荤粺缁存姢鍜岄厤缃�", "绯荤粺閰嶇疆銆佺敤鎴风鐞嗐�佹潈闄愬垎閰�"));
+ userRoles.add(createRole("浠撳簱绠$悊鍛�", "搴撳瓨鏃ュ父绠$悊", "鍏ュ簱銆佸嚭搴撱�佺洏鐐广�佸簱瀛樻煡璇�"));
+ userRoles.add(createRole("閲囪喘鍛�", "閲囪喘涓氬姟澶勭悊", "閲囪喘鐢宠銆佽鍗曠鐞嗐�佷緵搴斿晢绠$悊"));
+ userRoles.add(createRole("閿�鍞憳", "閿�鍞笟鍔″鐞�", "鎶ヤ环銆佽鍗曘�佸彂璐с�佸敭鍚�"));
+ userRoles.add(createRole("璐ㄦ鍛�", "璐ㄩ噺妫�楠屽伐浣�", "妫�楠屼换鍔°�佹楠岃褰曘�佷笉鍚堟牸澶勭悊"));
+ userRoles.add(createRole("璁惧绠$悊鍛�", "璁惧缁存姢绠$悊", "璁惧鍙拌处銆佷繚鍏昏鍒掋�佷繚鍏绘墽琛�"));
+ userRoles.add(createRole("浜轰簨涓撳憳", "浜轰簨琛屾斂绠$悊", "鍛樺伐妗f銆佽�冨嫟銆佸鎵规祦绋�"));
+ data.put("userRoles", userRoles);
+
+ // 楠屾敹鏍囧噯
+ List<Map<String, String>> acceptCriteria = new ArrayList<>();
+ acceptCriteria.add(createCriteria("1", "鍔熻兘瀹屾暣鎬�", "鎵�鏈夐渶姹傚姛鑳藉紑鍙戝畬鎴愬苟閫氳繃娴嬭瘯"));
+ acceptCriteria.add(createCriteria("2", "鎬ц兘杈炬爣", "鍝嶅簲鏃堕棿銆佸苟鍙戞暟婊¤冻鎬ц兘闇�姹�"));
+ acceptCriteria.add(createCriteria("3", "瀹夊叏鍚堣", "閫氳繃瀹夊叏娴嬭瘯锛岀鍚堟暟鎹畨鍏ㄨ鑼�"));
+ acceptCriteria.add(createCriteria("4", "鏂囨。榻愬叏", "鐢ㄦ埛鎵嬪唽銆佽繍缁存墜鍐屻�丄PI鏂囨。瀹屾暣"));
+ acceptCriteria.add(createCriteria("5", "鍩硅瀹屾垚", "瀹屾垚鐢ㄦ埛鍩硅骞堕�氳繃鑰冩牳"));
+ acceptCriteria.add(createCriteria("6", "鏁版嵁杩佺Щ", "鍘嗗彶鏁版嵁鎴愬姛杩佺Щ骞堕獙璇佸噯纭�"));
+ data.put("acceptCriteria", acceptCriteria);
+
+ // 鍔犺浇妯℃澘骞剁敓鎴�
+ Template template = cfg.getTemplate("闇�姹傝鏄庝功.xml");
+ StringWriter out = new StringWriter();
+ template.process(data, out);
+
+ // 淇濆瓨涓篸ocx
+ String outputPath = "D:/鐗涢┈/鏂囨。/闇�姹傝鏄庝功.docx";
+ File outputFile = new File(outputPath);
+ outputFile.getParentFile().mkdirs();
+ try (FileOutputStream fos = new FileOutputStream(outputFile);
+ OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
+ osw.write(out.toString());
+ }
+
+ System.out.println("闇�姹傝鏄庝功鐢熸垚鎴愬姛: " + outputPath);
+ }
+
+ private static Map<String, String> createFeature(String id, String name, String desc) {
+ Map<String, String> map = new HashMap<>();
+ map.put("id", id);
+ map.put("name", name);
+ map.put("desc", desc);
+ return map;
+ }
+
+ private static Map<String, String> createRole(String name, String desc, String permission) {
+ Map<String, String> map = new HashMap<>();
+ map.put("name", name);
+ map.put("desc", desc);
+ map.put("permission", permission);
+ return map;
+ }
+
+ private static Map<String, String> createCriteria(String no, String item, String criteria) {
+ Map<String, String> map = new HashMap<>();
+ map.put("no", no);
+ map.put("item", item);
+ map.put("criteria", criteria);
+ return map;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/util/ServerOpsDocGenerator.java b/src/main/java/com/ruoyi/util/ServerOpsDocGenerator.java
new file mode 100644
index 0000000..4023314
--- /dev/null
+++ b/src/main/java/com/ruoyi/util/ServerOpsDocGenerator.java
@@ -0,0 +1,255 @@
+package com.ruoyi.util;
+
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import freemarker.template.TemplateExceptionHandler;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+
+public class ServerOpsDocGenerator {
+
+ public static void main(String[] args) throws Exception {
+ generateServerOpsDoc();
+ }
+
+ public static void generateServerOpsDoc() throws Exception {
+ Configuration cfg = new Configuration(Configuration.VERSION_2_3_32);
+ cfg.setClassForTemplateLoading(ServerOpsDocGenerator.class, "/static");
+ cfg.setDefaultEncoding("UTF-8");
+ cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
+
+ Map<String, Object> data = new HashMap<>();
+
+ data.put("projectName", "浜у搧搴撳瓨绠$悊绯荤粺");
+ data.put("projectVersion", "V1.0");
+ data.put("docDate", "2026骞�6鏈�");
+
+ // 鏈嶅姟鍣ㄦ竻鍗�
+ List<Map<String, String>> servers = new ArrayList<>();
+ servers.add(createServer("SVR-APP-01", "搴旂敤鏈嶅姟鍣�", "192.168.1.101", "8鏍�", "16GB", "500GB SSD", "CentOS 7.9", "杩愯涓�"));
+ servers.add(createServer("SVR-APP-02", "搴旂敤鏈嶅姟鍣�", "192.168.1.102", "8鏍�", "16GB", "500GB SSD", "CentOS 7.9", "杩愯涓�"));
+ servers.add(createServer("SVR-DB-01", "鏁版嵁搴撲富搴�", "192.168.1.201", "8鏍�", "32GB", "1TB SSD", "CentOS 7.9", "杩愯涓�"));
+ servers.add(createServer("SVR-DB-02", "鏁版嵁搴撲粠搴�", "192.168.1.202", "8鏍�", "32GB", "1TB SSD", "CentOS 7.9", "杩愯涓�"));
+ servers.add(createServer("SVR-REDIS-01", "Redis鑺傜偣1", "192.168.1.301", "4鏍�", "8GB", "200GB SSD", "CentOS 7.9", "杩愯涓�"));
+ servers.add(createServer("SVR-REDIS-02", "Redis鑺傜偣2", "192.168.1.302", "4鏍�", "8GB", "200GB SSD", "CentOS 7.9", "杩愯涓�"));
+ servers.add(createServer("SVR-REDIS-03", "Redis鑺傜偣3", "192.168.1.303", "4鏍�", "8GB", "200GB SSD", "CentOS 7.9", "杩愯涓�"));
+ servers.add(createServer("SVR-FILE-01", "鏂囦欢鏈嶅姟鍣�", "192.168.1.401", "4鏍�", "8GB", "2TB HDD", "CentOS 7.9", "纾佺洏鍛婅"));
+ servers.add(createServer("SVR-AI-01", "AI鎺ㄧ悊鏈嶅姟鍣�", "192.168.1.501", "16鏍�", "64GB", "1TB SSD", "Ubuntu 22.04", "杩愯涓�"));
+ servers.add(createServer("SVR-NGINX-01", "Nginx浠g悊", "192.168.1.11", "4鏍�", "8GB", "200GB SSD", "CentOS 7.9", "杩愯涓�"));
+ data.put("servers", servers);
+
+ // 杩愮淮杩涘害璺熻釜
+ List<Map<String, String>> progress = new ArrayList<>();
+ progress.add(createProgress("2026-05-20", "鏈嶅姟鍣ㄥ垵濮嬬幆澧冮厤缃�", "瀹夎JDK25銆丯ginx銆丏ocker", "100%", ""));
+ progress.add(createProgress("2026-05-21", "鏁版嵁搴撲富浠庢惌寤�", "MySQL8.0涓讳粠澶嶅埗閰嶇疆", "100%", ""));
+ progress.add(createProgress("2026-05-22", "Redis闆嗙兢閮ㄧ讲", "3鑺傜偣鍝ㄥ叺妯″紡閮ㄧ讲", "100%", ""));
+ progress.add(createProgress("2026-05-23", "搴旂敤鏈嶅姟閮ㄧ讲", "SpringBoot搴旂敤鍙岃妭鐐归儴缃�", "100%", ""));
+ progress.add(createProgress("2026-05-24", "SSL璇佷功閰嶇疆", "Nginx HTTPS閰嶇疆", "100%", ""));
+ progress.add(createProgress("2026-05-25", "鐩戞帶绯荤粺鎼缓", "Prometheus+Grafana閮ㄧ讲", "90%", "鍛婅瑙勫垯寰呭畬鍠�"));
+ progress.add(createProgress("2026-05-26", "鏃ュ織鏀堕泦绯荤粺", "ELK鏃ュ織骞冲彴鎼缓", "80%", "Kibana浠〃鐩樺緟閰嶇疆"));
+ progress.add(createProgress("2026-05-27", "澶囦唤绛栫暐閰嶇疆", "鏁版嵁搴撹嚜鍔ㄥ浠借剼鏈厤缃�", "100%", ""));
+ progress.add(createProgress("2026-05-28", "瀹夊叏鍔犲浐", "闃茬伀澧欒鍒欍�丼SH鍔犲浐", "85%", "绔彛鎵弿寰呭畬鎴�"));
+ progress.add(createProgress("2026-05-29", "鍘嬪姏娴嬭瘯", "JMeter鎬ц兘鍘嬫祴", "100%", "骞跺彂鎸囨爣杈炬爣"));
+ progress.add(createProgress("2026-05-30", "鐏惧婕旂粌", "鏁版嵁搴撲富浠庡垏鎹㈡紨缁�", "100%", "鍒囨崲鏃堕棿30绉掑唴"));
+ data.put("progress", progress);
+
+ // 鏈嶅姟鍣ㄥ贰妫�璁板綍
+ List<Map<String, String>> inspections = new ArrayList<>();
+ inspections.add(createInspection("2026-05-20", "SVR-APP-01", "CPU 35%, 鍐呭瓨 52%, 纾佺洏 40%", "姝e父", ""));
+ inspections.add(createInspection("2026-05-20", "SVR-APP-02", "CPU 30%, 鍐呭瓨 48%, 纾佺洏 38%", "姝e父", ""));
+ inspections.add(createInspection("2026-05-20", "SVR-DB-01", "CPU 45%, 鍐呭瓨 68%, 纾佺洏 55%", "姝e父", ""));
+ inspections.add(createInspection("2026-05-20", "SVR-DB-02", "CPU 20%, 鍐呭瓨 60%, 纾佺洏 52%", "姝e父", ""));
+ inspections.add(createInspection("2026-05-20", "SVR-REDIS-01", "CPU 15%, 鍐呭瓨 40%, 纾佺洏 25%", "姝e父", ""));
+ inspections.add(createInspection("2026-05-25", "SVR-APP-01", "CPU 42%, 鍐呭瓨 58%, 纾佺洏 43%", "姝e父", ""));
+ inspections.add(createInspection("2026-05-25", "SVR-DB-01", "CPU 55%, 鍐呭瓨 72%, 纾佺洏 60%", "鍏虫敞", "鍐呭瓨浣跨敤鐜囧亸楂橈紝寤鸿鍏虫敞"));
+ inspections.add(createInspection("2026-05-25", "SVR-FILE-01", "CPU 20%, 鍐呭瓨 35%, 纾佺洏 85%", "鍛婅", "纾佺洏浣跨敤鐜囪揪85%锛岄渶鎵╁"));
+ inspections.add(createInspection("2026-05-30", "SVR-APP-01", "CPU 38%, 鍐呭瓨 55%, 纾佺洏 45%", "姝e父", ""));
+ inspections.add(createInspection("2026-05-30", "SVR-DB-01", "CPU 48%, 鍐呭瓨 70%, 纾佺洏 58%", "姝e父", "鍐呭瓨宸蹭紭鍖�"));
+ inspections.add(createInspection("2026-05-30", "SVR-FILE-01", "CPU 18%, 鍐呭瓨 32%, 纾佺洏 88%", "鍛婅", "纾佺洏鎸佺画澧為暱锛岄渶灏藉揩鎵╁"));
+ inspections.add(createInspection("2026-05-30", "SVR-AI-01", "CPU 65%, 鍐呭瓨 78%, 纾佺洏 45%", "鍏虫敞", "GPU浣跨敤鐜囨甯革紝CPU璐熻浇鍋忛珮"));
+ data.put("inspections", inspections);
+
+ // 鏁版嵁搴撳浠借褰�
+ List<Map<String, String>> backups = new ArrayList<>();
+ backups.add(createBackup("2026-05-20", "鍏ㄩ噺澶囦唤", "product_inventory", "5.2GB", "鎴愬姛", "02:00", "02:15"));
+ backups.add(createBackup("2026-05-21", "澧為噺澶囦唤", "product_inventory", "380MB", "鎴愬姛", "02:00", "02:08"));
+ backups.add(createBackup("2026-05-22", "澧為噺澶囦唤", "product_inventory", "420MB", "鎴愬姛", "02:00", "02:09"));
+ backups.add(createBackup("2026-05-23", "鍏ㄩ噺澶囦唤", "product_inventory", "5.5GB", "鎴愬姛", "02:00", "02:20"));
+ backups.add(createBackup("2026-05-24", "澧為噺澶囦唤", "product_inventory", "350MB", "鎴愬姛", "02:00", "02:07"));
+ backups.add(createBackup("2026-05-25", "澧為噺澶囦唤", "product_inventory", "400MB", "鎴愬姛", "02:00", "02:08"));
+ backups.add(createBackup("2026-05-26", "澧為噺澶囦唤", "product_inventory", "390MB", "澶辫触", "02:00", "02:03"));
+ backups.add(createBackup("2026-05-26", "澧為噺澶囦唤", "product_inventory", "395MB", "鎴愬姛", "03:00", "03:08"));
+ backups.add(createBackup("2026-05-27", "鍏ㄩ噺澶囦唤", "product_inventory", "5.8GB", "鎴愬姛", "02:00", "02:22"));
+ backups.add(createBackup("2026-05-28", "澧為噺澶囦唤", "product_inventory", "410MB", "鎴愬姛", "02:00", "02:09"));
+ data.put("backups", backups);
+
+ // 鏁呴殰/浜嬩欢璁板綍
+ List<Map<String, String>> incidents = new ArrayList<>();
+ incidents.add(createIncident("INC-001", "2026-05-22 14:30", "SVR-DB-01", "MySQL杩炴帴鏁板紓甯稿崌楂�", "杩炴帴姹犳硠婕�", "璋冩暣杩炴帴姹犲弬鏁帮紝閲嶅惎鏈嶅姟", "2026-05-22 15:10", "宸茶В鍐�", "鍛╔X"));
+ incidents.add(createIncident("INC-002", "2026-05-24 09:15", "SVR-APP-01", "搴旂敤鍝嶅簲瓒呮椂", "绾跨▼姹犺�楀敖", "鎵╁ぇ绾跨▼姹狅紝澧炲姞瓒呮椂鏃堕棿", "2026-05-24 09:50", "宸茶В鍐�", "鍛╔X"));
+ incidents.add(createIncident("INC-003", "2026-05-26 02:03", "SVR-DB-01", "鏁版嵁搴撳浠藉け璐�", "纾佺洏绌洪棿涓嶈冻", "娓呯悊褰掓。鏃ュ織锛岄噴鏀剧┖闂�", "2026-05-26 03:00", "宸茶В鍐�", "鍛╔X"));
+ incidents.add(createIncident("INC-004", "2026-05-28 11:20", "SVR-REDIS-02", "Redis鍝ㄥ叺鍒囨崲寮傚父", "缃戠粶鎶栧姩瀵艰嚧璇垽", "鎺掓煡缃戠粶锛岃皟鏁村摠鍏佃秴鏃跺弬鏁�", "2026-05-28 11:50", "宸茶В鍐�", "鍛╔X"));
+ incidents.add(createIncident("INC-005", "2026-05-30 08:45", "SVR-FILE-01", "纾佺洏浣跨敤鐜囪秴85%", "鏃ュ織鏂囦欢鏈疆杞�", "鍚敤鏃ュ織杞浆锛屾竻鐞嗘棫鏃ュ織", "2026-05-30 09:30", "澶勭悊涓�", "鍛╔X"));
+ incidents.add(createIncident("INC-006", "2026-05-30 16:00", "SVR-AI-01", "GPU椹卞姩寮傚父瀵艰嚧鎺ㄧ悊澶辫触", "椹卞姩鐗堟湰涓嶅吋瀹�", "鍥炴粴GPU椹卞姩鐗堟湰", "2026-05-30 17:30", "宸茶В鍐�", "瀛橷X"));
+ data.put("incidents", incidents);
+
+ // 琛ヤ竵/鏇存柊璁板綍
+ List<Map<String, String>> patches = new ArrayList<>();
+ patches.add(createPatch("2026-05-20", "SVR-APP-01/02", "JDK 25.0.1 瀹夊叏鏇存柊", "瀹夊叏琛ヤ竵", "鎴愬姛", ""));
+ patches.add(createPatch("2026-05-22", "鍏ㄩ儴鏈嶅姟鍣�", "OpenSSL 3.0.15 鍗囩骇", "瀹夊叏琛ヤ竵", "鎴愬姛", "淇楂樺嵄婕忔礊CVE-2026-XXXX"));
+ patches.add(createPatch("2026-05-24", "SVR-NGINX-01", "Nginx 1.26.2 鐗堟湰鍗囩骇", "鐗堟湰鍗囩骇", "鎴愬姛", ""));
+ patches.add(createPatch("2026-05-26", "SVR-DB-01/02", "MySQL 8.0.38 琛ヤ竵鏇存柊", "瀹夊叏琛ヤ竵", "鎴愬姛", "鍏堝崌绾т粠搴擄紝楠岃瘉鍚庡垏鎹㈠崌绾т富搴�"));
+ patches.add(createPatch("2026-05-28", "SVR-AI-01", "CUDA Toolkit 12.6 鏇存柊", "鐗堟湰鍗囩骇", "鎴愬姛", ""));
+ patches.add(createPatch("2026-05-30", "鍏ㄩ儴鏈嶅姟鍣�", "绯荤粺鍐呮牳瀹夊叏鏇存柊", "瀹夊叏琛ヤ竵", "杩涜涓�", "闇�閫愬彴閲嶅惎锛屾鍦ㄥ垎鎵规墽琛�"));
+ data.put("patches", patches);
+
+ // 鍙樻洿璁板綍
+ List<Map<String, String>> changes = new ArrayList<>();
+ changes.add(createChange("CHG-001", "2026-05-22", "鏁版嵁搴撹繛鎺ユ睜鍙傛暟璋冩暣", "SVR-DB-01", "杩炴帴鏁�50鍒�100", "鍛╔X", "宸插畬鎴�", ""));
+ changes.add(createChange("CHG-002", "2026-05-23", "Nginx鏂板璐熻浇鍧囪 瑙勫垯", "SVR-NGINX-01", "澧炲姞A/B娴嬭瘯璺敱", "鍛╔X", "宸插畬鎴�", ""));
+ changes.add(createChange("CHG-003", "2026-05-25", "Redis鍐呭瓨绛栫暐璋冩暣", "SVR-REDIS-01/02/03", "maxmemory浠�4G璋冩暣涓�6G", "鍛╔X", "宸插畬鎴�", ""));
+ changes.add(createChange("CHG-004", "2026-05-27", "鏁版嵁搴撳浠界瓥鐣ヨ皟鏁�", "SVR-DB-01", "浠庢瘡鏃ュ叏閲忔敼涓哄懆涓夊叚鍏ㄩ噺+鏃ュ閲�", "鍛╔X", "宸插畬鎴�", ""));
+ changes.add(createChange("CHG-005", "2026-05-29", "搴旂敤JVM鍙傛暟浼樺寲", "SVR-APP-01/02", "鍫嗗唴瀛�8G鍒�12G锛孏C绛栫暐璋冩暣", "鐜媂X", "宸插畬鎴�", ""));
+ data.put("changes", changes);
+
+ // 寰呭姙浜嬮」
+ List<Map<String, String>> actionItems = new ArrayList<>();
+ actionItems.add(createActionItem("1", "SVR-FILE-01纾佺洏鎵╁鑷�4TB", "鍛╔X", "2026-06-05"));
+ actionItems.add(createActionItem("2", "瀹屾垚ELK鏃ュ織骞冲彴Kibana浠〃鐩橀厤缃�", "鍛╔X", "2026-06-03"));
+ actionItems.add(createActionItem("3", "瀹屽杽Prometheus鍛婅瑙勫垯", "鍛╔X", "2026-06-04"));
+ actionItems.add(createActionItem("4", "瀹屾垚鍏ㄩ儴鏈嶅姟鍣ㄥ唴鏍稿畨鍏ㄦ洿鏂�", "鍛╔X", "2026-06-02"));
+ actionItems.add(createActionItem("5", "缂栧啓杩愮淮鎵嬪唽鍜屽簲鎬ラ妗�", "鍛╔X", "2026-06-10"));
+ actionItems.add(createActionItem("6", "閰嶇疆寮傚湴澶囦唤鍚屾浠诲姟", "鍛╔X", "2026-06-08"));
+ data.put("actionItems", actionItems);
+
+ // 杩愮淮缁熻
+ data.put("serverCount", "10");
+ data.put("runningCount", "8");
+ data.put("alertCount", "2");
+ data.put("uptimeRate", "99.95%");
+ data.put("totalInspections", "12");
+ data.put("totalBackups", "10");
+ data.put("backupSuccessRate", "90%");
+ data.put("totalIncidents", "6");
+ data.put("solvedIncidents", "5");
+ data.put("totalPatches", "6");
+ data.put("completedPatches", "5");
+
+ // 杩愮淮缁撹
+ data.put("opsConclusion", "鏁翠綋杩愮淮鐘跺喌鑹ソ锛屾湇鍔″櫒鍙敤鐜囪揪鍒�99.95%銆係VR-FILE-01纾佺洏鍛婅闇�灏藉揩澶勭悊锛屽凡瀹屾垚鏃ュ織杞浆缂撹В鍘嬪姏锛屼粛闇�鎵╁銆傚浠界瓥鐣ュ凡浼樺寲锛�26鏃ュ浠藉け璐ュ凡澶勭悊銆傚畨鍏ㄨˉ涓佸垎鎵规墽琛屼腑锛岄璁�6鏈�2鏃ュ墠鍏ㄩ儴瀹屾垚銆�");
+ data.put("riskWarning", "纾佺洏鍛婅锛圫VR-FILE-01锛夈�佸唴瀛樺亸楂橈紙SVR-DB-01锛夈�佸唴鏍歌ˉ涓佸緟瀹屾垚锛�3鍙帮級");
+
+ Template template = cfg.getTemplate("鏈嶅姟鍣ㄨ繍缁磋褰�.xml");
+ StringWriter out = new StringWriter();
+ template.process(data, out);
+
+ String outputPath = "D:/鐗涢┈/鏂囨。/鏈嶅姟鍣ㄨ繍缁磋褰�.docx";
+ File outputFile = new File(outputPath);
+ outputFile.getParentFile().mkdirs();
+ try (FileOutputStream fos = new FileOutputStream(outputFile);
+ OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
+ osw.write(out.toString());
+ }
+
+ System.out.println("鏈嶅姟鍣ㄨ繍缁磋褰曠敓鎴愭垚鍔�: " + outputPath);
+ }
+
+ private static Map<String, String> createServer(String id, String type, String ip, String cpu,
+ String memory, String disk, String os, String status) {
+ Map<String, String> map = new HashMap<>();
+ map.put("id", id);
+ map.put("type", type);
+ map.put("ip", ip);
+ map.put("cpu", cpu);
+ map.put("memory", memory);
+ map.put("disk", disk);
+ map.put("os", os);
+ map.put("status", status);
+ return map;
+ }
+
+ private static Map<String, String> createProgress(String date, String task, String content, String rate, String remark) {
+ Map<String, String> map = new HashMap<>();
+ map.put("date", date);
+ map.put("task", task);
+ map.put("content", content);
+ map.put("rate", rate);
+ map.put("remark", remark);
+ return map;
+ }
+
+ private static Map<String, String> createInspection(String date, String server, String metrics, String result, String remark) {
+ Map<String, String> map = new HashMap<>();
+ map.put("date", date);
+ map.put("server", server);
+ map.put("metrics", metrics);
+ map.put("result", result);
+ map.put("remark", remark);
+ return map;
+ }
+
+ private static Map<String, String> createBackup(String date, String type, String database, String size,
+ String status, String startTime, String endTime) {
+ Map<String, String> map = new HashMap<>();
+ map.put("date", date);
+ map.put("type", type);
+ map.put("database", database);
+ map.put("size", size);
+ map.put("status", status);
+ map.put("startTime", startTime);
+ map.put("endTime", endTime);
+ return map;
+ }
+
+ private static Map<String, String> createIncident(String no, String time, String server, String desc,
+ String cause, String solution, String resolveTime,
+ String status, String handler) {
+ Map<String, String> map = new HashMap<>();
+ map.put("no", no);
+ map.put("time", time);
+ map.put("server", server);
+ map.put("desc", desc);
+ map.put("cause", cause);
+ map.put("solution", solution);
+ map.put("resolveTime", resolveTime);
+ map.put("status", status);
+ map.put("handler", handler);
+ return map;
+ }
+
+ private static Map<String, String> createPatch(String date, String server, String content, String type, String result, String remark) {
+ Map<String, String> map = new HashMap<>();
+ map.put("date", date);
+ map.put("server", server);
+ map.put("content", content);
+ map.put("type", type);
+ map.put("result", result);
+ map.put("remark", remark);
+ return map;
+ }
+
+ private static Map<String, String> createChange(String no, String date, String content, String server,
+ String detail, String executor, String status, String remark) {
+ Map<String, String> map = new HashMap<>();
+ map.put("no", no);
+ map.put("date", date);
+ map.put("content", content);
+ map.put("server", server);
+ map.put("detail", detail);
+ map.put("executor", executor);
+ map.put("status", status);
+ map.put("remark", remark);
+ return map;
+ }
+
+ private static Map<String, String> createActionItem(String no, String content, String owner, String deadline) {
+ Map<String, String> map = new HashMap<>();
+ map.put("no", no);
+ map.put("content", content);
+ map.put("owner", owner);
+ map.put("deadline", deadline);
+ return map;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/util/SystemDesignDocGenerator.java b/src/main/java/com/ruoyi/util/SystemDesignDocGenerator.java
new file mode 100644
index 0000000..4515101
--- /dev/null
+++ b/src/main/java/com/ruoyi/util/SystemDesignDocGenerator.java
@@ -0,0 +1,211 @@
+package com.ruoyi.util;
+
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import freemarker.template.TemplateExceptionHandler;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+
+public class SystemDesignDocGenerator {
+
+ public static void main(String[] args) throws Exception {
+ generateSystemDesignDoc();
+ }
+
+ public static void generateSystemDesignDoc() throws Exception {
+ Configuration cfg = new Configuration(Configuration.VERSION_2_3_32);
+ cfg.setClassForTemplateLoading(SystemDesignDocGenerator.class, "/static");
+ cfg.setDefaultEncoding("UTF-8");
+ cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
+
+ Map<String, Object> data = new HashMap<>();
+
+ // 椤圭洰鍩烘湰淇℃伅
+ data.put("projectName", "浜у搧搴撳瓨绠$悊绯荤粺");
+ data.put("projectVersion", "V1.0");
+ data.put("docDate", "2026骞�6鏈�");
+
+ // 鍚庣鎶�鏈爤
+ List<Map<String, String>> backendTech = new ArrayList<>();
+ backendTech.add(createTech("鏍稿績妗嗘灦", "Spring Boot 3.5", "鎻愪緵渚濊禆娉ㄥ叆銆丄OP銆侀厤缃鐞嗙瓑鍔熻兘"));
+ backendTech.add(createTech("ORM妗嗘灦", "MyBatis-Plus 3.5", "鏁版嵁搴撹闂紝鏀寔鑷姩浠g爜鐢熸垚"));
+ backendTech.add(createTech("瀹夊叏妗嗘灦", "Spring Security", "璁よ瘉鎺堟潈銆佹潈闄愭帶鍒�"));
+ backendTech.add(createTech("缂撳瓨", "Redis 7.0", "缂撳瓨鐑偣鏁版嵁锛屾彁鍗囨�ц兘"));
+ backendTech.add(createTech("鏁版嵁搴�", "MySQL 8.0", "瀛樺偍涓氬姟鏁版嵁"));
+ backendTech.add(createTech("浠诲姟璋冨害", "Quartz", "瀹氭椂浠诲姟璋冨害绠$悊"));
+ backendTech.add(createTech("鏃ュ織", "Logback", "鏃ュ織璁板綍涓庣鐞�"));
+ backendTech.add(createTech("API鏂囨。", "Knife4j", "鎺ュ彛鏂囨。鐢熸垚涓庢祴璇�"));
+ data.put("backendTech", backendTech);
+
+ // 鍓嶇鎶�鏈爤
+ List<Map<String, String>> frontendTech = new ArrayList<>();
+ frontendTech.add(createTech("鏍稿績妗嗘灦", "Vue 3", "娓愯繘寮廕avaScript妗嗘灦"));
+ frontendTech.add(createTech("UI缁勪欢", "Element Plus", "浼佷笟绾I缁勪欢搴�"));
+ frontendTech.add(createTech("鐘舵�佺鐞�", "Pinia", "Vue瀹樻柟鐘舵�佺鐞嗗簱"));
+ frontendTech.add(createTech("璺敱", "Vue Router", "鍗曢〉闈㈠簲鐢ㄨ矾鐢辩鐞�"));
+ frontendTech.add(createTech("HTTP瀹㈡埛绔�", "Axios", "HTTP璇锋眰搴�"));
+ frontendTech.add(createTech("鏋勫缓宸ュ叿", "Vite", "涓嬩竴浠e墠绔瀯寤哄伐鍏�"));
+ data.put("frontendTech", frontendTech);
+
+ // AI鎶�鏈爤
+ List<Map<String, String>> aiTech = new ArrayList<>();
+ aiTech.add(createTech("澶ц瑷�妯″瀷", "Claude API / OpenAI API", "鏅鸿兘瀹㈡湇銆佹枃妗g敓鎴�"));
+ aiTech.add(createTech("鏈哄櫒瀛︿範", "TensorFlow / PyTorch", "棰勬祴妯″瀷璁粌涓庢帹鐞�"));
+ aiTech.add(createTech("OCR璇嗗埆", "鐧惧害OCR / Tesseract", "鏂囨。鍥剧墖璇嗗埆"));
+ aiTech.add(createTech("璇煶璇嗗埆", "鐧惧害璇煶 / 璁", "璇煶杞枃瀛�"));
+ aiTech.add(createTech("妯″瀷閮ㄧ讲", "FastAPI + Docker", "妯″瀷鏈嶅姟鍖栭儴缃�"));
+ data.put("aiTech", aiTech);
+
+ // 绯荤粺妯″潡
+ List<Map<String, String>> modules = new ArrayList<>();
+ modules.add(createModule("MOD-001", "搴撳瓨绠$悊", "鍏ュ簱銆佸嚭搴撱�佺洏鐐广�侀璀︺�佸簱瀛樻煡璇�"));
+ modules.add(createModule("MOD-002", "閲囪喘绠$悊", "閲囪喘鐢宠銆佽鍗曠鐞嗐�佷緵搴斿晢绠$悊"));
+ modules.add(createModule("MOD-003", "閿�鍞鐞�", "鎶ヤ环銆佽鍗曘�佸彂璐с�佸敭鍚�"));
+ modules.add(createModule("MOD-004", "璐ㄩ噺绠$悊", "璐ㄩ噺妫�楠屻�佷笉鍚堟牸澶勭悊銆佹娴嬫姤鍛�"));
+ modules.add(createModule("MOD-005", "璁惧绠$悊", "璁惧鍙拌处銆佷繚鍏昏鍒掋�佷繚鍏绘墽琛�"));
+ modules.add(createModule("MOD-006", "浜轰簨绠$悊", "鍛樺伐妗f銆佽�冨嫟銆佸鎵规祦绋�"));
+ modules.add(createModule("MOD-007", "绯荤粺绠$悊", "鐢ㄦ埛銆佽鑹层�佹潈闄愩�佹棩蹇�"));
+ modules.add(createModule("MOD-008", "AI鏈嶅姟", "鏅鸿兘瀹㈡湇銆侀娴嬪垎鏋愩�佹枃妗h瘑鍒�"));
+ data.put("modules", modules);
+
+ // 鏈嶅姟鍣ㄩ厤缃�
+ List<Map<String, String>> servers = new ArrayList<>();
+ servers.add(createServer("搴旂敤鏈嶅姟鍣�1", "8鏍�", "16GB", "500GB SSD", "CentOS 7.9"));
+ servers.add(createServer("搴旂敤鏈嶅姟鍣�2", "8鏍�", "16GB", "500GB SSD", "CentOS 7.9"));
+ servers.add(createServer("鏁版嵁搴撲富搴�", "8鏍�", "32GB", "1TB SSD", "CentOS 7.9"));
+ servers.add(createServer("鏁版嵁搴撲粠搴�", "8鏍�", "32GB", "1TB SSD", "CentOS 7.9"));
+ servers.add(createServer("Redis鑺傜偣1", "4鏍�", "8GB", "200GB SSD", "CentOS 7.9"));
+ servers.add(createServer("Redis鑺傜偣2", "4鏍�", "8GB", "200GB SSD", "CentOS 7.9"));
+ servers.add(createServer("Redis鑺傜偣3", "4鏍�", "8GB", "200GB SSD", "CentOS 7.9"));
+ servers.add(createServer("鏂囦欢鏈嶅姟鍣�", "4鏍�", "8GB", "2TB HDD", "CentOS 7.9"));
+ servers.add(createServer("AI鎺ㄧ悊鏈嶅姟鍣�", "16鏍�", "64GB", "1TB SSD", "Ubuntu 22.04"));
+ data.put("servers", servers);
+
+ // 鏁版嵁搴撹〃
+ List<Map<String, String>> tables = new ArrayList<>();
+ tables.add(createTable("stock_inventory", "搴撳瓨琛紝瀛樺偍搴撳瓨鏁伴噺銆佹壒鍙风瓑淇℃伅"));
+ tables.add(createTable("stock_in_record", "鍏ュ簱璁板綍琛紝璁板綍鍏ュ簱鏄庣粏"));
+ tables.add(createTable("stock_out_record", "鍑哄簱璁板綍琛紝璁板綍鍑哄簱鏄庣粏"));
+ tables.add(createTable("purchase_order", "閲囪喘璁㈠崟琛�"));
+ tables.add(createTable("sales_order", "閿�鍞鍗曡〃"));
+ tables.add(createTable("quality_inspect", "璐ㄦ璁板綍琛�"));
+ tables.add(createTable("device_info", "璁惧淇℃伅琛�"));
+ tables.add(createTable("device_maintenance", "璁惧淇濆吇璁板綍琛�"));
+ tables.add(createTable("staff_on_job", "鍛樺伐淇℃伅琛�"));
+ tables.add(createTable("sys_user", "绯荤粺鐢ㄦ埛琛�"));
+ tables.add(createTable("sys_role", "瑙掕壊琛�"));
+ tables.add(createTable("sys_menu", "鑿滃崟鏉冮檺琛�"));
+ data.put("tables", tables);
+
+ // API鎺ュ彛
+ List<Map<String, String>> apis = new ArrayList<>();
+ apis.add(createApi("1", "POST", "/api/auth/login", "鐢ㄦ埛鐧诲綍"));
+ apis.add(createApi("2", "GET", "/api/stock/list", "搴撳瓨鍒楄〃鏌ヨ"));
+ apis.add(createApi("3", "POST", "/api/stock/in", "鍏ュ簱鎿嶄綔"));
+ apis.add(createApi("4", "POST", "/api/stock/out", "鍑哄簱鎿嶄綔"));
+ apis.add(createApi("5", "GET", "/api/purchase/list", "閲囪喘璁㈠崟鍒楄〃"));
+ apis.add(createApi("6", "POST", "/api/purchase/create", "鍒涘缓閲囪喘璁㈠崟"));
+ apis.add(createApi("7", "GET", "/api/sales/list", "閿�鍞鍗曞垪琛�"));
+ apis.add(createApi("8", "POST", "/api/quality/inspect", "鎻愪氦璐ㄦ璁板綍"));
+ apis.add(createApi("9", "GET", "/api/device/list", "璁惧鍒楄〃鏌ヨ"));
+ apis.add(createApi("10", "POST", "/api/ai/chat", "AI鏅鸿兘闂瓟"));
+ apis.add(createApi("11", "POST", "/api/ai/predict", "搴撳瓨棰勬祴鎺ュ彛"));
+ apis.add(createApi("12", "POST", "/api/ai/ocr", "OCR鏂囨。璇嗗埆"));
+ data.put("apis", apis);
+
+ // 璇勫椤�
+ List<Map<String, String>> reviewItems = new ArrayList<>();
+ reviewItems.add(createReviewItem("绯荤粺鏋舵瀯", "閫氳繃", "鏋舵瀯娓呮櫚锛屽眰娆″垎鏄庯紝婊¤冻涓氬姟闇�姹�"));
+ reviewItems.add(createReviewItem("鏁版嵁搴撹璁�", "閫氳繃", "琛ㄧ粨鏋勫悎鐞嗭紝绱㈠紩璁捐瀹屽杽"));
+ reviewItems.add(createReviewItem("鎺ュ彛璁捐", "閫氳繃", "RESTful瑙勮寖锛屾帴鍙f枃妗e畬鏁�"));
+ reviewItems.add(createReviewItem("鏈嶅姟鍣ㄩ厤缃�", "閫氳繃", "閰嶇疆婊¤冻鎬ц兘瑕佹眰"));
+ reviewItems.add(createReviewItem("AI鎶�鏈柟妗�", "閫氳繃", "鎶�鏈�夊瀷鍚堢悊锛屽彲琛屾�ч珮"));
+ reviewItems.add(createReviewItem("瀹夊叏璁捐", "閫氳繃", "瀹夊叏鎺柦瀹屽杽"));
+ data.put("reviewItems", reviewItems);
+
+ // 寰呭姙浜嬮」
+ List<Map<String, String>> actionItems = new ArrayList<>();
+ actionItems.add(createActionItem("1", "瀹屽杽鏁版嵁搴揈R鍥捐璁�", "鐜媂X", "X鏈圶鏃�"));
+ actionItems.add(createActionItem("2", "琛ュ厖API鎺ュ彛璇︾粏鍙傛暟璇存槑", "璧礨X", "X鏈圶鏃�"));
+ actionItems.add(createActionItem("3", "纭AI鏈嶅姟鍣℅PU閰嶇疆", "瀛橷X", "X鏈圶鏃�"));
+ actionItems.add(createActionItem("4", "缂栧啓閮ㄧ讲鏂囨。", "鍛╔X", "X鏈圶鏃�"));
+ data.put("actionItems", actionItems);
+
+ // 鍔犺浇妯℃澘骞剁敓鎴�
+ Template template = cfg.getTemplate("绯荤粺璁捐璇存槑涔�.xml");
+ StringWriter out = new StringWriter();
+ template.process(data, out);
+
+ // 淇濆瓨涓篸ocx
+ String outputPath = "D:/鐗涢┈/鏂囨。/绯荤粺璁捐璇存槑涔�.docx";
+ File outputFile = new File(outputPath);
+ outputFile.getParentFile().mkdirs();
+ try (FileOutputStream fos = new FileOutputStream(outputFile);
+ OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
+ osw.write(out.toString());
+ }
+
+ System.out.println("绯荤粺璁捐璇存槑涔︾敓鎴愭垚鍔�: " + outputPath);
+ }
+
+ private static Map<String, String> createTech(String category, String component, String desc) {
+ Map<String, String> map = new HashMap<>();
+ map.put("category", category);
+ map.put("component", component);
+ map.put("desc", desc);
+ return map;
+ }
+
+ private static Map<String, String> createModule(String id, String name, String desc) {
+ Map<String, String> map = new HashMap<>();
+ map.put("id", id);
+ map.put("name", name);
+ map.put("desc", desc);
+ return map;
+ }
+
+ private static Map<String, String> createServer(String name, String cpu, String memory, String disk, String os) {
+ Map<String, String> map = new HashMap<>();
+ map.put("name", name);
+ map.put("cpu", cpu);
+ map.put("memory", memory);
+ map.put("disk", disk);
+ map.put("os", os);
+ return map;
+ }
+
+ private static Map<String, String> createTable(String name, String desc) {
+ Map<String, String> map = new HashMap<>();
+ map.put("name", name);
+ map.put("desc", desc);
+ return map;
+ }
+
+ private static Map<String, String> createApi(String no, String method, String path, String desc) {
+ Map<String, String> map = new HashMap<>();
+ map.put("no", no);
+ map.put("method", method);
+ map.put("path", path);
+ map.put("desc", desc);
+ return map;
+ }
+
+ private static Map<String, String> createReviewItem(String item, String result, String opinion) {
+ Map<String, String> map = new HashMap<>();
+ map.put("item", item);
+ map.put("result", result);
+ map.put("opinion", opinion);
+ return map;
+ }
+
+ private static Map<String, String> createActionItem(String no, String content, String owner, String deadline) {
+ Map<String, String> map = new HashMap<>();
+ map.put("no", no);
+ map.put("content", content);
+ map.put("owner", owner);
+ map.put("deadline", deadline);
+ return map;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/util/TechDevDocGenerator.java b/src/main/java/com/ruoyi/util/TechDevDocGenerator.java
new file mode 100644
index 0000000..5d64afa
--- /dev/null
+++ b/src/main/java/com/ruoyi/util/TechDevDocGenerator.java
@@ -0,0 +1,208 @@
+package com.ruoyi.util;
+
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import freemarker.template.TemplateExceptionHandler;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+
+public class TechDevDocGenerator {
+
+ public static void main(String[] args) throws Exception {
+ generateTechDevDoc();
+ }
+
+ public static void generateTechDevDoc() throws Exception {
+ Configuration cfg = new Configuration(Configuration.VERSION_2_3_32);
+ cfg.setClassForTemplateLoading(TechDevDocGenerator.class, "/static");
+ cfg.setDefaultEncoding("UTF-8");
+ cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
+
+ Map<String, Object> data = new HashMap<>();
+
+ // 椤圭洰鍩烘湰淇℃伅
+ data.put("projectName", "浜у搧搴撳瓨绠$悊绯荤粺");
+ data.put("projectVersion", "V1.0");
+ data.put("docDate", "2026骞�6鏈�");
+
+ // Gitblit浠撳簱鍦板潃
+ List<Map<String, String>> repositories = new ArrayList<>();
+ repositories.add(createRepo("鍚庣浠撳簱", "http://114.132.189.42:9002/r/product-inventory-management-after.git"));
+ repositories.add(createRepo("鍓嶇浠撳簱", "http://114.132.189.42:9002/r/product-inventory-ui.git"));
+ repositories.add(createRepo("鏂囨。浠撳簱", "http://114.132.189.42:9002/r/product-inventory-docs.git"));
+ repositories.add(createRepo("鏁版嵁搴撹剼鏈�", "http://114.132.189.42:9002/r/product-inventory-db.git"));
+ data.put("repositories", repositories);
+
+ // Git鐢ㄦ埛鏉冮檺鍒嗛厤
+ List<Map<String, String>> gitUsers = new ArrayList<>();
+ gitUsers.add(createGitUser("zhangxx", "寮燲X", "椤圭洰绠$悊鍛�", "RW+锛堟墍鏈変粨搴擄級"));
+ gitUsers.add(createGitUser("wangxx", "鐜媂X", "鍚庣寮�鍙�", "RW锛堝悗绔�佹暟鎹簱锛�"));
+ gitUsers.add(createGitUser("zhaoxx", "璧礨X", "鍚庣寮�鍙�", "RW锛堝悗绔�佹暟鎹簱锛�"));
+ gitUsers.add(createGitUser("chenxx", "闄圶X", "鍓嶇寮�鍙�", "RW锛堝墠绔粨搴擄級"));
+ gitUsers.add(createGitUser("sunxx", "瀛橷X", "AI宸ョ▼甯�", "RW锛堝悗绔�丄I妯″潡锛�"));
+ gitUsers.add(createGitUser("liuxx", "鍒榅X", "娴嬭瘯宸ョ▼甯�", "R锛堟墍鏈変粨搴擄級"));
+ gitUsers.add(createGitUser("zhouxx", "鍛╔X", "杩愮淮宸ョ▼甯�", "RW锛堟枃妗c�侀儴缃茶剼鏈級"));
+ data.put("gitUsers", gitUsers);
+
+ // 娴嬭瘯鐢ㄤ緥
+ List<Map<String, String>> testCases = new ArrayList<>();
+ testCases.add(createTestCase("TC-001", "鐧诲綍妯″潡", "鐢ㄦ埛鍚嶅瘑鐮佹纭櫥褰�", "鐧诲綍鎴愬姛", "鐧诲綍鎴愬姛", "閫氳繃"));
+ testCases.add(createTestCase("TC-002", "鐧诲綍妯″潡", "鐢ㄦ埛鍚嶉敊璇櫥褰�", "鎻愮ず鐢ㄦ埛涓嶅瓨鍦�", "鎻愮ず姝g‘", "閫氳繃"));
+ testCases.add(createTestCase("TC-003", "搴撳瓨绠$悊", "鍏ュ簱鎿嶄綔-姝e父鏁版嵁", "鍏ュ簱鎴愬姛", "鍏ュ簱鎴愬姛", "閫氳繃"));
+ testCases.add(createTestCase("TC-004", "搴撳瓨绠$悊", "鍑哄簱鎿嶄綔-搴撳瓨涓嶈冻", "鎻愮ず搴撳瓨涓嶈冻", "鎻愮ず姝g‘", "閫氳繃"));
+ testCases.add(createTestCase("TC-005", "閲囪喘绠$悊", "鍒涘缓閲囪喘璁㈠崟", "鍒涘缓鎴愬姛", "鍒涘缓鎴愬姛", "閫氳繃"));
+ testCases.add(createTestCase("TC-006", "閿�鍞鐞�", "鍒涘缓閿�鍞鍗�", "鍒涘缓鎴愬姛", "鍒涘缓鎴愬姛", "閫氳繃"));
+ testCases.add(createTestCase("TC-007", "璐ㄦ绠$悊", "鎻愪氦璐ㄦ璁板綍", "鎻愪氦鎴愬姛", "鎻愪氦鎴愬姛", "閫氳繃"));
+ testCases.add(createTestCase("TC-008", "璁惧绠$悊", "鍒涘缓淇濆吇璁″垝", "鍒涘缓鎴愬姛", "鍒涘缓鎴愬姛", "杩涜涓�"));
+ testCases.add(createTestCase("TC-009", "AI妯″潡", "鏅鸿兘闂瓟鍔熻兘", "杩斿洖姝g‘绛旀", "杩斿洖姝g‘", "杩涜涓�"));
+ testCases.add(createTestCase("TC-010", "绯荤粺绠$悊", "鐢ㄦ埛鏉冮檺閰嶇疆", "鏉冮檺鐢熸晥", "鏉冮檺鐢熸晥", "閫氳繃"));
+ data.put("testCases", testCases);
+
+ // 浠g爜Review璁板綍
+ List<Map<String, String>> reviewRecords = new ArrayList<>();
+ reviewRecords.add(createReviewRecord("2026-05-20", "鐜媂X", "寮燲X", "搴撳瓨妯″潡鍏ュ簱鍔熻兘", "閫氳繃", "浠g爜瑙勮寖锛岄�昏緫娓呮櫚"));
+ reviewRecords.add(createReviewRecord("2026-05-21", "璧礨X", "鐜媂X", "閲囪喘璁㈠崟瀹℃壒娴佺▼", "閫氳繃", "闇�琛ュ厖寮傚父澶勭悊"));
+ reviewRecords.add(createReviewRecord("2026-05-22", "闄圶X", "寮燲X", "鍓嶇鐧诲綍椤甸潰浼樺寲", "閫氳繃", "UI绗﹀悎璁捐绋�"));
+ reviewRecords.add(createReviewRecord("2026-05-23", "鐜媂X", "璧礨X", "搴撳瓨棰勮瀹氭椂浠诲姟", "閫氳繃", "鎬ц兘闇�浼樺寲"));
+ reviewRecords.add(createReviewRecord("2026-05-24", "瀛橷X", "鐜媂X", "AI鏅鸿兘瀹㈡湇鎺ュ彛", "閫氳繃", "闇�澧炲姞閿欒閲嶈瘯鏈哄埗"));
+ reviewRecords.add(createReviewRecord("2026-05-25", "璧礨X", "鐜媂X", "璁惧淇濆吇楠屾敹鍔熻兘", "杩涜涓�", ""));
+ data.put("reviewRecords", reviewRecords);
+
+ // 甯歌闂
+ List<Map<String, String>> commonIssues = new ArrayList<>();
+ commonIssues.add(createCommonIssue("1", "浠g爜瑙勮寖", "鍙橀噺鍛藉悕涓嶈鑼冿紝闇�閬靛惊椹煎嘲鍛藉悕娉�"));
+ commonIssues.add(createCommonIssue("2", "浠g爜瑙勮寖", "缂哄皯蹇呰鐨勬敞閲婅鏄�"));
+ commonIssues.add(createCommonIssue("3", "瀹夊叏闂", "SQL璇彞鏈娇鐢ㄥ弬鏁板寲鏌ヨ锛屽瓨鍦ㄦ敞鍏ラ闄�"));
+ commonIssues.add(createCommonIssue("4", "鎬ц兘闂", "寰幆涓墽琛屾暟鎹簱鏌ヨ锛岄渶浼樺寲"));
+ commonIssues.add(createCommonIssue("5", "寮傚父澶勭悊", "寮傚父鎹曡幏鍚庢湭鍋氬鐞嗭紝闇�娣诲姞鏃ュ織鎴栨姏鍑�"));
+ commonIssues.add(createCommonIssue("6", "瀹夊叏闂", "鏁忔劅淇℃伅鏄庢枃鎵撳嵃鍒版棩蹇楋紝闇�鑴辨晱"));
+ data.put("commonIssues", commonIssues);
+
+ // 杩唬璁″垝
+ List<Map<String, String>> iterations = new ArrayList<>();
+ iterations.add(createIteration("v1.0.0", "鍩虹妗嗘灦鎼缓銆佺敤鎴锋潈闄愭ā鍧�", "绗�1-4鍛�", "鐜媂X", "宸插畬鎴�"));
+ iterations.add(createIteration("v1.1.0", "搴撳瓨绠$悊妯″潡", "绗�5-8鍛�", "鐜媂X", "宸插畬鎴�"));
+ iterations.add(createIteration("v1.2.0", "閲囪喘閿�鍞ā鍧�", "绗�9-12鍛�", "璧礨X", "宸插畬鎴�"));
+ iterations.add(createIteration("v1.3.0", "璐ㄦ璁惧妯″潡", "绗�13-16鍛�", "鐜媂X", "杩涜涓�"));
+ iterations.add(createIteration("v1.4.0", "浜轰簨鍗忓悓妯″潡", "绗�17-20鍛�", "璧礨X", "寰呭紑濮�"));
+ iterations.add(createIteration("v1.5.0", "AI鏅鸿兘鍖栧姛鑳�", "绗�21-24鍛�", "瀛橷X", "寰呭紑濮�"));
+ data.put("iterations", iterations);
+
+ // 姣忔棩杩涘害
+ List<Map<String, String>> dailyProgress = new ArrayList<>();
+ dailyProgress.add(createDailyProgress("2026-05-20", "鐜媂X", "瀹屾垚鍏ュ簱妯″潡寮�鍙�", "100%", ""));
+ dailyProgress.add(createDailyProgress("2026-05-20", "璧礨X", "閲囪喘璁㈠崟瀹℃壒娴佺▼寮�鍙�", "80%", "寰呰仈璋�"));
+ dailyProgress.add(createDailyProgress("2026-05-20", "闄圶X", "鍓嶇搴撳瓨椤甸潰浼樺寲", "100%", ""));
+ dailyProgress.add(createDailyProgress("2026-05-21", "鐜媂X", "搴撳瓨棰勮瀹氭椂浠诲姟寮�鍙�", "90%", "寰呮祴璇�"));
+ dailyProgress.add(createDailyProgress("2026-05-21", "璧礨X", "閲囪喘璁㈠崟瀹℃壒娴佺▼鑱旇皟", "100%", ""));
+ dailyProgress.add(createDailyProgress("2026-05-21", "瀛橷X", "AI鎺ュ彛璋冪爺涓庢妧鏈�夊瀷", "70%", "闇�纭"));
+ dailyProgress.add(createDailyProgress("2026-05-22", "鐜媂X", "璁惧淇濆吇妯″潡寮�鍙�", "60%", "杩涜涓�"));
+ dailyProgress.add(createDailyProgress("2026-05-22", "璧礨X", "璐ㄦ璁板綍鍔熻兘寮�鍙�", "50%", "杩涜涓�"));
+ data.put("dailyProgress", dailyProgress);
+
+ // 闂璺熻釜
+ List<Map<String, String>> issues = new ArrayList<>();
+ issues.add(createIssue("ISS-001", "搴撳瓨鏌ヨ鍝嶅簲鎱�", "鍒榅X", "鐜媂X", "楂�", "宸茶В鍐�"));
+ issues.add(createIssue("ISS-002", "鍏ュ簱鎵瑰彿鏍¢獙閫昏緫閿欒", "鍒榅X", "鐜媂X", "楂�", "宸茶В鍐�"));
+ issues.add(createIssue("ISS-003", "閲囪喘璁㈠崟閲戦璁$畻绮惧害闂", "鍒榅X", "璧礨X", "涓�", "宸茶В鍐�"));
+ issues.add(createIssue("ISS-004", "鍓嶇鍒嗛〉缁勪欢鏍峰紡寮傚父", "鍒榅X", "闄圶X", "浣�", "杩涜涓�"));
+ issues.add(createIssue("ISS-005", "AI鎺ュ彛瓒呮椂闂", "瀛橷X", "瀛橷X", "楂�", "杩涜涓�"));
+ issues.add(createIssue("ISS-006", "璁惧淇濆吇鎻愰啋鏈Е鍙�", "鍒榅X", "鐜媂X", "涓�", "寰呭鐞�"));
+ data.put("issues", issues);
+
+ // 鍔犺浇妯℃澘骞剁敓鎴�
+ Template template = cfg.getTemplate("鎶�鏈蒋浠跺紑鍙戞枃妗�.xml");
+ StringWriter out = new StringWriter();
+ template.process(data, out);
+
+ // 淇濆瓨涓篸ocx
+ String outputPath = "D:/鐗涢┈/鏂囨。/鎶�鏈蒋浠跺紑鍙戞枃妗�.docx";
+ File outputFile = new File(outputPath);
+ outputFile.getParentFile().mkdirs();
+ try (FileOutputStream fos = new FileOutputStream(outputFile);
+ OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
+ osw.write(out.toString());
+ }
+
+ System.out.println("鎶�鏈蒋浠跺紑鍙戞枃妗g敓鎴愭垚鍔�: " + outputPath);
+ }
+
+ private static Map<String, String> createRepo(String name, String url) {
+ Map<String, String> map = new HashMap<>();
+ map.put("name", name);
+ map.put("url", url);
+ return map;
+ }
+
+ private static Map<String, String> createGitUser(String username, String realname, String role, String permission) {
+ Map<String, String> map = new HashMap<>();
+ map.put("username", username);
+ map.put("realname", realname);
+ map.put("role", role);
+ map.put("permission", permission);
+ return map;
+ }
+
+ private static Map<String, String> createTestCase(String no, String module, String content, String expected, String actual, String status) {
+ Map<String, String> map = new HashMap<>();
+ map.put("no", no);
+ map.put("module", module);
+ map.put("content", content);
+ map.put("expected", expected);
+ map.put("actual", actual);
+ map.put("status", status);
+ return map;
+ }
+
+ private static Map<String, String> createReviewRecord(String date, String submitter, String reviewer, String content, String result, String remark) {
+ Map<String, String> map = new HashMap<>();
+ map.put("date", date);
+ map.put("submitter", submitter);
+ map.put("reviewer", reviewer);
+ map.put("content", content);
+ map.put("result", result);
+ map.put("remark", remark);
+ return map;
+ }
+
+ private static Map<String, String> createCommonIssue(String no, String type, String desc) {
+ Map<String, String> map = new HashMap<>();
+ map.put("no", no);
+ map.put("type", type);
+ map.put("desc", desc);
+ return map;
+ }
+
+ private static Map<String, String> createIteration(String version, String scope, String time, String owner, String status) {
+ Map<String, String> map = new HashMap<>();
+ map.put("version", version);
+ map.put("scope", scope);
+ map.put("time", time);
+ map.put("owner", owner);
+ map.put("status", status);
+ return map;
+ }
+
+ private static Map<String, String> createDailyProgress(String date, String person, String content, String progress, String remark) {
+ Map<String, String> map = new HashMap<>();
+ map.put("date", date);
+ map.put("person", person);
+ map.put("content", content);
+ map.put("progress", progress);
+ map.put("remark", remark);
+ return map;
+ }
+
+ private static Map<String, String> createIssue(String no, String desc, String finder, String owner, String priority, String status) {
+ Map<String, String> map = new HashMap<>();
+ map.put("no", no);
+ map.put("desc", desc);
+ map.put("finder", finder);
+ map.put("owner", owner);
+ map.put("priority", priority);
+ map.put("status", status);
+ return map;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/util/TestReportDocGenerator.java b/src/main/java/com/ruoyi/util/TestReportDocGenerator.java
new file mode 100644
index 0000000..225fc1e
--- /dev/null
+++ b/src/main/java/com/ruoyi/util/TestReportDocGenerator.java
@@ -0,0 +1,190 @@
+package com.ruoyi.util;
+
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import freemarker.template.TemplateExceptionHandler;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+
+public class TestReportDocGenerator {
+
+ public static void main(String[] args) throws Exception {
+ generateTestReportDoc();
+ }
+
+ public static void generateTestReportDoc() throws Exception {
+ Configuration cfg = new Configuration(Configuration.VERSION_2_3_32);
+ cfg.setClassForTemplateLoading(TestReportDocGenerator.class, "/static");
+ cfg.setDefaultEncoding("UTF-8");
+ cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
+
+ Map<String, Object> data = new HashMap<>();
+
+ // 椤圭洰鍩烘湰淇℃伅
+ data.put("projectName", "浜у搧搴撳瓨绠$悊绯荤粺");
+ data.put("projectVersion", "V1.0");
+ data.put("docDate", "2026骞�6鏈�");
+
+ // 娴嬭瘯璁″垝姒傝堪
+ data.put("testScope", "瑕嗙洊搴撳瓨绠$悊銆侀噰璐攢鍞�佽川妫�璁惧銆佷汉浜嬪崗鍚屻�丄I鏅鸿兘鍖栫瓑鍏ㄩ儴鍔熻兘妯″潡");
+ data.put("testMethodology", "榛戠洅娴嬭瘯 + 鐧界洅娴嬭瘯 + 鑷姩鍖栨祴璇� + 鎬ц兘娴嬭瘯");
+ data.put("testCycle", "2026骞�5鏈�20鏃� - 2026骞�6鏈�30鏃�");
+ data.put("testEnv", "娴嬭瘯鐜锛歐indows Server 2022 / JDK 25 / MySQL 8.0 / Redis 7.0");
+
+ // 娴嬭瘯鐢ㄤ緥
+ List<Map<String, String>> testCases = new ArrayList<>();
+ testCases.add(createTestCase("TC-001", "鐧诲綍妯″潡", "鐢ㄦ埛鍚嶅瘑鐮佹纭櫥褰�", "鐧诲綍鎴愬姛璺宠浆涓婚〉", "鐧诲綍鎴愬姛", "閫氳繃", "鐜媂X"));
+ testCases.add(createTestCase("TC-002", "鐧诲綍妯″潡", "鐢ㄦ埛鍚嶉敊璇櫥褰�", "鎻愮ず鐢ㄦ埛涓嶅瓨鍦�", "鎻愮ず姝g‘", "閫氳繃", "鍒榅X"));
+ testCases.add(createTestCase("TC-003", "鐧诲綍妯″潡", "瀵嗙爜閿欒杩炵画5娆�", "璐﹀彿閿佸畾30鍒嗛挓", "閿佸畾鎴愬姛", "閫氳繃", "鍒榅X"));
+ testCases.add(createTestCase("TC-004", "鐧诲綍妯″潡", "绌虹敤鎴峰悕鐧诲綍", "鎻愮ず鐢ㄦ埛鍚嶄负绌�", "鎻愮ず姝g‘", "閫氳繃", "鍒榅X"));
+ testCases.add(createTestCase("TC-005", "搴撳瓨绠$悊", "閲囪喘鍏ュ簱-姝e父鏁版嵁", "鍏ュ簱鎴愬姛锛屽簱瀛樺鍔�", "鍏ュ簱鎴愬姛", "閫氳繃", "鐜媂X"));
+ testCases.add(createTestCase("TC-006", "搴撳瓨绠$悊", "閲囪喘鍏ュ簱-缂哄皯蹇呭~椤�", "鎻愮ず蹇呭~瀛楁", "鎻愮ず姝g‘", "閫氳繃", "鍒榅X"));
+ testCases.add(createTestCase("TC-007", "搴撳瓨绠$悊", "閿�鍞嚭搴�-姝e父鏁版嵁", "鍑哄簱鎴愬姛锛屽簱瀛樺噺灏�", "鍑哄簱鎴愬姛", "閫氳繃", "鐜媂X"));
+ testCases.add(createTestCase("TC-008", "搴撳瓨绠$悊", "閿�鍞嚭搴�-搴撳瓨涓嶈冻", "鎻愮ず搴撳瓨涓嶈冻", "鎻愮ず姝g‘", "閫氳繃", "鍒榅X"));
+ testCases.add(createTestCase("TC-009", "搴撳瓨绠$悊", "搴撳瓨鐩樼偣-宸紓鎶ュ憡", "鐢熸垚宸紓鎶ュ憡", "鎶ュ憡姝g‘", "閫氳繃", "鐜媂X"));
+ testCases.add(createTestCase("TC-010", "搴撳瓨绠$悊", "搴撳瓨棰勮-涓嬮檺瑙﹀彂", "鑷姩鐢熸垚棰勮閫氱煡", "閫氱煡宸插彂閫�", "閫氳繃", "鐜媂X"));
+ testCases.add(createTestCase("TC-011", "閲囪喘绠$悊", "鍒涘缓閲囪喘璁㈠崟", "璁㈠崟鍒涘缓鎴愬姛", "鍒涘缓鎴愬姛", "閫氳繃", "璧礨X"));
+ testCases.add(createTestCase("TC-012", "閲囪喘绠$悊", "閲囪喘瀹℃壒娴佺▼", "閫愮骇瀹℃壒閫氳繃", "瀹℃壒姝e父", "閫氳繃", "璧礨X"));
+ testCases.add(createTestCase("TC-013", "閲囪喘绠$悊", "渚涘簲鍟嗕俊鎭淮鎶�", "淇℃伅鏇存柊鎴愬姛", "鏇存柊鎴愬姛", "閫氳繃", "璧礨X"));
+ testCases.add(createTestCase("TC-014", "閿�鍞鐞�", "鍒涘缓閿�鍞鍗�", "璁㈠崟鍒涘缓鎴愬姛", "鍒涘缓鎴愬姛", "閫氳繃", "璧礨X"));
+ testCases.add(createTestCase("TC-015", "閿�鍞鐞�", "閿�鍞姤浠峰崟鐢熸垚", "鎶ヤ环鍗曠敓鎴怭DF", "鐢熸垚鎴愬姛", "閫氳繃", "璧礨X"));
+ testCases.add(createTestCase("TC-016", "璐ㄦ绠$悊", "鏉ユ枡妫�楠�-鍚堟牸鍝�", "妫�楠岄�氳繃鍏ュ簱", "妫�楠屾纭�", "閫氳繃", "鍒榅X"));
+ testCases.add(createTestCase("TC-017", "璐ㄦ绠$悊", "涓嶅悎鏍煎搧澶勭悊娴佺▼", "瑙﹀彂涓嶅悎鏍煎鐞嗘祦绋�", "娴佺▼姝g‘", "閫氳繃", "鍒榅X"));
+ testCases.add(createTestCase("TC-018", "璁惧绠$悊", "璁惧鍙拌处褰曞叆", "璁惧淇℃伅淇濆瓨鎴愬姛", "淇濆瓨鎴愬姛", "閫氳繃", "鐜媂X"));
+ testCases.add(createTestCase("TC-019", "璁惧绠$悊", "淇濆吇璁″垝鍒涘缓", "璁″垝鍒涘缓鎴愬姛", "鍒涘缓鎴愬姛", "閫氳繃", "鐜媂X"));
+ testCases.add(createTestCase("TC-020", "璁惧绠$悊", "淇濆吇楠屾敹纭", "楠屾敹閫氳繃璁板綍褰掓。", "楠屾敹鎴愬姛", "杩涜涓�", "鐜媂X"));
+ testCases.add(createTestCase("TC-021", "浜轰簨绠$悊", "鍛樺伐鍏ヨ亴鐧昏", "鍛樺伐淇℃伅鍏ュ簱", "鐧昏鎴愬姛", "閫氳繃", "璧礨X"));
+ testCases.add(createTestCase("TC-022", "浜轰簨绠$悊", "鍚堝悓鍒版湡鎻愰啋", "鑷姩鍙戦�佹彁閱掗�氱煡", "閫氱煡宸插彂閫�", "閫氳繃", "璧礨X"));
+ testCases.add(createTestCase("TC-023", "AI妯″潡", "鏅鸿兘闂瓟-搴撳瓨鏌ヨ", "杩斿洖姝g‘搴撳瓨淇℃伅", "杩斿洖姝g‘", "閫氳繃", "瀛橷X"));
+ testCases.add(createTestCase("TC-024", "AI妯″潡", "搴撳瓨棰勬祴鍑嗙‘鎬�", "棰勬祴璇樊灏忎簬15%", "璇樊12%", "閫氳繃", "瀛橷X"));
+ testCases.add(createTestCase("TC-025", "AI妯″潡", "OCR鏂囨。璇嗗埆", "璇嗗埆鍑嗙‘鐜�>95%", "鍑嗙‘鐜�96.5%", "閫氳繃", "瀛橷X"));
+ testCases.add(createTestCase("TC-026", "AI妯″潡", "璇煶褰曞叆鍔熻兘", "璇嗗埆鍑嗙‘鐜�>90%", "鍑嗙‘鐜�88%", "杩涜涓�", "瀛橷X"));
+ testCases.add(createTestCase("TC-027", "绯荤粺绠$悊", "鐢ㄦ埛鏉冮檺閰嶇疆", "鏉冮檺鐢熸晥涓旈殧绂�", "鏉冮檺姝g‘", "閫氳繃", "鍒榅X"));
+ testCases.add(createTestCase("TC-028", "绯荤粺绠$悊", "鎿嶄綔鏃ュ織瀹¤", "鍏抽敭鎿嶄綔鍏ㄨ褰�", "璁板綍瀹屾暣", "閫氳繃", "鍒榅X"));
+ testCases.add(createTestCase("TC-029", "鎬ц兘娴嬭瘯", "100骞跺彂鐢ㄦ埛鐧诲綍", "鍝嶅簲鏃堕棿<3绉�", "骞冲潎1.8绉�", "閫氳繃", "鍒榅X"));
+ testCases.add(createTestCase("TC-030", "鎬ц兘娴嬭瘯", "鐧句竾绾ф暟鎹煡璇�", "鏌ヨ鏃堕棿<2绉�", "0.9绉�", "閫氳繃", "鍒榅X"));
+ data.put("testCases", testCases);
+
+ // 娴嬭瘯杩涘害璺熻釜
+ List<Map<String, String>> progress = new ArrayList<>();
+ progress.add(createProgress("2026-05-20", "鐧诲綍妯″潡銆佸簱瀛樺叆搴�", "8", "8", "100%", "宸插畬鎴愮涓�杞�"));
+ progress.add(createProgress("2026-05-21", "搴撳瓨鍑哄簱銆佸簱瀛樼洏鐐�", "10", "9", "90%", "搴撳瓨鐩樼偣寰呭洖褰�"));
+ progress.add(createProgress("2026-05-22", "搴撳瓨棰勮銆侀噰璐鍗�", "8", "8", "100%", ""));
+ progress.add(createProgress("2026-05-23", "閿�鍞鐞嗐�佷緵搴斿晢绠$悊", "10", "8", "80%", "渚涘簲鍟嗗鎵规祦绋嬪緟娴�"));
+ progress.add(createProgress("2026-05-24", "璐ㄦ绠$悊鍏ㄦ祦绋�", "6", "6", "100%", ""));
+ progress.add(createProgress("2026-05-25", "璁惧鍙拌处銆佷繚鍏昏鍒�", "6", "4", "67%", "淇濆吇楠屾敹鍔熻兘寮�鍙戜腑"));
+ progress.add(createProgress("2026-05-26", "浜轰簨绠$悊銆佸悎鍚岀鐞�", "8", "6", "75%", "鍚堝悓鍒版湡鎻愰啋寰呴獙璇�"));
+ progress.add(createProgress("2026-05-27", "AI鏅鸿兘闂瓟銆丱CR璇嗗埆", "6", "5", "83%", "璇煶褰曞叆鍑嗙‘鐜囧緟浼樺寲"));
+ progress.add(createProgress("2026-05-28", "绯荤粺绠$悊銆佹�ц兘娴嬭瘯", "8", "6", "75%", "鎬ц兘娴嬭瘯杩涜涓�"));
+ progress.add(createProgress("2026-05-29", "鍏ㄦā鍧楀洖褰掓祴璇�", "30", "25", "83%", "3涓敤渚嬪緟淇鍚庨噸娴�"));
+ progress.add(createProgress("2026-05-30", "缂洪櫡淇楠岃瘉", "12", "10", "83%", "2涓綆浼樺厛绾х己闄峰欢鍚庡鐞�"));
+ data.put("progress", progress);
+
+ // 缂洪櫡璺熻釜
+ List<Map<String, String>> defects = new ArrayList<>();
+ defects.add(createDefect("BUG-001", "搴撳瓨鏌ヨ鍝嶅簲鏃堕棿瓒呰繃5绉�", "涓ラ噸", "鐜媂X", "宸蹭慨澶�", "2026-05-22"));
+ defects.add(createDefect("BUG-002", "鍏ュ簱鎵瑰彿閲嶅鏍¢獙澶辨晥", "涓ラ噸", "鐜媂X", "宸蹭慨澶�", "2026-05-22"));
+ defects.add(createDefect("BUG-003", "閲囪喘璁㈠崟閲戦绮惧害涓㈠け", "涓�鑸�", "璧礨X", "宸蹭慨澶�", "2026-05-23"));
+ defects.add(createDefect("BUG-004", "鍓嶇鍒嗛〉缁勪欢鏄剧ず寮傚父", "杞诲井", "闄圶X", "宸蹭慨澶�", "2026-05-24"));
+ defects.add(createDefect("BUG-005", "AI鏅鸿兘闂瓟鎺ュ彛瓒呮椂", "涓ラ噸", "瀛橷X", "淇涓�", "2026-05-27"));
+ defects.add(createDefect("BUG-006", "璁惧淇濆吇鎻愰啋瀹氭椂浠诲姟鏈Е鍙�", "涓�鑸�", "鐜媂X", "寰呭鐞�", "2026-05-28"));
+ defects.add(createDefect("BUG-007", "Excel瀵煎嚭澶ф暟鎹噺鍐呭瓨婧㈠嚭", "涓�鑸�", "鐜媂X", "淇涓�", "2026-05-29"));
+ defects.add(createDefect("BUG-008", "璇煶褰曞叆鏂硅█璇嗗埆鐜囦綆", "杞诲井", "瀛橷X", "寰呭鐞�", "2026-05-30"));
+ defects.add(createDefect("BUG-009", "澶氱敤鎴峰悓鏃剁洏鐐瑰鑷存暟鎹笉涓�鑷�", "涓ラ噸", "鐜媂X", "寰呭鐞�", "2026-05-30"));
+ defects.add(createDefect("BUG-010", "绉诲姩绔〉闈㈤�傞厤寮傚父", "杞诲井", "闄圶X", "寰呭鐞�", "2026-05-30"));
+ data.put("defects", defects);
+
+ // 娴嬭瘯缁熻
+ data.put("totalCases", "80");
+ data.put("passedCases", "68");
+ data.put("failedCases", "3");
+ data.put("inProgressCases", "5");
+ data.put("blockedCases", "4");
+ data.put("passRate", "85.0%");
+ data.put("totalDefects", "10");
+ data.put("fixedDefects", "4");
+ data.put("openDefects", "4");
+ data.put("inProgressDefects", "2");
+ data.put("criticalDefects", "3");
+ data.put("majorDefects", "3");
+ data.put("minorDefects", "4");
+
+ // 娴嬭瘯缁撹
+ data.put("testConclusion", "绯荤粺鏁翠綋鍔熻兘瀹屾暣锛屾牳蹇冧笟鍔℃祦绋嬮�氳繃娴嬭瘯銆傚瓨鍦�3涓弗閲嶇己闄峰緟淇锛欰I鎺ュ彛瓒呮椂銆佺洏鐐瑰苟鍙戞暟鎹笉涓�鑷淬�丒xcel瀵煎嚭鍐呭瓨婧㈠嚭銆傚缓璁慨澶嶄弗閲嶇己闄峰悗瀹夋帓绗簩杞洖褰掓祴璇曪紝鍐嶈繘鍏ヤ笂绾挎祦绋嬨��");
+ data.put("releaseSuggestion", "鏈夋潯浠堕�氳繃锛屼慨澶嶄弗閲嶇己闄峰悗鍙笂绾�");
+
+ // 寰呭姙浜嬮」
+ List<Map<String, String>> actionItems = new ArrayList<>();
+ actionItems.add(createActionItem("1", "淇AI鏅鸿兘闂瓟鎺ュ彛瓒呮椂闂", "瀛橷X", "2026-06-02"));
+ actionItems.add(createActionItem("2", "淇鐩樼偣骞跺彂鏁版嵁涓�鑷存�ч棶棰�", "鐜媂X", "2026-06-03"));
+ actionItems.add(createActionItem("3", "淇Excel澶ф暟鎹噺瀵煎嚭鍐呭瓨婧㈠嚭", "鐜媂X", "2026-06-03"));
+ actionItems.add(createActionItem("4", "瀹屾垚璇煶褰曞叆鏂硅█璇嗗埆浼樺寲", "瀛橷X", "2026-06-05"));
+ actionItems.add(createActionItem("5", "瀹屾垚绗簩杞叏閲忓洖褰掓祴璇�", "鍒榅X", "2026-06-08"));
+ actionItems.add(createActionItem("6", "杈撳嚭鏈�缁堟祴璇曟姤鍛�", "鍒榅X", "2026-06-10"));
+ data.put("actionItems", actionItems);
+
+ // 鍔犺浇妯℃澘骞剁敓鎴�
+ Template template = cfg.getTemplate("娴嬭瘯鎶ュ憡.xml");
+ StringWriter out = new StringWriter();
+ template.process(data, out);
+
+ // 淇濆瓨涓篸ocx
+ String outputPath = "D:/鐗涢┈/鏂囨。/娴嬭瘯鎶ュ憡.docx";
+ File outputFile = new File(outputPath);
+ outputFile.getParentFile().mkdirs();
+ try (FileOutputStream fos = new FileOutputStream(outputFile);
+ OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
+ osw.write(out.toString());
+ }
+
+ System.out.println("娴嬭瘯鎶ュ憡鐢熸垚鎴愬姛: " + outputPath);
+ }
+
+ private static Map<String, String> createTestCase(String no, String module, String content,
+ String expected, String actual, String status, String tester) {
+ Map<String, String> map = new HashMap<>();
+ map.put("no", no);
+ map.put("module", module);
+ map.put("content", content);
+ map.put("expected", expected);
+ map.put("actual", actual);
+ map.put("status", status);
+ map.put("tester", tester);
+ return map;
+ }
+
+ private static Map<String, String> createProgress(String date, String content, String total,
+ String completed, String rate, String remark) {
+ Map<String, String> map = new HashMap<>();
+ map.put("date", date);
+ map.put("content", content);
+ map.put("total", total);
+ map.put("completed", completed);
+ map.put("rate", rate);
+ map.put("remark", remark);
+ return map;
+ }
+
+ private static Map<String, String> createDefect(String no, String desc, String severity,
+ String owner, String status, String deadline) {
+ Map<String, String> map = new HashMap<>();
+ map.put("no", no);
+ map.put("desc", desc);
+ map.put("severity", severity);
+ map.put("owner", owner);
+ map.put("status", status);
+ map.put("deadline", deadline);
+ return map;
+ }
+
+ private static Map<String, String> createActionItem(String no, String content, String owner, String deadline) {
+ Map<String, String> map = new HashMap<>();
+ map.put("no", no);
+ map.put("content", content);
+ map.put("owner", owner);
+ map.put("deadline", deadline);
+ return map;
+ }
+}
\ No newline at end of file
diff --git "a/src/main/resources/static/\346\212\200\346\234\257\350\275\257\344\273\266\345\274\200\345\217\221\346\226\207\346\241\243.xml" "b/src/main/resources/static/\346\212\200\346\234\257\350\275\257\344\273\266\345\274\200\345\217\221\346\226\207\346\241\243.xml"
new file mode 100644
index 0000000..448134f
--- /dev/null
+++ "b/src/main/resources/static/\346\212\200\346\234\257\350\275\257\344\273\266\345\274\200\345\217\221\346\226\207\346\241\243.xml"
@@ -0,0 +1,1398 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
+ xml:space="preserve">
+<o:DocumentProperties>
+ <o:Title>鎶�鏈蒋浠跺紑鍙戞枃妗�</o:Title>
+ <o:Author>绯荤粺鐢熸垚</o:Author>
+ <o:Created>2026-06-02</o:Created>
+</o:DocumentProperties>
+<w:fonts>
+ <w:defaultFonts w:ascii="瀹嬩綋" w:fareast="瀹嬩綋" w:h-ansi="瀹嬩綋"/>
+</w:fonts>
+<w:styles>
+ <w:style w:type="paragraph" w:styleId="title">
+ <w:name w:val="Title"/>
+ <w:pPr><w:jc w:val="center"/></w:pPr>
+ <w:rPr><w:b/><w:size w:val="36"/></w:rPr>
+ </w:style>
+ <w:style w:type="paragraph" w:styleId="heading1">
+ <w:name w:val="Heading 1"/>
+ <w:rPr><w:b/><w:size w:val="28"/></w:rPr>
+ </w:style>
+ <w:style w:type="paragraph" w:styleId="heading2">
+ <w:name w:val="Heading 2"/>
+ <w:rPr><w:b/><w:size w:val="24"/></w:rPr>
+ </w:style>
+ <w:style w:type="paragraph" w:styleId="heading3">
+ <w:name w:val="Heading 3"/>
+ <w:rPr><w:b/><w:size w:val="22"/></w:rPr>
+ </w:style>
+</w:styles>
+<w:body>
+
+<!-- 鏍囬 -->
+<w:p><w:pPr><w:pStyle w:val="title"/></w:pPr>
+ <w:r><w:t>浜у搧搴撳瓨绠$悊绯荤粺 鎶�鏈蒋浠跺紑鍙戞枃妗�</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:jc w:val="center"/></w:pPr>
+ <w:r><w:t>鐗堟湰锛歷3.8.9</w:t></w:r>
+ <w:r><w:t> </w:t></w:r>
+ <w:r><w:t>鏃ユ湡锛�2026-06-02</w:t></w:r>
+</w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 涓�銆丟itblit浠撳簱鍦板潃 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涓�銆丟itblit浠撳簱鍦板潃</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>1.1 浠撳簱淇℃伅</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="2000"/><w:gridCol w:w="6500"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>椤圭洰</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍦板潃</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>鍚庣浠撳簱</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>http://114.132.189.42:9002/r/product-inventory-management-after.git</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>鍓嶇浠撳簱</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>锛堝墠绔粨搴撳湴鍧�锛�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>Gitblit绠$悊骞冲彴</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>http://114.132.189.42:9002</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>1.2 鍒嗘敮绠$悊绛栫暐</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鈥� master锛氱敓浜х幆澧冨垎鏀紝浠呴�氳繃鍚堝苟鍙戝竷</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� dev_鏂扮枂椹搩钖痯ro锛氬紑鍙戜富鍒嗘敮锛屾棩甯稿紑鍙戝悎骞惰嚦姝�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� feature/*锛氬姛鑳藉紑鍙戝垎鏀紝瀹屾垚鍚庡悎骞惰嚦dev鍒嗘敮</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� hotfix/*锛氱揣鎬ヤ慨澶嶅垎鏀紝淇鍚庡悎骞惰嚦master鍜宒ev</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� release/*锛氬彂甯冨垎鏀紝鍙戝竷鍓嶆祴璇曚娇鐢�</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>1.3 鎻愪氦瑙勮寖</w:t></w:r>
+</w:p>
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1500"/><w:gridCol w:w="2500"/><w:gridCol w:w="4500"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>绫诲瀷</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璇存槑</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>绀轰緥</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>feat</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏂板姛鑳�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>feat(device): 娣诲姞璁惧淇濆吇楠屾敹鍔熻兘</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>fix</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>淇Bug</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>fix(purchase): 淇閲囪喘鍙拌处搴撳瓨鍏ュ簱璁板綍鏌ヨ閫昏緫</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>docs</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏂囨。鏇存柊</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>docs: 鏇存柊API鎺ュ彛鏂囨。</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>refactor</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>浠g爜閲嶆瀯</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>refactor(home): 閲嶆瀯棣栭〉鎺у埗鍣ㄦ帴鍙�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>test</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>娴嬭瘯鐩稿叧</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>test: 娣诲姞搴撳瓨妯″潡鍗曞厓娴嬭瘯</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>chore</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏋勫缓/宸ュ叿鐩稿叧</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>chore: 鍗囩骇SpringBoot鐗堟湰</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 浜屻�丟it鐢ㄦ埛鏉冮檺鍒嗛厤 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>浜屻�丟it鐢ㄦ埛鏉冮檺鍒嗛厤</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>2.1 鐢ㄦ埛鏉冮檺琛�</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1500"/><w:gridCol w:w="2000"/><w:gridCol w:w="2500"/><w:gridCol w:w="2500"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鐢ㄦ埛鍚�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>濮撳悕</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>瑙掕壊</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏉冮檺</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>yangyunshan</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>椤圭洰绠$悊鍛�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>RW+ (鍏ㄩ儴鍒嗘敮)</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>developer1</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>寮�鍙戜汉鍛�1</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>寮�鍙戜汉鍛�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>RW (dev/feature鍒嗘敮)</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>developer2</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>寮�鍙戜汉鍛�2</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>寮�鍙戜汉鍛�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>RW (dev/feature鍒嗘敮)</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>tester</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>娴嬭瘯浜哄憳</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>娴嬭瘯浜哄憳</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>R (鍙鏉冮檺)</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>2.2 鏉冮檺璇存槑</w:t></w:r>
+</w:p>
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1200"/><w:gridCol w:w="7500"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏉冮檺</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璇存槑</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>RW+</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>璇诲啓鎺ㄩ�佹潈闄愶紝鍙垱寤�/鍒犻櫎鍒嗘敮锛屽彲寮哄埗鎺ㄩ��</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>RW</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>璇诲啓鏉冮檺锛屽彲鎺ㄩ�佷唬鐮佸埌鐜版湁鍒嗘敮锛屼笉鍙垹闄ゅ垎鏀�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>R</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鍙鏉冮檺锛屼粎鍙厠闅嗗拰鎷夊彇浠g爜</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 涓夈�佹瀯寤烘柟寮� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涓夈�佹瀯寤烘柟寮�</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>3.1 寮�鍙戠幆澧冮厤缃�</w:t></w:r>
+</w:p>
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="2500"/><w:gridCol w:w="6200"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鐜椤�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鐗堟湰瑕佹眰</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>JDK鐗堟湰</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>JDK 25</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>Maven鐗堟湰</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>3.6.3+</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>Node.js鐗堟湰</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>18.x+</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>IDE</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>IntelliJ IDEA 2024+</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>鏁版嵁搴�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>MySQL 8.0+</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>缂撳瓨</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>Redis 6.0+</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>3.2 鎶�鏈爤</w:t></w:r>
+</w:p>
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1500"/><w:gridCol w:w="3000"/><w:gridCol w:w="4200"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>灞傜骇</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鎶�鏈�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鐗堟湰</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>鍚庣妗嗘灦</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>Spring Boot</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>3.5.13</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>瀹夊叏妗嗘灦</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>Spring Security + JWT</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>-</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>ORM妗嗘灦</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>MyBatis + PageHelper</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>2.1.1</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>鏁版嵁搴撹繛鎺ユ睜</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>Druid</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>1.2.23</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>JSON澶勭悊</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>Fastjson</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>2.0.53</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>API鏂囨。</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>Knife4j (Swagger)</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>4.5.0</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>宸ュ叿搴�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>Hutool</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>5.8.43</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>瀵硅薄瀛樺偍</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>MinIO</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>8.4.3</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>鍓嶇妗嗘灦</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>Vue + Element UI</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>-</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>3.3 鍚庣鏋勫缓姝ラ</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>1. 鍏嬮殕浠g爜浠撳簱锛�</w:t></w:r></w:p>
+<w:p><w:r><w:t> git clone http://114.132.189.42:9002/r/product-inventory-management-after.git</w:t></w:r></w:p>
+<w:p><w:r><w:t/></w:r></w:p>
+<w:p><w:r><w:t>2. 瀵煎叆IDEA椤圭洰锛岀瓑寰匨aven渚濊禆涓嬭浇</w:t></w:r></w:p>
+<w:p><w:r><w:t/></w:r></w:p>
+<w:p><w:r><w:t>3. 閰嶇疆application-dev.yml鏁版嵁搴撹繛鎺ヤ俊鎭細</w:t></w:r></w:p>
+<w:p><w:r><w:t> spring.datasource.url=jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8</w:t></w:r></w:p>
+<w:p><w:r><w:t> spring.datasource.username=root</w:t></w:r></w:p>
+<w:p><w:r><w:t> spring.datasource.password=password</w:t></w:r></w:p>
+<w:p><w:r><w:t/></w:r></w:p>
+<w:p><w:r><w:t>4. 閰嶇疆Redis杩炴帴淇℃伅</w:t></w:r></w:p>
+<w:p><w:r><w:t/></w:r></w:p>
+<w:p><w:r><w:t>5. 鎵цMaven缂栬瘧锛�</w:t></w:r></w:p>
+<w:p><w:r><w:t> mvn clean compile</w:t></w:r></w:p>
+<w:p><w:r><w:t/></w:r></w:p>
+<w:p><w:r><w:t>6. 杩愯涓荤被锛歝om.ruoyi.RuoYiApplication</w:t></w:r></w:p>
+<w:p><w:r><w:t/></w:r></w:p>
+<w:p><w:r><w:t>7. 璁块棶鎺ュ彛鏂囨。锛歨ttp://localhost:8080/doc.html</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>3.4 鍓嶇鏋勫缓姝ラ</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>1. 杩涘叆鍓嶇鐩綍锛歝d ruoyi-ui</w:t></w:r></w:p>
+<w:p><w:r><w:t/></w:r></w:p>
+<w:p><w:r><w:t>2. 瀹夎渚濊禆锛歯pm install 鎴� pnpm install</w:t></w:r></w:p>
+<w:p><w:r><w:t/></w:r></w:p>
+<w:p><w:r><w:t>3. 寮�鍙戠幆澧冭繍琛岋細npm run dev</w:t></w:r></w:p>
+<w:p><w:r><w:t/></w:r></w:p>
+<w:p><w:r><w:t>4. 鐢熶骇鐜鏋勫缓锛歯pm run build</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>3.5 鎵撳寘閮ㄧ讲</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>1. 鍚庣鎵撳寘锛歮vn clean package -DskipTests</w:t></w:r></w:p>
+<w:p><w:r><w:t/></w:r></w:p>
+<w:p><w:r><w:t>2. 鐢熸垚鐨凧AR鍖咃細target/ruoyi.jar</w:t></w:r></w:p>
+<w:p><w:r><w:t/></w:r></w:p>
+<w:p><w:r><w:t>3. 鍚姩鍛戒护锛歫ava -jar ruoyi.jar --spring.profiles.active=prod</w:t></w:r></w:p>
+<w:p><w:r><w:t/></w:r></w:p>
+<w:p><w:r><w:t>4. 澶氱幆澧冮厤缃鏄庯細</w:t></w:r></w:p>
+<w:p><w:r><w:t> - dev: 寮�鍙戠幆澧�</w:t></w:r></w:p>
+<w:p><w:r><w:t> - prod: 鐢熶骇鐜</w:t></w:r></w:p>
+<w:p><w:r><w:t> - hbxm, hbkj, hhkj绛�: 鍚勫鎴峰畾鍒剁幆澧�</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 鍥涖�佹墜鍔ㄦ祴璇� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>鍥涖�佹墜鍔ㄦ祴璇�</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>4.1 娴嬭瘯鐜淇℃伅</w:t></w:r>
+</w:p>
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="2500"/><w:gridCol w:w="6200"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>椤圭洰</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>淇℃伅</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>娴嬭瘯鐜鍦板潃</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>http://test.xxx.com</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>娴嬭瘯璐﹀彿</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>test / 123456</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>绠$悊鍛樿处鍙�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>admin / admin123</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>API鏂囨。鍦板潃</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>http://localhost:8080/doc.html</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>4.2 鍔熻兘妯″潡娴嬭瘯鐢ㄤ緥</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="600"/><w:gridCol w:w="1200"/><w:gridCol w:w="3000"/><w:gridCol w:w="1500"/><w:gridCol w:w="1500"/><w:gridCol w:w="900"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>缂栧彿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>妯″潡</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>娴嬭瘯鍐呭</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>棰勬湡缁撴灉</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>瀹為檯缁撴灉</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鐘舵��</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>1</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閲囪喘绠$悊</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閲囪喘鍙拌处搴撳瓨鍏ュ簱璁板綍鏌ヨ</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>姝g‘鏄剧ず鍏ュ簱璁板綍</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>绗﹀悎棰勬湡</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>2</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>璁惧绠$悊</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>璁惧淇濆吇楠屾敹鍔熻兘</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>楠屾敹娴佺▼姝e父</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>绗﹀悎棰勬湡</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>3</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>搴撳瓨绠$悊</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>搴撳瓨鐗╄仈璁惧缁戝畾</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>缁戝畾鎴愬姛骞跺疄鏃舵暟閲�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>绗﹀悎棰勬湡</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>4</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鍙戣揣绠$悊</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鍑哄簱鎵瑰彿濉啓涓庡叆搴撴壒鍙烽�夋嫨</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鎵瑰彿鍏宠仈姝g‘</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>绗﹀悎棰勬湡</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>5</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>璐ㄩ噺绠$悊</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鎵归噺蹇�熸楠屽姛鑳�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鎵归噺妫�楠屾祦绋嬫甯�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>绗﹀悎棰勬湡</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>6</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>棣栭〉</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>涓婃湀閿�鍞噰璐噾棰濈粺璁�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>缁熻鏁版嵁鍑嗙‘</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>绗﹀悎棰勬湡</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>7</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>璐㈠姟绠$悊</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>璐㈠姟鍔╂墜AI鍔熻兘</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>AI闂瓟姝e父</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>绗﹀悎棰勬湡</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>8</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鍛樺伐绠$悊</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鍛樺伐鍏ヨ亴鏈嶅姟鎺ュ彛</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鍏ヨ亴娴佺▼姝e父</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>绗﹀悎棰勬湡</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>9</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>瀹℃壒绠$悊</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>瀹℃壒瀹炰緥鎸夊綋鍓嶇敤鎴疯繃婊�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>杩囨护缁撴灉姝g‘</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>绗﹀悎棰勬湡</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>10</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>璁惧宸℃</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>璁惧宸℃寮傚父鑱斿姩缁翠慨鍗�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>缁翠慨鍗曡嚜鍔ㄧ敓鎴�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>绗﹀悎棰勬湡</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>4.3 娴嬭瘯娉ㄦ剰浜嬮」</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鈥� 娴嬭瘯鍓嶇‘淇濇暟鎹簱宸插垵濮嬪寲鏈�鏂拌剼鏈�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 娴嬭瘯瀹屾垚鍚庡強鏃跺弽棣堥棶棰樺埌寮�鍙戜汉鍛�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 閲嶇偣鍏虫敞杈圭晫鏉′欢鍜屽紓甯稿満鏅�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鎬ц兘娴嬭瘯闇�鍦ㄧ嫭绔嬬幆澧冭繘琛�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� AI鍔熻兘娴嬭瘯闇�纭繚AI鏈嶅姟姝e父杩炴帴</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 澶氱幆澧冮厤缃祴璇曢渶瑕嗙洊鍚勫鎴峰畾鍒剁幆澧�</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 浜斻�佷唬鐮丷eview璁板綍 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>浜斻�佷唬鐮丷eview璁板綍</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>5.1 Review瑙勮寖</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鈥� 姣忎釜鍔熻兘寮�鍙戝畬鎴愬悗闇�鎻愪氦浠g爜瀹℃煡</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 瀹℃煡浜哄憳鑷冲皯1浜猴紝閲嶈鍔熻兘闇�2浜哄鏌�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 瀹℃煡閫氳繃鍚庢柟鍙悎骞惰嚦dev鍒嗘敮</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 瀹℃煡閲嶇偣锛氫唬鐮佽鑼冦�佸畨鍏ㄦ�с�佹�ц兘銆佸彲缁存姢鎬�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 浣跨敤Git鎻愪氦淇℃伅鍏宠仈瀹℃煡璁板綍</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>5.2 Review璁板綍琛�</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1000"/><w:gridCol w:w="1000"/><w:gridCol w:w="1200"/><w:gridCol w:w="2200"/><w:gridCol w:w="1200"/><w:gridCol w:w="1800"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏃ユ湡</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鎻愪氦浜�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>瀹℃煡浜�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>瀹℃煡鍐呭</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>瀹℃煡缁撴灉</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>澶囨敞</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>2026-06-01</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>瀹℃煡浜篈</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鍛樺伐鍏ヨ亴鏈嶅姟鎺ュ彛淇敼</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>澧炲姞鐢ㄦ埛娣诲姞鏍囪瘑鍙傛暟</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>2026-05-30</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>瀹℃煡浜篈</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>璁惧淇濆吇楠屾敹鍔熻兘</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>娣诲姞骞村害瀹氭椂浠诲姟鏀寔</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>2026-05-28</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>瀹℃煡浜築</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>搴撳瓨鐗╄仈璁惧缁戝畾鍔熻兘</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>瀹炴椂鏁伴噰鍔熻兘瀹屽杽</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>2026-05-25</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>瀹℃煡浜篈</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>棣栭〉鐢熶骇鐪嬫澘鎬ц兘浼樺寲</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>浼樺寲鏌ヨ鎬ц兘</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>2026-05-22</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>瀹℃煡浜築</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>璐㈠姟AI妯″潡鍗囩骇</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>AI鎻愰棶浼樺寲</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>2026-05-20</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>瀹℃煡浜篈</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閲囪喘鏅鸿兘浣撳鏂囦欢鍒嗘瀽</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>闄勪欢瀛樺偍涓庡巻鍙插洖鏄�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>2026-05-18</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>瀹℃煡浜篈</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閿�鍞姪鎵嬪墠绔仈璋�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>AI閿�鍞姪鎵嬪姛鑳�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>2026-05-15</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>瀹℃煡浜築</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>璁惧宸℃寮傚父鑱斿姩缁翠慨鍗�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鑷姩鐢熸垚缁翠慨鍗�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>5.3 甯歌闂娓呭崟</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="600"/><w:gridCol w:w="2000"/><w:gridCol w:w="5900"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>搴忓彿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>闂绫诲瀷</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>闂鎻忚堪</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>1</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>浠g爜瑙勮寖</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鍛藉悕涓嶈鑼冿紝闇�閬靛惊椹煎嘲鍛藉悕娉曪紝甯搁噺浣跨敤澶у啓涓嬪垝绾�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>2</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>瀹夊叏鎬�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>SQL娉ㄥ叆椋庨櫓锛岄渶浣跨敤鍙傛暟鍖栨煡璇紝閬垮厤瀛楃涓叉嫾鎺�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>3</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鎬ц兘</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>N+1鏌ヨ闂锛岄渶浣跨敤鍏宠仈鏌ヨ鎴栨壒閲忔煡璇紭鍖�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>4</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>寮傚父澶勭悊</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>寮傚父鎹曡幏鍚庢湭姝g‘澶勭悊鎴栬褰曟棩蹇楋紝闇�瀹屽杽寮傚父澶勭悊閫昏緫</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>5</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>浜嬪姟绠$悊</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>澶氳〃鎿嶄綔鏈坊鍔犱簨鍔℃敞瑙o紝鍙兘瀵艰嚧鏁版嵁涓嶄竴鑷�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 鍏�佽繘搴﹁窡韪褰� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>鍏�佽繘搴﹁窡韪褰�</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>6.1 椤圭洰鏁翠綋杩涘害</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="2500"/><w:gridCol w:w="1500"/><w:gridCol w:w="1500"/><w:gridCol w:w="1500"/><w:gridCol w:w="1500"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>妯″潡鍚嶇О</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璁″垝鍔熻兘鏁�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>宸插畬鎴�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>杩涜涓�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>瀹屾垚鐜�</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>閲囪喘绠$悊</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>15</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>14</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>1</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>93%</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>搴撳瓨绠$悊</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>12</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>11</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>1</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>92%</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>閿�鍞鐞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>18</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>17</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>1</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>94%</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>璁惧绠$悊</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>10</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>10</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>0</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>100%</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>璐ㄩ噺绠$悊</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>8</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>7</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>1</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>88%</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>璐㈠姟绠$悊</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>20</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>19</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>1</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>95%</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>AI鏅鸿兘鍔╂墜</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>6</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>6</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>0</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>100%</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>瀹℃壒娴佺▼</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>8</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>8</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>0</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>100%</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>棣栭〉鐪嬫澘</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>5</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>5</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>0</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>100%</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍚堣</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>102</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>97</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>5</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>95%</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>6.2 杩唬璁″垝</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1500"/><w:gridCol w:w="3000"/><w:gridCol w:w="2000"/><w:gridCol w:w="1200"/><w:gridCol w:w="1000"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>杩唬鐗堟湰</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍔熻兘鑼冨洿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璁″垝鏃堕棿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璐熻矗浜�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鐘舵��</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>v1.0</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鍩虹妗嗘灦鎼缓銆佺敤鎴锋潈闄愮鐞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>2025-01-01 ~ 2025-03-31</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>宸插畬鎴�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>v2.0</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閲囪喘銆佸簱瀛樸�侀攢鍞牳蹇冩ā鍧�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>2025-04-01 ~ 2025-08-31</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>宸插畬鎴�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>v3.0</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>璁惧绠$悊銆佽川閲忕鐞嗐�佽储鍔$鐞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>2025-09-01 ~ 2025-12-31</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>宸插畬鎴�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>v3.8</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>AI鏅鸿兘鍔╂墜銆佸鎵规祦绋嬨�侀椤电湅鏉�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>2026-01-01 ~ 2026-05-31</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>宸插畬鎴�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>v3.9</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鍔熻兘瀹屽杽銆佹�ц兘浼樺寲銆丅ug淇</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>2026-06-01 ~ 2026-06-30</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>杩涜涓�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>6.3 姣忔棩杩涘害璁板綍</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1200"/><w:gridCol w:w="1200"/><w:gridCol w:w="3500"/><w:gridCol w:w="1300"/><w:gridCol w:gridCol w:w="1300"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏃ユ湡</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>浜哄憳</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>宸ヤ綔鍐呭</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>杩涘害</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>澶囨敞</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>2026-06-02</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>淇敼鍛樺伐鍏ヨ亴鏈嶅姟鎺ュ彛澧炲姞鐢ㄦ埛娣诲姞鏍囪瘑鍙傛暟</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>100%</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>宸叉彁浜�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>2026-06-01</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>娣诲姞璁惧淇濆吇楠屾敹鍔熻兘鍜屽勾搴﹀畾鏃朵换鍔℃敮鎸�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>100%</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>宸叉彁浜�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>2026-05-30</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>淇閲囪喘鍙拌处搴撳瓨鍏ュ簱璁板綍鏌ヨ閫昏緫</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>100%</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>宸叉彁浜�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>2026-05-28</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>娣诲姞搴撳瓨鐗╄仈璁惧缁戝畾鍜屽疄鏃舵暟閲囧姛鑳�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>100%</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>宸叉彁浜�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>2026-05-25</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鍙戣揣鍑哄簱鎵瑰彿涓庡叆搴撴壒鍙峰叧鑱斿姛鑳�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>100%</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>宸叉彁浜�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>2026-05-22</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏂板涓婃湀閿�鍞噰璐噾棰濈粺璁″姛鑳�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>100%</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>宸叉彁浜�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>2026-05-20</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>浼樺寲鎵归噺蹇�熸楠屽姛鑳�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>100%</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>宸叉彁浜�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>2026-05-18</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閿�鍞姪鎵婣I鍔熻兘鍓嶇鑱旇皟</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>100%</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>宸叉彁浜�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>6.4 寰呭畬鎴愪簨椤�</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="600"/><w:gridCol w:w="2500"/><w:gridCol w:w="2000"/><w:gridCol w:w="1200"/><w:gridCol w:w="1200"/><w:gridCol w:w="1200"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>搴忓彿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>浜嬮」鎻忚堪</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璁″垝瀹屾垚鏃堕棿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璐熻矗浜�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>浼樺厛绾�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鐘舵��</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>1</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閲囪喘绠$悊鍓╀綑鍔熻兘瀹屽杽</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>2026-06-10</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>楂�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>杩涜涓�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>2</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>搴撳瓨绠$悊鍓╀綑鍔熻兘瀹屽杽</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>2026-06-12</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>楂�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>寰呭紑濮�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>3</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閿�鍞鐞嗗墿浣欏姛鑳藉畬鍠�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>2026-06-15</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>楂�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>寰呭紑濮�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>4</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>璐ㄩ噺绠$悊鍓╀綑鍔熻兘瀹屽杽</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>2026-06-18</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>涓�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>寰呭紑濮�</w:t></w:r></w>p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>5</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>绯荤粺鎬ц兘浼樺寲</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>2026-06-25</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>涓�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>寰呭紑濮�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>6</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>绯荤粺闆嗘垚娴嬭瘯</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>2026-06-28</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>楂�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>寰呭紑濮�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>6.5 闂璺熻釜</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="600"/><w:gridCol w:w="2500"/><w:gridCol w:w="1200"/><w:gridCol w:w="1200"/><w:gridCol w:w="1200"/><w:gridCol w:w="1200"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>缂栧彿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>闂鎻忚堪</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍙戠幇浜�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璐d换浜�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>浼樺厛绾�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鐘舵��</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>1</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閲囪喘鍙拌处搴撳瓨鍏ュ簱璁板綍鏌ヨ寮傚父</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>娴嬭瘯浜哄憳</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>楂�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>宸茶В鍐�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>2</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>棣栭〉鐪嬫澘鎬ц兘闂</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>娴嬭瘯浜哄憳</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>涓�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>宸茶В鍐�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>3</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鎵归噺蹇�熸楠屾暟鎹牎楠岄棶棰�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>娴嬭瘯浜哄憳</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>涓�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>宸茶В鍐�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 涓冦�侀檮褰� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涓冦�侀檮褰�</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>7.1 鐩稿叧鏂囨。</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鈥� 闄勫綍A锛氭帴鍙f枃妗� - Swagger鍦板潃锛歨ttp://localhost:8080/doc.html</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 闄勫綍B锛氭暟鎹簱璁捐鏂囨。</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 闄勫綍C锛氶儴缃叉墜鍐�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 闄勫綍D锛氳繍缁存墜鍐�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 闄勫綍E锛氬墠绔仈璋冩枃妗o紙瑙乨oc鐩綍锛�</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>7.2 鑱旂郴鏂瑰紡</w:t></w:r>
+</w:p>
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="2000"/><w:gridCol w:w="3000"/><w:gridCol w:w="3500"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>瑙掕壊</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>濮撳悕</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鑱旂郴鏂瑰紡</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>椤圭洰缁忕悊</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>yangyunshan@xxx.com</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>寮�鍙戣礋璐d汉</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>yangyunshan@xxx.com</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>娴嬭瘯璐熻矗浜�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>娴嬭瘯浜哄憳</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>tester@xxx.com</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>7.3 鐗堟湰鍘嗗彶</w:t></w:r>
+</w:p>
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1200"/><w:gridCol w:w="1500"/><w:gridCol w:w="3000"/><w:gridCol w:w="2800"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鐗堟湰</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏃ユ湡</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>淇敼浜�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>淇敼璇存槑</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>v1.0</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>2026-06-02</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏉ㄤ簯灞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鍒濆鐗堟湰鍒涘缓</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+</w:body>
+</w:wordDocument>
\ No newline at end of file
diff --git "a/src/main/resources/static/\346\234\215\345\212\241\345\231\250\350\277\220\347\273\264\350\256\260\345\275\225.xml" "b/src/main/resources/static/\346\234\215\345\212\241\345\231\250\350\277\220\347\273\264\350\256\260\345\275\225.xml"
new file mode 100644
index 0000000..543d0b8
--- /dev/null
+++ "b/src/main/resources/static/\346\234\215\345\212\241\345\231\250\350\277\220\347\273\264\350\256\260\345\275\225.xml"
@@ -0,0 +1,702 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
+ xml:space="preserve">
+<o:DocumentProperties>
+ <o:Title>鏈嶅姟鍣ㄨ繍缁磋褰�</o:Title>
+ <o:Author>绯荤粺鐢熸垚</o:Author>
+ <o:Created>${docDate}</o:Created>
+</o:DocumentProperties>
+<w:fonts>
+ <w:defaultFonts w:ascii="瀹嬩綋" w:fareast="瀹嬩綋" w:h-ansi="瀹嬩綋"/>
+</w:fonts>
+<w:styles>
+ <w:style w:type="paragraph" w:styleId="title">
+ <w:name w:val="Title"/>
+ <w:pPr><w:jc w:val="center"/></w:pPr>
+ <w:rPr><w:b/><w:size w:val="36"/></w:rPr>
+ </w:style>
+ <w:style w:type="paragraph" w:styleId="heading1">
+ <w:name w:val="Heading 1"/>
+ <w:rPr><w:b/><w:size w:val="28"/></w:rPr>
+ </w:style>
+ <w:style w:type="paragraph" w:styleId="heading2">
+ <w:name w:val="Heading 2"/>
+ <w:rPr><w:b/><w:size w:val="24"/></w:rPr>
+ </w:style>
+ <w:style w:type="paragraph" w:styleId="heading3">
+ <w:name w:val="Heading 3"/>
+ <w:rPr><w:b/><w:size w:val="22"/></w:rPr>
+ </w:style>
+</w:styles>
+<w:body>
+
+<!-- 鏍囬 -->
+<w:p><w:pPr><w:pStyle w:val="title"/></w:pPr>
+ <w:r><w:t>${projectName} 鏈嶅姟鍣ㄨ繍缁磋褰�</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:jc w:val="center"/></w:pPr>
+ <w:r><w:t>鐗堟湰锛�${projectVersion}</w:t></w:r>
+ <w:r><w:t> </w:t></w:r>
+ <w:r><w:t>鏃ユ湡锛�${docDate}</w:t></w:r>
+</w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 涓�銆佹湇鍔″櫒娓呭崟 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涓�銆佹湇鍔″櫒娓呭崟</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1200"/><w:gridCol w:w="1200"/><w:gridCol w:w="1300"/><w:gridCol w:w="700"/><w:gridCol w:w="700"/><w:gridCol w:w="1100"/><w:gridCol w:w="1100"/><w:gridCol w:w="600"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>缂栧彿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>绫诲瀷</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍐呯綉IP</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>CPU</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍐呭瓨</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>纭洏</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鎿嶄綔绯荤粺</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鐘舵��</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list servers as s>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${s.id}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${s.type}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${s.ip}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${s.cpu}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${s.memory}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${s.disk}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${s.os}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${s.status}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 浜屻�佽繍缁磋繘搴﹁窡韪� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>浜屻�佽繍缁磋繘搴﹁窡韪�</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1100"/><w:gridCol w:w="1800"/><w:gridCol w:w="2800"/><w:gridCol w:w="700"/><w:gridCol w:w="2100"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏃ユ湡</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>浠诲姟</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>宸ヤ綔鍐呭</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>杩涘害</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>澶囨敞</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list progress as p>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${p.date}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${p.task}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${p.content}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${p.rate}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${p.remark}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 涓夈�佹湇鍔″櫒宸℃璁板綍 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涓夈�佹湇鍔″櫒宸℃璁板綍</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1100"/><w:gridCol w:w="1200"/><w:gridCol w:w="2500"/><w:gridCol w:w="900"/><w:gridCol w:w="2800"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏃ユ湡</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏈嶅姟鍣�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>宸℃鎸囨爣</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>缁撴灉</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>澶囨敞</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list inspections as ins>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${ins.date}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${ins.server}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${ins.metrics}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${ins.result}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${ins.remark}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 鍥涖�佹暟鎹簱澶囦唤璁板綍 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>鍥涖�佹暟鎹簱澶囦唤璁板綍</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1100"/><w:gridCol w:w="900"/><w:gridCol w:w="1500"/><w:gridCol w:w="900"/><w:gridCol w:w="900"/><w:gridCol w:w="1100"/><w:gridCol w:w="1100"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏃ユ湡</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>绫诲瀷</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏁版嵁搴�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>澶у皬</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鐘舵��</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>寮�濮嬫椂闂�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>缁撴潫鏃堕棿</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list backups as b>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${b.date}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${b.type}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${b.database}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${b.size}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${b.status}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${b.startTime}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${b.endTime}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 浜斻�佹晠闅�/浜嬩欢璁板綍 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>浜斻�佹晠闅�/浜嬩欢璁板綍</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="650"/><w:gridCol w:w="1000"/><w:gridCol w:w="1000"/><w:gridCol w:w="1600"/><w:gridCol w:w="1300"/><w:gridCol w:w="1600"/><w:gridCol w:w="1000"/><w:gridCol w:w="650"/><w:gridCol w:w="700"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>缂栧彿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍙戠敓鏃堕棿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏈嶅姟鍣�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏁呴殰鎻忚堪</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍘熷洜</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>澶勭悊鏂规</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>瑙e喅鏃堕棿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鐘舵��</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>澶勭悊浜�</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list incidents as inc>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${inc.no}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${inc.time}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${inc.server}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${inc.desc}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${inc.cause}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${inc.solution}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${inc.resolveTime}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${inc.status}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${inc.handler}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 鍏�佽ˉ涓�/鏇存柊璁板綍 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>鍏�佽ˉ涓�/鏇存柊璁板綍</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1100"/><w:gridCol w:w="1500"/><w:gridCol w:w="2600"/><w:gridCol w:w="900"/><w:gridCol w:w="900"/><w:gridCol w:w="1500"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏃ユ湡</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏈嶅姟鍣�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏇存柊鍐呭</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>绫诲瀷</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>缁撴灉</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>澶囨敞</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list patches as pt>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${pt.date}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${pt.server}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${pt.content}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${pt.type}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${pt.result}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${pt.remark}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 涓冦�佸彉鏇磋褰� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涓冦�佸彉鏇磋褰�</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="800"/><w:gridCol w:w="1000"/><w:gridCol w:w="1800"/><w:gridCol w:w="1500"/><w:gridCol w:w="1800"/><w:gridCol w:w="800"/><w:gridCol w:w="800"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>缂栧彿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏃ユ湡</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍙樻洿鍐呭</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>娑夊強鏈嶅姟鍣�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍙樻洿璇︽儏</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鎵ц浜�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鐘舵��</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list changes as ch>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${ch.no}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${ch.date}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${ch.content}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${ch.server}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${ch.detail}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${ch.executor}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${ch.status}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 鍏�佽繍缁寸粺璁� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>鍏�佽繍缁寸粺璁�</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>8.1 鏈嶅姟鍣ㄧ姸鎬�</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="2250"/><w:gridCol w:w="2250"/><w:gridCol w:w="2250"/><w:gridCol w:w="2250"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>缁熻椤�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏁伴噺</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>缁熻椤�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏁伴噺</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>鏈嶅姟鍣ㄦ�绘暟</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${serverCount}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>姝e父杩愯</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${runningCount}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>鍛婅/寮傚父</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${alertCount}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鍙敤鐜�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${uptimeRate}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>宸℃鎬绘鏁�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${totalInspections}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>澶囦唤鎬绘鏁�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${totalBackups}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>澶囦唤鎴愬姛鐜�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${backupSuccessRate}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏁呴殰鎬绘暟</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${totalIncidents}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>宸茶В鍐虫晠闅�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${solvedIncidents}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>琛ヤ竵鎬绘暟</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${totalPatches}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>琛ヤ竵宸插畬鎴�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${completedPatches}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t/></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t/></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 涔濄�佽繍缁寸粨璁� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涔濄�佽繍缁寸粨璁�</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>9.1 缁煎悎璇勪环</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>${opsConclusion}</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>9.2 椋庨櫓鎻愮ず</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>${riskWarning}</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 鍗併�佸緟鍔炰簨椤� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>鍗併�佸緟鍔炰簨椤�</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="500"/><w:gridCol w:w="4500"/><w:gridCol w:w="2000"/><w:gridCol w:w="1500"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>搴忓彿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>寰呭姙鍐呭</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璐熻矗浜�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>瀹屾垚鏃堕棿</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list actionItems as a>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${a.no}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${a.content}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${a.owner}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${a.deadline}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 杩愮淮璇勫浼氳绾 -->
+<w:p><w:pPr><w:pStyle w:val="title"/></w:pPr>
+ <w:r><w:t>杩愮淮璇勫浼氳绾</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>浼氳淇℃伅</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>浼氳涓婚锛氫骇鍝佸簱瀛樼鐞嗙郴缁熻繍缁磋瘎瀹′細璁�</w:t></w:r></w:p>
+<w:p><w:r><w:t>浼氳鏃堕棿锛�2026骞�6鏈�2鏃� 10:00-11:30</w:t></w:r></w:p>
+<w:p><w:r><w:t>浼氳鍦扮偣锛氬叕鍙镐細璁</w:t></w:r></w:p>
+<w:p><w:r><w:t>涓绘寔浜猴細寮燲X</w:t></w:r></w:p>
+<w:p><w:r><w:t>璁板綍浜猴細鍛╔X</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>鍙備細浜哄憳</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>寮燲X锛堥」鐩粡鐞嗭級銆佺帇XX锛堝悗绔紑鍙戯級銆佸懆XX锛堣繍缁村伐绋嬪笀锛夈�佸垬XX锛堟祴璇曞伐绋嬪笀锛�</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>璇勫鍐呭</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>1. 鏈嶅姟鍣ㄨ祫婧愰厤缃笌浣跨敤鎯呭喌</w:t></w:r></w:p>
+<w:p><w:r><w:t>2. 澶囦唤绛栫暐涓庢仮澶嶆紨缁冭瘎浼�</w:t></w:r></w:p>
+<w:p><w:r><w:t>3. 瀹夊叏琛ヤ竵鎵ц杩涘害</w:t></w:r></w:p>
+<w:p><w:r><w:t>4. 鏁呴殰澶勭悊鏁堢巼鍒嗘瀽</w:t></w:r></w:p>
+<w:p><w:r><w:t>5. 鐩戞帶鍛婅浣撶郴瀹屽杽搴�</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>璇勫缁撹</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="2500"/><w:gridCol w:w="1500"/><w:gridCol w:w="4500"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璇勫椤�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璇勫缁撴灉</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璇勫鎰忚</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>鏈嶅姟鍣ㄩ厤缃�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閰嶇疆鍚堢悊锛孲VR-FILE-01闇�鎵╁</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>澶囦唤绛栫暐</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鍏ㄩ噺+澧為噺绛栫暐鍚堢悊锛岄渶澧炲姞寮傚湴澶囦唤</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>瀹夊叏琛ヤ竵</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>杩涜涓�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鍐呮牳琛ヤ竵3鍙板緟瀹屾垚锛岄璁�6鏈�2鏃ュ畬鎴�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>鏁呴殰澶勭悊</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏁呴殰鍝嶅簲鍙婃椂锛屽钩鍧囧鐞嗘椂闂�40鍒嗛挓</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>鐩戞帶鍛婅</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>杩涜涓�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>Prometheus宸查儴缃诧紝鍛婅瑙勫垯闇�瀹屽杽</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>閬楃暀闂</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>1. SVR-FILE-01纾佺洏鎵╁鏂规鍜岄绠楀緟瀹℃壒</w:t></w:r></w:p>
+<w:p><w:r><w:t>2. 寮傚湴澶囦唤鏈嶅姟鍣ㄨ祫婧愬緟鐢宠</w:t></w:r></w:p>
+<w:p><w:r><w:t>3. 鏄惁闇�瑕佸紩鍏ヨ嚜鍔ㄥ寲杩愮淮骞冲彴锛圓nsible/Jenkins锛夛紵</w:t></w:r></w:p>
+<w:p><w:r><w:t>4. AI鎺ㄧ悊鏈嶅姟鍣℅PU鏄惁闇�瑕佸啑浣欓厤缃紵</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涓嬫浼氳</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鏃堕棿锛�2026骞�6鏈�9鏃�</w:t></w:r></w:p>
+<w:p><w:r><w:t>涓婚锛氳繍缁村伐浣滄�荤粨涓庝笅闃舵瑙勫垝</w:t></w:r></w:p>
+
+</w:body>
+</w:wordDocument>
\ No newline at end of file
diff --git "a/src/main/resources/static/\346\265\213\350\257\225\346\212\245\345\221\212.xml" "b/src/main/resources/static/\346\265\213\350\257\225\346\212\245\345\221\212.xml"
new file mode 100644
index 0000000..011878c
--- /dev/null
+++ "b/src/main/resources/static/\346\265\213\350\257\225\346\212\245\345\221\212.xml"
@@ -0,0 +1,553 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
+ xml:space="preserve">
+<o:DocumentProperties>
+ <o:Title>娴嬭瘯鎶ュ憡</o:Title>
+ <o:Author>绯荤粺鐢熸垚</o:Author>
+ <o:Created>${docDate}</o:Created>
+</o:DocumentProperties>
+<w:fonts>
+ <w:defaultFonts w:ascii="瀹嬩綋" w:fareast="瀹嬩綋" w:h-ansi="瀹嬩綋"/>
+</w:fonts>
+<w:styles>
+ <w:style w:type="paragraph" w:styleId="title">
+ <w:name w:val="Title"/>
+ <w:pPr><w:jc w:val="center"/></w:pPr>
+ <w:rPr><w:b/><w:size w:val="36"/></w:rPr>
+ </w:style>
+ <w:style w:type="paragraph" w:styleId="heading1">
+ <w:name w:val="Heading 1"/>
+ <w:rPr><w:b/><w:size w:val="28"/></w:rPr>
+ </w:style>
+ <w:style w:type="paragraph" w:styleId="heading2">
+ <w:name w:val="Heading 2"/>
+ <w:rPr><w:b/><w:size w:val="24"/></w:rPr>
+ </w:style>
+ <w:style w:type="paragraph" w:styleId="heading3">
+ <w:name w:val="Heading 3"/>
+ <w:rPr><w:b/><w:size w:val="22"/></w:rPr>
+ </w:style>
+</w:styles>
+<w:body>
+
+<!-- 鏍囬 -->
+<w:p><w:pPr><w:pStyle w:val="title"/></w:pPr>
+ <w:r><w:t>${projectName} 娴嬭瘯鎶ュ憡</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:jc w:val="center"/></w:pPr>
+ <w:r><w:t>鐗堟湰锛�${projectVersion}</w:t></w:r>
+ <w:r><w:t> </w:t></w:r>
+ <w:r><w:t>鏃ユ湡锛�${docDate}</w:t></w:r>
+</w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 涓�銆佹祴璇曡鍒掓杩� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涓�銆佹祴璇曡鍒掓杩�</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>1.1 娴嬭瘯鐩爣</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>纭繚浜у搧搴撳瓨绠$悊绯荤粺鍚勫姛鑳芥ā鍧楃鍚堥渶姹傝鏍硷紝绯荤粺杩愯绋冲畾鍙潬锛屾�ц兘婊¤冻璁捐瑕佹眰锛屼负绯荤粺涓婄嚎鎻愪緵璐ㄩ噺淇濋殰銆�</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>1.2 娴嬭瘯鑼冨洿</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>${testScope}</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>1.3 娴嬭瘯鏂规硶</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>${testMethodology}</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>1.4 娴嬭瘯鍛ㄦ湡</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>${testCycle}</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>1.5 娴嬭瘯鐜</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>${testEnv}</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 浜屻�佹祴璇曠敤渚� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>浜屻�佹祴璇曠敤渚�</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="900"/><w:gridCol w:w="1000"/><w:gridCol w:w="2100"/><w:gridCol w:w="1800"/><w:gridCol w:w="1400"/><w:gridCol w:w="800"/><w:gridCol w:w="800"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鐢ㄤ緥缂栧彿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>妯″潡</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>娴嬭瘯鍐呭</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>棰勬湡缁撴灉</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>瀹為檯缁撴灉</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鐘舵��</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>娴嬭瘯浜�</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list testCases as tc>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${tc.no}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${tc.module}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${tc.content}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${tc.expected}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${tc.actual}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${tc.status}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${tc.tester}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 涓夈�佹祴璇曡繘搴﹁窡韪� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涓夈�佹祴璇曡繘搴﹁窡韪�</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1300"/><w:gridCol w:w="2600"/><w:gridCol w:w="700"/><w:gridCol w:w="700"/><w:gridCol w:w="700"/><w:gridCol w:w="2500"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏃ユ湡</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>娴嬭瘯鍐呭</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璁″垝鏁�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>瀹屾垚鏁�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>瀹屾垚鐜�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>澶囨敞</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list progress as p>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${p.date}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${p.content}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${p.total}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${p.completed}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${p.rate}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${p.remark}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 鍥涖�佺己闄疯窡韪� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>鍥涖�佺己闄疯窡韪�</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1000"/><w:gridCol w:w="3000"/><w:gridCol w:w="800"/><w:gridCol w:w="1000"/><w:gridCol w:w="800"/><w:gridCol w:w="1200"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>缂栧彿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>缂洪櫡鎻忚堪</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>涓ラ噸绋嬪害</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璐熻矗浜�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鐘舵��</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璁″垝淇鏃�</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list defects as d>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${d.no}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${d.desc}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${d.severity}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${d.owner}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${d.status}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${d.deadline}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 浜斻�佹祴璇曠粺璁� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>浜斻�佹祴璇曠粺璁�</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>5.1 鐢ㄤ緥鎵ц缁熻</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="2250"/><w:gridCol w:w="2250"/><w:gridCol w:w="2250"/><w:gridCol w:w="2250"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>缁熻椤�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏁伴噺</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>缁熻椤�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏁伴噺</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>鐢ㄤ緥鎬绘暟</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${totalCases}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃鐢ㄤ緥</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${passedCases}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>澶辫触鐢ㄤ緥</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${failedCases}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>杩涜涓敤渚�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${inProgressCases}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>闃诲鐢ㄤ緥</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${blockedCases}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃鐜�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${passRate}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>5.2 缂洪櫡缁熻</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="2250"/><w:gridCol w:w="2250"/><w:gridCol w:w="2250"/><w:gridCol w:w="2250"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>缁熻椤�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏁伴噺</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>缁熻椤�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏁伴噺</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>缂洪櫡鎬绘暟</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${totalDefects}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>宸蹭慨澶�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${fixedDefects}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>寰呭鐞�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${openDefects}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>淇涓�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${inProgressDefects}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>涓ラ噸缂洪櫡</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${criticalDefects}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>涓�鑸己闄�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${majorDefects}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>杞诲井缂洪櫡</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${minorDefects}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t/></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t/></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 鍏�佹祴璇曠粨璁� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>鍏�佹祴璇曠粨璁�</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>6.1 缁煎悎璇勪环</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>${testConclusion}</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>6.2 涓婄嚎寤鸿</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>${releaseSuggestion}</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 涓冦�佸緟鍔炰簨椤� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涓冦�佸緟鍔炰簨椤�</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="500"/><w:gridCol w:w="4500"/><w:gridCol w:w="2000"/><w:gridCol w:w="1500"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>搴忓彿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>寰呭姙鍐呭</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璐熻矗浜�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>瀹屾垚鏃堕棿</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list actionItems as a>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${a.no}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${a.content}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${a.owner}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${a.deadline}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 娴嬭瘯璇勫浼氳绾 -->
+<w:p><w:pPr><w:pStyle w:val="title"/></w:pPr>
+ <w:r><w:t>娴嬭瘯璇勫浼氳绾</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>浼氳淇℃伅</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>浼氳涓婚锛氫骇鍝佸簱瀛樼鐞嗙郴缁熸祴璇曡瘎瀹′細璁�</w:t></w:r></w:p>
+<w:p><w:r><w:t>浼氳鏃堕棿锛�2026骞�6鏈�2鏃� 14:00-16:00</w:t></w:r></w:p>
+<w:p><w:r><w:t>浼氳鍦扮偣锛氬叕鍙镐細璁</w:t></w:r></w:p>
+<w:p><w:r><w:t>涓绘寔浜猴細寮燲X</w:t></w:r></w:p>
+<w:p><w:r><w:t>璁板綍浜猴細鍒榅X</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>鍙備細浜哄憳</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>寮燲X锛堥」鐩粡鐞嗭級銆佹潕XX锛堜骇鍝佺粡鐞嗭級銆佺帇XX锛堝悗绔紑鍙戯級銆佽档XX锛堝悗绔紑鍙戯級銆侀檲XX锛堝墠绔紑鍙戯級銆佸瓩XX锛圓I宸ョ▼甯堬級銆佸垬XX锛堟祴璇曞伐绋嬪笀锛�</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>璇勫鍐呭</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>1. 娴嬭瘯鐢ㄤ緥瑕嗙洊搴﹁瘎瀹�</w:t></w:r></w:p>
+<w:p><w:r><w:t>2. 娴嬭瘯杩涘害涓庤鍒掑亸宸垎鏋�</w:t></w:r></w:p>
+<w:p><w:r><w:t>3. 缂洪櫡鍒嗘瀽涓庨闄╄瘎浼�</w:t></w:r></w:p>
+<w:p><w:r><w:t>4. 鎬ц兘娴嬭瘯缁撴灉璇勪及</w:t></w:r></w:p>
+<w:p><w:r><w:t>5. 涓婄嚎鏉′欢纭</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>璇勫缁撹</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="2500"/><w:gridCol w:w="1500"/><w:gridCol w:w="4500"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璇勫椤�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璇勫缁撴灉</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璇勫鎰忚</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>娴嬭瘯鐢ㄤ緥瑕嗙洊搴�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏍稿績鍔熻兘鍏ㄨ鐩栵紝寤鸿琛ュ厖杈圭晫寮傚父鍦烘櫙</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>娴嬭瘯杩涘害</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏁翠綋杩涘害85%锛岀鍚堣鍒掗鏈�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>缂洪櫡绠$悊</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏈夋潯浠堕�氳繃</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>3涓弗閲嶇己闄烽渶淇鍚庡彲涓婄嚎</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>鎬ц兘娴嬭瘯</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>閫氳繃</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>骞跺彂鍜屾煡璇㈡�ц兘婊¤冻瑕佹眰</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>AI鍔熻兘娴嬭瘯</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏈夋潯浠堕�氳繃</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>璇煶褰曞叆鍑嗙‘鐜囬渶浼樺寲锛屽叾浠栧姛鑳借揪鏍�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>閬楃暀闂</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>1. 璇煶褰曞叆鏂硅█璇嗗埆浼樺寲鏂规寰呭瓩XX纭</w:t></w:r></w:p>
+<w:p><w:r><w:t>2. Excel澶ф暟鎹噺瀵煎嚭鏄惁闇�瑕佹敼寮傛澶勭悊锛�</w:t></w:r></w:p>
+<w:p><w:r><w:t>3. 鐩樼偣骞跺彂閿佹満鍒舵槸鍚﹂渶瑕佸紩鍏ュ垎甯冨紡閿侊紵</w:t></w:r></w:p>
+<w:p><w:r><w:t>4. 绉诲姩绔�傞厤鑼冨洿鏄惁绾冲叆鏈涓婄嚎锛�</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涓嬫浼氳</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鏃堕棿锛�2026骞�6鏈�10鏃�</w:t></w:r></w:p>
+<w:p><w:r><w:t>涓婚锛氱浜岃疆鍥炲綊娴嬭瘯璇勫浼氳</w:t></w:r></w:p>
+
+</w:body>
+</w:wordDocument>
\ No newline at end of file
diff --git "a/src/main/resources/static/\347\263\273\347\273\237\350\256\276\350\256\241\350\257\264\346\230\216\344\271\246.xml" "b/src/main/resources/static/\347\263\273\347\273\237\350\256\276\350\256\241\350\257\264\346\230\216\344\271\246.xml"
new file mode 100644
index 0000000..847b528
--- /dev/null
+++ "b/src/main/resources/static/\347\263\273\347\273\237\350\256\276\350\256\241\350\257\264\346\230\216\344\271\246.xml"
@@ -0,0 +1,602 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
+ xml:space="preserve">
+<o:DocumentProperties>
+ <o:Title>绯荤粺璁捐璇存槑涔�</o:Title>
+ <o:Author>绯荤粺鐢熸垚</o:Author>
+ <o:Created>${docDate}</o:Created>
+</o:DocumentProperties>
+<w:fonts>
+ <w:defaultFonts w:ascii="瀹嬩綋" w:fareast="瀹嬩綋" w:h-ansi="瀹嬩綋"/>
+</w:fonts>
+<w:styles>
+ <w:style w:type="paragraph" w:styleId="title">
+ <w:name w:val="Title"/>
+ <w:pPr><w:jc w:val="center"/></w:pPr>
+ <w:rPr><w:b/><w:size w:val="36"/></w:rPr>
+ </w:style>
+ <w:style w:type="paragraph" w:styleId="heading1">
+ <w:name w:val="Heading 1"/>
+ <w:rPr><w:b/><w:size w:val="28"/></w:rPr>
+ </w:style>
+ <w:style w:type="paragraph" w:styleId="heading2">
+ <w:name w:val="Heading 2"/>
+ <w:rPr><w:b/><w:size w:val="24"/></w:rPr>
+ </w:style>
+ <w:style w:type="paragraph" w:styleId="heading3">
+ <w:name w:val="Heading 3"/>
+ <w:rPr><w:b/><w:size w:val="22"/></w:rPr>
+ </w:style>
+</w:styles>
+<w:body>
+
+<!-- 鏍囬 -->
+<w:p><w:pPr><w:pStyle w:val="title"/></w:pPr>
+ <w:r><w:t>${projectName} 绯荤粺璁捐璇存槑涔�</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:jc w:val="center"/></w:pPr>
+ <w:r><w:t>鐗堟湰锛�${projectVersion}</w:t></w:r>
+ <w:r><w:t> </w:t></w:r>
+ <w:r><w:t>鏃ユ湡锛�${docDate}</w:t></w:r>
+</w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 涓�銆佽璁¤鏄� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涓�銆佽璁¤鏄�</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>1.1 缂栧啓鐩殑</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鏈枃妗f棬鍦ㄨ缁嗘弿杩颁骇鍝佸簱瀛樼鐞嗙郴缁熺殑绯荤粺鏋舵瀯璁捐銆佽蒋浠舵鏋躲�佹湇鍔″櫒閰嶇疆绛夋妧鏈粏鑺傦紝涓哄紑鍙戜汉鍛樻彁渚涙妧鏈寚瀵硷紝涓鸿繍缁翠汉鍛樻彁渚涢儴缃插弬鑰冿紝纭繚绯荤粺鐨勫彲缁存姢鎬у拰鍙墿灞曟�с��</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>1.2 椤圭洰鑳屾櫙</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>浜у搧搴撳瓨绠$悊绯荤粺鏄竴濂楅潰鍚戜紒涓氱殑缁煎悎绠$悊骞冲彴锛屾兜鐩栧簱瀛樼鐞嗐�侀噰璐攢鍞�佽川閲忔娴嬨�佽澶囩淮鎶ゃ�佷汉浜嬪崗鍚岀瓑鏍稿績涓氬姟妯″潡锛屽苟寮曞叆AI鎶�鏈疄鐜版櫤鑳藉寲鍔熻兘锛屾彁鍗囦紒涓氱鐞嗘晥鐜囧拰鍐崇瓥姘村钩銆�</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>1.3 璁捐鍘熷垯</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鈥� 楂樺彲鐢ㄦ�э細閲囩敤闆嗙兢閮ㄧ讲锛岀‘淇濈郴缁�7x24灏忔椂绋冲畾杩愯</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鍙墿灞曟�э細妯″潡鍖栬璁★紝鏀寔鍔熻兘鐏垫椿鎵╁睍</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 瀹夊叏鎬э細澶氬眰娆″畨鍏ㄩ槻鎶わ紝淇濋殰鏁版嵁瀹夊叏</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 楂樻�ц兘锛氫紭鍖栨暟鎹簱鍜岀紦瀛樼瓥鐣ワ紝纭繚蹇�熷搷搴�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鏄撶淮鎶わ細鏍囧噯鍖栨帴鍙e拰鏂囨。锛岄檷浣庣淮鎶ゆ垚鏈�</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 浜屻�佽蒋浠舵鏋� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>浜屻�佽蒋浠舵鏋�</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>2.1 鏁翠綋鏋舵瀯</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>绯荤粺閲囩敤鍓嶅悗绔垎绂荤殑寰湇鍔℃灦鏋勶紝涓昏鍒嗕负浠ヤ笅灞傛锛�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 琛ㄧ幇灞傦細Vue 3 + Element Plus锛屾彁渚涚敤鎴蜂氦浜掔晫闈�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 缃戝叧灞傦細Nginx鍙嶅悜浠g悊锛岃礋杞藉潎琛″拰璇锋眰璺敱</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鏈嶅姟灞傦細Spring Boot寰湇鍔★紝涓氬姟閫昏緫澶勭悊</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鏁版嵁灞傦細MySQL涓讳粠闆嗙兢 + Redis缂撳瓨</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� AI鏈嶅姟灞傦細澶ц瑷�妯″瀷API鎺ュ叆锛屾満鍣ㄥ涔犳ā鍨嬫湇鍔�</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>2.2 鍚庣鎶�鏈爤</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="2000"/><w:gridCol w:w="2500"/><w:gridCol w:w="4000"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍒嗙被</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鎶�鏈粍浠�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璇存槑</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list backendTech as t>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${t.category}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${t.component}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${t.desc}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>2.3 鍓嶇鎶�鏈爤</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="2000"/><w:gridCol w:w="2500"/><w:gridCol w:w="4000"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍒嗙被</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鎶�鏈粍浠�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璇存槑</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list frontendTech as t>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${t.category}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${t.component}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${t.desc}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>2.4 AI鎶�鏈灦鏋�</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="2000"/><w:gridCol w:w="2500"/><w:gridCol w:w="4000"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍒嗙被</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鎶�鏈粍浠�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璇存槑</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list aiTech as t>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${t.category}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${t.component}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${t.desc}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>2.5 绯荤粺妯″潡璁捐</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1500"/><w:gridCol w:w="2000"/><w:gridCol w:w="5000"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>妯″潡缂栧彿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>妯″潡鍚嶇О</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍔熻兘鎻忚堪</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list modules as m>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${m.id}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${m.name}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${m.desc}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 涓夈�佹湇鍔″櫒閰嶇疆 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涓夈�佹湇鍔″櫒閰嶇疆</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>3.1 鏈嶅姟鍣ㄦ嫇鎵�</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>绯荤粺閲囩敤鍒嗗竷寮忛儴缃叉灦鏋勶紝涓昏鏈嶅姟鍣ㄨ妭鐐瑰寘鎷細</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 搴旂敤鏈嶅姟鍣ㄩ泦缇わ細閮ㄧ讲Spring Boot搴旂敤锛�2鍙颁互涓�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鏁版嵁搴撴湇鍔″櫒锛歁ySQL涓讳粠鏋舵瀯锛屼富搴�1鍙� + 浠庡簱1鍙�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 缂撳瓨鏈嶅姟鍣細Redis鍝ㄥ叺妯″紡锛�3鍙�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鏂囦欢鏈嶅姟鍣細MinIO瀵硅薄瀛樺偍锛�2鍙�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� AI鎺ㄧ悊鏈嶅姟鍣細GPU鏈嶅姟鍣紝閮ㄧ讲鏈哄櫒瀛︿範妯″瀷</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>3.2 鏈嶅姟鍣ㄩ厤缃竻鍗�</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1500"/><w:gridCol w:w="1500"/><w:gridCol w:w="1500"/><w:gridCol w:w="2000"/><w:gridCol w:w="2000"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鏈嶅姟鍣ㄥ悕绉�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>CPU</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍐呭瓨</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>纭洏</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鎿嶄綔绯荤粺</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list servers as s>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${s.name}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${s.cpu}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${s.memory}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${s.disk}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${s.os}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>3.3 缃戠粶鏋舵瀯</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鈥� 澶栫綉甯﹀锛�100Mbps锛屾敮鎸侀珮骞跺彂璁块棶</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鍐呯綉甯﹀锛氬崈鍏嗕互澶綉锛屾湇鍔″櫒闂撮珮閫熼�氫俊</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 闃茬伀澧欙細閰嶇疆瀹夊叏缁勮鍒欙紝浠呭紑鏀惧繀瑕佺鍙�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 璐熻浇鍧囪 锛歂ginx瀹炵幇璇锋眰鍒嗗彂锛屾敮鎸佸仴搴锋鏌�</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>3.4 瀹夊叏閰嶇疆</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鈥� SSL璇佷功锛氶厤缃瓾TTPS锛屼繚闅滄暟鎹紶杈撳畨鍏�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鏁版嵁搴撳畨鍏細鍐呯綉璁块棶锛岀姝㈠缃戠洿杩�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 瀹氭湡澶囦唤锛氭瘡鏃ヨ嚜鍔ㄥ浠芥暟鎹簱锛屼繚鐣�30澶�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鏃ュ織瀹¤锛氳褰曞叧閿搷浣滄棩蹇楋紝鏀寔瀹夊叏瀹¤</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 鍥涖�佹暟鎹簱璁捐 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>鍥涖�佹暟鎹簱璁捐</w:t></w:r>
+</wp>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>4.1 鏁版嵁搴撻�夊瀷</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鈥� 涓绘暟鎹簱锛歁ySQL 8.0锛屽瓨鍌ㄤ笟鍔℃暟鎹�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 缂撳瓨鏁版嵁搴擄細Redis 7.0锛岀紦瀛樼儹鐐规暟鎹�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鏂囦欢瀛樺偍锛歁inIO锛屽瓨鍌ㄦ枃浠跺拰闄勪欢</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>4.2 涓昏鏁版嵁琛�</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="2500"/><w:gridCol w:w="6000"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>琛ㄥ悕</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璇存槑</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list tables as t>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${t.name}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${t.desc}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 浜斻�佹帴鍙h璁� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>浜斻�佹帴鍙h璁�</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>5.1 鎺ュ彛瑙勮寖</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鈥� 鎺ュ彛鍗忚锛歊ESTful API锛屽熀浜嶩TTP/HTTPS</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鏁版嵁鏍煎紡锛欽SON</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 璁よ瘉鏂瑰紡锛欽WT Token</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鎺ュ彛鏂囨。锛歋wagger / Knife4j</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>5.2 涓昏鎺ュ彛鍒楄〃</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1000"/><w:gridCol w:w="1500"/><w:gridCol w:w="3000"/><w:gridCol w:w="3000"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>搴忓彿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璇锋眰鏂瑰紡</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鎺ュ彛璺緞</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍔熻兘璇存槑</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list apis as a>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${a.no}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${a.method}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${a.path}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${a.desc}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 璇勫浼氳绾鏍囬 -->
+<w:p><w:pPr><w:pStyle w:val="title"/></w:pPr>
+ <w:r><w:t>璁捐璇勫浼氳绾</w:t></w:r>
+</w:p>
+
+<!-- 浼氳淇℃伅 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>浼氳淇℃伅</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>浼氳涓婚锛氱郴缁熻璁¤瘎瀹′細璁�</w:t></w:r></w:p>
+<w:p><w:r><w:t>浼氳鏃堕棿锛�2026骞碭鏈圶鏃� 14:00-17:00</w:t></w:r></w:p>
+<w:p><w:r><w:t>浼氳鍦扮偣锛氬叕鍙镐細璁</w:t></w:r></w:p>
+<w:p><w:r><w:t>涓绘寔浜猴細寮燲X</w:t></w:r></w:p>
+<w:p><w:r><w:t>璁板綍浜猴細鏉嶺X</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 鍙備細浜哄憳 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>鍙備細浜哄憳</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>寮燲X锛堥」鐩粡鐞嗭級銆佹潕XX锛堜骇鍝佺粡鐞嗭級銆佺帇XX锛堟灦鏋勫笀锛夈�佽档XX锛堝悗绔紑鍙戯級銆侀檲XX锛堝墠绔紑鍙戯級銆佸瓩XX锛圓I宸ョ▼甯堬級銆佸垬XX锛堟祴璇曞伐绋嬪笀锛�</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 璇勫鍐呭 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>璇勫鍐呭</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>1. 绯荤粺鏋舵瀯璁捐璇勫</w:t></w:r></w:p>
+<w:p><w:r><w:t>2. 鏁版嵁搴撹璁¤瘎瀹�</w:t></w:r></w:p>
+<w:p><w:r><w:t>3. 鎺ュ彛璁捐璇勫</w:t></w:r></w:p>
+<w:p><w:r><w:t>4. 鏈嶅姟鍣ㄩ厤缃瘎瀹�</w:t></w:r></w:p>
+<w:p><w:r><w:t>5. AI鎶�鏈柟妗堣瘎瀹�</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 璇勫缁撹 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>璇勫缁撹</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="2500"/><w:gridCol w:w="1500"/><w:gridCol w:w="4500"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璇勫椤�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璇勫缁撴灉</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璇勫鎰忚</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list reviewItems as r>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${r.item}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${r.result}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${r.opinion}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 寰呭姙浜嬮」 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>寰呭姙浜嬮」</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="500"/><w:gridCol w:w="4500"/><w:gridCol w:w="2000"/><w:gridCol w:w="1500"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>搴忓彿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>寰呭姙鍐呭</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璐熻矗浜�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>瀹屾垚鏃堕棿</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list actionItems as a>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${a.no}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${a.content}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${a.owner}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${a.deadline}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 閬楃暀闂 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>閬楃暀闂</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>1. 鏄惁闇�瑕佽�冭檻瀹瑰櫒鍖栭儴缃诧紙Docker/K8s锛夛紵</w:t></w:r></w:p>
+<w:p><w:r><w:t>2. AI鎺ㄧ悊鏈嶅姟鍣ㄦ槸鍚﹂渶瑕侀厤缃瓽PU锛�</w:t></w:r></w:p>
+<w:p><w:r><w:t>3. 鏁版嵁搴撴槸鍚﹂渶瑕佸垎搴撳垎琛ㄦ柟妗堬紵</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 涓嬫浼氳 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涓嬫浼氳</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鏃堕棿锛�2026骞碭鏈圶鏃�</w:t></w:r></w:p>
+<w:p><w:r><w:t>涓婚锛氬紑鍙戣瘎瀹′細璁�</w:t></w:r></w:p>
+
+</w:body>
+</w:wordDocument>
\ No newline at end of file
diff --git "a/src/main/resources/static/\351\234\200\346\261\202\350\257\264\346\230\216\344\271\246.xml" "b/src/main/resources/static/\351\234\200\346\261\202\350\257\264\346\230\216\344\271\246.xml"
new file mode 100644
index 0000000..b5a22a5
--- /dev/null
+++ "b/src/main/resources/static/\351\234\200\346\261\202\350\257\264\346\230\216\344\271\246.xml"
@@ -0,0 +1,456 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
+ xml:space="preserve">
+<o:DocumentProperties>
+ <o:Title>椤圭洰闇�姹傝鏄庝功</o:Title>
+ <o:Author>绯荤粺鐢熸垚</o:Author>
+ <o:Created>${docDate}</o:Created>
+</o:DocumentProperties>
+<w:fonts>
+ <w:defaultFonts w:ascii="瀹嬩綋" w:fareast="瀹嬩綋" w:h-ansi="瀹嬩綋"/>
+</w:fonts>
+<w:styles>
+ <w:style w:type="paragraph" w:styleId="title">
+ <w:name w:val="Title"/>
+ <w:pPr><w:jc w:val="center"/></w:pPr>
+ <w:rPr><w:b/><w:size w:val="36"/></w:rPr>
+ </w:style>
+ <w:style w:type="paragraph" w:styleId="heading1">
+ <w:name w:val="Heading 1"/>
+ <w:rPr><w:b/><w:size w:val="28"/></w:rPr>
+ </w:style>
+ <w:style w:type="paragraph" w:styleId="heading2">
+ <w:name w:val="Heading 2"/>
+ <w:rPr><w:b/><w:size w:val="24"/></w:rPr>
+ </w:style>
+ <w:style w:type="paragraph" w:styleId="heading3">
+ <w:name w:val="Heading 3"/>
+ <w:rPr><w:b/><w:size w:val="22"/></w:rPr>
+ </w:style>
+</w:styles>
+<w:body>
+
+<!-- 鏍囬 -->
+<w:p><w:pPr><w:pStyle w:val="title"/></w:pPr>
+ <w:r><w:t>${projectName} 闇�姹傝鏄庝功</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:jc w:val="center"/></w:pPr>
+ <w:r><w:t>鐗堟湰锛�${projectVersion}</w:t></w:r>
+ <w:r><w:t> </w:t></w:r>
+ <w:r><w:t>鏃ユ湡锛�${docDate}</w:t></w:r>
+</w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 涓�銆侀」鐩儗鏅� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涓�銆侀」鐩儗鏅�</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>闅忕潃浼佷笟涓氬姟瑙勬ā涓嶆柇鎵╁ぇ锛屼紶缁熺殑鎵嬪伐璁板綍鍜孍xcel绠$悊鏂瑰紡宸叉棤娉曟弧瓒虫棩鐩婂鏉傜殑搴撳瓨銆侀噰璐�侀攢鍞瓑涓氬姟闇�姹傘�備负鎻愬崌绠$悊鏁堢巼銆侀檷浣庝汉宸ラ敊璇巼銆佸疄鐜版暟鎹疄鏃跺叡浜紝浼佷笟鎬ラ渶涓�濂楁暟瀛楀寲銆佹櫤鑳藉寲鐨勪骇鍝佸簱瀛樼鐞嗙郴缁熴��</w:t></w:r></w:p>
+<w:p><w:r><w:t/></w:r></w:p>
+<w:p><w:r><w:t>鏈」鐩棬鍦ㄦ瀯寤轰竴涓泦搴撳瓨绠$悊銆侀噰璐攢鍞�佽川閲忔娴嬨�佽澶囩淮鎶ゃ�佷汉浜嬪崗鍚屼簬涓�浣撶殑缁煎悎绠$悊骞冲彴锛屽苟缁撳悎浜哄伐鏅鸿兘鎶�鏈疄鐜版櫤鑳介璀︺�佹暟鎹垎鏋愮瓑楂樼骇鍔熻兘銆�</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 浜屻�侀」鐩洰鏍� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>浜屻�侀」鐩洰鏍�</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>1. 瀹炵幇搴撳瓨鍏ㄦ祦绋嬫暟瀛楀寲绠$悊锛屽寘鎷叆搴撱�佸嚭搴撱�佺洏鐐广�侀璀︾瓑</w:t></w:r></w:p>
+<w:p><w:r><w:t>2. 寤虹珛閲囪喘閿�鍞棴鐜鐞嗭紝浠庤浠峰埌鍙戣揣鍏ㄧ▼鍙拷婧�</w:t></w:r></w:p>
+<w:p><w:r><w:t>3. 鏋勫缓璐ㄩ噺妫�娴嬩綋绯伙紝纭繚浜у搧璐ㄩ噺鍙帶鍙煡</w:t></w:r></w:p>
+<w:p><w:r><w:t>4. 瀹炵幇璁惧鍏ㄧ敓鍛藉懆鏈熺鐞嗭紝闄嶄綆璁惧鏁呴殰鐜�</w:t></w:r></w:p>
+<w:p><w:r><w:t>5. 鏁村悎浜轰簨鍗忓悓娴佺▼锛屾彁鍗囧姙鍏晥鐜�</w:t></w:r></w:p>
+<w:p><w:r><w:t>6. 寮曞叆AI鎶�鏈紝瀹炵幇鏅鸿兘棰勬祴銆佹櫤鑳藉鏈嶃�佹櫤鑳芥枃妗e鐞�</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 涓夈�佸姛鑳介渶姹� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涓夈�佸姛鑳介渶姹�</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>3.1 搴撳瓨绠$悊妯″潡</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1500"/><w:gridCol w:w="3500"/><w:gridCol w:w="3500"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍔熻兘缂栧彿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍔熻兘鍚嶇О</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍔熻兘鎻忚堪</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list inventoryFeatures as f>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${f.id}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${f.name}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${f.desc}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>3.2 閲囪喘閿�鍞ā鍧�</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1500"/><w:gridCol w:w="3500"/><w:gridCol w:w="3500"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍔熻兘缂栧彿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍔熻兘鍚嶇О</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍔熻兘鎻忚堪</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list purchaseFeatures as f>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${f.id}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${f.name}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${f.desc}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>3.3 璐ㄦ璁惧妯″潡</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1500"/><w:gridCol w:w="3500"/><w:gridCol w:w="3500"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍔熻兘缂栧彿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍔熻兘鍚嶇О</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍔熻兘鎻忚堪</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list qualityFeatures as f>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${f.id}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${f.name}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${f.desc}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>3.4 浜轰簨鍗忓悓妯″潡</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1500"/><w:gridCol w:w="3500"/><w:gridCol w:w="3500"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍔熻兘缂栧彿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍔熻兘鍚嶇О</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍔熻兘鎻忚堪</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list staffFeatures as f>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${f.id}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${f.name}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${f.desc}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>3.5 AI鏅鸿兘鍖栨ā鍧�</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1500"/><w:gridCol w:w="3500"/><w:gridCol w:w="3500"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍔熻兘缂栧彿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍔熻兘鍚嶇О</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鍔熻兘鎻忚堪</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list aiFeatures as f>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${f.id}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${f.name}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${f.desc}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 鍥涖�侀潪鍔熻兘闇�姹� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>鍥涖�侀潪鍔熻兘闇�姹�</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>4.1 鎬ц兘闇�姹�</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鈥� 椤甸潰鍝嶅簲鏃堕棿锛氭櫘閫氶〉闈㈠姞杞芥椂闂翠笉瓒呰繃2绉�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鏁版嵁鏌ヨ锛氬崟琛ㄦ煡璇㈠搷搴旀椂闂翠笉瓒呰繃1绉�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 骞跺彂鏀寔锛氱郴缁熸敮鎸�100+鐢ㄦ埛鍚屾椂鍦ㄧ嚎鎿嶄綔</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鏁版嵁澶勭悊锛氭敮鎸佺櫨涓囩骇鏁版嵁閲忕殑楂樻晥澶勭悊</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>4.2 瀹夊叏闇�姹�</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鈥� 鐢ㄦ埛璁よ瘉锛氭敮鎸佸鍥犵礌璁よ瘉锛岀‘淇濊处鎴峰畨鍏�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鏉冮檺鎺у埗锛氬熀浜嶳BAC妯″瀷锛屽疄鐜扮粏绮掑害鏉冮檺绠$悊</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鏁版嵁鍔犲瘑锛氭晱鎰熸暟鎹噰鐢ˋES鍔犲瘑瀛樺偍</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鎿嶄綔鏃ュ織锛氬叧閿搷浣滃叏绋嬭褰曪紝鏀寔瀹¤杩芥函</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>4.3 鍙敤鎬ч渶姹�</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鈥� 绯荤粺鍙敤鎬э細7x24灏忔椂绋冲畾杩愯锛屽彲鐢ㄦ�ц揪鍒�99.9%</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鏁版嵁澶囦唤锛氭瘡鏃ヨ嚜鍔ㄥ浠斤紝鏀寔蹇�熸仮澶�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 瀹圭伨鑳藉姏锛氭敮鎸佸紓鍦板鐏撅紝鏁版嵁涓嶄涪澶�</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>4.4 鍏煎鎬ч渶姹�</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鈥� 娴忚鍣ㄦ敮鎸侊細鍏煎Chrome銆丒dge銆丗irefox涓绘祦娴忚鍣�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 绉诲姩绔�傞厤锛氭牳蹇冨姛鑳芥敮鎸佺Щ鍔ㄧ璁块棶</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鎺ュ彛鏍囧噯锛氶噰鐢≧ESTful API锛屾敮鎸佺涓夋柟绯荤粺闆嗘垚</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 浜斻�佺敤鎴疯鑹� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>浜斻�佺敤鎴疯鑹�</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="2000"/><w:gridCol w:w="3000"/><w:gridCol w:w="3500"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>瑙掕壊鍚嶇О</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>瑙掕壊鎻忚堪</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>涓昏鏉冮檺</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list userRoles as r>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${r.name}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${r.desc}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${r.permission}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 鍏�佷笟鍔℃祦绋� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>鍏�佷笟鍔℃祦绋�</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>6.1 搴撳瓨鍏ュ簱娴佺▼</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>1. 閲囪喘璁㈠崟鍒拌揣 鈫� 2. 璐ㄩ噺妫�楠� 鈫� 3. 妫�楠屽悎鏍� 鈫� 4. 鍒涘缓鍏ュ簱鍗� 鈫� 5. 瀹℃壒鍏ュ簱 鈫� 6. 鏇存柊搴撳瓨</w:t></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>6.2 閿�鍞嚭搴撴祦绋�</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>1. 閿�鍞鍗曞垱寤� 鈫� 2. 搴撳瓨鏍¢獙 鈫� 3. 璁㈠崟瀹℃壒 鈫� 4. 鐢熸垚鍑哄簱鍗� 鈫� 5. 鍙戣揣纭 鈫� 6. 鏇存柊搴撳瓨</w:t></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>6.3 璁惧淇濆吇娴佺▼</w:t></w:r>
+</wp>
+<w:p><w:r><w:t>1. 鍒跺畾淇濆吇璁″垝 鈫� 2. 瀹氭椂浠诲姟瑙﹀彂 鈫� 3. 鎵ц淇濆吇浠诲姟 鈫� 4. 楠屾敹纭 鈫� 5. 璁板綍褰掓。</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 涓冦�佹妧鏈姹� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涓冦�佹妧鏈姹�</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鈥� 鍚庣妗嗘灦锛歋pring Boot 3.5 + MyBatis-Plus</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鍓嶇妗嗘灦锛歏ue 3 + Element Plus</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鏁版嵁搴擄細MySQL 8.0</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 缂撳瓨锛歊edis</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� JDK鐗堟湰锛欽DK 25</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� AI鎶�鏈細Claude API / OpenAI API锛堟櫤鑳藉鏈嶏級</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鏈哄櫒瀛︿範锛歍ensorFlow / PyTorch锛堥娴嬫ā鍨嬶級</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� OCR锛氱櫨搴CR / Tesseract锛堟枃妗h瘑鍒級</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 鍏�侀獙鏀舵爣鍑� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>鍏�侀獙鏀舵爣鍑�</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="500"/><w:gridCol w:w="3000"/><w:gridCol w:w="5000"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>搴忓彿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>楠屾敹椤�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>楠屾敹鏍囧噯</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list acceptCriteria as a>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${a.no}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${a.item}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${a.criteria}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 涔濄�侀檮褰� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涔濄�侀檮褰�</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鈥� 闄勫綍A锛氭暟鎹簱璁捐鏂囨。</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 闄勫綍B锛氭帴鍙h璁℃枃妗�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 闄勫綍C锛歎I鍘熷瀷璁捐</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 闄勫綍D锛氭祴璇曠敤渚�</w:t></w:r></w:p>
+
+</w:body>
+</w:wordDocument>
\ No newline at end of file
diff --git "a/src/main/resources/static/\351\241\271\347\233\256\350\256\241\345\210\222\344\271\246.xml" "b/src/main/resources/static/\351\241\271\347\233\256\350\256\241\345\210\222\344\271\246.xml"
new file mode 100644
index 0000000..dc9e006
--- /dev/null
+++ "b/src/main/resources/static/\351\241\271\347\233\256\350\256\241\345\210\222\344\271\246.xml"
@@ -0,0 +1,356 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
+ xml:space="preserve">
+<o:DocumentProperties>
+ <o:Title>椤圭洰璁″垝涔�</o:Title>
+ <o:Author>绯荤粺鐢熸垚</o:Author>
+ <o:Created>${docDate}</o:Created>
+</o:DocumentProperties>
+<w:fonts>
+ <w:defaultFonts w:ascii="瀹嬩綋" w:fareast="瀹嬩綋" w:h-ansi="瀹嬩綋"/>
+</w:fonts>
+<w:styles>
+ <w:style w:type="paragraph" w:styleId="title">
+ <w:name w:val="Title"/>
+ <w:pPr><w:jc w:val="center"/></w:pPr>
+ <w:rPr><w:b/><w:size w:val="36"/></w:rPr>
+ </w:style>
+ <w:style w:type="paragraph" w:styleId="heading1">
+ <w:name w:val="Heading 1"/>
+ <w:rPr><w:b/><w:size w:val="28"/></w:rPr>
+ </w:style>
+ <w:style w:type="paragraph" w:styleId="heading2">
+ <w:name w:val="Heading 2"/>
+ <w:rPr><w:b/><w:size w:val="24"/></w:rPr>
+ </w:style>
+</w:styles>
+<w:body>
+
+<!-- 鏍囬 -->
+<w:p><w:pPr><w:pStyle w:val="title"/></w:pPr>
+ <w:r><w:t>${projectName} 椤圭洰璁″垝涔�</w:t></w:r>
+</w:p>
+
+<w:p><w:pPr><w:jc w:val="center"/></w:pPr>
+ <w:r><w:t>鐗堟湰锛�${projectVersion}</w:t></w:r>
+ <w:r><w:t> </w:t></w:r>
+ <w:r><w:t>鏃ユ湡锛�${docDate}</w:t></w:r>
+</w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 涓�銆侀」鐩杩� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涓�銆侀」鐩杩�</w:t></w:r>
+</w:p>
+<w:p>
+ <w:r><w:t>鍩轰簬鑻ヤ緷妗嗘灦寮�鍙戠殑浼佷笟绾т骇鍝佸簱瀛樼鐞嗙郴缁燂紝娑电洊搴撳瓨绠$悊銆侀噰璐�侀攢鍞�佽川妫�銆佽澶囥�佷汉浜嬬瓑鏍稿績涓氬姟妯″潡锛屽疄鐜颁紒涓氭暟瀛楀寲绠$悊銆�</w:t></w:r>
+</w:p>
+
+<!-- 浜屻�侀噷绋嬬璁″垝 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>浜屻�侀噷绋嬬璁″垝</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="1000"/><w:gridCol w:w="1500"/><w:gridCol w:w="2500"/><w:gridCol w:w="1500"/><w:gridCol w:w="2000"/></w:tblGrid>
+
+ <!-- 琛ㄥご -->
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>閲岀▼纰�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>闃舵鍐呭</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璇︾粏鎻忚堪</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璁″垝鏃堕棿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>浜や粯鐗�</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <!-- 鏁版嵁琛� -->
+ <#list milestones as m>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${m.id}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${m.name}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${m.content}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${m.time}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${m.deliverable}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+
+ <!-- AI鐩稿叧閲岀▼纰� -->
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>M10</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>AI鏅鸿兘鍖�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏅鸿兘瀹㈡湇銆侀娴嬪垎鏋愩�丱CR璇嗗埆</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>绗�23-26鍛�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>AI鍔熻兘妯″潡</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 涓夈�佷汉鍛樺畨鎺� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涓夈�佷汉鍛樺畨鎺�</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="2000"/><w:gridCol w:w="2000"/><w:gridCol w:w="4500"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>瑙掕壊</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>濮撳悕</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>鑱岃矗</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list team as t>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${t.role}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${t.name}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${t.duty}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+
+ <!-- AI鐩稿叧瑙掕壊 -->
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>AI宸ョ▼甯�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>瀛橷X</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>AI妯″瀷璁粌銆佹櫤鑳藉姛鑳藉紑鍙�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>鏁版嵁鍒嗘瀽甯�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鍚碭X</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鏁版嵁鍒嗘瀽銆侀娴嬫ā鍨嬫瀯寤�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 鍥涖�佹妧鏈灦鏋� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>鍥涖�佹妧鏈灦鏋�</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鈥� 鍚庣妗嗘灦锛歋pring Boot 3.5 + MyBatis-Plus</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鍓嶇妗嗘灦锛歏ue 3 + Element Plus</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鏁版嵁搴擄細MySQL 8.0</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 缂撳瓨锛歊edis</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� JDK鐗堟湰锛欽DK 25</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 浜斻�丄I鏅鸿兘鍖栧姛鑳� -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>浜斻�丄I鏅鸿兘鍖栧姛鑳�</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鏈」鐩紩鍏ヤ汉宸ユ櫤鑳芥妧鏈紝瀹炵幇浠ヤ笅鏅鸿兘鍖栧姛鑳斤細</w:t></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>5.1 AI杈呭姪鍐崇瓥</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鈥� 鏅鸿兘搴撳瓨棰勮锛氬熀浜庡巻鍙叉暟鎹娴嬪簱瀛橀渶姹傦紝鑷姩鐢熸垚琛ヨ揣寤鸿</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 閿�鍞娴嬪垎鏋愶細鍒╃敤鏈哄櫒瀛︿範绠楁硶鍒嗘瀽閿�鍞秼鍔匡紝杈呭姪鍒跺畾閿�鍞瓥鐣�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 寮傚父妫�娴嬶細鑷姩璇嗗埆寮傚父鏁版嵁锛堝寮傚父鍑哄叆搴撹褰曪級锛屽強鏃堕璀�</w:t></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>5.2 鏅鸿兘瀹㈡湇涓庝氦浜�</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鈥� AI鏅鸿兘瀹㈡湇锛氶泦鎴愬ぇ璇█妯″瀷锛屾彁渚�7x24灏忔椂鏅鸿兘闂瓟鏈嶅姟</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 璇煶璇嗗埆褰曞叆锛氭敮鎸佽闊宠浆鏂囧瓧锛屽揩閫熷綍鍏ヨ鍗曞拰搴撳瓨淇℃伅</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鏅鸿兘鏂囨。澶勭悊锛歄CR璇嗗埆閲囪喘鍗曘�佸彂璐у崟绛夌焊璐ㄦ枃妗o紝鑷姩褰曞叆绯荤粺</w:t></w:r></w:p>
+
+<w:p><w:pPr><w:pStyle w:val="heading2"/></w:pPr>
+ <w:r><w:t>5.3 AI鎶�鏈簲鐢ㄦ灦鏋�</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鈥� 澶ц瑷�妯″瀷锛欳laude API / OpenAI API锛岀敤浜庢櫤鑳介棶绛斿拰鏂囨。鐢熸垚</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� 鏈哄櫒瀛︿範妗嗘灦锛歍ensorFlow / PyTorch锛岀敤浜庨娴嬫ā鍨嬭缁�</w:t></w:r></w:p>
+<w:p><w:r><w:t>鈥� OCR寮曟搸锛歍esseract / 鐧惧害OCR锛岀敤浜庢枃妗h瘑鍒�</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 璇勫浼氳绾鏍囬 -->
+<w:p><w:pPr><w:pStyle w:val="title"/></w:pPr>
+ <w:r><w:t>璇勫浼氳绾</w:t></w:r>
+</w:p>
+
+<!-- 浼氳淇℃伅 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>浼氳淇℃伅</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>浼氳涓婚锛氫骇鍝佸簱瀛樼鐞嗙郴缁熼渶姹傝瘎瀹′細璁�</w:t></w:r></w:p>
+<w:p><w:r><w:t>浼氳鏃堕棿锛�2026骞碭鏈圶鏃� 14:00-16:00</w:t></w:r></w:p>
+<w:p><w:r><w:t>浼氳鍦扮偣锛氬叕鍙镐細璁</w:t></w:r></w:p>
+<w:p><w:r><w:t>涓绘寔浜猴細寮燲X</w:t></w:r></w:p>
+<w:p><w:r><w:t>璁板綍浜猴細鏉嶺X</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 鍙備細浜哄憳 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>鍙備細浜哄憳</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>寮燲X銆佹潕XX銆佺帇XX銆佽档XX銆侀檲XX銆佸垬XX</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 璇勫缁撹 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>璇勫缁撹</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="2500"/><w:gridCol w:w="2000"/><w:gridCol w:w="4000"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璇勫椤�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璇勫缁撴灉</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>澶囨敞</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list reviewResults as r>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${r.item}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${r.result}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${r.remark}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 寰呭姙浜嬮」 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>寰呭姙浜嬮」</w:t></w:r>
+</w:p>
+
+<w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="9000" w:type="pct"/>
+ <w:tblBorders>
+ <w:top w:val="single" w:sz="4"/>
+ <w:left w:val="single" w:sz="4"/>
+ <w:bottom w:val="single" w:sz="4"/>
+ <w:right w:val="single" w:sz="4"/>
+ <w:insideH w:val="single" w:sz="4"/>
+ <w:insideV w:val="single" w:sz="4"/>
+ </w:tblBorders>
+ </w:tblPr>
+ <w:tblGrid><w:gridCol w:w="500"/><w:gridCol w:w="4000"/><w:gridCol w:w="2000"/><w:gridCol w:w="2000"/></w:tblGrid>
+
+ <w:tr>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>搴忓彿</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>寰呭姙鍐呭</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>璐熻矗浜�</w:t></w:r></w:p>
+ </w:tc>
+ <w:tc><w:tcPr><w:shd w:val="clear" w:color="auto" w:fill="E7E6E6"/></w:tcPr>
+ <w:p><w:r><w:b/><w:t>瀹屾垚鏃堕棿</w:t></w:r></w:p>
+ </w:tc>
+ </w:tr>
+
+ <#list actionItems as a>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>${a.no}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${a.content}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${a.owner}</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>${a.deadline}</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ </#list>
+
+ <!-- AI鐩稿叧寰呭姙 -->
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>4</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>璋冪爺AI澶фā鍨嬫帴鍙f帴鍏ユ柟妗�</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>瀛橷X</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>X鏈圶鏃�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+ <w:tr>
+ <w:tc><w:p><w:r><w:t>5</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鍑嗗搴撳瓨棰勬祴妯″瀷璁粌鏁版嵁</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>鍚碭X</w:t></w:r></w:p></w:tc>
+ <w:tc><w:p><w:r><w:t>X鏈圶鏃�</w:t></w:r></w:p></w:tc>
+ </w:tr>
+</w:tbl>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 閬楃暀闂 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>閬楃暀闂</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>1. 绉诲姩绔槸鍚﹂渶瑕佸悓姝ュ紑鍙戯紵</w:t></w:r></w:p>
+<w:p><w:r><w:t>2. 涓庣幇鏈塃RP绯荤粺鐨勫鎺ヨ寖鍥村緟纭</w:t></w:r></w:p>
+<w:p><w:r><w:t>3. AI鏅鸿兘瀹㈡湇閲囩敤鑷爺妯″瀷杩樻槸绗笁鏂笰PI锛�</w:t></w:r></w:p>
+<w:p><w:r><w:t>4. 鏁版嵁闅愮涓嶢I鏁版嵁澶勭悊鐨勫悎瑙勬�ч渶璇勪及</w:t></w:r></w:p>
+
+<w:p><w:r><w:t/></w:r></w:p>
+
+<!-- 涓嬫浼氳 -->
+<w:p><w:pPr><w:pStyle w:val="heading1"/></w:pPr>
+ <w:r><w:t>涓嬫浼氳</w:t></w:r>
+</w:p>
+<w:p><w:r><w:t>鏃堕棿锛�2026骞碭鏈圶鏃�</w:t></w:r></w:p>
+<w:p><w:r><w:t>涓婚锛氳璁¤瘎瀹′細璁�</w:t></w:r></w:p>
+
+</w:body>
+</w:wordDocument>
\ No newline at end of file
--
Gitblit v1.9.3