fix组合包文档

This commit is contained in:
2025-12-11 11:14:31 +08:00
parent 09d7a4f076
commit 2c89b8cb26
3 changed files with 535 additions and 20 deletions

View File

@@ -90,16 +90,21 @@ func (g *PDFGeneratorRefactored) GenerateProductPDF(ctx context.Context, product
product.Price = decimal.NewFromFloat(price)
}
return g.generatePDF(product, doc)
return g.generatePDF(product, doc, nil)
}
// GenerateProductPDFFromEntity 从entity类型生成PDF推荐使用
func (g *PDFGeneratorRefactored) GenerateProductPDFFromEntity(ctx context.Context, product *entities.Product, doc *entities.ProductDocumentation) ([]byte, error) {
return g.generatePDF(product, doc)
return g.generatePDF(product, doc, nil)
}
// GenerateProductPDFWithSubProducts 从entity类型生成PDF支持组合包子产品文档
func (g *PDFGeneratorRefactored) GenerateProductPDFWithSubProducts(ctx context.Context, product *entities.Product, doc *entities.ProductDocumentation, subProductDocs []*entities.ProductDocumentation) ([]byte, error) {
return g.generatePDF(product, doc, subProductDocs)
}
// generatePDF 内部PDF生成方法
func (g *PDFGeneratorRefactored) generatePDF(product *entities.Product, doc *entities.ProductDocumentation) (result []byte, err error) {
func (g *PDFGeneratorRefactored) generatePDF(product *entities.Product, doc *entities.ProductDocumentation, subProductDocs []*entities.ProductDocumentation) (result []byte, err error) {
defer func() {
if r := recover(); r != nil {
// 将panic转换为error而不是重新抛出
@@ -174,9 +179,61 @@ func (g *PDFGeneratorRefactored) generatePDF(product *entities.Product, doc *ent
// 添加第一页(产品信息)
pageBuilder.AddFirstPage(pdf, product, doc, chineseFontAvailable)
// 如果有关联的文档,添加接口文档页面
if doc != nil {
pageBuilder.AddDocumentationPages(pdf, doc, chineseFontAvailable)
// 如果是组合包,需要特殊处理:先渲染所有文档,最后统一添加二维码
if product.IsPackage {
// 如果有关联的文档,添加接口文档页面(但不包含二维码和说明,后面统一添加)
if doc != nil {
pageBuilder.AddDocumentationPagesWithoutAdditionalInfo(pdf, doc, chineseFontAvailable)
}
// 如果有子产品文档,为每个子产品添加接口文档页面
if len(subProductDocs) > 0 {
for i, subDoc := range subProductDocs {
// 获取子产品信息从文档中获取ProductID然后查找对应的产品信息
// 注意这里我们需要从product.PackageItems中查找对应的子产品信息
var subProduct *entities.Product
if product.PackageItems != nil && i < len(product.PackageItems) {
if product.PackageItems[i].Product != nil {
subProduct = product.PackageItems[i].Product
}
}
// 如果找不到子产品信息,创建一个基本的子产品实体
if subProduct == nil {
subProduct = &entities.Product{
ID: subDoc.ProductID,
Code: subDoc.ProductID, // 使用ProductID作为临时Code
Name: fmt.Sprintf("子产品 %d", i+1),
}
}
pageBuilder.AddSubProductDocumentationPages(pdf, subProduct, subDoc, chineseFontAvailable, false)
}
}
// 在所有接口文档渲染完成后,统一添加二维码和后勤服务说明
// 使用主产品文档(如果存在),否则使用第一个子产品文档,如果都没有则创建一个空的文档对象
var finalDoc *entities.ProductDocumentation
if doc != nil {
finalDoc = doc
} else if len(subProductDocs) > 0 {
finalDoc = subProductDocs[0]
} else {
// 如果没有文档,创建一个空的文档对象,用于添加二维码和说明
finalDoc = &entities.ProductDocumentation{
ProductID: product.ID,
RequestMethod: "POST",
Version: "1.0",
}
}
// 始终添加二维码和后勤服务说明
pageBuilder.AddAdditionalInfo(pdf, finalDoc, chineseFontAvailable)
} else {
// 普通产品:使用原来的方法(包含二维码和说明)
if doc != nil {
pageBuilder.AddDocumentationPages(pdf, doc, chineseFontAvailable)
}
}
// 生成PDF字节流