2026-06-03 c7d92d01b02f6b26b17dc77b217f0ffe39615ebe
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
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", "张XX", "项目管理员", "RW+(所有仓库)"));
        gitUsers.add(createGitUser("wangxx", "王XX", "后端开发", "RW(后端、数据库)"));
        gitUsers.add(createGitUser("zhaoxx", "赵XX", "后端开发", "RW(后端、数据库)"));
        gitUsers.add(createGitUser("chenxx", "陈XX", "前端开发", "RW(前端仓库)"));
        gitUsers.add(createGitUser("sunxx", "孙XX", "AI工程师", "RW(后端、AI模块)"));
        gitUsers.add(createGitUser("liuxx", "刘XX", "测试工程师", "R(所有仓库)"));
        gitUsers.add(createGitUser("zhouxx", "周XX", "运维工程师", "RW(文档、部署脚本)"));
        data.put("gitUsers", gitUsers);
 
        // 测试用例
        List<Map<String, String>> testCases = new ArrayList<>();
        testCases.add(createTestCase("TC-001", "登录模块", "用户名密码正确登录", "登录成功", "登录成功", "通过"));
        testCases.add(createTestCase("TC-002", "登录模块", "用户名错误登录", "提示用户不存在", "提示正确", "通过"));
        testCases.add(createTestCase("TC-003", "库存管理", "入库操作-正常数据", "入库成功", "入库成功", "通过"));
        testCases.add(createTestCase("TC-004", "库存管理", "出库操作-库存不足", "提示库存不足", "提示正确", "通过"));
        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模块", "智能问答功能", "返回正确答案", "返回正确", "进行中"));
        testCases.add(createTestCase("TC-010", "系统管理", "用户权限配置", "权限生效", "权限生效", "通过"));
        data.put("testCases", testCases);
 
        // 代码Review记录
        List<Map<String, String>> reviewRecords = new ArrayList<>();
        reviewRecords.add(createReviewRecord("2026-05-20", "王XX", "张XX", "库存模块入库功能", "通过", "代码规范,逻辑清晰"));
        reviewRecords.add(createReviewRecord("2026-05-21", "赵XX", "王XX", "采购订单审批流程", "通过", "需补充异常处理"));
        reviewRecords.add(createReviewRecord("2026-05-22", "陈XX", "张XX", "前端登录页面优化", "通过", "UI符合设计稿"));
        reviewRecords.add(createReviewRecord("2026-05-23", "王XX", "赵XX", "库存预警定时任务", "通过", "性能需优化"));
        reviewRecords.add(createReviewRecord("2026-05-24", "孙XX", "王XX", "AI智能客服接口", "通过", "需增加错误重试机制"));
        reviewRecords.add(createReviewRecord("2026-05-25", "赵XX", "王XX", "设备保养验收功能", "进行中", ""));
        data.put("reviewRecords", reviewRecords);
 
        // 常见问题
        List<Map<String, String>> commonIssues = new ArrayList<>();
        commonIssues.add(createCommonIssue("1", "代码规范", "变量命名不规范,需遵循驼峰命名法"));
        commonIssues.add(createCommonIssue("2", "代码规范", "缺少必要的注释说明"));
        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周", "王XX", "已完成"));
        iterations.add(createIteration("v1.1.0", "库存管理模块", "第5-8周", "王XX", "已完成"));
        iterations.add(createIteration("v1.2.0", "采购销售模块", "第9-12周", "赵XX", "已完成"));
        iterations.add(createIteration("v1.3.0", "质检设备模块", "第13-16周", "王XX", "进行中"));
        iterations.add(createIteration("v1.4.0", "人事协同模块", "第17-20周", "赵XX", "待开始"));
        iterations.add(createIteration("v1.5.0", "AI智能化功能", "第21-24周", "孙XX", "待开始"));
        data.put("iterations", iterations);
 
        // 每日进度
        List<Map<String, String>> dailyProgress = new ArrayList<>();
        dailyProgress.add(createDailyProgress("2026-05-20", "王XX", "完成入库模块开发", "100%", ""));
        dailyProgress.add(createDailyProgress("2026-05-20", "赵XX", "采购订单审批流程开发", "80%", "待联调"));
        dailyProgress.add(createDailyProgress("2026-05-20", "陈XX", "前端库存页面优化", "100%", ""));
        dailyProgress.add(createDailyProgress("2026-05-21", "王XX", "库存预警定时任务开发", "90%", "待测试"));
        dailyProgress.add(createDailyProgress("2026-05-21", "赵XX", "采购订单审批流程联调", "100%", ""));
        dailyProgress.add(createDailyProgress("2026-05-21", "孙XX", "AI接口调研与技术选型", "70%", "需确认"));
        dailyProgress.add(createDailyProgress("2026-05-22", "王XX", "设备保养模块开发", "60%", "进行中"));
        dailyProgress.add(createDailyProgress("2026-05-22", "赵XX", "质检记录功能开发", "50%", "进行中"));
        data.put("dailyProgress", dailyProgress);
 
        // 问题跟踪
        List<Map<String, String>> issues = new ArrayList<>();
        issues.add(createIssue("ISS-001", "库存查询响应慢", "刘XX", "王XX", "高", "已解决"));
        issues.add(createIssue("ISS-002", "入库批号校验逻辑错误", "刘XX", "王XX", "高", "已解决"));
        issues.add(createIssue("ISS-003", "采购订单金额计算精度问题", "刘XX", "赵XX", "中", "已解决"));
        issues.add(createIssue("ISS-004", "前端分页组件样式异常", "刘XX", "陈XX", "低", "进行中"));
        issues.add(createIssue("ISS-005", "AI接口超时问题", "孙XX", "孙XX", "高", "进行中"));
        issues.add(createIssue("ISS-006", "设备保养提醒未触发", "刘XX", "王XX", "中", "待处理"));
        data.put("issues", issues);
 
        // 加载模板并生成
        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> 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;
    }
}