sign.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package sign
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "mtp20access/global"
  7. "mtp20access/model/account"
  8. "mtp20access/model/account/request"
  9. "mtp20access/model/account/response"
  10. "mtp20access/service/asign"
  11. "strconv"
  12. "time"
  13. "go.uber.org/zap"
  14. )
  15. // QueryUserESignRecord 查询用户电子签记录表
  16. func QueryUserESignRecord(userId int) (rsp []account.Useresignrecord, err error) {
  17. rsp = make([]account.Useresignrecord, 0)
  18. err = global.M2A_DB.Where("USERID = ?", userId).Find(&rsp)
  19. return
  20. }
  21. // AddUser 添加用户
  22. func AddUser(req request.AddUserReq, userId int) (err error) {
  23. // 获取用户电子签记录
  24. useresignrecord := new(account.Useresignrecord)
  25. has, _ := global.M2A_DB.Where("USERID = ? AND TEMPLATETYPE = 1 AND RECORDSTATUS = 3", userId).Get(useresignrecord)
  26. if has {
  27. err = errors.New("用户已同步")
  28. return
  29. }
  30. // 调用爱签API-添加个人用户(https://{host}/user/addPersonalUser)
  31. rsp, err := asign.AddPersonalUserBy(
  32. strconv.Itoa(userId),
  33. req.Name,
  34. req.IdCard,
  35. req.Mobile,
  36. req.IdCardType,
  37. )
  38. if err != nil {
  39. return
  40. }
  41. if rsp.Code != 100000 {
  42. err = errors.New(strconv.Itoa(rsp.Code))
  43. global.M2A_LOG.Error("【AddUser】 接口调用失败", zap.Error(err))
  44. return
  45. }
  46. // 更新用户电子签记录-实名认证状态
  47. authinfo, err := json.Marshal(req)
  48. if err != nil {
  49. global.M2A_LOG.Error("【AddUser】 构建AUTHINFO失败", zap.Error(err))
  50. return
  51. }
  52. sql := fmt.Sprintf(`
  53. UPDATE useresignrecord
  54. SET RECORDSTATUS = 3,
  55. UPDATETIME = SYSDATE,
  56. AUTHINFO = '%v'
  57. WHERE USERID = %v
  58. `, string(authinfo), userId)
  59. if _, err = global.M2A_DB.Exec(sql); err != nil {
  60. global.M2A_LOG.Error("【AddUser】 更新用户电子签记录失败", zap.Error(err))
  61. return
  62. }
  63. return
  64. }
  65. // CreateContractAndAddSigner 上传待签署文件和添加签署方
  66. func CreateContractAndAddSigner(req request.CreateContractAndAddSignerReq, userId int) (rsp response.CreateContractAndAddSignerRsp, err error) {
  67. // 获取用户电子签记录
  68. useresignrecord := new(account.Useresignrecord)
  69. has, err := global.M2A_DB.Where("USERID = ? AND TEMPLATENO = ?", userId, req.TemplateNo).Get(useresignrecord)
  70. if err != nil || !has {
  71. global.M2A_LOG.Error("【CreateContractAndAddSigner】 获取用户电子签记录失败", zap.Error(err))
  72. return
  73. }
  74. // 判断是否需要创建合同(上传待签署文件)
  75. if useresignrecord.CONTRACTNO == "" {
  76. // 生成合同编号
  77. // #{userid} || '_' || to_char(sysdate, 'yyyyMMddhh24miss') || '_' || seq_useresignrecord.currval,
  78. contractNo := fmt.Sprintf("%d_%s_%v", userId, time.Now().Format("2006-01-02 15:04:05"), useresignrecord.RECORDID)
  79. // 调用爱签API-上传待签署文件(https://{host}/contract/createContract)
  80. r, e := asign.CreateContract(
  81. contractNo,
  82. useresignrecord.TEMPLATENAME,
  83. useresignrecord.TEMPLATENO,
  84. )
  85. if e != nil {
  86. err = e
  87. return
  88. }
  89. if r.Code != 100000 {
  90. err = errors.New(strconv.Itoa(r.Code))
  91. global.M2A_LOG.Error("【CreateContractAndAddSigner】 上传待签署文件接口调用失败", zap.Error(err))
  92. return
  93. }
  94. // 将返回的合同编号写入数据库
  95. useresignrecord.CONTRACTNO = contractNo
  96. sql := fmt.Sprintf(`
  97. UPDATE useresignrecord
  98. SET SIGNURL = '%v'
  99. UPDATETIME = SYSDATE
  100. WHERE RECORDID = %v
  101. `, useresignrecord.CONTRACTNO, useresignrecord.RECORDID)
  102. if _, err = global.M2A_DB.Exec(sql); err != nil {
  103. global.M2A_LOG.Error("【CreateContractAndAddSigner】 写入合同编号失败", zap.Error(err))
  104. return
  105. }
  106. }
  107. // 判断是否需要添加签署方(获取合同签约地址)
  108. if useresignrecord.SIGNURL != "" {
  109. err = errors.New("合同签署链接已存在")
  110. } else {
  111. // 调用爱签API-添加签署方(https://{host}/contract/addSigner)
  112. r, e := asign.AddSigner(
  113. useresignrecord.CONTRACTNO,
  114. strconv.Itoa(userId),
  115. )
  116. if e != nil {
  117. err = e
  118. return
  119. }
  120. if r.Code != 100000 {
  121. err = errors.New(strconv.Itoa(r.Code))
  122. global.M2A_LOG.Error("【CreateContractAndAddSigner】 添加签署方接口调用失败", zap.Error(err))
  123. return
  124. }
  125. if len(r.Data.SignUser) > 0 {
  126. useresignrecord.SIGNURL = r.Data.SignUser[0].SignUrl
  127. // 将返回的合同编号写入数据库
  128. sql := fmt.Sprintf(`
  129. UPDATE useresignrecord
  130. SET SIGNURL = '%v'
  131. UPDATETIME = SYSDATE
  132. WHERE RECORDID = %v
  133. `, useresignrecord.SIGNURL, useresignrecord.RECORDID)
  134. if _, err = global.M2A_DB.Exec(sql); err != nil {
  135. global.M2A_LOG.Error("【CreateContractAndAddSigner】 写入合同签署链接失败", zap.Error(err))
  136. return
  137. }
  138. // 给客户端返回合同签署地址
  139. rsp.SignUrl = useresignrecord.SIGNURL
  140. }
  141. }
  142. return
  143. }