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;
|
}
|
}
|