| 
									
										
										
										
											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日"), | 
					
						
							|  |  |  |  | 		}, | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } |