package contract_request

import (
	"encoding/json"
	"git.sxidc.com/student-physical-examination/contract_lock_sdk/http"
	"git.sxidc.com/student-physical-examination/contract_lock_sdk/model/common"
	"os"
)

type ContractCreateWithfileuploadRequest struct {
	// <ext>inner-type:Json<CategoryInfo>;core:true</ext> 【用印流程】 用印流程  【作用】 1、传入此参数时用印流程引d和用印流程名称必传其一，均传入以用印流程引d为准 2、内部单位必须传入用印流程发起，外部单位无用印流程功能因此可不传入（如内部单位的用印流程配置为外部单位可发起，可传入用印流程） 3、未传入时则使用平台方默认用印流程 3、发起文件时，需选择使用的用印流程 【传参】 1、内部单位必须传入用印流程发起，外部单位无用印流程功能因此可不传入（如内部单位的用印流程配置为外部单位可发起，可传入用印流程） 2、用印流程id和用印流程名称必传其一，均传入以用印流程id为准 3、未传入时则使用平台方默认用印流程
	CategoryInfo string `json:"categoryInfo,omitempty"`
	// <ext>core:true</ext> 【是否需要使用用印流程】是否需要使用用印流程 【作用】 1、可配置是否使用用印流程发起电子签约，不使用用印流程则无法使用用印流程中预设的配置，也无法根据用印流程进行文件归类 2、true：使用用印流程发起，则以categoryInfo（用印流程）传参逻辑生效 3、false：不使用用印流程发起，则categoryInfo（用印流程）传参无效，将不使用用印流程发起电子签约 【传参】 取值范围：true（使用），false（不使用）；不传值默认为：true（使用）。
	NeedCategory *bool `json:"needCategory,omitempty"`
	// <ext>core:true</ext> 【文件主题】文件主题   【作用】 电子签约文件的标题，如签署劳动合同时，可设置为“劳动合同-XX公司-张三” 【传参】 最大长度：500（包含）。 【特殊说明】 用印流程-高级配置中可设置文件主题生成规则，若设置按规则自动生成，则接口传入无效；若设置为发起人自定义，则接口传入的文件主题生效
	Subject string `json:"subject"`
	// <ext>core:true</ext> 【是否发起电子签约】是否发起电子签约 【作用】 1、若立即发起，则接口调用成功后电子签约文件直接进入签署状态，签署人将按顺序进行签署（若签署前需要填参，则由对应的用户补全文件后内容后进入签署） 2、若保存为草稿，文件不会发起签署，后续若需继续修改签署信息可调用 <docs>/contract/edit</docs> ；后续若需发起时需调用 <docs>/contract/send</docs> 发起电子签约 【传参】 取值范围：true（立即发起），false（保存为草稿）；不传值默认为：true（立即发起）。
	Send string `json:"send,omitempty"`
	// <ext>inner-type:Json<OpenContractControlBean>;core:true</ext> 【“草稿”文件是否允许编辑和发起】“草稿”文件是否允许编辑和发起 【作用】 1、是否发起电子签约(send)中传入false时，电子签约将会若保存为草稿，文件不会发起签署 2、此处可控制创建的文件，用户登录电子签章系统中是否允许手动编辑和发起
	ContractControl string `json:"contractControl,omitempty"`
	// 【文件编号】文件编号  【作用】 电子签约文件的编号，方便对文件进行查询、归档等管理，如“QYS-20160101-000001” 【传参】 最大长度：500（包含）。 【特殊说明】 用印流程若设置按规则自动生成，则接口传入无效；若设置为发起人自定义，则接口传入的文件编号生效
	Sn string `json:"sn,omitempty"`
	// <ext>core:true;format:date</ext> 【文件定时发起时间】文件定时发起时间 【作用】 可以创建文件后保存草稿，在设定的时间由系统自动发起文件 【传参】 1、仅在send（是否发起电子签约）为false（保存为草稿）时生效。 2、日期格式：yyyy-MM-dd HH:mm
	SendTimeStr string `json:"sendTimeStr,omitempty"`
	// 【第三方业务系统文件id】第三方业务系统文件id 【作用】 可传入业务系统中唯一的文件id，方便后续查询、管理电子签约文件 【传参】 最大长度：200（包含）。 【特殊说明】 1、bizid不能与草稿、签署中、已完成、作废中的电子签约文件重复 2、如果电子签约文件已作废、已撤回、已拒签，则允许其bizid被重复使用
	BizId string `json:"bizId,omitempty"`
	// 【业务数据 】业务数据 【作用】 可传入业务系统中需要记录的数据，比如相关审批意见、电子签约文件的说明，不会在页面展示，但支持回调给业务系统 【传参】 最大长度：4000（包含）。
	BusinessData string `json:"businessData,omitempty"`
	// <ext>deprecated:true</ext> 【文件描述】文件描述 【作用】 用于对文件进行补充描述，不会在页面展示，仅在系统数据库中记录 【传参】 最大长度：1200（包含）。
	Description string `json:"description,omitempty"`
	// <ext>core:true</ext> 【发起主体名称】发起主体名称 【作用】 即电子签约文件的发起单位，仅能传入用印流程设置的发起主体范围 【传参】 最大长度：500（包含）。
	TenantName string `json:"tenantName,omitempty"`
	// <ext>inner-type:Json<UserInfoRequest>;core:true</ext> 【发起人】发起人 【作用】 记录该电子签约文件的发起人 【传参】 1、参数必传其一，传入多个参数时只按参数中最高优先级查询，优先级为用户id>联系方式>手机号>邮箱>成员编号>用户证件号>第三方业务系统用户id>登录账号。 2、使用联系方式或成员编号查询用户且用户不存在时，将使用对应的参数值和发起人姓名创建新用户，并会加入发起主体组织内部。 3、不传发起人时默认为发起主体名称
	CreatorInfo string `json:"creatorInfo,omitempty"`
	// <ext>inner-type:Json<CustomizeFieldInfo[]>;core:true</ext> 【自定义字段】自定义字段 【作用】 1、除文件主题、文件编号等基础信息，不同类型的文件发起时需要填写的字段信息是不同的，例如发起采购合同可填写金额，发起人事合同可填写员工岗位 2、自定义字段可在电子签章管理后台统一定义或在用印流程中根据业务定义，定义好后可通过该参数传入字段值
	CustomizeFieldInfo string `json:"customizeFieldInfo,omitempty"`
	// <ext>core:true</ext> 【签署文件类型】签署文件类型 【作用】 1、可指定签署的文件类型，包括PDF签署或OFD签署 2、选择后将会把签署文档转换为对应的文件格式进行签署 3、若签署文档为ofd格式，仅能支持OFD签署，且只能使用OFD用印流程或不使用用印流程发起电子签约 【传参】 取值范围：PDF（PDF签署），OFD（OFD签署）；不传值默认为：PDF（PDF签署）。
	SignFileType string `json:"signFileType,omitempty"`
	// <ext>core:true</ext> 【本地上传的签署文档】本地上传的签署文档 【作用】 上传需要签署的本地文档，支持上传多个 【传参】 1、支持的文件格式：pdf，doc，docx，wps，rtf，png，gif，jpg，jpeg，tiff，html，htm，xls，xlsx，txt，ofd，dwg，ppt，pptx，ofd。 2、若上传CAD图纸（dwg格式），请先开启【电子签章管理后台-自定义配置DWG_SWITCH】。 3、当上传的文档为PDF时，PDF的版本需要>1.3；上传签署文档大小限制可在【电子签章管理后台-电子用印设置-文件上传限制】进行配置。 【特殊说明】 用印流程-文件设置中开启“发起签约时，允许新增文件”，则传入的签署文档与用印流程中配置的文件模板都作为电子签约文档；若未开启配置，则只能使用用印流程中配置的文件模板
	SignFiles []*os.File `json:"signFiles,omitempty"`
	// <ext>core:true</ext> 【本地/网络路径上传的签署文档】本地/网络路径上传的签署文档 【作用】 通过本地路径或网络路径获取文件进行上传，文件上传后系统将自动将文档转换为PDF/OFD格式，方便后续进行签署 【传参】 1、支持的文件格式：pdf，doc，docx，wps，rtf，png，gif，jpg，jpeg，tiff，html，htm，xls，xlsx，txt，ofd，dwg，ppt，pptx，ofd。 2、若上传CAD图纸（dwg格式），请先开启【电子签章管理后台-自定义配置DWG_SWITCH】。 3、当上传的文档为PDF时，PDF的版本需要>1.3；上传签署文档大小限制可在【电子签章管理后台-电子用印设置-文件上传限制】进行配置。 4、传参格式：[\"C:\\\\Users\\\\Administrator\\\\Desktop\\\\文档一.pdf\",\"C:\\\\Users\\\\Administrator\\\\Desktop\\\\文档二.pdf\"] 【特殊说明】 用印流程-文件设置中开启“发起签约时，允许新增文件”，则传入的签署文档与用印流程中配置的文件模板都作为电子签约文档；若未开启配置，则只能使用用印流程中配置的文件模板
	Urls string `json:"urls,omitempty"`
	// <ext>inner-type:Json<SignFileConfigInfo[]>;core:true</ext> 【签署文档配置信息】签署文档配置信息 【传参】 当同时使用本地上传、本地/网络路径上传签署文档时，将先按传参顺序匹配本地上传的文档，再匹配本地/网络路径上传的文档
	SignFileConfigInfo string `json:"signFileConfigInfo,omitempty"`
	// <ext>inner-type:Json<WithfileuploadFillSignatory[]>;core:true</ext> 【拟定方】拟定方 【作用】 即需拟定文件的组织和个人（如文件正式发起拟定前需与各签约方共同补全文件参数内容并完成内部审批）。 内部组织拟定方下可设置拟定节点（个人拟定、个人审批），其余拟定方仅支持个人拟定 【特殊说明】 拟定方须提前在用印流程预设好，接口暂不支持自定义拟定方。仅支持接口通过传入拟定方、拟定节点类型和顺序匹配流程预设的审批节点，为审批节点指定审批人
	FillSignatoryInfo string `json:"fillSignatoryInfo,omitempty"`
	// <ext>inner-type:Json<WithfileuploadSignatory[]>;core:true</ext> 【签署方 】签署方  【作用】 即需签署的组织和个人，组织签署方下可设置签署节点（签字、审批、签章、执业章签署等），个人签署方仅支持个人签字 【特殊说明】 签署方为空时，需在签署完成后调用 <docs>/contract/finish</docs> 完成电子签约，否则文件一直会处于签署状态不会结束
	SignatoryInfo string `json:"signatoryInfo,omitempty"`
	// <ext>core:true;format:date</ext> 【签署截止日期】签署截止日期 【作用】 若超过该日期，文件的所有签署方将不能进行文件签署，文件状态变为“已截止签署” 【传参】 1、日期格式：yyyy-MM-dd。 2、若传入2022-03-09，系统将在2022年3月9日的23时59分59秒后将文件标记为“已截止签署”。
	ExpireTime string `json:"expireTime,omitempty"`
	// <ext>core:true;format:date</ext> 【文件到期日期】文件到期日期 【作用】 文件履行期限的截止日期，若超过此日期后，文件将标记为“已到期” 【传参】 1、日期格式：yyyy-MM-dd。 2、传入日期必须晚于当前日期，，若传入2022-03-09，系统将在2022年3月9日的23时59分59秒将文件标记为“已到期”。
	EndTime string `json:"endTime,omitempty"`
	// <ext>inner-type:Json<TransmitterInfo[]>;core:true</ext> 【抄送人】抄送人 【作用】 用于添加该电子签约文件的抄送人，抄送人将收到文件通知，可查看、下载文件 【传参】 若使用联系方式查询用户，用户不存在时，则使用传入的姓名、联系方式创建用户。
	TransmitterInfo string `json:"transmitterInfo,omitempty"`
	// 【公共标签】公共标签 【作用】 可传入电子签约文件的标签对文件进行分类、筛选等管理，公共标签仅发起方内部成员可见、可编辑 【传参】 支持传入多个，传参方式为:[\"公共标签1\",\"公共标签2\"]。
	ContractPublicTag string `json:"contractPublicTag,omitempty"`
	// 【文档脱敏设置】文档脱敏设置 【作用】 1、常用于公文，需要将红头文件以及加盖的印章转成黑白，可在此处提前设置需转换的格式，文档签署完成后会转换为指定格式，并长期存储，通过2.17.2 下载签署任务文档（/document/download)下载转化后的文档 2、支持转换的类型包括： PDF黑白黑章文件：文件为黑白，去除已签署的数字签名，保留已签署的印章/签名/日期/批注但转为黑白图片，转化为PDF格式 OFD黑白黑章文件：文件为黑白，去除已签署的数字签名，保留已签署的印章/签名/日期/批注但转为黑白图片，转化为OFD格式 【传参】 取值范围：PDF_BLACK_SEAL（PDF黑白黑章文件），OFD_BLACK_SEAL（OFD黑白黑章文件）；可选多项；不传值默认为：不进行转换。
	DocumentFormats string `json:"documentFormats,omitempty"`
	// 【消息通知渠道】消息通知渠道 【传参】 1、取值范围：0（发送全部通知），1（仅发送短信通知），2（仅发送邮件通知）；不传值默认为：0（发送全部通知）。 2、当用印流程配置消息通知渠道时，以用印流程配置为准。
	MsgCode string `json:"msgCode,omitempty"`
	// <ext>inner-type:Json<FileReturnFormat></ext> 【文件签署完成后返回签约文件】文件签署完成后返回签约文件 【作用】 若本次电子签约中所有签署方的全部签署节点，均为自动签署且全部签署完成后，可配置返回签署后的电子签约文件
	FileReturnFormat string `json:"fileReturnFormat,omitempty"`
	// <ext>inner-type:Json<ContractRequest></ext> 【需作废的电子签约文件】需作废的电子签约文件 【作用】 1、用印流程中可设置作废模式为“新签模式”：可使用指定流程发起一份新的电子签约，新文件签署完成后，将原文件状态修改为“已作废” 2、若创建电子签约时传入的用印流程被设置可以作废其他流程下的电子签约文件，此处可传入需作废的原文件信息 3、仅支持传入已完成、强制结束状态的电子签约，未传入时则正常发起新签文件 【传参】 电子签约文件id和第三方业务系统文件id必传其一，均传入以电子签约文件id为准。
	CancelContractInfo       string                                `json:"cancelContractInfo,omitempty"`
	CategoryInfoObject       *common.CategoryInfo                  `json:"categoryInfoObject,omitempty"`
	FileReturnFormatObject   *common.FileReturnFormat              `json:"fileReturnFormatObject,omitempty"`
	TransmitterInfoObject    []*common.TransmitterInfo             `json:"transmitterInfoObject,omitempty"`
	FillSignatoryInfoObject  []*common.WithfileuploadFillSignatory `json:"fillSignatoryInfoObject,omitempty"`
	SignatoryInfoObject      []*common.WithfileuploadSignatory     `json:"signatoryInfoObject,omitempty"`
	SignFileConfigInfoObject []*common.SignFileConfigInfo          `json:"signFileConfigInfoObject,omitempty"`
	CancelContractInfoObject *common.ContractRequest               `json:"cancelContractInfoObject,omitempty"`
	CustomizeFieldInfoObject []*common.CustomizeFieldInfo          `json:"customizeFieldInfoObject,omitempty"`
	ContractControlObject    *common.OpenContractControlBean       `json:"contractControlObject,omitempty"`
	CreatorInfoObject        *common.UserInfoRequest               `json:"creatorInfoObject,omitempty"`
}

