فهرست منبع

任务 #6612 【Go查询】订单系统:交易商签署合同时,所属的经纪会员为甲方签合同

zhouxnsz 10 ماه پیش
والد
کامیت
14498001ad

+ 6 - 6
config/config.xml

@@ -54,12 +54,12 @@
     <SecretId value="AKIDPktwvneP2WqxvmWFsMclmfLLKDyrbAXp"/>
     <SecretKey value="GNH9tX8c6Wls02vhNzUvdLuGMYfeVErM"/>
     <EndPoint value="essbasic.tencentcloudapi.com"/>
-    <AppId value="yDCADUUpu1n1m4UEI0NjHCMBOg0yst3p"/>
-    <ProxyOrganizationName value="深圳市永坤黄金有限公司"/>
-    <ProxyOrganizationOpenId value="YKHJ"/>
-    <ProxyOperatorOpenId value="YKHJ_LEGAL"/>
-    <SignToken value="B2EF7AF0E61F4727ACAA57ED4765161B"/>
-    <SignKey value="468EA61DB12741D9928CC73B9628202D"/>
+    <AppId value="yDtwRUUlnx8780UutZx2Z8yC7zF6kNcy"/>
+    <ProxyOrganizationName value="深金国际控股(深圳)集团有限公司"/>
+    <ProxyOrganizationOpenId value="SJGJKG"/>
+    <ProxyOperatorOpenId value="SJGJKG_LEGAL"/>
+    <SignToken value="35AEB450F6A64112B7BB852CBB6E03EC"/>
+    <SignKey value="2313251413F242A583B8A2D64D7EC757"/>
   </Tencent>
   <Asign>
     <Url value="https://oapi.asign.cn"/>

+ 124 - 0
config/readme.md

@@ -17,6 +17,9 @@ SignToken 腾讯电子签密回调通知Token,用于验签,使用公司账
 SignKey 腾讯电子签密回调通知密钥,用于解密,使用公司账号登录 <https://qian.tencent.com/console/> 设置和获取
 指定回调地址样式:<http://218.17.158.45:15160/api/Tencent/QianNotice>
 
+注意事项:
+1、如果开启了“本企业自动签署”,则甲乙双方都不能添加“填写区”的控件,但“发起方”可以有填写控件;
+
 ### 多元测试环境
 
 ```xml
@@ -34,6 +37,23 @@ SignKey 腾讯电子签密回调通知密钥,用于解密,使用公司账号
 </Tencent>
 ```
 
+### 多元世纪 - 正式环境
+
+```xml
+<Tencent>
+  <Enabled value="1"/>
+  <SecretId value="AKIDPktwvneP2WqxvmWFsMclmfLLKDyrbAXp"/>
+  <SecretKey value="GNH9tX8c6Wls02vhNzUvdLuGMYfeVErM"/>
+  <EndPoint value="essbasic.tencentcloudapi.com"/>
+  <AppId value="yDtwwUUlptqr7oUygYhLdxZojtktLczu"/>
+  <ProxyOrganizationName value="深圳市多元世纪信息技术股份有限公司"/>
+  <ProxyOrganizationOpenId value="MUCHINFO"/>
+  <ProxyOperatorOpenId value="MUCHINFO_LEGAL"/>
+  <SignToken value="107CC64CFCAB4E658D0D5662A7C3BBA0"/>
+  <SignKey value="3FDF49D069164BDBBC0EE9DDD695D380"/>
+</Tencent>
+```
+
 ### 麦顿实盘环境
 
 ```xml
@@ -143,6 +163,110 @@ YKHJ_LEGAL - 法人(甲方自动签署)
 </Tencent>
 ```
 
