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 data = new HashMap<>(); // 项目基本信息 data.put("projectName", "产品库存管理系统"); data.put("projectVersion", "V1.0"); data.put("docDate", "2026年6月"); // Gitblit仓库地址 List> 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> 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> 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> 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> 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> 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> 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> 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 createRepo(String name, String url) { Map map = new HashMap<>(); map.put("name", name); map.put("url", url); return map; } private static Map createGitUser(String username, String realname, String role, String permission) { Map map = new HashMap<>(); map.put("username", username); map.put("realname", realname); map.put("role", role); map.put("permission", permission); return map; } private static Map createTestCase(String no, String module, String content, String expected, String actual, String status) { Map 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 createReviewRecord(String date, String submitter, String reviewer, String content, String result, String remark) { Map 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 createCommonIssue(String no, String type, String desc) { Map map = new HashMap<>(); map.put("no", no); map.put("type", type); map.put("desc", desc); return map; } private static Map createIteration(String version, String scope, String time, String owner, String status) { Map 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 createDailyProgress(String date, String person, String content, String progress, String remark) { Map 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 createIssue(String no, String desc, String finder, String owner, String priority, String status) { Map 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; } }