servcies.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741
  1. package asign
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "io"
  8. "mtp2_if/config"
  9. "mtp2_if/db"
  10. "mtp2_if/logger"
  11. "mtp2_if/models"
  12. "mtp2_if/utils"
  13. "net/http"
  14. "strconv"
  15. )
  16. // CreateSeal 创建印章
  17. func CreateSeal(req CreateSealReq) (err error) {
  18. apiReq := APIReq[APICreateSealReq]{
  19. Data: APICreateSealReq{
  20. Account: req.Account,
  21. IsDefault: req.IsDefault,
  22. Base64ImageStr: req.Base64ImageStr,
  23. SealName: req.SealName,
  24. SealNo: strconv.Itoa(int(utils.GenID())),
  25. },
  26. }
  27. apiRsp, err := APIPost[APICreateSealReq, interface{}](apiReq, APIURL_CreateSeal)
  28. if err != nil {
  29. return
  30. }
  31. if apiRsp.Code != CODE_SUCCESS {
  32. err = errors.New(apiRsp.Msg)
  33. return
  34. }
  35. return
  36. }
  37. // ModifySeal 修改印章
  38. func ModifySeal(req ModifySealReq) (err error) {
  39. apiReq := APIReq[APIModifySealReq]{
  40. Data: APIModifySealReq{
  41. Account: req.Account,
  42. IsDefault: req.IsDefault,
  43. Base64ImageStr: req.Base64ImageStr,
  44. SealName: req.SealName,
  45. SealNo: req.SealNo,
  46. },
  47. }
  48. apiRsp, err := APIPost[APIModifySealReq, interface{}](apiReq, APIURL_ModifySeal)
  49. if err != nil {
  50. return
  51. }
  52. if apiRsp.Code != CODE_SUCCESS {
  53. err = errors.New(apiRsp.Msg)
  54. return
  55. }
  56. return
  57. }
  58. // BankCard4 银行卡四要素认证
  59. func BankCard4(req BankCard4Req) (rsp BankCard4Rsp, err error) {
  60. // 校验入参
  61. if req.Type == 1 && req.Person == nil {
  62. err = errors.New("缺少参数")
  63. return
  64. }
  65. if req.Type == 2 && req.Company == nil {
  66. err = errors.New("缺少参数")
  67. return
  68. }
  69. // 判断证件号码是否已经在爱签平台存在
  70. // var getUserReq APIGetUserReq
  71. // getUserReq.Account = strconv.Itoa(req.UserId)
  72. getUserReq := APIReq[APIGetUserReq]{
  73. Data: APIGetUserReq{Account: strconv.Itoa(req.UserId)},
  74. }
  75. apiRsp, err := APIPost[APIGetUserReq, []APIGetUserRsp](getUserReq, APIURL_GetUser)
  76. if err != nil {
  77. return
  78. }
  79. if apiRsp.Code == CODE_SUCCESS {
  80. err = errors.New("电子签平台用户编号已存在")
  81. logger.GetLogger().Error("电子签平台用户编号已存在, apiRsp:", apiRsp)
  82. return
  83. }
  84. getUserReq.Data.Account = ""
  85. if req.Type == 1 {
  86. getUserReq.Data.IdCard = req.Person.IdCardNo
  87. } else {
  88. getUserReq.Data.CreditCode = req.Company.CreditCode
  89. }
  90. apiRsp, err = APIPost[APIGetUserReq, []APIGetUserRsp](getUserReq, APIURL_GetUser)
  91. if err != nil {
  92. return
  93. }
  94. if apiRsp.Code == CODE_SUCCESS && len(apiRsp.Data) > 0 {
  95. err = errors.New("电子签平台证件号码已存在")
  96. logger.GetLogger().Error("电子签平台证件号码已存在, apiRsp:", apiRsp)
  97. return
  98. }
  99. // 从交易库中获取类型为实名认证的电子签信息
  100. var record models.Useresignrecord
  101. has, err := db.GetEngine().Where("TEMPLATETYPE = 1 AND USERID = ?", req.UserId).Get(&record)
  102. if err != nil {
  103. return
  104. }
  105. if !has {
  106. err = errors.New("无对应实名认证记录信息")
  107. logger.GetLogger().Error("无对应实名认证记录信息, userId:", req.UserId)
  108. return
  109. }
  110. if record.RECORDSTATUS == 3 {
  111. err = errors.New("账户已实名")
  112. logger.GetLogger().Error("账户已实名, userId:", req.UserId)
  113. return
  114. }
  115. // 调用爱签接口
  116. var authinfo []byte
  117. var bankCard4Rsp *APIRsp[APIBankCard4Rsp]
  118. if req.Type == 1 { // 个人
  119. personBankCard4Req := APIReq[APIPersonBankCard4Req]{
  120. Data: APIPersonBankCard4Req{
  121. RealName: req.Person.RealName,
  122. IdCardNo: req.Person.IdCardNo,
  123. BankCard: req.Person.BankCard,
  124. Mobile: req.Person.Mobile,
  125. },
  126. }
  127. if bankCard4Rsp, err = APIPost[APIPersonBankCard4Req, APIBankCard4Rsp](personBankCard4Req, APIURL_Person_BankCard4); err != nil {
  128. return
  129. }
  130. if authinfo, err = json.Marshal(req.Person); err != nil {
  131. return
  132. }
  133. } else { // 企业
  134. companyBankCard4Req := APIReq[APICompanyBankCard4Req]{
  135. Data: APICompanyBankCard4Req{
  136. CompanyName: req.Company.CompanyName,
  137. CreditCode: req.Company.CreditCode,
  138. RealName: req.Company.RealName,
  139. IdCardNo: req.Company.IdCardNo,
  140. BankCard: req.Company.BankCard,
  141. Mobile: req.Company.Mobile,
  142. },
  143. }
  144. if bankCard4Rsp, err = APIPost[APICompanyBankCard4Req, APIBankCard4Rsp](companyBankCard4Req, APIURL_Person_BankCard4); err != nil {
  145. return
  146. }
  147. if authinfo, err = json.Marshal(req.Company); err != nil {
  148. return
  149. }
  150. }
  151. if bankCard4Rsp.Code != CODE_SUCCESS {
  152. err = errors.New(bankCard4Rsp.Msg)
  153. return
  154. }
  155. rsp.SerialNo = bankCard4Rsp.Data.SerialNo
  156. // 更新用户电子签记录-记录实名信息
  157. sql := fmt.Sprintf(`
  158. UPDATE useresignrecord
  159. SET RECORDSTATUS = 2,
  160. UPDATETIME = SYSDATE,
  161. AUTHINFO = '%v'
  162. WHERE USERID = %v AND TEMPLATETYPE = 1
  163. `, string(authinfo), req.UserId)
  164. _, err = db.GetEngine().Exec(sql)
  165. return
  166. }
  167. // CaptcaResend 重新发送认证验证码
  168. func CaptcaResend(req CaptchaResendReq) (err error) {
  169. apiReq := APIReq[APICaptchaResendReq]{Data: APICaptchaResendReq{SerialNo: req.SerialNo}}
  170. apiRsp, err := APIPost[APICaptchaResendReq, interface{}](apiReq, APIURL_Captcha_Resend)
  171. if err != nil {
  172. return
  173. }
  174. if apiRsp.Code != CODE_SUCCESS {
  175. err = errors.New(apiRsp.Msg)
  176. return
  177. }
  178. return
  179. }
  180. // CaptchaVerify 认证验证码校验
  181. func CaptchaVerify(req CaptchaVerifyReq) (err error) {
  182. // 从交易库中获取类型为实名认证的电子签信息
  183. var record models.Useresignrecord
  184. has, err := db.GetEngine().Where("TEMPLATETYPE = 1 AND RECORDSTATUS = 2 AND USERID = ?", req.UserId).Get(&record)
  185. if err != nil {
  186. return
  187. }
  188. if !has {
  189. err = errors.New("无对应实名认证记录信息")
  190. logger.GetLogger().Error("无对应实名认证记录信息, userId:", req.UserId)
  191. return
  192. }
  193. // 调用爱签接口 - 认证验证码校验
  194. apiReq := APIReq[APICaptchaVerifyReq]{
  195. Data: APICaptchaVerifyReq{
  196. SerialNo: req.SerialNo,
  197. Captcha: req.Captcha,
  198. },
  199. }
  200. apiRsp, err := APIPost[APICaptchaVerifyReq, interface{}](apiReq, APIURL_Captcha_Verify)
  201. if err != nil {
  202. return
  203. }
  204. if apiRsp.Code != CODE_SUCCESS {
  205. err = errors.New(apiRsp.Msg)
  206. return
  207. }
  208. // 调用爱签接口 - 添加用户
  209. var addUserRsp *APIRsp[APIAddUserRsp]
  210. if req.Type == 1 { // 个人
  211. addPersonalUserReq := APIReq[APIAddPersonalUserReq]{
  212. Data: APIAddPersonalUserReq{
  213. Account: strconv.Itoa(req.UserId),
  214. SerialNo: req.SerialNo,
  215. },
  216. }
  217. if addUserRsp, err = APIPost[APIAddPersonalUserReq, APIAddUserRsp](addPersonalUserReq, APIURL_V2_User_AddPersonalUser); err != nil {
  218. return
  219. }
  220. } else { // 企业
  221. addEnterpriseUserReq := APIReq[APIAddEnterpriseUserReq]{
  222. Data: APIAddEnterpriseUserReq{
  223. Account: strconv.Itoa(req.UserId),
  224. SerialNo: req.SerialNo,
  225. },
  226. }
  227. if addUserRsp, err = APIPost[APIAddEnterpriseUserReq, APIAddUserRsp](addEnterpriseUserReq, APIURL_V2_User_AddEnterpriseUser); err != nil {
  228. return
  229. }
  230. }
  231. if addUserRsp.Code != CODE_SUCCESS {
  232. err = errors.New(addUserRsp.Msg)
  233. return
  234. }
  235. // 获取临时存储的用户认证信息
  236. cacheMap := make(map[string]interface{})
  237. if err = json.Unmarshal([]byte(record.AUTHINFO), &cacheMap); err != nil {
  238. logger.GetLogger().Error("反序列化临时存储用户信息失败, AUTHINFO:", record.AUTHINFO)
  239. return
  240. }
  241. // 调用JAVA实名认证接口
  242. reqParam := make(map[string]interface{})
  243. if req.Type == 1 { // 个人
  244. reqParam["userid"] = req.UserId
  245. reqParam["cardnum"] = cacheMap["idCardNo"]
  246. reqParam["username"] = cacheMap["realName"]
  247. reqParam["cardtype"] = 0 // 目前写死证件类型为身份证 - 0
  248. reqParam["cardfrontphotourl"] = cacheMap["idCardPhoto"]
  249. reqParam["cardbackphotourl"] = cacheMap["idCardPhotoBackURL"]
  250. reqParam["bankaccount"] = cacheMap["bankCard"]
  251. reqParam["bankid"] = cacheMap["bankId"]
  252. reqParam["userinfotype"] = 1 // 1 - 个人
  253. } else {
  254. reqParam["userid"] = req.UserId
  255. reqParam["customername"] = cacheMap["companyName"]
  256. reqParam["cardtype"] = 4 // 企业统一信用
  257. reqParam["cardfrontphotourl"] = cacheMap["idCardPhoto"]
  258. reqParam["legalpersonname"] = cacheMap["realName"]
  259. reqParam["cardnum"] = cacheMap["creditCode"]
  260. reqParam["mobilephone"] = cacheMap["mobile"]
  261. reqParam["userinfotype"] = 2 // 2 - 企业
  262. }
  263. jsonParam, err := json.Marshal(&reqParam)
  264. if err != nil {
  265. logger.GetLogger().Error("反序列化JAVA实名认证入参失败, reqParam:", reqParam)
  266. return
  267. }
  268. // 构建请求
  269. javaUrl := config.SerCfg.AsignCfg.OpenApiUrl + "/onlineopen/userInfo/addAuth"
  270. javaReq, err := http.NewRequest("POST", javaUrl, bytes.NewReader(jsonParam))
  271. // 设置请求头
  272. javaReq.Header.Set("Content-Type", "application/json; charset=utf-8")
  273. client := &http.Client{}
  274. rsp, err := client.Do(javaReq)
  275. if err != nil {
  276. logger.GetLogger().Error("JAVA实名认证请求失败, err:", err)
  277. return
  278. }
  279. defer rsp.Body.Close()
  280. body, err := io.ReadAll(rsp.Body)
  281. if err != nil {
  282. logger.GetLogger().Error("JAVA实名认证请求获取body失败, err:", err)
  283. return
  284. }
  285. // rspData: map[code:0 hasAuth:1 message:认证成功]
  286. rspData := make(map[string]interface{})
  287. if err = json.Unmarshal(body, &rspData); err != nil {
  288. logger.GetLogger().Error("JAVA实名认证请求反序列化body失败, err:", err)
  289. return
  290. }
  291. logger.GetLogger().Info("调用JAVA实名认证接口返回, rspData:", rspData)
  292. code, ok := rspData["code"]
  293. if !ok {
  294. err = errors.New("实名认证失败,请稍后重试")
  295. logger.GetLogger().Error(err.Error())
  296. return
  297. }
  298. if code != "0" {
  299. err = fmt.Errorf("实名认证失败,%v", rspData["message"])
  300. logger.GetLogger().Error(err.Error())
  301. return
  302. }
  303. // 更新用户电子签记录 - 更新实名认证状态
  304. sql := fmt.Sprintf(`
  305. UPDATE useresignrecord
  306. SET RECORDSTATUS = 3,
  307. UPDATETIME = SYSDATE
  308. WHERE USERID = %v AND TEMPLATETYPE = 1
  309. `, req.UserId)
  310. _, err = db.GetEngine().Exec(sql)
  311. return
  312. }
  313. // SyncContractStatus 同步合同状态
  314. func SyncContractStatus(req SyncContractStatusReq) (rsp SyncContractStatusRsp, err error) {
  315. // 从交易库中获取类型为实名认证的电子签信息
  316. var record models.Useresignrecord
  317. has, err := db.GetEngine().Where("RECORDID = ?", req.RecordId).Get(&record)
  318. if err != nil {
  319. return
  320. }
  321. if !has {
  322. err = errors.New("查无此记录信息")
  323. logger.GetLogger().Error("查无此记录信息, RecordId:", req.RecordId)
  324. return
  325. }
  326. if record.CONTRACTNO == "" {
  327. err = errors.New("此记录未生成合同编号")
  328. logger.GetLogger().Error("此记录未生成合同编号, RecordId:", req.RecordId)
  329. return
  330. }
  331. // 调用爱签接口 - 查询合同状态
  332. apiReq := APIReq[APIContractStatusReq]{Data: APIContractStatusReq{ContractNo: record.CONTRACTNO}}
  333. apiRsp, err := APIPost[APIContractStatusReq, APIContractStatusRsp](apiReq, APIURL_Contract_Status)
  334. if err != nil {
  335. return
  336. }
  337. if apiRsp.Code != CODE_SUCCESS {
  338. err = errors.New(apiRsp.Msg)
  339. return
  340. }
  341. status := record.RECORDSTATUS // 记录状态: 1:未签署 2:签署中 3:已签署 4:签署拒绝
  342. switch apiRsp.Data.Status { // 合同状态:0:等待签约 1:签约中 2:已签约 3:过期 4:拒签 6:作废 -2:状态异常
  343. case 0:
  344. status = 1
  345. case 1:
  346. status = 2
  347. case 2:
  348. status = 3
  349. case 4:
  350. status = 4
  351. }
  352. // 更新用户电子签记录 - 更新合同签署状态
  353. sql := fmt.Sprintf(`
  354. UPDATE useresignrecord
  355. SET RECORDSTATUS = %v,
  356. UPDATETIME = SYSDATE
  357. WHERE RECORDID = %v
  358. `, status, req.RecordId)
  359. _, err = db.GetEngine().Exec(sql)
  360. if err != nil {
  361. return
  362. }
  363. rsp = SyncContractStatusRsp{
  364. ContractNo: apiRsp.Data.ContractNo,
  365. ContractName: apiRsp.Data.ContractName,
  366. Status: apiRsp.Data.Status,
  367. }
  368. return
  369. }
  370. // PARTYA_SIGNATURE
  371. // PARTYA_DATE
  372. //
  373. // P_PARTYB_SIGNATURE
  374. // P_PARTYB_ID
  375. // P_PARTYB_MOBILE
  376. // P_PARTYB_DATE
  377. //
  378. // E_PARTYB_SIGNATURE
  379. // E_PARTYB_LEGAL
  380. // E_PARTYB_DATE
  381. // CreateContract 创建合同
  382. func CreateContract(req CreateContractReq) (rsp CreateContractRsp, err error) {
  383. // 获取电子签信息
  384. var record models.Useresignrecord
  385. has, err := db.GetEngine().Where("RECORDID = ?", req.RecordId).Get(&record)
  386. if err != nil {
  387. logger.GetLogger().Error("获取电子签信息失败, err", err)
  388. err = errors.New("获取电子签信息失败")
  389. return
  390. }
  391. if !has {
  392. err = errors.New("查无此记录信息")
  393. logger.GetLogger().Error("查无此记录信息, RecordId:", req.RecordId)
  394. return
  395. }
  396. if record.RECORDSTATUS != 1 {
  397. err = errors.New("记录信息状态异常")
  398. logger.GetLogger().Error("记录信息状态异常, RecordId:", req.RecordId, record.RECORDSTATUS)
  399. return
  400. }
  401. // 调用爱签接口 - 查询模板列表
  402. apiReq := APIReq[APITemplateListReq]{Data: APITemplateListReq{Page: 1, Rows: 10}}
  403. apiRsp, err := APIPost[APITemplateListReq, APITemplateListRsp](apiReq, APIURL_Template_List)
  404. if err != nil {
  405. return
  406. }
  407. if apiRsp.Code != CODE_SUCCESS {
  408. err = errors.New(apiRsp.Msg)
  409. return
  410. }
  411. if len(apiRsp.Data.List) == 0 {
  412. err = errors.New("获取查询模板列表失败")
  413. logger.GetLogger().Error("获取查询模板列表失败")
  414. return
  415. }
  416. // 获取用户信息
  417. userInfo, err := models.GetUserInfo(int(record.USERID))
  418. if err != nil {
  419. logger.GetLogger().Error("获取用户信息失败, err:", err)
  420. err = errors.New("获取用户信息失败")
  421. return
  422. }
  423. templateName := record.TEMPLATENAME
  424. if userInfo.Userinfotype == 1 { // 个人
  425. templateName += "-个人"
  426. } else { // 企业
  427. templateName += "-企业"
  428. }
  429. // 获取模板信息
  430. templateIdent := ""
  431. for _, item := range apiRsp.Data.List {
  432. if item.TemplateName == templateName {
  433. templateIdent = item.TemplateIdent
  434. break
  435. }
  436. }
  437. if templateIdent == "" {
  438. err = errors.New("获取模板信息失败")
  439. logger.GetLogger().Error("获取模板信息失败")
  440. return
  441. }
  442. // 获取用户实名信息
  443. var recordAuth models.Useresignrecord
  444. has, err = db.GetEngine().Where("TEMPLATETYPE = 1 AND USERID = ?", userInfo.Userid).Get(&recordAuth)
  445. if err != nil {
  446. return
  447. }
  448. if !has {
  449. err = errors.New("无对应实名认证记录信息")
  450. logger.GetLogger().Error("无对应实名认证记录信息, userId:", userInfo.Userid)
  451. return
  452. }
  453. // 调用爱签接口 - 上传待签署文件
  454. contractNo := strconv.Itoa(int(utils.GenID()))
  455. apiCreateContractReq := APIReq[APICreateContractReq]{
  456. Data: APICreateContractReq{
  457. ContractNo: contractNo,
  458. ContractName: templateName,
  459. SignOrder: 1,
  460. ValidityTime: 30,
  461. NotifyUrl: config.SerCfg.AsignCfg.NotifyUrl,
  462. },
  463. }
  464. apiCreateContractReq.Data.Templates = []APITemplate{
  465. {
  466. TemplateNo: templateIdent,
  467. },
  468. }
  469. apiCreateContractRsp, err := APIPost[APICreateContractReq, APICreateContractRsp](apiCreateContractReq, APIURL_CreateContract)
  470. if err != nil {
  471. return
  472. }
  473. if apiCreateContractRsp.Code != CODE_SUCCESS {
  474. err = errors.New(apiCreateContractRsp.Msg)
  475. return
  476. }
  477. // 将合同编号写入数据库
  478. sql := fmt.Sprintf(`
  479. UPDATE useresignrecord
  480. SET contractNo = '%v',
  481. UPDATETIME = SYSDATE
  482. WHERE RECORDID = %v
  483. `, contractNo, record.RECORDID)
  484. if _, err = db.GetEngine().Exec(sql); err != nil {
  485. logger.GetLogger().Error("更新合同编号失败, err:", err)
  486. err = errors.New("更新合同编号失败")
  487. return
  488. }
  489. // 添加签署方 - 甲方 - 交易所
  490. // appAddSignerReq1 := APIAddSignerReq{
  491. // ContractNo: contractNo,
  492. // Account: "ZR_LEGAL",
  493. // SignType: 2, // 无感知签约(需要开通权限)
  494. // SignStrategyList: []APISignStrategy{
  495. // {AttachNo: 1, LocationMode: 4, SignKey: "PARTYA_SIGNATURE", SignType: 1}, // 甲方签章
  496. // {AttachNo: 1, LocationMode: 4, SignKey: "PARTYA_DATE", SignType: 2}, // 甲方签署时间
  497. // },
  498. // }
  499. appAddSignerReq1 := APIAddSignerReq{
  500. ContractNo: contractNo,
  501. Account: "EX_LEGAL",
  502. SignType: 2, // 无感知签约(需要开通权限)
  503. }
  504. signStrategyListPartyA, err := buildStrategyByPartyA(int(record.TEMPLATECONFIGID))
  505. if err != nil {
  506. return
  507. }
  508. if len(signStrategyListPartyA) > 0 {
  509. appAddSignerReq1.SignStrategyList = signStrategyListPartyA
  510. }
  511. // 获取临时存储的用户认证信息
  512. cacheMap := make(map[string]interface{})
  513. if err = json.Unmarshal([]byte(recordAuth.AUTHINFO), &cacheMap); err != nil {
  514. logger.GetLogger().Error("反序列化临时存储用户信息失败, AUTHINFO:", recordAuth.AUTHINFO)
  515. return
  516. }
  517. if recordAuth.AUTHINFO == "" {
  518. err = errors.New("获取实名信息失败")
  519. logger.GetLogger().Error("获取实名信息失败")
  520. return
  521. }
  522. // 添加签署方 - 乙方 - 投资者
  523. appAddSignerReq2 := APIAddSignerReq{
  524. ContractNo: contractNo,
  525. Account: strconv.Itoa(int(record.USERID)),
  526. SignType: 3,
  527. ValidateType: 3,
  528. }
  529. // // 签章策略
  530. // signStrategyList := make([]APISignStrategy, 0)
  531. // // 接收方模板填充策略
  532. // receiverFillStrategyList := make([]APIReceiverFillStrategy, 0)
  533. // if userInfo.Userinfotype == 1 { // 个人
  534. // // 乙方签章
  535. // signStrategyList = append(signStrategyList, APISignStrategy{AttachNo: 1, LocationMode: 4, SignKey: "P_PARTYB_SIGNATURE", SignType: 1})
  536. // // 乙方签署时间
  537. // signStrategyList = append(signStrategyList, APISignStrategy{AttachNo: 1, LocationMode: 4, SignKey: "P_PARTYB_DATE", SignType: 2})
  538. // // 身份证号
  539. // receiverFillStrategyList = append(receiverFillStrategyList, APIReceiverFillStrategy{AttachNo: 1, Key: "P_PARTYB_ID", Value: cacheMap["idCardNo"].(string)})
  540. // // 联系方式
  541. // receiverFillStrategyList = append(receiverFillStrategyList, APIReceiverFillStrategy{AttachNo: 1, Key: "P_PARTYB_MOBILE", Value: cacheMap["mobile"].(string)})
  542. // } else { // 企业
  543. // // 乙方签章
  544. // signStrategyList = append(signStrategyList, APISignStrategy{AttachNo: 1, LocationMode: 4, SignKey: "E_PARTYB_SIGNATURE", SignType: 1})
  545. // // 乙方签署时间
  546. // signStrategyList = append(signStrategyList, APISignStrategy{AttachNo: 1, LocationMode: 4, SignKey: "E_PARTYB_DATE", SignType: 2})
  547. // // 法定代表人名称
  548. // receiverFillStrategyList = append(receiverFillStrategyList, APIReceiverFillStrategy{AttachNo: 1, Key: "E_PARTYB_LEGAL", Value: cacheMap["realName"].(string)})
  549. // }
  550. // appAddSignerReq2.SignStrategyList = signStrategyList
  551. // appAddSignerReq2.ReceiverFillStrategyList = receiverFillStrategyList
  552. signStrategyList, receiverFillStrategyList, err := buildStrategyByPartyB(int(record.TEMPLATECONFIGID), int(userInfo.Userinfotype), cacheMap)
  553. if err != nil {
  554. return
  555. }
  556. if len(signStrategyList) > 0 {
  557. appAddSignerReq2.SignStrategyList = signStrategyList
  558. }
  559. if len(receiverFillStrategyList) > 0 {
  560. appAddSignerReq2.ReceiverFillStrategyList = receiverFillStrategyList
  561. }
  562. apiAddSignerRsp, err := APIPost[APIAddSignerReq, APIAddSignerRsp](APIReq[APIAddSignerReq]{Datas: []APIAddSignerReq{appAddSignerReq1, appAddSignerReq2}}, APIURL_AddSigner)
  563. if err != nil {
  564. return
  565. }
  566. if apiAddSignerRsp.Code != CODE_SUCCESS {
  567. err = errors.New(apiAddSignerRsp.Msg)
  568. return
  569. }
  570. if len(apiAddSignerRsp.Data.SignUser) == 0 {
  571. err = errors.New("获取合同签署地址失败")
  572. logger.GetLogger().Error("获取合同签署地址失败")
  573. return
  574. }
  575. // 将返回的合同签署地址写入数据库
  576. sql = fmt.Sprintf(`
  577. UPDATE useresignrecord
  578. SET RECORDSTATUS = 2,
  579. SIGNURL = '%v',
  580. UPDATETIME = SYSDATE
  581. WHERE RECORDID = %v
  582. `, apiAddSignerRsp.Data.SignUser[0].SignUrl, record.RECORDID)
  583. if _, err = db.GetEngine().Exec(sql); err != nil {
  584. logger.GetLogger().Error("合同签署地址失败, err:", err)
  585. err = errors.New("合同签署地址失败")
  586. return
  587. }
  588. rsp = CreateContractRsp{SignUrl: apiAddSignerRsp.Data.SignUser[0].SignUrl}
  589. return
  590. }
  591. // 构建甲方签章策略
  592. func buildStrategyByPartyA(templateConfigId int) (signStrategyList []APISignStrategy, err error) {
  593. signStrategyList = make([]APISignStrategy, 0)
  594. // 获取电子签模板字段配置
  595. fields := make([]models.Esigntemplatefield, 0)
  596. if err = db.GetEngine().Where("TEMPLATECONFIGID = ?", templateConfigId).Find(&fields); err != nil {
  597. logger.GetLogger().Error("获取电子签模板字段配置失败, err", err)
  598. err = errors.New("获取电子签模板字段配置失败")
  599. return
  600. }
  601. if len(fields) == 0 {
  602. err = errors.New("获取电子签模板字段配置信息异常")
  603. logger.GetLogger().Error("获取电子签模板字段配置异常, templateconfigid:", templateConfigId)
  604. return
  605. }
  606. for _, item := range fields {
  607. switch item.FIELDKEY {
  608. case "PARTYA_SIGNATURE": // 甲方签章(企业印章)
  609. signStrategyList = append(signStrategyList, APISignStrategy{AttachNo: 1, LocationMode: 4, SignKey: "PARTYA_SIGNATURE", SignType: 1})
  610. case "PARTYA_DATE": // 甲方签署时间
  611. signStrategyList = append(signStrategyList, APISignStrategy{AttachNo: 1, LocationMode: 4, SignKey: "PARTYA_DATE", SignType: 2})
  612. }
  613. }
  614. return
  615. }
  616. // cacheMap {"realName":"邓志明","idCardNo":"430426198507087670","bankCard":"6221885840097492396","mobile":"18033442829","idCardPhoto":"./uploadFile/20231227/202312271427518530.jpg","idCardPhotoBackURL":"./uploadFile/20231227/202312271427544764.jpg","bankId":"403100000004"}
  617. // 构建乙方签章策略和模板填充策略
  618. func buildStrategyByPartyB(templateConfigId int, fieldUserType int, cacheMap map[string]interface{}) (signStrategyList []APISignStrategy, receiverFillStrategyList []APIReceiverFillStrategy, err error) {
  619. signStrategyList = make([]APISignStrategy, 0)
  620. receiverFillStrategyList = make([]APIReceiverFillStrategy, 0)
  621. // 获取电子签模板字段配置
  622. fields := make([]models.Esigntemplatefield, 0)
  623. if err = db.GetEngine().Where("TEMPLATECONFIGID = ? AND FIELDUSERTYPE = ?", templateConfigId, fieldUserType).Find(&fields); err != nil {
  624. logger.GetLogger().Error("获取电子签模板字段配置失败, err", err)
  625. err = errors.New("获取电子签模板字段配置失败")
  626. return
  627. }
  628. if len(fields) == 0 {
  629. err = errors.New("获取电子签模板字段配置信息异常")
  630. logger.GetLogger().Error("获取电子签模板字段配置异常, templateconfigid:", templateConfigId)
  631. return
  632. }
  633. for _, item := range fields {
  634. switch item.FIELDKEY {
  635. case "P_PARTYB_NAME": // 乙方名称
  636. receiverFillStrategyList = append(receiverFillStrategyList, APIReceiverFillStrategy{AttachNo: 1, Key: "P_PARTYB_NAME", Value: cacheMap["realName"].(string)})
  637. case "P_PARTYB_ID": // 乙方证件号码
  638. receiverFillStrategyList = append(receiverFillStrategyList, APIReceiverFillStrategy{AttachNo: 1, Key: "P_PARTYB_ID", Value: cacheMap["idCardNo"].(string)})
  639. case "P_PARTYB_SIGNATURE": // 乙方签章(个人)
  640. signStrategyList = append(signStrategyList, APISignStrategy{AttachNo: 1, LocationMode: 4, SignKey: "P_PARTYB_SIGNATURE", SignType: 1})
  641. case "P_PARTYB_DATE": // 乙方签署时间
  642. signStrategyList = append(signStrategyList, APISignStrategy{AttachNo: 1, LocationMode: 4, SignKey: "P_PARTYB_DATE", SignType: 2})
  643. }
  644. }
  645. return
  646. }
  647. func ASignCompleted(contractNo, status string) (err error) {
  648. /*
  649. // 合同签署完成后回调通知示例
  650. String publickey = "MFwwDQcccccxxxxmEz/nw27Ln6AP90ZCMPi+iNF1m9mhNECAwEAAQ==";
  651. String remark = ""; // 若被拒签则会返回拒签原因,拒签原因不参与签名
  652. Map <String, String> map = new HashMap<>();
  653. map.put("action", "signCompleted");
  654. map.put("contractNo", "20221114142140345");
  655. map.put("status", "2");
  656. map.put("signTime", "2022-11-14 14:22:00");
  657. map.put("timestamp", "1668406920005");
  658. map.put("validityTime", "2022-11-24 23:59:59");
  659. String json = JSONObject.toJSONString(map, SerializerFeature.MapSortField);
  660. System.out.println("数据:" + json);
  661. // 计算签名
  662. try {
  663. String sign = "feFfcprGjdmDDqRmxK5qlWlMncX0mc6LJ5agebOGIx2QiAern+6ZRg/SBHOgvHp/+1ywVRdyKNUKxPneETwKPw==";
  664. System.out.println(RSAUtils.rsaSignCheck(sign, json, publickey));
  665. } catch (Exception e) {
  666. e.printStackTrace();
  667. }
  668. */
  669. // 获取合同编号
  670. if contractNo == "" {
  671. logger.GetLogger().Error("获取合同编号失败")
  672. err = errors.New("获取合同编号失败")
  673. return
  674. }
  675. // 获取合同状态
  676. if status == "" {
  677. logger.GetLogger().Error("获取获取合同状态失败")
  678. err = errors.New("获取获取合同状态失败")
  679. return
  680. }
  681. // 更新数据库记录
  682. sql := fmt.Sprintf(`
  683. UPDATE useresignrecord
  684. SET RECORDSTATUS = 3,
  685. UPDATETIME = SYSDATE
  686. WHERE CONTRACTNO = '%v'
  687. `, contractNo)
  688. _, err = db.GetEngine().Exec(sql)
  689. return
  690. }