+### 宇坤黄金正式环境
+
+```xml
+<Tencent>
+  <Enabled value="1"/>
+  <SecretId value="AKIDPktwvneP2WqxvmWFsMclmfLLKDyrbAXp"/>
+  <SecretKey value="GNH9tX8c6Wls02vhNzUvdLuGMYfeVErM"/>
+  <EndPoint value="essbasic.tencentcloudapi.com"/>
+  <AppId value="yDt1JUU567assbUx3NO8tjTSX8pzL7QB"/>
+  <ProxyOrganizationName value="杭州宇坤黄金珠宝有限公司"/>
+  <ProxyOrganizationOpenId value="HZYKHJ"/>
+  <ProxyOperatorOpenId value="HZYKHJ_LEGAL"/>
+  <SignToken value="B2EF7AF0E61F4727ACAA57ED4765161B"/>
+  <SignKey value="468EA61DB12741D9928CC73B9628202D"/>
+</Tencent>
+```
+
+### 深圳宇坤黄金珠宝有限公司 - 正式环境
+
+```xml
+<Tencent>
+  <Enabled value="1"/>
+  <SecretId value="AKIDPktwvneP2WqxvmWFsMclmfLLKDyrbAXp"/>
+  <SecretKey value="GNH9tX8c6Wls02vhNzUvdLuGMYfeVErM"/>
+  <EndPoint value="essbasic.tencentcloudapi.com"/>
+  <AppId value="yDtwRUUlnx87qeUutZx2Z7N2TB68PD3S"/>
+  <ProxyOrganizationName value="深圳宇坤黄金珠宝有限公司"/>
+  <ProxyOrganizationOpenId value="SZYKHJ"/>
+  <ProxyOperatorOpenId value="SZYKHJ_LEGAL"/>
+  <SignToken value="B0C755C9B2CD439ABE0EF1E8F7E732D3"/>
+  <SignKey value="DAE929EBBC5D460FA6B81777A5A93466"/>
+</Tencent>
+```
+
+### 深金国际四大天王 - 正式环境
+
+#### 深金国际
+
+```xml
+<Tencent>
+  <Enabled value="1"/>
+  <SecretId value="AKIDPktwvneP2WqxvmWFsMclmfLLKDyrbAXp"/>
+  <SecretKey value="GNH9tX8c6Wls02vhNzUvdLuGMYfeVErM"/>
+  <EndPoint value="essbasic.tencentcloudapi.com"/>
+  <AppId value="yDtwRUUlnx8780UutZx2Z8yC7zF6kNcy"/>
+  <ProxyOrganizationName value="深金国际控股(深圳)集团有限公司"/>
+  <ProxyOrganizationOpenId value="SJGJKG"/>
+  <ProxyOperatorOpenId value="SJGJKG_LEGAL"/>
+  <SignToken value="35AEB450F6A64112B7BB852CBB6E03EC"/>
+  <SignKey value="2313251413F242A583B8A2D64D7EC757"/>
+</Tencent>
+```
+
+#### 九五精炼
+
+```xml
+<Tencent>
+  <Enabled value="1"/>
+  <SecretId value="AKIDPktwvneP2WqxvmWFsMclmfLLKDyrbAXp"/>
+  <SecretKey value="GNH9tX8c6Wls02vhNzUvdLuGMYfeVErM"/>
+  <EndPoint value="essbasic.tencentcloudapi.com"/>
+  <AppId value="yDtwRUUlnx87hvUutZx2Z8eLd2z2QH7L"/>
+  <ProxyOrganizationName value="九五精炼(深圳)贵金属新材料有限公司"/>
+  <ProxyOrganizationOpenId value="JWJLSZ"/>
+  <ProxyOperatorOpenId value="JWJLSZ_LEGAL"/>
+  <SignToken value="35AEB450F6A64112B7BB852CBB6E03EC"/>
+  <SignKey value="2313251413F242A583B8A2D64D7EC757"/>
+</Tencent>
+```
+
+#### 融通银合
+
+```xml
+<Tencent>
+  <Enabled value="1"/>
+  <SecretId value="AKIDPktwvneP2WqxvmWFsMclmfLLKDyrbAXp"/>
+  <SecretKey value="GNH9tX8c6Wls02vhNzUvdLuGMYfeVErM"/>
+  <EndPoint value="essbasic.tencentcloudapi.com"/>
+  <AppId value="yDtwRUUln7hfjiUygYhLd8XV0rmMm0Xl"/>
+  <ProxyOrganizationName value="融通银合金融服务(深圳)有限公司"/>
+  <ProxyOrganizationOpenId value="RTYHJRFW"/>
+  <ProxyOperatorOpenId value="RTYHJRFW_LEGAL"/>
+  <SignToken value="35AEB450F6A64112B7BB852CBB6E03EC"/>
+  <SignKey value="2313251413F242A583B8A2D64D7EC757"/>
+</Tencent>
+```
+
+#### 瑞银汇鑫
+
+```xml
+<Tencent>
+  <Enabled value="1"/>
+  <SecretId value="AKIDPktwvneP2WqxvmWFsMclmfLLKDyrbAXp"/>
+  <SecretKey value="GNH9tX8c6Wls02vhNzUvdLuGMYfeVErM"/>
+  <EndPoint value="essbasic.tencentcloudapi.com"/>
+  <AppId value="yDtwRUUlnx872eUutZx2Zw7ChXgd4KwI"/>
+  <ProxyOrganizationName value="深圳鑫汇银瑞黄金经营有限公司"/>
+  <ProxyOrganizationOpenId value="SZXHYRHJ"/>
+  <ProxyOperatorOpenId value="SZXHYRHJ_LEGAL"/>
+  <SignToken value="35AEB450F6A64112B7BB852CBB6E03EC"/>
+  <SignKey value="2313251413F242A583B8A2D64D7EC757"/>
+</Tencent>
+```
+
 ---
 
 ## 爱签配置说明

