package fadada import ( "fmt" "strings" ) // AuthConfig 认证相关配置 type AuthConfig struct { RedirectURL string `json:"redirectUrl" yaml:"redirect_url"` } // SignConfig 签署相关配置 type SignConfig struct { RedirectURL string `json:"redirectUrl" yaml:"redirect_url"` } // ContractConfig 合同相关配置 type ContractConfig struct { Name string `json:"name" yaml:"name"` ExpireDays int `json:"expireDays" yaml:"expire_days"` RetryCount int `json:"retryCount" yaml:"retry_count"` } // CallbackConfig 回调配置 type CallbackConfig struct { Enabled bool `json:"enabled" yaml:"enabled"` } // TemplateFields 合作协议模板控件 fieldId type TemplateFields struct { // AgreementNo 协议编号控件编码列表(法大大控件不可复用,多处填同一值) AgreementNo []string `json:"agreementNo" yaml:"agreement_no"` ContractDate string `json:"contractDate" yaml:"contract_date"` // PartyAName 甲方企业名控件编码列表(多处填同一企业名) PartyAName []string `json:"partyAName" yaml:"party_a_name"` PartyAUSCC string `json:"partyAUscc" yaml:"party_a_uscc"` PartyAAddress string `json:"partyAAddress" yaml:"party_a_address"` PartyARep string `json:"partyARep" yaml:"party_a_rep"` PartyASignDate string `json:"partyASignDate" yaml:"party_a_sign_date"` PartyBSignDate string `json:"partyBSignDate" yaml:"party_b_sign_date"` } // Config 法大大服务配置 type Config struct { AppID string `json:"appId" yaml:"app_id"` AppSecret string `json:"appSecret" yaml:"app_secret"` ServerURL string `json:"serverUrl" yaml:"server_url"` OpenCorpID string `json:"openCorpId" yaml:"open_corp_id"` // NoAuthSceneCode 免验证签场景码;仅 freeSignType=business 时需要。当前按模板免验证签,可留空。 NoAuthSceneCode string `json:"noAuthSceneCode" yaml:"no_auth_scene_code"` TemplateID string `json:"templateId" yaml:"template_id"` // PartyAActorID / PartyBActorID 签署模板中的参与方标识(actorId),须与模板角色名一致 PartyAActorID string `json:"partyAActorId" yaml:"party_a_actor_id"` PartyBActorID string `json:"partyBActorId" yaml:"party_b_actor_id"` // TemplateDocID 签署模板文档 docId(填单必填);为空则创建任务后从详情自动解析 TemplateDocID string `json:"templateDocId" yaml:"template_doc_id"` TemplateFields *TemplateFields `json:"templateFields" yaml:"template_fields"` Contract *ContractConfig `json:"contract" yaml:"contract"` Auth *AuthConfig `json:"auth" yaml:"auth"` Sign *SignConfig `json:"sign" yaml:"sign"` Callback *CallbackConfig `json:"callback" yaml:"callback"` } // NewConfig 创建并校验法大大配置 func NewConfig( appID, appSecret, serverURL, openCorpID, noAuthSceneCode, templateID string, partyAActorID, partyBActorID, templateDocID string, fields *TemplateFields, contract *ContractConfig, auth *AuthConfig, sign *SignConfig, callback *CallbackConfig, ) (*Config, error) { if appID == "" { return nil, fmt.Errorf("法大大应用ID不能为空") } if appSecret == "" { return nil, fmt.Errorf("法大大应用密钥不能为空") } if serverURL == "" { return nil, fmt.Errorf("法大大服务器URL不能为空") } return &Config{ AppID: appID, AppSecret: appSecret, ServerURL: serverURL, OpenCorpID: openCorpID, NoAuthSceneCode: noAuthSceneCode, TemplateID: templateID, PartyAActorID: partyAActorID, PartyBActorID: partyBActorID, TemplateDocID: templateDocID, TemplateFields: fields, Contract: contract, Auth: auth, Sign: sign, Callback: callback, }, nil } // Validate 验证配置完整性 func (c *Config) Validate() error { if c.AppID == "" { return fmt.Errorf("法大大应用ID不能为空") } if c.AppSecret == "" { return fmt.Errorf("法大大应用密钥不能为空") } if c.ServerURL == "" { return fmt.Errorf("法大大服务器URL不能为空") } return nil } // ValidateTemplateFields 校验模板填单所需配置 func (c *Config) ValidateTemplateFields() error { if c.TemplateID == "" { return fmt.Errorf("法大大模板ID不能为空") } if c.OpenCorpID == "" { return fmt.Errorf("法大大 open_corp_id 不能为空") } if c.TemplateFields == nil { return fmt.Errorf("法大大 template_fields 未配置") } f := c.TemplateFields if len(f.AgreementNo) == 0 { return fmt.Errorf("法大大 template_fields.agreement_no 不能为空") } for i, id := range f.AgreementNo { if strings.TrimSpace(id) == "" { return fmt.Errorf("法大大 template_fields.agreement_no[%d] 不能为空", i) } } if len(f.PartyAName) == 0 { return fmt.Errorf("法大大 template_fields.party_a_name 不能为空") } for i, id := range f.PartyAName { if strings.TrimSpace(id) == "" { return fmt.Errorf("法大大 template_fields.party_a_name[%d] 不能为空", i) } } // party_a/b_sign_date 为签署控件,签署时自动写入,填单可不配 required := map[string]string{ "contract_date": f.ContractDate, "party_a_uscc": f.PartyAUSCC, "party_a_address": f.PartyAAddress, "party_a_rep": f.PartyARep, } for name, id := range required { if id == "" { return fmt.Errorf("法大大 template_fields.%s 不能为空", name) } } return nil } // ResolvePartyAActorID 甲方参与方标识(优先配置,默认与签署模板角色名一致) func (c *Config) ResolvePartyAActorID() string { if c != nil && c.PartyAActorID != "" { return c.PartyAActorID } return ActorIDPartyA } // ResolvePartyBActorID 乙方参与方标识(优先配置,默认与签署模板角色名一致) func (c *Config) ResolvePartyBActorID() string { if c != nil && c.PartyBActorID != "" { return c.PartyBActorID } return ActorIDPartyB } const ( // 接口成功码 successCode = "100000" // 个人证件类型:身份证(文档 userIdentType) UserIdentTypeIDCard = "id_card" // 企业认证方式:法人认证(文档 corpIdentMethod) CorpIdentMethodLegalRep = "legalRep" // 经办人认证方式:手机号(文档 oprIdentMethod) OprIdentMethodMobile = "mobile" )