func (obj ContractCreateWithfileuploadRequest) GetUrl() string {
	return "/contract/create/withfileupload"
}

func (obj ContractCreateWithfileuploadRequest) GetHttpParameter() *http.HttpParameter {
	parameter := http.NewPostHttpParameter()
	parameter.AddParam("needCategory", obj.NeedCategory)
	parameter.AddParam("subject", obj.Subject)
	parameter.AddParam("send", obj.Send)
	parameter.AddParam("sn", obj.Sn)
	parameter.AddParam("sendTimeStr", obj.SendTimeStr)
	parameter.AddParam("bizId", obj.BizId)
	parameter.AddParam("businessData", obj.BusinessData)
	parameter.AddParam("description", obj.Description)
	parameter.AddParam("tenantName", obj.TenantName)
	parameter.AddParam("signFileType", obj.SignFileType)
	parameter.AddParam("urls", obj.Urls)
	parameter.AddParam("expireTime", obj.ExpireTime)
	parameter.AddParam("endTime", obj.EndTime)
	parameter.AddParam("contractPublicTag", obj.ContractPublicTag)
	parameter.AddParam("documentFormats", obj.DocumentFormats)
	parameter.AddParam("msgCode", obj.MsgCode)
	parameter.AddListFiles("signFiles", obj.SignFiles)
	if obj.ContractControlObject != nil {
		jsonBytes, _ := json.Marshal(obj.ContractControlObject)
		parameter.AddParam("contractControl", string(jsonBytes))
	} else {
		parameter.AddParam("contractControl", obj.ContractControl)
	}
	if obj.SignFileConfigInfoObject != nil {
		jsonBytes, _ := json.Marshal(obj.SignFileConfigInfoObject)
		parameter.AddParam("signFileConfigInfo", string(jsonBytes))
	} else {
		parameter.AddParam("signFileConfigInfo", obj.SignFileConfigInfo)
	}
	if obj.TransmitterInfoObject != nil {
		jsonBytes, _ := json.Marshal(obj.TransmitterInfoObject)
		parameter.AddParam("transmitterInfo", string(jsonBytes))
	} else {
		parameter.AddParam("transmitterInfo", obj.TransmitterInfo)
	}
	if obj.FileReturnFormatObject != nil {
		jsonBytes, _ := json.Marshal(obj.FileReturnFormatObject)
		parameter.AddParam("fileReturnFormat", string(jsonBytes))
	} else {
		parameter.AddParam("fileReturnFormat", obj.FileReturnFormat)
	}
	if obj.CreatorInfoObject != nil {
		jsonBytes, _ := json.Marshal(obj.CreatorInfoObject)
		parameter.AddParam("creatorInfo", string(jsonBytes))
	} else {
		parameter.AddParam("creatorInfo", obj.CreatorInfo)
	}
	if obj.CustomizeFieldInfoObject != nil {
		jsonBytes, _ := json.Marshal(obj.CustomizeFieldInfoObject)
		parameter.AddParam("customizeFieldInfo", string(jsonBytes))
	} else {
		parameter.AddParam("customizeFieldInfo", obj.CustomizeFieldInfo)
	}
	if obj.FillSignatoryInfoObject != nil {
		jsonBytes, _ := json.Marshal(obj.FillSignatoryInfoObject)
		parameter.AddParam("fillSignatoryInfo", string(jsonBytes))
	} else {
		parameter.AddParam("fillSignatoryInfo", obj.FillSignatoryInfo)
	}
	if obj.CancelContractInfoObject != nil {
		jsonBytes, _ := json.Marshal(obj.CancelContractInfoObject)
		parameter.AddParam("cancelContractInfo", string(jsonBytes))
	} else {
		parameter.AddParam("cancelContractInfo", obj.CancelContractInfo)
	}
	if obj.SignatoryInfoObject != nil {
		jsonBytes, _ := json.Marshal(obj.SignatoryInfoObject)
		parameter.AddParam("signatoryInfo", string(jsonBytes))
	} else {
		parameter.AddParam("signatoryInfo", obj.SignatoryInfo)
	}
	if obj.CategoryInfoObject != nil {
		jsonBytes, _ := json.Marshal(obj.CategoryInfoObject)
		parameter.AddParam("categoryInfo", string(jsonBytes))
	} else {
		parameter.AddParam("categoryInfo", obj.CategoryInfo)
	}
	return parameter
}