+ 2 - 2
controllers/tencent/test.go

@@ -24,7 +24,7 @@ import (
 func CreateConsoleLoginUrl(c *gin.Context) {
 	appG := app.Gin{C: c}
 
-	agent := utils.SetAgent()
+	agent := utils.SetAgent(nil, nil, nil)
 	proxyOrganizationName := SysConfig.SerCfg.TencentCfg.ProxyOrganizationName
 	response, _ := tencent.CreateConsoleLoginUrl(agent, proxyOrganizationName)
 
@@ -56,7 +56,7 @@ func GetTemplateInfo(c *gin.Context) {
 		return
 	}
 
-	if rsp, err := tencent.GetTemplateInfo(&req.ContractName); err == nil {
+	if rsp, err := tencent.GetTemplateInfo(&req.ContractName, nil, nil, nil); err == nil {
 		appG.Response(http.StatusOK, e.SUCCESS, rsp)
 	} else {
 		appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)

+ 14 - 0
models/esign.go

@@ -103,3 +103,17 @@ func InsertUserEsignRecord(userId, areaUserId int, econfig Esigntemplateconfig,
 
 	return
 }
+
+func GetEsignTemplateFields(templateConfigId int, fieldUserType int) (fields []Esigntemplatefield, err error) {
+	fields = make([]Esigntemplatefield, 0)
+	err = db.GetEngine().Table("ESIGNTEMPLATEFIELD").Where("TEMPLATECONFIGID = ?", templateConfigId).And("FIELDUSERTYPE = ?", fieldUserType).Find(&fields)
+
+	return
+}
+
+func GetEsignareatemplateconfig(userId int) (config *Esignareatemplateconfig, err error) {
+	config = new(Esignareatemplateconfig)
+	_, err = db.GetEngine().Table("ESIGNAREATEMPLATECONFIG").Where("USERID = ?", userId).Get(config)
+
+	return
+}

+ 16 - 0
models/ori.go

@@ -1300,3 +1300,19 @@ type Usergoodsinventorylog struct {
 func (r *Usergoodsinventorylog) TableName() string {
 	return "USERGOODSINVENTORYLOG"
 }
+
+// Esignareatemplateconfig 机构电子签配置表
+type Esignareatemplateconfig struct {
+	USERID                  int64  `json:"userid" xorm:"USERID"`                                   // 机构用户ID
+	APPID                   string `json:"appid" xorm:"APPID"`                                     // AppId(腾讯电子签)
+	PROXYORGANIZATIONNAME   string `json:"proxyorganizationname" xorm:"PROXYORGANIZATIONNAME"`     // ProxyOrganizationName(腾讯电子签)
+	PROXYORGANIZATIONOPENID string `json:"proxyorganizationopenid" xorm:"PROXYORGANIZATIONOPENID"` // ProxyOrganizationOpenId(腾讯电子签)
+	PROXYOPERATOROPENID     string `json:"proxyoperatoropenid" xorm:"PROXYOPERATOROPENID"`         // ProxyOperatorOpenId(腾讯电子签)
+	SIGNTOKEN               string `json:"signtoken" xorm:"SIGNTOKEN"`                             // SignToken
+	SIGNKEY                 string `json:"signkey" xorm:"SIGNKEY"`                                 // SignKey
+}
+
+// TableName is ESIGNAREATEMPLATECONFIG
+func (r *Esignareatemplateconfig) TableName() string {
+	return "ESIGNAREATEMPLATECONFIG"
+}

+ 127 - 20
services/tencent/ess.go

@@ -72,8 +72,19 @@ func CreateFlowByTemplateDirectly(tmplateName string, userType int,
 	record *models.Useresignrecord,
 	idCardType int) (flowId, signUrl string, err error) {
 
+	var (
+		appId                   *string
+		proxyOrganizationOpenId *string
+		proxyOperatorOpenId     *string
+	)
+	if esignConfig, err := models.GetEsignareatemplateconfig(int(record.AREAUSERID)); err == nil && esignConfig.USERID != 0 {
+		appId = &esignConfig.APPID
+		proxyOrganizationOpenId = &esignConfig.PROXYORGANIZATIONOPENID
+		proxyOperatorOpenId = &esignConfig.PROXYOPERATOROPENID
+	}
+
 	// 获取模板信息
-	templateInfo, err := GetTemplateInfo(&tmplateName)
+	templateInfo, err := GetTemplateInfo(&tmplateName, appId, proxyOrganizationOpenId, proxyOperatorOpenId)
 	if err != nil {
 		return
 	}
@@ -96,13 +107,23 @@ func CreateFlowByTemplateDirectly(tmplateName string, userType int,
 	for i := range recipients {
 		recipient := recipients[i]
 
-		if config.SerCfg.TencentCfg.ProxyOrganizationName == *recipient.RoleName {
-			if *recipient.SignType != 1 {
-				// 签署方为本企业,同时不是自动签署时(一般为甲方非自动签署)
-				flowApproverInfos = append(flowApproverInfos, buildSelfOrganizationApprovers(recipient)...)
-			}
-		} else {
-			// 乙方
+		// if config.SerCfg.TencentCfg.ProxyOrganizationName == *recipient.RoleName {
+		// 	if *recipient.SignType != 1 {
+		// 		// 签署方为本企业,同时不是自动签署时(一般为甲方非自动签署)
+		// 		flowApproverInfos = append(flowApproverInfos, buildSelfOrganizationApprovers(recipient)...)
+		// 	}
+		// } else {
+		// 	// 乙方
+		// 	if userType == 1 {
+		// 		// 个人
+		// 		flowApproverInfos = append(flowApproverInfos, buildPersonApprovers(personName, personMobile, personIdCardNumber, idCardType, recipient)...)
+		// 	} else {
+		// 		// 企业
+		// 		flowApproverInfos = append(flowApproverInfos, buildOrganizationApprovers(organizationName, recipient)...)
+		// 	}
+		// }
+
+		if *recipient.SignType != 1 {
 			if userType == 1 {
 				// 个人
 				flowApproverInfos = append(flowApproverInfos, buildPersonApprovers(personName, personMobile, personIdCardNumber, idCardType, recipient)...)
@@ -113,8 +134,17 @@ func CreateFlowByTemplateDirectly(tmplateName string, userType int,
 		}
 	}
 
+	// 判断是否添加发起方角色的填写控件
+	// 说明:如果合同模板开启了“本企业自动填写”,合同甲乙双方都不能添加填写控件,需要由发起方添加填写控件
+	fields, err := models.GetEsignTemplateFields(int(record.TEMPLATECONFIGID), 3)
+	if err != nil {
+		return
+	}
+	formFields := buildSelfFormFields(int(record.AREAUSERID), int(record.USERID), fields)
+
 	// 发起合同
-	resp, err := essapi.CreateFlowByTemplateDirectly(*templateInfo.TemplateName, *templateInfo.TemplateId, flowApproverInfos)
+	resp, err := essapi.CreateFlowByTemplateDirectly(*templateInfo.TemplateName, *templateInfo.TemplateId, flowApproverInfos, formFields,
+		appId, proxyOrganizationOpenId, proxyOperatorOpenId)
 	if err != nil {
 		return
 	}
@@ -143,7 +173,25 @@ func CreateFlowByTemplateDirectly(tmplateName string, userType int,
 
 // GetFlowStatus 获取合同状态
 func GetFlowStatus(flowId string) (recordStatus int, err error) {
-	agent := utils.SetAgent()
+	// 获取对应电子签信息
+	var record *models.Useresignrecord
+	record, err = models.GetUseresignRecordByFlowID(flowId)
+	if err != nil {
+		err = fmt.Errorf("获取电子签信息失败")
+		return
+	}
+
+	var (
+		appId                   *string
+		proxyOrganizationOpenId *string
+		proxyOperatorOpenId     *string
+	)
+	if esignConfig, err := models.GetEsignareatemplateconfig(int(record.AREAUSERID)); err == nil && esignConfig.USERID != 0 {
+		appId = &esignConfig.APPID
+		proxyOrganizationOpenId = &esignConfig.PROXYORGANIZATIONOPENID
+		proxyOperatorOpenId = &esignConfig.PROXYOPERATOROPENID
+	}
+	agent := utils.SetAgent(appId, proxyOrganizationOpenId, proxyOperatorOpenId)
 	response, err := essapi.DescribeFlowDetailInfo(agent, []*string{&flowId})
 	if err == nil {
 		if len(response.Response.FlowInfo) == 0 {
@@ -152,14 +200,6 @@ func GetFlowStatus(flowId string) (recordStatus int, err error) {
 		}
 		flowDetailInfo := response.Response.FlowInfo[0]
 
-		// 获取对应电子签信息
-		var record *models.Useresignrecord
-		record, err = models.GetUseresignRecordByFlowID(flowId)
-		if err != nil {
-			err = fmt.Errorf("获取电子签信息失败")
-			return
-		}
-
 		// 更新电子签信息状态
 		if *flowDetailInfo.FlowStatus == "ALL" {
 			recordStatus = 3
@@ -236,8 +276,8 @@ func UpdateMdUserSwapProtocol(flowId string) (err error) {
 }
 
 // GetTemplateInfo 获取模板信息
-func GetTemplateInfo(contractName *string) (templateInfo *essbasic.TemplateInfo, err error) {
-	agent := utils.SetAgent()
+func GetTemplateInfo(contractName, appId, proxyOrganizationOpenId, proxyOperatorOpenId *string) (templateInfo *essbasic.TemplateInfo, err error) {
+	agent := utils.SetAgent(appId, proxyOrganizationOpenId, proxyOperatorOpenId)
 	templatesResp, err := essapi.DescribeTemplates(agent, contractName)
 	if err == nil {
 		if len(templatesResp.Response.Templates) > 0 {
@@ -308,6 +348,7 @@ func buildSelfOrganizationApprovers(recipient *essbasic.Recipient) []*essbasic.F
 	approverType := "ORGANIZATION"
 	flowApproverInfo.ApproverType = &approverType
 	flowApproverInfo.OrganizationOpenId = &config.SerCfg.TencentCfg.ProxyOrganizationOpenId // 本企业OpenID
+
 	// 模板中对应签署方的参与方id
 	flowApproverInfo.RecipientId = recipient.RecipientId
 	flowApproverInfo.OpenId = &config.SerCfg.TencentCfg.ProxyOperatorOpenId // 本企业员工OpenID
@@ -317,6 +358,72 @@ func buildSelfOrganizationApprovers(recipient *essbasic.Recipient) []*essbasic.F
 	return flowApproverInfos
 }
 
+// buildSelfFormFields 构造本企业填写控件
+// selfUserId 本企业用户ID
+// userId 乙方用户ID
+func buildSelfFormFields(selfUserId int, userId int, fields []models.Esigntemplatefield) (formFields []*essbasic.FormField) {
+	formFields = make([]*essbasic.FormField, 0)
+
+	// 获取本企业信息(合同发起方,一般为交易所或合同所属机构)
+	selfuserInfo, err := models.GetUserInfo(selfUserId)
+	if err != nil {
+		return
+	}
+	userInfo, err := models.GetUserInfo(userId)
+	if err != nil {
+		return
+	}
+
+	key, _ := hex.DecodeString(utils.AESSecretKey)
+	for _, item := range fields {
+		filedName := item.FIELDNAME
+		switch filedName {
+		case "甲方地址":
+			address := selfuserInfo.Province + selfuserInfo.City + selfuserInfo.District + selfuserInfo.Address
+			formFields = append(formFields, &essbasic.FormField{
+				ComponentName:  &filedName,
+				ComponentValue: &address,
+			})
+		case "甲方邮箱":
+			email := ""
+			if len(selfuserInfo.Email) > 0 {
+				// 手机号码解密
+				if h, err := hex.DecodeString(selfuserInfo.Email); err == nil { // hex -> []byte
+					if d, err := utils.AESDecrypt(h, key); err == nil {
+						email = string(d)
+					}
+				}
+			}
+			formFields = append(formFields, &essbasic.FormField{
+				ComponentName:  &filedName,
+				ComponentValue: &email,
+			})
+		case "甲方电话号码":
+			telphone := ""
+			if len(selfuserInfo.Email) > 0 {
+				// 手机号码解密
+				if h, err := hex.DecodeString(selfuserInfo.Telphone); err == nil { // hex -> []byte
+					if d, err := utils.AESDecrypt(h, key); err == nil {
+						telphone = string(d)
+					}
+				}
+			}
+			formFields = append(formFields, &essbasic.FormField{
+				ComponentName:  &filedName,
+				ComponentValue: &telphone,
+			})
+		case "乙方地址":
+			address := userInfo.Province + userInfo.City + userInfo.District + userInfo.Address
+			formFields = append(formFields, &essbasic.FormField{
+				ComponentName:  &filedName,
+				ComponentValue: &address,
+			})
+		}
+	}
+
+	return
+}
+
 func ProcessNotice(content string) {
 	// "{\"MsgId\":\"yDSLWUUckposmdf8UBxiJvuDbgiYRYbj\",\"MsgType\":\"FlowStatusChange\",\"MsgVersion\":\"ThirdPartyApp\",\"MsgData\":{\"ApplicationId\":\"yDwiuUUckpogfoa4UxhigrYChFMdSJQV\",\"ProxyOrganizationOpenId\":\"TJMD\",\"CustomerData\":\"\",\"FlowId\":\"yDSLWUUckposcsthUwvcaGSuV5EKZAzu\",\"FlowName\":\"1000_P_风险揭示书\",\"FlowType\":\"合同\",\"FlowStatus\":\"INIT\",\"FlowMessage\":\"\",\"CreateOn\":1699077064,\"Deadline\":1730613064,\"FlowApproverInfo\":[{\"ProxyOrganizationOpenId\":\"\",\"ProxyOperatorOpenId\":\"\",\"recipientId\":\"yDSLNUUckpos1i71UuGNih5yMGbZij46\",\"RecipientId\":\"yDSLNUUckpos1i71UuGNih5yMGbZij46\",\"PhoneNumber\":\"15914012152\",\"ProxyOrganizationName\":\"\",\"SignOrder\":0,\"ApproveName\":\"曹晓亮\",\"ApproveStatus\":\"PENDING\",\"ApproveMessage\":\"\",\"ApproveTime\":0,\"CaSign\":\"\"}],\"OccurTime\":1699077064,\"CcInfo\":[]}}"
 	m := make(map[string]interface{})

+ 9 - 6
services/tencent/essapi/CreateFlowByTemplateDirectly.go

@@ -1,7 +1,6 @@
 package essapi
 
 import (
-	"mtp2_if/config"
 	"mtp2_if/logger"
 	"mtp2_if/utils"
 
@@ -11,15 +10,19 @@ import (
 // CreateFlowByTemplateDirectly 通过合同名和模板Id直接发起签署流程
 // 本接口是对于发起合同几个接口的封装,详细参数需要根据自身业务进行调整
 // CreateFlowsByTemplates--CreateSignUrls
-func CreateFlowByTemplateDirectly(flowName, templateId string, flowApproverInfos []*essbasic.FlowApproverInfo) (resp map[string][]*string, err error) {
-	agent := utils.SetAgent()
+func CreateFlowByTemplateDirectly(flowName, templateId string, flowApproverInfos []*essbasic.FlowApproverInfo, formFields []*essbasic.FormField,
+	appId, proxyOrganizationOpenId, proxyOperatorOpenId *string) (resp map[string][]*string, err error) {
+
+	agent := utils.SetAgent(appId, proxyOrganizationOpenId, proxyOperatorOpenId)
 	resp = make(map[string][]*string)
 
 	// 创建签署流程
 	var flowInfos []*essbasic.FlowInfo
-	flowInfos = append(flowInfos, utils.FillFlowInfo(templateId, flowName, flowApproverInfos))
+	flowInfos = append(flowInfos, utils.FillFlowInfo(templateId, flowName, flowApproverInfos, formFields))
+
 	// 构建内容控件填充结构(根据自己需求使用)
-	// flowInfos[i].FormFields = []*v20210526.FormField{utils.BuildFormField("姓名", "张三")}
+	// flowInfos[i].FormFields = []*v20210526.FormField{utils.BuildFormField("姓名", "张三")
+	// 注意:这里是签署方需要填写的内容,发起方填写内容在 FillFlowInfo 方法中设置
 
 	// 发起签署
 	flowResponse, err := CreateFlowsByTemplates(agent, flowInfos)
@@ -38,7 +41,7 @@ func CreateFlowByTemplateDirectly(flowName, templateId string, flowApproverInfos
 	var urls []*string
 	for _, signUrlInfo := range createSignUrlsResp.Response.SignUrlInfos {
 		logger.GetLogger().Debugf("signUrlInfo OpenId:%v ApproverType:%v OrganizationName:%v Name:%v Mobile:%v", *signUrlInfo.OpenId, *signUrlInfo.ApproverType, *signUrlInfo.OrganizationName, *signUrlInfo.Name, *signUrlInfo.Mobile)
-		if *signUrlInfo.OpenId != config.SerCfg.TencentCfg.ProxyOperatorOpenId { // 不是甲方经办人
+		if *signUrlInfo.OpenId != *proxyOperatorOpenId { // 不是甲方经办人
 			urls = append(urls, signUrlInfo.SignUrl)
 		}
 	}

BIN
services/tencent/templates/永坤黄金/网签合同(宇坤)(20250114).docx


BIN
services/tencent/templates/永坤黄金/网签合同(永坤)(20240716).docx


BIN
services/tencent/templates/深金国际/合同--专项供应商合作及系统使用协议.docx


+ 22 - 0
services/tencent/templates/深金国际/深金国际电子签.sql

@@ -0,0 +1,22 @@
+insert into esigntemplateconfig (TEMPLATECONFIGID, ESIGNTYPE, TEMPLATENO, TEMPLATETYPE, TEMPLATENAME, ORDERINDEX, CREATORID, CREATETIME, UPDATETIME, PARTAKEY, PARTBKEY, TEMPLATECERTYPE)
+values ('1', '2', null, '4', '专项供应商合作及系统使用协议', '1', '1', to_date('04-11-2023 18:35:26', 'dd-mm-yyyy hh24:mi:ss'), to_date('04-11-2023 18:35:26', 'dd-mm-yyyy hh24:mi:ss'), null, null, '0');
+
+insert into esigntemplatefield (TEMPLATEFIELDID, TEMPLATECONFIGID, FIELDNAME, FIELDKEY, FIELDTYPE, REMARK, CREATETIME, FIELDUSERTYPE)
+values ('1', '1', '甲方地址', '甲方地址', '1', '发起方填写', to_date('16-01-2025 10:21:26', 'dd-mm-yyyy hh24:mi:ss'), '3');
+insert into esigntemplatefield (TEMPLATEFIELDID, TEMPLATECONFIGID, FIELDNAME, FIELDKEY, FIELDTYPE, REMARK, CREATETIME, FIELDUSERTYPE)
+values ('2', '1', '甲方邮箱', '甲方邮箱', '1', '发起方填写', to_date('16-01-2025 10:21:26', 'dd-mm-yyyy hh24:mi:ss'), '3');
+insert into esigntemplatefield (TEMPLATEFIELDID, TEMPLATECONFIGID, FIELDNAME, FIELDKEY, FIELDTYPE, REMARK, CREATETIME, FIELDUSERTYPE)
+values ('4', '1', '乙方地址', '乙方地址', '1', '发起方填写', to_date('16-01-2025 10:21:26', 'dd-mm-yyyy hh24:mi:ss'), '3');
+insert into esigntemplatefield (TEMPLATEFIELDID, TEMPLATECONFIGID, FIELDNAME, FIELDKEY, FIELDTYPE, REMARK, CREATETIME, FIELDUSERTYPE)
+values ('3', '1', '甲方电话号码', '甲方电话号码', '1', '发起方填写', to_date('16-01-2025 11:33:40', 'dd-mm-yyyy hh24:mi:ss'), '3');
+
+-- ESIGNAREATEMPLATECONFIG.USERID 要根据实际情况进行配置
+insert into ESIGNAREATEMPLATECONFIG (USERID, APPID, PROXYORGANIZATIONNAME, PROXYORGANIZATIONOPENID, PROXYOPERATOROPENID, SIGNTOKEN, SIGNKEY)
+values ('1000', 'yDtwRUUlnx8780UutZx2Z8yC7zF6kNcy', '深金国际控股(深圳)集团有限公司', 'SJGJKG', 'SJGJKG_LEGAL', '', '');
+insert into ESIGNAREATEMPLATECONFIG (USERID, APPID, PROXYORGANIZATIONNAME, PROXYORGANIZATIONOPENID, PROXYOPERATOROPENID, SIGNTOKEN, SIGNKEY)
+values ('2000', 'yDtwRUUlnx87hvUutZx2Z8eLd2z2QH7L', '九五精炼(深圳)贵金属新材料有限公司', 'JWJLSZ', 'JWJLSZ_LEGAL', '', '');
+insert into ESIGNAREATEMPLATECONFIG (USERID, APPID, PROXYORGANIZATIONNAME, PROXYORGANIZATIONOPENID, PROXYOPERATOROPENID, SIGNTOKEN, SIGNKEY)
+values ('3000', 'yDtwRUUln7hfjiUygYhLd8XV0rmMm0Xl', '融通银合金融服务(深圳)有限公司', 'RTYHJRFW', 'RTYHJRFW_LEGAL', '', '');
+insert into ESIGNAREATEMPLATECONFIG (USERID, APPID, PROXYORGANIZATIONNAME, PROXYORGANIZATIONOPENID, PROXYOPERATOROPENID, SIGNTOKEN, SIGNKEY)
+values ('4000', 'yDtwRUUlnx872eUutZx2Zw7ChXgd4KwI', '深圳鑫汇银瑞黄金经营有限公司', 'SZXHYRHJ', 'SZXHYRHJ_LEGAL', '', '');
+

+ 29 - 8
utils/CreateFlowUtils.go

@@ -36,17 +36,32 @@ func InitTencentESSClient() (err error) {
 }
 
 // SetAgent 设置Agent
-func SetAgent() *essbasic.Agent {
-	appId := SysConfig.SerCfg.TencentCfg.AppId
+func SetAgent(appId, proxyOrganizationOpenId, proxyOperatorOpenId *string) *essbasic.Agent {
+	if appId == nil {
+		appId = &SysConfig.SerCfg.TencentCfg.AppId
+	}
 	proxyAppId := ""
-	proxyOrganizationOpenId := SysConfig.SerCfg.TencentCfg.ProxyOrganizationOpenId
-	proxyOperatorOpenId := SysConfig.SerCfg.TencentCfg.ProxyOperatorOpenId
+	if proxyOrganizationOpenId == nil {
+		proxyOrganizationOpenId = &SysConfig.SerCfg.TencentCfg.ProxyOrganizationOpenId
+	}
+	if proxyOperatorOpenId == nil {
+		proxyOperatorOpenId = &SysConfig.SerCfg.TencentCfg.ProxyOperatorOpenId
+	}
+
+	// if userId != nil {
+	// 	if esignConfig, err := models.GetEsignareatemplateconfig(*userId); err == nil && esignConfig != nil {
+	// 		appId = esignConfig.APPID
+	// 		proxyOrganizationOpenId = esignConfig.PROXYORGANIZATIONOPENID
+	// 		proxyOperatorOpenId = esignConfig.PROXYOPERATOROPENID
+	// 	}
+	// }
+
 	userInfo := &essbasic.UserInfo{}
-	userInfo.OpenId = &proxyOperatorOpenId
+	userInfo.OpenId = proxyOperatorOpenId
 	var agent = &essbasic.Agent{
-		AppId:                   &appId,
+		AppId:                   appId,
 		ProxyAppId:              &proxyAppId,
-		ProxyOrganizationOpenId: &proxyOrganizationOpenId,
+		ProxyOrganizationOpenId: proxyOrganizationOpenId,
 		ProxyOperator:           userInfo,
 	}
 	return agent
@@ -54,7 +69,9 @@ func SetAgent() *essbasic.Agent {
 
 // FillFlowInfo 设置FlowInfo
 func FillFlowInfo(templateId, flowName string,
-	flowApproverInfos []*essbasic.FlowApproverInfo) *essbasic.FlowInfo {
+	flowApproverInfos []*essbasic.FlowApproverInfo,
+	formFields []*essbasic.FormField) *essbasic.FlowInfo {
+
 	FlowType := "合同"
 	var flowInfo = &essbasic.FlowInfo{
 		TemplateId:    &templateId,
@@ -62,6 +79,10 @@ func FillFlowInfo(templateId, flowName string,
 		FlowApprovers: flowApproverInfos,
 		FlowType:      &FlowType,
 	}
+	if len(formFields) > 0 {
+		flowInfo.FormFields = formFields
+	}
+
 	return flowInfo
 }