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

208 lines
5.3 KiB
Go
Raw Normal View History

2025-07-20 20:53:26 +08:00
package esign
import (
"fmt"
)
// FileOpsService 文件操作服务
// 处理文件下载、流程查询等操作
type FileOpsService struct {
httpClient *HTTPClient
config *Config
}
// NewFileOpsService 创建文件操作服务
func NewFileOpsService(httpClient *HTTPClient, config *Config) *FileOpsService {
return &FileOpsService{
httpClient: httpClient,
config: config,
}
}
// UpdateConfig 更新配置
func (s *FileOpsService) UpdateConfig(config *Config) {
s.config = config
}
// DownloadSignedFile 下载已签署文件及附属材料
// 获取签署完成后的文件下载链接和证书下载链接
//
// 参数说明:
// - signFlowId: 签署流程ID
//
// 返回: 下载文件响应和错误信息
func (s *FileOpsService) DownloadSignedFile(signFlowId string) (*DownloadSignedFileResponse, error) {
fmt.Println("开始下载已签署文件及附属材料...")
// 发送API请求
urlPath := fmt.Sprintf("/v3/sign-flow/%s/attachments", signFlowId)
responseBody, err := s.httpClient.Request("GET", urlPath, nil)
if err != nil {
return nil, fmt.Errorf("下载已签署文件失败: %v", err)
}
// 解析响应
var response DownloadSignedFileResponse
if err := UnmarshalResponse(responseBody, &response); err != nil {
return nil, err
}
if err := CheckResponseCode(response.Code, response.Message); err != nil {
return nil, err
}
fmt.Printf("已签署文件下载信息获取成功!\n")
fmt.Printf("文件数量: %d\n", len(response.Data.Files))
fmt.Printf("附属材料数量: %d\n", len(response.Data.Attachments))
if response.Data.CertificateDownloadUrl != "" {
fmt.Printf("证书下载链接: %s\n", response.Data.CertificateDownloadUrl)
}
return &response, nil
}
// QuerySignFlowDetail 查询签署流程详情
// 获取签署流程的详细状态和参与方信息
//
// 参数说明:
// - signFlowId: 签署流程ID
//
// 返回: 流程详情响应和错误信息
func (s *FileOpsService) QuerySignFlowDetail(signFlowId string) (*QuerySignFlowDetailResponse, error) {
fmt.Println("开始查询签署流程详情...")
// 发送API请求
urlPath := fmt.Sprintf("/v3/sign-flow/%s/detail", signFlowId)
responseBody, err := s.httpClient.Request("GET", urlPath, nil)
if err != nil {
return nil, fmt.Errorf("查询签署流程详情失败: %v", err)
}
// 解析响应
var response QuerySignFlowDetailResponse
if err := UnmarshalResponse(responseBody, &response); err != nil {
return nil, err
}
if err := CheckResponseCode(response.Code, response.Message); err != nil {
return nil, err
}
fmt.Printf("查询签署流程详情响应: %+v\n", response)
return &response, nil
}
// GetSignedFileDownloadUrls 获取已签署文件的下载链接
// 从下载响应中提取所有文件的下载链接
//
// 参数说明:
// - downloadResponse: 下载文件响应
//
// 返回: 文件下载链接映射
func GetSignedFileDownloadUrls(downloadResponse *DownloadSignedFileResponse) map[string]string {
urls := make(map[string]string)
// 添加已签署文件
for _, file := range downloadResponse.Data.Files {
urls[file.FileName] = file.DownloadUrl
}
// 添加附属材料
for _, attachment := range downloadResponse.Data.Attachments {
urls[attachment.FileName] = attachment.DownloadUrl
}
return urls
}
// GetSignFlowStatusText 获取签署流程状态文本
// 从流程详情中提取状态信息
//
// 参数说明:
// - status: 流程状态码
//
// 返回: 流程状态描述
func GetSignFlowStatusText(status int32) string {
switch status {
case 1:
return "草稿"
case 2:
return "签署中"
case 3:
return "已完成"
case 4:
return "已撤销"
case 5:
return "已过期"
case 6:
return "已拒绝"
default:
return fmt.Sprintf("未知状态(%d)", status)
}
}
// GetSignerStatus 获取签署人状态
// 从流程详情中提取指定签署人的状态
//
// 参数说明:
// - detailResponse: 流程详情响应
// - signerName: 签署人姓名
//
// 返回: 签署人状态描述
func GetSignerStatus(detailResponse *QuerySignFlowDetailResponse, signerName string) string {
for _, signer := range detailResponse.Data.Signers {
var name string
if signer.PsnSigner != nil {
name = signer.PsnSigner.PsnName
} else if signer.OrgSigner != nil {
name = signer.OrgSigner.OrgName
}
if name == signerName {
switch signer.SignStatus {
case 1:
return "待签署"
case 2:
return "已签署"
case 3:
return "已拒绝"
case 4:
return "已过期"
default:
return fmt.Sprintf("未知状态(%d)", signer.SignStatus)
}
}
}
return "未找到签署人"
}
// IsSignFlowCompleted 检查签署流程是否完成
// 根据状态码判断签署流程是否已完成
//
// 参数说明:
// - detailResponse: 流程详情响应
//
// 返回: 是否完成
func IsSignFlowCompleted(detailResponse *QuerySignFlowDetailResponse) bool {
// 状态码2表示已完成
return detailResponse.Data.SignFlowStatus == 2
}
// GetFileList 获取文件列表
// 从下载响应中获取所有文件信息
//
// 参数说明:
// - downloadResponse: 下载文件响应
//
// 返回: 文件信息列表
func GetFileList(downloadResponse *DownloadSignedFileResponse) []SignedFileInfo {
var files []SignedFileInfo
// 添加已签署文件
files = append(files, downloadResponse.Data.Files...)
// 添加附属材料
files = append(files, downloadResponse.Data.Attachments...)
return files
}