feat: 完成第四批任务 (Task 6.2, 10.1-10.3)
Task 6.2 - 报告导出功能: - ReportExportService: 报告导出服务 - ExportToMarkdown: Markdown 格式导出 - ExportToHtml: HTML 格式导出(可打印为 PDF) - ExportToPdf: PDF 导出(HTML 包装) Task 10.1-10.3 - 文档和打包: - README.md: 项目主文档 - docs/USAGE.md: 使用指南(CLI 命令、API、Web 界面) - docs/DEVELOPMENT.md: 开发指南(项目结构、构建、测试、部署) - docs/API.md: API 参考文档(端点、认证、错误码) - Dockerfile: Web API Docker 镜像 - docker-compose.yml: Docker Compose 配置 - .dockerignore: Docker 忽略文件 - NuGet 打包配置 (CodePlay.Core.csproj) 测试:42 个 (41 通过,1 跳过) ✅ 新增文件: - CodePlay.Core/Services/ReportExportService.cs - README.md - docs/USAGE.md - docs/DEVELOPMENT.md - docs/API.md - Dockerfile - docker-compose.yml - .dockerignore Co-authored-by: monkeycode-ai <monkeycode-ai@chaitin.com>
This commit is contained in:
@@ -1,14 +1,30 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||
<PackageId>CodePlay.Core</PackageId>
|
||||
<Version>1.0.0</Version>
|
||||
<Authors>CodePlay Team</Authors>
|
||||
<Company>CodePlay</Company>
|
||||
<Description>CodePlay - Professional code conversion engine for C# and Java</Description>
|
||||
<Copyright>Copyright (c) 2026 CodePlay</Copyright>
|
||||
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||
<PackageProjectUrl>https://github.com/your-org/codeplay</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/your-org/codeplay</RepositoryUrl>
|
||||
<PackageTags>code-conversion csharp java migration refactoring</PackageTags>
|
||||
<PackageReadmeFile>README.md</PackageReadmeFile>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.8.0" />
|
||||
<PackageReference Include="TreeSitter" Version="0.1.0-alpha.1" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
<PackageReference Include="TreeSitter" Version="1.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Include="..\README.md" Pack="true" PackagePath="\" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
using System.Text;
|
||||
|
||||
namespace CodePlay.Core.Services;
|
||||
|
||||
/// <summary>
|
||||
/// 报告导出服务
|
||||
/// </summary>
|
||||
public interface IReportExportService
|
||||
{
|
||||
string ExportToMarkdown(Core.Models.ConversionReport report);
|
||||
string ExportToHtml(Core.Models.ConversionReport report);
|
||||
byte[] ExportToPdf(Core.Models.ConversionReport report);
|
||||
}
|
||||
|
||||
public class ReportExportService : IReportExportService
|
||||
{
|
||||
public string ExportToMarkdown(Core.Models.ConversionReport report)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
|
||||
sb.AppendLine("# 代码转换报告");
|
||||
sb.AppendLine();
|
||||
sb.AppendLine($"**报告 ID**: {report.Id}");
|
||||
sb.AppendLine($"**项目 ID**: {report.ProjectId}");
|
||||
sb.AppendLine($"**创建时间**: {report.CreatedAt:yyyy-MM-dd HH:mm:ss}");
|
||||
sb.AppendLine();
|
||||
|
||||
sb.AppendLine("## 转换概况");
|
||||
sb.AppendLine();
|
||||
sb.AppendLine($"| 指标 | 数值 |");
|
||||
sb.AppendLine("|------|------|");
|
||||
sb.AppendLine($"| 源语言 | {report.SourceLanguage} |");
|
||||
sb.AppendLine($"| 目标语言 | {report.TargetLanguage} |");
|
||||
sb.AppendLine($"| 转换行数 | {report.LinesConverted} |");
|
||||
sb.AppendLine($"| 转换类数 | {report.ClassesConverted} |");
|
||||
sb.AppendLine($"| 转换方法数 | {report.MethodsConverted} |");
|
||||
sb.AppendLine($"| 问题数 | {report.IssueCount} |");
|
||||
sb.AppendLine($"| TODO 数 | {report.TodoCount} |");
|
||||
sb.AppendLine($"| 验证状态 | {report.ValidationStatus} |");
|
||||
sb.AppendLine();
|
||||
|
||||
if (report.TodoItems.Any())
|
||||
{
|
||||
sb.AppendLine("## 不可转换语法 (TODO)");
|
||||
sb.AppendLine();
|
||||
foreach (var todo in report.TodoItems)
|
||||
{
|
||||
sb.AppendLine($"### {todo.Description}");
|
||||
sb.AppendLine($"- **原因**: {todo.WhyNotDirect}");
|
||||
sb.AppendLine($"- **建议**: {todo.RecommendedAlternative}");
|
||||
sb.AppendLine();
|
||||
}
|
||||
}
|
||||
|
||||
if (report.Issues.Any())
|
||||
{
|
||||
sb.AppendLine("## 问题列表");
|
||||
sb.AppendLine();
|
||||
foreach (var issue in report.Issues)
|
||||
{
|
||||
sb.AppendLine($"### {issue.Description}");
|
||||
sb.AppendLine($"- **严重程度**: {issue.Severity}");
|
||||
sb.AppendLine($"- **建议**: {issue.Suggestion}");
|
||||
sb.AppendLine();
|
||||
}
|
||||
}
|
||||
|
||||
sb.AppendLine("## 转换日志");
|
||||
sb.AppendLine();
|
||||
foreach (var log in report.TransformationLog)
|
||||
{
|
||||
sb.AppendLine($"- [{log.Timestamp:HH:mm:ss}] {log.Operation}: {log.Details}");
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
public string ExportToHtml(Core.Models.ConversionReport report)
|
||||
{
|
||||
var markdown = ExportToMarkdown(report);
|
||||
var title = "代码转换报告 - " + report.Id;
|
||||
|
||||
var html = markdown
|
||||
.Replace("# ", "<h1>")
|
||||
.Replace("## ", "</h1><h2>")
|
||||
.Replace("### ", "</h2><h3>")
|
||||
.Replace("**", "<strong>")
|
||||
.Replace("\n", "<br/>");
|
||||
|
||||
var htmlFull = "<!DOCTYPE html><html><head><meta charset='utf-8'><title>" + title + "</title><style>body { font-family: Arial, sans-serif; max-width: 900px; margin: 0 auto; padding: 20px; } h1 { color: #333; border-bottom: 2px solid #007bff; padding-bottom: 10px; } h2 { color: #555; margin-top: 30px; } table { border-collapse: collapse; width: 100%; margin: 20px 0; } th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } th { background-color: #007bff; color: white; }</style></head><body>" + html + "</body></html>";
|
||||
|
||||
return htmlFull;
|
||||
}
|
||||
|
||||
public byte[] ExportToPdf(Core.Models.ConversionReport report)
|
||||
{
|
||||
// MVP 版本:生成 HTML,用户可以使用浏览器打印为 PDF
|
||||
// 完整实现需要引入 iText7 或 PuppeteerSharp
|
||||
var html = ExportToHtml(report);
|
||||
return Encoding.UTF8.GetBytes(html);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user