sign.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  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 AND TEMPLATETYPE = 1
  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. }
  144. /*
  145. handleASignCompleted 处理爱签合同签署完成后回调通知
  146. req 异步推送参数
  147. */
  148. func HandleASignCompleted(req map[string]string) (err error) {
  149. // 合同签署完成后回调通知示例
  150. // String publickey = "MFwwDQcccccxxxxmEz/nw27Ln6AP90ZCMPi+iNF1m9mhNECAwEAAQ==";
  151. // String remark = ""; // 若被拒签则会返回拒签原因,拒签原因不参与签名
  152. // Map <String, String> map = new HashMap<>();
  153. // map.put("action", "signCompleted");
  154. // map.put("contractNo", "20221114142140345");
  155. // map.put("status", "2");
  156. // map.put("signTime", "2022-11-14 14:22:00");
  157. // map.put("timestamp", "1668406920005");
  158. // map.put("validityTime", "2022-11-24 23:59:59");
  159. // String json = JSONObject.toJSONString(map, SerializerFeature.MapSortField);
  160. // System.out.println("数据:" + json);
  161. // // 计算签名
  162. // try {
  163. // String sign = "feFfcprGjdmDDqRmxK5qlWlMncX0mc6LJ5agebOGIx2QiAern+6ZRg/SBHOgvHp/+1ywVRdyKNUKxPneETwKPw==";
  164. // System.out.println(RSAUtils.rsaSignCheck(sign, json, publickey));
  165. // } catch (Exception e) {
  166. // e.printStackTrace();
  167. // }
  168. // 获取合同编号
  169. // contractNo, ok := req["contractNo"]
  170. // if !ok {
  171. // global.M2A_LOG.Error("【HandleASignCompleted】 获取合同编号失败", zap.Any("req", req))
  172. // return
  173. // }
  174. // // 获取合同状态
  175. // status, ok := req["status"]
  176. // if !ok {
  177. // global.M2A_LOG.Error("【HandleASignCompleted】 获取获取合同状态失败", zap.Any("req", req))
  178. // return
  179. // }
  180. // if status == "2" {
  181. // // 已签约
  182. // // 下载合同
  183. // }
  184. return
  185. }