servcies.go 24 KB

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