2026-06-04 789ee31d8548162f2b511460e6b1c1e436d00e68
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
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", "提供依赖注入、AOP、配置管理等功能"));
        backendTech.add(createTech("ORM框架", "MyBatis-Plus 3.5", "数据库访问,支持自动代码生成"));
        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", "渐进式JavaScript框架"));
        frontendTech.add(createTech("UI组件", "Element Plus", "企业级UI组件库"));
        frontendTech.add(createTech("状态管理", "Pinia", "Vue官方状态管理库"));
        frontendTech.add(createTech("路由", "Vue Router", "单页面应用路由管理"));
        frontendTech.add(createTech("HTTP客户端", "Axios", "HTTP请求库"));
        frontendTech.add(createTech("构建工具", "Vite", "下一代前端构建工具"));
        data.put("frontendTech", frontendTech);
 
        // AI技术栈
        List<Map<String, String>> aiTech = new ArrayList<>();
        aiTech.add(createTech("大语言模型", "Claude API / OpenAI API", "智能客服、文档生成"));
        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", "人事管理", "员工档案、考勤、审批流程"));
        modules.add(createModule("MOD-007", "系统管理", "用户、角色、权限、日志"));
        modules.add(createModule("MOD-008", "AI服务", "智能客服、预测分析、文档识别"));
        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规范,接口文档完整"));
        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", "完善数据库ER图设计", "王XX", "X月X日"));
        actionItems.add(createActionItem("2", "补充API接口详细参数说明", "赵XX", "X月X日"));
        actionItems.add(createActionItem("3", "确认AI服务器GPU配置", "孙XX", "X月X日"));
        actionItems.add(createActionItem("4", "编写部署文档", "周XX", "X月X日"));
        data.put("actionItems", actionItems);
 
        // 加载模板并生成
        Template template = cfg.getTemplate("系统设计说明书.xml");
        StringWriter out = new StringWriter();
        template.process(data, out);
 
        // 保存为docx
        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;
    }
}