Files
tyapi-server/internal/shared/esign/template_service.go

168 lines
4.0 KiB
Go
Raw Normal View History

2025-07-20 20:53:26 +08:00
package esign
import (
"fmt"
"time"
)
// TemplateService 模板服务
// 处理模板填写和文件生成相关操作
type TemplateService struct {
httpClient *HTTPClient
config *Config
}
// NewTemplateService 创建模板服务
func NewTemplateService(httpClient *HTTPClient, config *Config) *TemplateService {
return &TemplateService{
httpClient: httpClient,
config: config,
}
}
// UpdateConfig 更新配置
func (s *TemplateService) UpdateConfig(config *Config) {
s.config = config
}
// Fill 填写模板生成文件
// 根据模板ID和填写内容生成包含填写内容的文档
//
// 参数说明:
// - components: 需要填写的组件列表,包含字段键名和值
//
// 返回: 生成的文件ID和错误信息
func (s *TemplateService) Fill(components []Component) (*FillTemplate, error) {
fmt.Println("开始填写模板生成文件...")
// 生成带时间戳的文件名
2025-07-28 01:46:39 +08:00
fileName := generateFileName(s.config.Contract.Name, "pdf")
2025-07-20 20:53:26 +08:00
// 构建请求数据
requestData := FillTemplateRequest{
DocTemplateID: s.config.TemplateID,
FileName: fileName,
Components: components,
}
// 序列化请求数据
jsonData, err := MarshalRequest(requestData)
if err != nil {
return nil, err
}
// 发送API请求
responseBody, err := s.httpClient.Request("POST", "/v3/files/create-by-doc-template", jsonData)
if err != nil {
return nil, fmt.Errorf("填写模板失败: %v", err)
}
// 解析响应
var response FillTemplateResponse
if err := UnmarshalResponse(responseBody, &response); err != nil {
return nil, err
}
// 检查响应状态
if err := CheckResponseCode(response.Code, response.Message); err != nil {
return nil, err
}
fmt.Printf("模板填写成功文件ID: %s\n", response.Data.FileID)
return &FillTemplate{
FileID: response.Data.FileID,
FileDownloadUrl: response.Data.FileDownloadUrl,
FileName: fileName,
TemplateID: s.config.TemplateID,
FillTime: time.Now(),
}, nil
}
// FillWithDefaults 使用默认数据填写模板
// 使用预设的默认数据填写模板,适用于测试或标准流程
//
// 参数说明:
// - partyA: 甲方企业名称
// - legalRepA: 甲方法人姓名
// - partyB: 乙方企业名称
// - legalRepB: 乙方法人姓名
//
// 返回: 生成的文件ID和错误信息
func (s *TemplateService) FillWithDefaults(partyA, legalRepA, partyB, legalRepB string) (*FillTemplate, error) {
// 构建默认填写组件
components := []Component{
{
ComponentKey: "JFQY",
ComponentValue: partyA,
},
{
ComponentKey: "JFFR",
ComponentValue: legalRepA,
},
{
ComponentKey: "YFQY",
ComponentValue: partyB,
},
{
ComponentKey: "YFFR",
ComponentValue: legalRepB,
},
{
ComponentKey: "QDRQ",
ComponentValue: formatDateForTemplate(),
},
}
return s.Fill(components)
}
// FillWithCustomData 使用自定义数据填写模板
// 允许传入自定义的组件数据来填写模板
//
// 参数说明:
// - customComponents: 自定义组件数据
//
// 返回: 生成的文件ID和错误信息
func (s *TemplateService) FillWithCustomData(customComponents map[string]string) (*FillTemplate, error) {
var components []Component
// 将map转换为Component切片
for key, value := range customComponents {
components = append(components, Component{
ComponentKey: key,
ComponentValue: value,
})
}
return s.Fill(components)
}
// CreateDefaultComponents 创建默认模板数据
// 返回用于测试的默认模板填写数据
//
// 返回: 默认组件数据
func CreateDefaultComponents() []Component {
return []Component{
{
ComponentKey: "JFQY",
ComponentValue: "海南省学宇思网络科技有限公司",
},
{
ComponentKey: "JFFR",
ComponentValue: "刘福思",
},
{
ComponentKey: "YFQY",
ComponentValue: "测试企业",
},
{
ComponentKey: "YFFR",
ComponentValue: "测试法人",
},
{
ComponentKey: "QDRQ",
ComponentValue: time.Now().Format("2006年01月02日"),
},
}
}