fix组合包文档
This commit is contained in:
@@ -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字节流
|
||||
|
||||
Reference in New Issue
Block a user