servcies.go 21 KB

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