Bladeren bron

处理历史数据查询中金额类字段小数位问题

zhou.xiaoning 1 jaar geleden
bovenliggende
commit
86484499ba

+ 7 - 0
config/config.j2

@@ -54,4 +54,11 @@
     <SignToken value="{{SignToken}}"/>
     <SignKey value="{{SignKey}}"/>
   </Tencent>
+  <Asign>
+    <Url value="{{Asign_Url}}"/>
+    <AppId value="{{Asign_AppId}}"/>
+    <PrivateKey value="{{Asign_PrivateKey}}"/>
+    <NotifyUrl value="{{Asign_NotifyUrl}}"/>
+    <OpenApiUrl value="{{Asign_OpenApiUrl}}"/>
+  </Asign>
 </Configuration>

+ 39 - 0
controllers/asign/auth.go

@@ -0,0 +1,39 @@
+package asign
+
+import (
+	"mtp2_if/global/app"
+	"mtp2_if/global/e"
+	"mtp2_if/logger"
+	"net/http"
+
+	asignService "mtp2_if/services/asign"
+
+	"github.com/gin-gonic/gin"
+)
+
+// BankCard4 银行卡四要素认证
+// @Summary  银行卡四要素认证
+// @Produce  json
+// @Security ApiKeyAuth
+// @accept   application/json
+// @Param    data body     asignService.BankCard4Req true "入参"
+// @Failure  500  {object} asignService.BankCard4Rsp
+// @Router   /Asign/BankCard4 [post]
+// @Tags     爱签
+func BankCard4(c *gin.Context) {
+	appG := app.Gin{C: c}
+
+	// 获取请求参数
+	var req asignService.BankCard4Req
+	if err := appG.C.ShouldBindJSON(&req); err != nil {
+		logger.GetLogger().Errorf(err.Error())
+		appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
+		return
+	}
+
+	if rsp, err := asignService.BankCard4(req); err == nil {
+		appG.Response(http.StatusOK, e.SUCCESS, rsp)
+	} else {
+		appG.Response(http.StatusBadRequest, e.ERROR, nil)
+	}
+}

+ 11 - 5
controllers/quote/history.go

@@ -15,6 +15,7 @@ import (
 	"time"
 
 	"github.com/gin-gonic/gin"
+	"github.com/shopspring/decimal"
 )
 
 // HistoryData 历史数据
@@ -105,13 +106,14 @@ func QueryHistoryDatas(c *gin.Context) {
 	// 计算最终价格
 	rst := make([]HistoryData, 0)
 	for _, v := range cycleDatas {
+		tt, _ := decimal.NewFromFloat(utils.IntToFloat64(v.TT, dcplace)).Round(2).Float64() // 按行情服务要求,金额类需要先除以商品报价小数位再按2位小数四舍五入
 		historyData := HistoryData{
 			Opened:        utils.IntToFloat64(v.Open, dcplace),
 			Highest:       utils.IntToFloat64(v.High, dcplace),
 			Lowest:        utils.IntToFloat64(v.Low, dcplace),
 			Closed:        utils.IntToFloat64(v.Close, dcplace),
 			TotleVolume:   v.TV,
-			TotleTurnover: float64(v.TT),
+			TotleTurnover: tt,
 			HoldVolume:    v.HV,
 			Settle:        utils.IntToFloat64(v.SP, dcplace),
 			TimeStamp:     time.Unix(int64(v.ST), 0),
@@ -185,6 +187,7 @@ func QueryHistoryDatas(c *gin.Context) {
 					v := quoteDays[0]
 					if len(rst) == 0 {
 						logger.GetLogger().Debugf("[checkTiks] no tiks, add a tik:%v", v)
+						tt, _ := decimal.NewFromFloat(utils.IntToFloat64(int(v.Totalturnover), dcplace)).Round(2).Float64() // 按行情服务要求,金额类需要先除以商品报价小数位再按2位小数四舍五入
 						// 历史数据当前没数据则直接加当前盘面数据
 						historyData := HistoryData{
 							Opened:        utils.IntToFloat64(int(v.Opened), dcplace),
@@ -192,7 +195,7 @@ func QueryHistoryDatas(c *gin.Context) {
 							Lowest:        utils.IntToFloat64(int(v.Lowest), dcplace),
 							Closed:        utils.IntToFloat64(int(v.Last), dcplace),
 							TotleVolume:   int(v.Totalvolume),
-							TotleTurnover: float64(v.Totalturnover),
+							TotleTurnover: tt,
 							HoldVolume:    int(v.Holdvolume),
 							Settle:        utils.IntToFloat64(int(v.Settle), dcplace),
 							TimeStamp:     fisrtDate,
@@ -221,13 +224,14 @@ func QueryHistoryDatas(c *gin.Context) {
 							// #3424 当日未开市显示了K线
 							// 修改:这里增加判断盘面是否有开盘价
 							if v.Opened > 0 && v.Last > 0 {
+								tt, _ := decimal.NewFromFloat(utils.IntToFloat64(int(v.Totalturnover), dcplace)).Round(2).Float64() // 按行情服务要求,金额类需要先除以商品报价小数位再按2位小数四舍五入
 								historyData := HistoryData{
 									Opened:        utils.IntToFloat64(int(v.Opened), dcplace),
 									Highest:       utils.IntToFloat64(int(v.Highest), dcplace),
 									Lowest:        utils.IntToFloat64(int(v.Lowest), dcplace),
 									Closed:        utils.IntToFloat64(int(v.Last), dcplace),
 									TotleVolume:   int(v.Totalvolume),
-									TotleTurnover: float64(v.Totalturnover),
+									TotleTurnover: tt,
 									HoldVolume:    int(v.Holdvolume),
 									Settle:        utils.IntToFloat64(int(v.Settle), dcplace),
 									TimeStamp:     fisrtDate,
@@ -348,11 +352,12 @@ func QueryHistoryTikDatas(c *gin.Context) {
 		if v.TDR == 83 { // (Ascii) B-66 S-83
 			buyOrSell = 1
 		}
+		tt, _ := decimal.NewFromFloat(utils.IntToFloat64(v.TT, dcplace)).Round(2).Float64() // 按行情服务要求,金额类需要先除以商品报价小数位再按2位小数四舍五入
 		rst = append(rst, HistoryTikData{
 			TimeStamp: time.Unix(int64(v.AT), 0),
 			PE:        utils.IntToFloat64(v.PE, dcplace),
 			Vol:       v.Vol,
-			TT:        float64(v.TT),
+			TT:        tt,
 			Bid:       utils.IntToFloat64(v.Bid, dcplace),
 			BV:        v.BV,
 			Ask:       utils.IntToFloat64(v.Ask, dcplace),
@@ -799,13 +804,14 @@ func QueryTSData(c *gin.Context) {
 			}
 		}
 		if needAdd {
+			tt, _ := decimal.NewFromFloat(utils.IntToFloat64(cycleData.TT, int(goods.Decimalplace))).Round(2).Float64() // 按行情服务要求,金额类需要先除以商品报价小数位再按2位小数四舍五入
 			historyDatas = append(historyDatas, HistoryData{
 				Opened:        utils.IntToFloat64(cycleData.Open, int(goods.Decimalplace)),
 				Highest:       utils.IntToFloat64(cycleData.High, int(goods.Decimalplace)),
 				Lowest:        utils.IntToFloat64(cycleData.Low, int(goods.Decimalplace)),
 				Closed:        utils.IntToFloat64(cycleData.Close, int(goods.Decimalplace)),
 				TotleVolume:   cycleData.TV,
-				TotleTurnover: float64(cycleData.TT),
+				TotleTurnover: tt,
 				HoldVolume:    cycleData.HV,
 				Settle:        utils.IntToFloat64(cycleData.SP, int(goods.Decimalplace)),
 				TimeStamp:     time.Unix(int64(cycleData.ST), 0),

+ 5 - 2
controllers/quote/quote.go

@@ -12,6 +12,7 @@ import (
 	"time"
 
 	"github.com/gin-gonic/gin"
+	"github.com/shopspring/decimal"
 )
 
 // QueryQuoteDayReq 获取商品盘面信息请求参数
@@ -177,6 +178,8 @@ func QueryQuoteDay(c *gin.Context) {
 		// 获取对应的商品信息
 		goods, bFind := mtpcache.GetGoods(v.Goodscode)
 		if bFind {
+			lt, _ := decimal.NewFromFloat(utils.IntToFloat64(int(v.Lastturnover), int(goods.DECIMALPLACE))).Round(2).Float64() // 按行情服务要求,金额类需要先除以商品报价小数位再按2位小数四舍五入
+			tt, _ := decimal.NewFromFloat(utils.IntToFloat64(int(v.Totalturnover), int(goods.DECIMALPLACE))).Round(2).Float64()
 			rsp = append(rsp, QueryQuoteDayRsp{
 				Exchangedate:         v.Exchangedate,
 				Goodscode:            v.Goodscode,
@@ -190,11 +193,11 @@ func QueryQuoteDay(c *gin.Context) {
 				Utclasttime:          time.Unix(int64(v.Utclasttime), 0),
 				Last:                 utils.IntToFloat64(int(v.Last), int(goods.DECIMALPLACE)),
 				Lastvolume:           v.Lastvolume,
-				Lastturnover:         utils.IntToFloat64(int(v.Lastturnover), int(goods.DECIMALPLACE)),
+				Lastturnover:         lt,
 				Totalbidvolume:       v.Totalbidvolume,
 				Totalaskvolume:       v.Totalaskvolume,
 				Totalvolume:          v.Totalvolume,
-				Totalturnover:        utils.IntToFloat64(int(v.Totalturnover), int(goods.DECIMALPLACE)),
+				Totalturnover:        tt,
 				Bid:                  utils.IntToFloat64(int(v.Bid), int(goods.DECIMALPLACE)),
 				Bid2:                 utils.IntToFloat64(int(v.Bid2), int(goods.DECIMALPLACE)),
 				Bid3:                 utils.IntToFloat64(int(v.Bid3), int(goods.DECIMALPLACE)),

+ 124 - 2
docs/docs.go

@@ -17,6 +17,44 @@ const docTemplate = `{
     "host": "{{.Host}}",
     "basePath": "{{.BasePath}}",
     "paths": {
+        "/Asign/BankCard4": {
+            "post": {
+                "security": [
+                    {
+                        "ApiKeyAuth": []
+                    }
+                ],
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "爱签"
+                ],
+                "summary": "银行卡四要素认证",
+                "parameters": [
+                    {
+                        "description": "入参",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/asign.BankCard4Req"
+                        }
+                    }
+                ],
+                "responses": {
+                    "500": {
+                        "description": "Internal Server Error",
+                        "schema": {
+                            "$ref": "#/definitions/asign.BankCard4Rsp"
+                        }
+                    }
+                }
+            }
+        },
         "/Bank/QueryBankBranChnumInfo": {
             "get": {
                 "security": [
@@ -22730,6 +22768,90 @@ const docTemplate = `{
                 }
             }
         },
+        "asign.BankCard4Req": {
+            "type": "object",
+            "required": [
+                "type",
+                "userId"
+            ],
+            "properties": {
+                "company": {
+                    "description": "企业法人银行卡四要素,实体类型为企业时必填",
+                    "$ref": "#/definitions/asign.CompanyBankCard4"
+                },
+                "person": {
+                    "description": "个人银行卡四要素,实体类型为个人时必填",
+                    "$ref": "#/definitions/asign.PersonBankCard4"
+                },
+                "type": {
+                    "description": "实体类型 1:个人 2:企业",
+                    "type": "integer"
+                },
+                "userId": {
+                    "description": "用户ID",
+                    "type": "integer"
+                }
+            }
+        },
+        "asign.BankCard4Rsp": {
+            "type": "object",
+            "properties": {
+                "serialNo": {
+                    "description": "认证流水号",
+                    "type": "string"
+                }
+            }
+        },
+        "asign.CompanyBankCard4": {
+            "type": "object",
+            "properties": {
+                "bankCard": {
+                    "description": "法人银行卡号(仅限印有“银联”字样的银行卡)",
+                    "type": "string"
+                },
+                "companyName": {
+                    "description": "企业名称",
+                    "type": "string"
+                },
+                "creditCode": {
+                    "description": "社会统一信用代码",
+                    "type": "string"
+                },
+                "idCardNo": {
+                    "description": "法人身份证号",
+                    "type": "string"
+                },
+                "mobile": {
+                    "description": "法人手机号(限中国大陆11位手机号)",
+                    "type": "string"
+                },
+                "realName": {
+                    "description": "法人姓名",
+                    "type": "string"
+                }
+            }
+        },
+        "asign.PersonBankCard4": {
+            "type": "object",
+            "properties": {
+                "bankCard": {
+                    "description": "银行卡号(仅限印有“银联”字样的银行卡)",
+                    "type": "string"
+                },
+                "idCardNo": {
+                    "description": "身份证号",
+                    "type": "string"
+                },
+                "mobile": {
+                    "description": "手机号码(限中国大陆11位手机号)",
+                    "type": "string"
+                },
+                "realName": {
+                    "description": "真实姓名",
+                    "type": "string"
+                }
+            }
+        },
         "common.ClientMenu": {
             "type": "object",
             "properties": {
@@ -63933,7 +64055,7 @@ const docTemplate = `{
             ],
             "properties": {
                 "email": {
-                    "description": "邮箱地址,如必修改则不传,传空为清除邮箱地址",
+                    "description": "邮箱地址,如必修改则不传,传空为清除邮箱地址",
                     "type": "string"
                 },
                 "userID": {
@@ -63941,7 +64063,7 @@ const docTemplate = `{
                     "type": "integer"
                 },
                 "wechat": {
-                    "description": "微信号,如必修改则不传,传空为清除微信号",
+                    "description": "微信号,如必修改则不传,传空为清除微信号",
                     "type": "string"
                 }
             }

+ 124 - 2
docs/swagger.json

@@ -8,6 +8,44 @@
         "version": "1.0"
     },
     "paths": {
+        "/Asign/BankCard4": {
+            "post": {
+                "security": [
+                    {
+                        "ApiKeyAuth": []
+                    }
+                ],
+                "consumes": [
+                    "application/json"
+                ],
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "爱签"
+                ],
+                "summary": "银行卡四要素认证",
+                "parameters": [
+                    {
+                        "description": "入参",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/asign.BankCard4Req"
+                        }
+                    }
+                ],
+                "responses": {
+                    "500": {
+                        "description": "Internal Server Error",
+                        "schema": {
+                            "$ref": "#/definitions/asign.BankCard4Rsp"
+                        }
+                    }
+                }
+            }
+        },
         "/Bank/QueryBankBranChnumInfo": {
             "get": {
                 "security": [
@@ -22721,6 +22759,90 @@
                 }
             }
         },
+        "asign.BankCard4Req": {
+            "type": "object",
+            "required": [
+                "type",
+                "userId"
+            ],
+            "properties": {
+                "company": {
+                    "description": "企业法人银行卡四要素,实体类型为企业时必填",
+                    "$ref": "#/definitions/asign.CompanyBankCard4"
+                },
+                "person": {
+                    "description": "个人银行卡四要素,实体类型为个人时必填",
+                    "$ref": "#/definitions/asign.PersonBankCard4"
+                },
+                "type": {
+                    "description": "实体类型 1:个人 2:企业",
+                    "type": "integer"
+                },
+                "userId": {
+                    "description": "用户ID",
+                    "type": "integer"
+                }
+            }
+        },
+        "asign.BankCard4Rsp": {
+            "type": "object",
+            "properties": {
+                "serialNo": {
+                    "description": "认证流水号",
+                    "type": "string"
+                }
+            }
+        },
+        "asign.CompanyBankCard4": {
+            "type": "object",
+            "properties": {
+                "bankCard": {
+                    "description": "法人银行卡号(仅限印有“银联”字样的银行卡)",
+                    "type": "string"
+                },
+                "companyName": {
+                    "description": "企业名称",
+                    "type": "string"
+                },
+                "creditCode": {
+                    "description": "社会统一信用代码",
+                    "type": "string"
+                },
+                "idCardNo": {
+                    "description": "法人身份证号",
+                    "type": "string"
+                },
+                "mobile": {
+                    "description": "法人手机号(限中国大陆11位手机号)",
+                    "type": "string"
+                },
+                "realName": {
+                    "description": "法人姓名",
+                    "type": "string"
+                }
+            }
+        },
+        "asign.PersonBankCard4": {
+            "type": "object",
+            "properties": {
+                "bankCard": {
+                    "description": "银行卡号(仅限印有“银联”字样的银行卡)",
+                    "type": "string"
+                },
+                "idCardNo": {
+                    "description": "身份证号",
+                    "type": "string"
+                },
+                "mobile": {
+                    "description": "手机号码(限中国大陆11位手机号)",
+                    "type": "string"
+                },
+                "realName": {
+                    "description": "真实姓名",
+                    "type": "string"
+                }
+            }
+        },
         "common.ClientMenu": {
             "type": "object",
             "properties": {
@@ -63924,7 +64046,7 @@
             ],
             "properties": {
                 "email": {
-                    "description": "邮箱地址,如必修改则不传,传空为清除邮箱地址",
+                    "description": "邮箱地址,如必修改则不传,传空为清除邮箱地址",
                     "type": "string"
                 },
                 "userID": {
@@ -63932,7 +64054,7 @@
                     "type": "integer"
                 },
                 "wechat": {
-                    "description": "微信号,如必修改则不传,传空为清除微信号",
+                    "description": "微信号,如必修改则不传,传空为清除微信号",
                     "type": "string"
                 }
             }

+ 85 - 2
docs/swagger.yaml

@@ -16,6 +16,66 @@ definitions:
         description: 总条数
         type: integer
     type: object
+  asign.BankCard4Req:
+    properties:
+      company:
+        $ref: '#/definitions/asign.CompanyBankCard4'
+        description: 企业法人银行卡四要素,实体类型为企业时必填
+      person:
+        $ref: '#/definitions/asign.PersonBankCard4'
+        description: 个人银行卡四要素,实体类型为个人时必填
+      type:
+        description: 实体类型 1:个人 2:企业
+        type: integer
+      userId:
+        description: 用户ID
+        type: integer
+    required:
+    - type
+    - userId
+    type: object
+  asign.BankCard4Rsp:
+    properties:
+      serialNo:
+        description: 认证流水号
+        type: string
+    type: object
+  asign.CompanyBankCard4:
+    properties:
+      bankCard:
+        description: 法人银行卡号(仅限印有“银联”字样的银行卡)
+        type: string
+      companyName:
+        description: 企业名称
+        type: string
+      creditCode:
+        description: 社会统一信用代码
+        type: string
+      idCardNo:
+        description: 法人身份证号
+        type: string
+      mobile:
+        description: 法人手机号(限中国大陆11位手机号)
+        type: string
+      realName:
+        description: 法人姓名
+        type: string
+    type: object
+  asign.PersonBankCard4:
+    properties:
+      bankCard:
+        description: 银行卡号(仅限印有“银联”字样的银行卡)
+        type: string
+      idCardNo:
+        description: 身份证号
+        type: string
+      mobile:
+        description: 手机号码(限中国大陆11位手机号)
+        type: string
+      realName:
+        description: 真实姓名
+        type: string
+    type: object
   common.ClientMenu:
     properties:
       children:
@@ -30675,13 +30735,13 @@ definitions:
   user.UpdateUserInfoWechatAndEmailReq:
     properties:
       email:
-        description: 邮箱地址,如必修改则不传,传空为清除邮箱地址
+        description: 邮箱地址,如必修改则不传,传空为清除邮箱地址
         type: string
       userID:
         description: 用户ID
         type: integer
       wechat:
-        description: 微信号,如必修改则不传,传空为清除微信号
+        description: 微信号,如必修改则不传,传空为清除微信号
         type: string
     required:
     - userID
@@ -30702,6 +30762,29 @@ info:
   title: MTP2.0 查询服务 API
   version: "1.0"
 paths:
+  /Asign/BankCard4:
+    post:
+      consumes:
+      - application/json
+      parameters:
+      - description: 入参
+        in: body
+        name: data
+        required: true
+        schema:
+          $ref: '#/definitions/asign.BankCard4Req'
+      produces:
+      - application/json
+      responses:
+        "500":
+          description: Internal Server Error
+          schema:
+            $ref: '#/definitions/asign.BankCard4Rsp'
+      security:
+      - ApiKeyAuth: []
+      summary: 银行卡四要素认证
+      tags:
+      - 爱签
   /Bank/QueryBankBranChnumInfo:
     get:
       parameters:

+ 83 - 14
services/asign/api.go

@@ -8,47 +8,116 @@ import (
 	"github.com/fatih/structs"
 )
 
-// PersonBankCard4 个人银行卡四要素认证
-func PersonBankCard4(req PersonBankCard4Req) (rsp *Rsp[PersonBankCard4Rsp], err error) {
+// APIPersonBankCard4 个人银行卡四要素认证
+func APIPersonBankCard4(req APIPersonBankCard4Req) (rsp *APIRsp[APIBankCard4Rsp], err error) {
 	apiUrl := config.SerCfg.AsignCfg.Url + "/auth/person/bankCard4"
 
 	reqMap := structs.Map(req)
-	logger.GetLogger().Info("[asign.PersonBankCard4] 调用接口 /auth/person/bankCard4 请求, request:", reqMap)
+	logger.GetLogger().Info("调用接口 "+apiUrl+" 请求, request:", reqMap)
 	rspBody, err := HttpPost(apiUrl, reqMap)
 	if err != nil {
-		logger.GetLogger().Error("[asign.PersonBankCard4] 调用接口 /auth/person/bankCard4 错误, error:", err.Error())
+		logger.GetLogger().Error("调用接口 "+apiUrl+" 错误, error:", err.Error())
 		return
 	}
 	rspStr := string(rspBody)
 	if len(rspStr) == 0 {
-		logger.GetLogger().Error("[asign.PersonBankCard4] 调用接口 /auth/person/bankCard4 错误, response为空")
+		logger.GetLogger().Error("调用接口 " + apiUrl + " 错误, response为空")
 		return
 	}
-	logger.GetLogger().Info("[asign.PersonBankCard4] 调用接口 /auth/person/bankCard4 返回, response:", rspStr)
-	rsp = new(Rsp[PersonBankCard4Rsp])
+	logger.GetLogger().Info("调用接口 "+apiUrl+" 返回, response:", rspStr)
+	rsp = new(APIRsp[APIBankCard4Rsp])
 	err = json.Unmarshal(rspBody, rsp)
 
 	return
 }
 
-// CaptchaVerify 认证验证码校验
-func CaptchaVerify(req CaptchaVerifyReq) (rsp *Rsp[CaptchaVerifyRsp], err error) {
+// APICompanyBankCard4 企业法人银行卡四要素认证
+func APICompanyBankCard4(req APICompanyBankCard4Req) (rsp *APIRsp[APIBankCard4Rsp], err error) {
+	apiUrl := config.SerCfg.AsignCfg.Url + "/auth/company/bankCard4"
+
+	reqMap := structs.Map(req)
+	logger.GetLogger().Info("调用接口 "+apiUrl+" 请求, request:", reqMap)
+	rspBody, err := HttpPost(apiUrl, reqMap)
+	if err != nil {
+		logger.GetLogger().Error("调用接口 "+apiUrl+" 错误, error:", err.Error())
+		return
+	}
+	rspStr := string(rspBody)
+	if len(rspStr) == 0 {
+		logger.GetLogger().Error("调用接口 " + apiUrl + " 错误, response为空")
+		return
+	}
+	logger.GetLogger().Info("调用接口 "+apiUrl+" 返回, response:", rspStr)
+	rsp = new(APIRsp[APIBankCard4Rsp])
+	err = json.Unmarshal(rspBody, rsp)
+
+	return
+}
+
+// APICaptchaVerify 认证验证码校验
+func APICaptchaResend(req APICaptchaResendReq) (rsp *APIRsp[interface{}], err error) {
+	apiUrl := config.SerCfg.AsignCfg.Url + "/auth/captcha/resend"
+
+	reqMap := structs.Map(req)
+	logger.GetLogger().Info("调用接口 "+apiUrl+" 请求, request:", reqMap)
+	rspBody, err := HttpPost(apiUrl, reqMap)
+	if err != nil {
+		logger.GetLogger().Error("调用接口 "+apiUrl+" 错误, error:", err.Error())
+		return
+	}
+	rspStr := string(rspBody)
+	if len(rspStr) == 0 {
+		logger.GetLogger().Error("调用接口 " + apiUrl + " 错误, response为空")
+		return
+	}
+	logger.GetLogger().Info("调用接口 "+apiUrl+" 返回, response:", rspStr)
+	rsp = new(APIRsp[interface{}])
+	err = json.Unmarshal(rspBody, rsp)
+
+	return
+}
+
+// APICaptchaVerify 认证验证码校验
+func APICaptchaVerify(req APICaptchaVerifyReq) (rsp *APIRsp[APICaptchaVerifyRsp], err error) {
 	apiUrl := config.SerCfg.AsignCfg.Url + "/auth/captcha/verify"
 
 	reqMap := structs.Map(req)
-	logger.GetLogger().Info("[asign.CaptchaVerify] 调用接口 /auth/captcha/verify 请求, request:", reqMap)
+	logger.GetLogger().Info("调用接口 "+apiUrl+" 请求, request:", reqMap)
+	rspBody, err := HttpPost(apiUrl, reqMap)
+	if err != nil {
+		logger.GetLogger().Error("调用接口 "+apiUrl+" 错误, error:", err.Error())
+		return
+	}
+	rspStr := string(rspBody)
+	if len(rspStr) == 0 {
+		logger.GetLogger().Error("调用接口 " + apiUrl + " 错误, response为空")
+		return
+	}
+	logger.GetLogger().Info("调用接口 "+apiUrl+" 返回, response:", rspStr)
+	rsp = new(APIRsp[APICaptchaVerifyRsp])
+	err = json.Unmarshal(rspBody, rsp)
+
+	return
+}
+
+// APIGetUser 查询用户信息
+func APIGetUser(req APIGetUserReq) (rsp *APIRsp[APIGetUserRsp], err error) {
+	apiUrl := config.SerCfg.AsignCfg.Url + "/user/getUser"
+
+	reqMap := structs.Map(req)
+	logger.GetLogger().Info("调用接口 "+apiUrl+" 请求, request:", reqMap)
 	rspBody, err := HttpPost(apiUrl, reqMap)
 	if err != nil {
-		logger.GetLogger().Error("[asign.CaptchaVerify] 调用接口 /auth/captcha/verify 错误, error:", err.Error())
+		logger.GetLogger().Error("调用接口 "+apiUrl+" 错误, error:", err.Error())
 		return
 	}
 	rspStr := string(rspBody)
 	if len(rspStr) == 0 {
-		logger.GetLogger().Error("[asign.CaptchaVerify] 调用接口 /auth/captcha/verify 错误, response为空")
+		logger.GetLogger().Error("调用接口 " + apiUrl + " 错误, response为空")
 		return
 	}
-	logger.GetLogger().Info("[asign.CaptchaVerify] 调用接口 /auth/captcha/verify 返回, response:", rspStr)
-	rsp = new(Rsp[CaptchaVerifyRsp])
+	logger.GetLogger().Info("调用接口 "+apiUrl+" 返回, response:", rspStr)
+	rsp = new(APIRsp[APIGetUserRsp])
 	err = json.Unmarshal(rspBody, rsp)
 
 	return

+ 108 - 0
services/asign/apiModels.go

@@ -0,0 +1,108 @@
+package asign
+
+type APIRspData interface {
+	interface{} | APIBankCard4Rsp | APIAddPersonalUserRsp | APICaptchaVerifyRsp | APIGetUserRsp
+}
+
+type APIRsp[T APIRspData] struct {
+	Code int    `json:"code"` // 响应码,100000表示成功,其他表示异常
+	Msg  string `json:"msg"`  // 响应信息
+	Data T      // 响应数据
+}
+
+// APIPersonBankCard4Req 个人银行卡四要素认证入参
+type APIPersonBankCard4Req struct {
+	RealName string `json:"realName" binding:"required"` // 真实姓名
+	IdCardNo string `json:"idCardNo" binding:"required"` // 身份证号
+	BankCard string `json:"bankCard" binding:"required"` // 银行卡号(仅限印有“银联”字样的银行卡)
+	Mobile   string `json:"mobile" binding:"required"`   // 手机号码(限中国大陆11位手机号)
+}
+
+// APICompanyBankCard4Req 企业法人银行卡四要素认证入参
+type APICompanyBankCard4Req struct {
+	CompanyName string `json:"companyName" binding:"required"` // 企业名称
+	CreditCode  string `json:"creditCode" binding:"required"`  // 社会统一信用代码
+	RealName    string `json:"realName" binding:"required"`    // 法人姓名
+	IdCardNo    string `json:"idCardNo" binding:"required"`    // 法人身份证号
+	BankCard    string `json:"bankCard" binding:"required"`    // 法人银行卡号(仅限印有“银联”字样的银行卡)
+	Mobile      string `json:"mobile" binding:"required"`      // 法人手机号(限中国大陆11位手机号)
+}
+
+// APIBankCard4Rsp 银行卡四要素认证出参
+type APIBankCard4Rsp struct {
+	Result   int    `json:"result"`   // 认证结果 0.暂无结果/认证中 1.成功 2.失败
+	SerialNo string `json:"serialNo"` // 认证流水号
+	Type     string `json:"type"`     // 认证类型
+}
+
+type APICaptchaResendReq struct {
+	SerialNo string `json:"serialNo" binding:"required"` // 认证流水号
+}
+
+// CaptchaVerifyReq 认证验证码校验入参
+type APICaptchaVerifyReq struct {
+	SerialNo string `json:"serialNo" binding:"required"` // 认证流水号
+	Captcha  string `json:"captcha" binding:"required"`  // 短信验证码
+}
+
+// CaptchaVerifyRsp 认证验证码校验出参
+type APICaptchaVerifyRsp struct {
+	Result   int    `json:"result"`   // 认证结果 0.暂无结果/认证中 1.成功 2.失败
+	SerialNo string `json:"serialNo"` // 认证流水号
+	Type     string `json:"type"`     // 认证类型
+}
+
+// APIGetUserReq 查询用户信息入参
+type APIGetUserReq struct {
+	Account    *string `json:"account"`    // 用户唯一识别码
+	CreditCode *string `json:"creditCode"` // 社会统一信用代码
+	IdCard     *string `json:"idCard"`     // 	证件号码
+}
+
+// APIGetUserRsp 查询用户信息出参
+type APIGetUserRsp struct {
+	Account      string `json:"account"`      //	用户账号,用户唯一识别码
+	Name         string `json:"name"`         //	个人用户姓名/企业法人姓名
+	CompanyName  string `json:"companyName"`  //	企业名称
+	IdCard       string `json:"idCard"`       //	个人用户证件号/企业法人身份证号
+	Mobile       string `json:"mobile"`       //	用户手机号(签约短信通知手机号)
+	Email        string `json:"email"`        //	用户邮箱号
+	UserType     int    `json:"userType"`     //	用户类型: 1:企业 2:个人
+	CreditCode   string `json:"creditCode"`   //	社会统一信用代码
+	BankCard     string `json:"bankCard"`     //	用户银行卡号
+	PortVersion  int    `json:"portVersion"`  //	用户添加时调用的接口版本: 0:历史接口 1:V2版本接口
+	IdentifyType int    `json:"identifyType"` //	认证类型
+	AuthType     int    `json:"authType"`     //	认证方式: 当portVersion=0 历史接口时 0:非强制认证 1:爱签平台强制认证 当portVersion=1 (V2)版本接口时 0:平台方自行认证 1:爱签平台认证
+	CreateTime   string `json:"createTime"`   //	创建时间
+	IdentifyTime string `json:"identifyTime"` //	认证时间
+}
+
+// AddPersonalUserReq 添加个人用户(V2)入参
+type APIAddPersonalUserReq struct {
+	Account         string `json:"account" binding:"required"` // 用户唯一识别码(请转入UserID)
+	SerialNo        string `json:"serialNo"`                   // 实名认证流水号
+	Name            string `json:"name"`                       // 用户姓名
+	IdCard          string `json:"idCard"`                     // 个人身份证、台胞证、港澳通行证等证件号
+	IdCardType      int    `json:"idCardType"`                 // 证件类型 1:居民身份证 2:台湾居民来往内地通行证 3:港澳居民往来内地通行证 10:武装警察身份证 11:军人身份证 15:警察(警官)证 21:外国人永久居留证 23:护照
+	Mobile          string `json:"mobile"`                     // 手机号码
+	SignPwd         string `json:"signPwd"`                    // 签约密码(MTP2登录密码加密方式),如果为空将随机生成签约密码(当签约方式为“签约密码签约”时会使用到,可通过重置接口修改)
+	IsSignPwdNotice int    `json:"isSignPwdNotice"`            // 是否将签约密码以短信形式通知用户 0:不通知(默认) 1:通知
+	IsNotice        int    `json:"isNotice"`                   // 用户发起合同或需要签署时是否进行短信通知 0:否(默认) 1:是
+}
+
+// AddPersonalUserRsp 添加个人用户(V2)出参
+type APIAddPersonalUserRsp struct {
+	SealNo string `json:"sealNo"  binding:"required"` // 生成默认印章编号
+}
+
+type APITemplate struct {
+	TemplateNo string `json:"templateNo"` // 合同模板编号
+}
+
+type APICreateContractReq struct {
+	ContractNo   string `json:"contractNo" binding:"required"`   // 合同ID,合同唯一编号
+	ContractName string `json:"contractName" binding:"required"` // 合同名称
+	ValidityTime int    `json:"validityTime"`                    // 合同签署剩余天数(系统当前时间+该天数=在此日期之前可以签署合同日期),【注】与合同有效截止日期必传其一,【例】可传剩余天数:15
+	ValidityDate string `json:"validityDate"`                    // 合同有效截止日期(在此日期之前可以签署合同,格式要求:yyyyMMddHHmmss),【注】与合同有效天数必传其一,【例】传值“20231207190000” 为:2023年12月07日19时00分00秒
+	SignOrder    int    `json:"signOrder" binding:"required"`    // 签约方式 1:无序签约(默认) 2:顺序签约
+}

+ 5 - 0
services/asign/const.go

@@ -0,0 +1,5 @@
+package asign
+
+var (
+	CODE_SUCCESS = 10000 // 成功
+)

+ 26 - 56
services/asign/models.go

@@ -1,69 +1,39 @@
 package asign
 
-type RspData interface {
-	PersonBankCard4Rsp | AddPersonalUserRsp | CaptchaVerifyRsp
-}
+import "time"
 
-type Rsp[T RspData] struct {
-	Code int    `json:"code"` // 响应码,100000表示成功,其他表示异常
-	Msg  string `json:"msg"`  // 	响应信息
-	Data T      // 响应数据
+// PersonBankCard4 个人银行卡四要素
+type PersonBankCard4 struct {
+	RealName string `json:"realName"` // 真实姓名
+	IdCardNo string `json:"idCardNo"` // 身份证号
+	BankCard string `json:"bankCard"` // 银行卡号(仅限印有“银联”字样的银行卡)
+	Mobile   string `json:"mobile"`   // 手机号码(限中国大陆11位手机号)
 }
 
-// PersonBankCard4Req 个人银行卡四要素认证请求入参
-type PersonBankCard4Req struct {
-	RealName string `json:"realName" binding:"required"` // 真实姓名
-	IdCardNo string `json:"idCardNo" binding:"required"` // 身份证号
-	BankCard string `json:"bankCard" binding:"required"` // 银行卡号(仅限印有“银联”字样的银行卡)
-	Mobile   string `json:"mobile" binding:"required"`   // 手机号码(限中国大陆11位手机号)
+// CompanyBankCard4 企业法人银行卡四要素
+type CompanyBankCard4 struct {
+	CompanyName string `json:"companyName"` // 企业名称
+	CreditCode  string `json:"creditCode"`  // 社会统一信用代码
+	RealName    string `json:"realName"`    // 法人姓名
+	IdCardNo    string `json:"idCardNo"`    // 法人身份证号
+	BankCard    string `json:"bankCard"`    // 法人银行卡号(仅限印有“银联”字样的银行卡)
+	Mobile      string `json:"mobile"`      // 法人手机号(限中国大陆11位手机号)
 }
 
-// PersonBankCard4Rsp 个人银行卡四要素认证请求出参
-type PersonBankCard4Rsp struct {
-	Result   int    `json:"result"`   // 认证结果 0.暂无结果/认证中 1.成功 2.失败
-	SerialNo string `json:"serialNo"` // 认证流水号
-	Type     string `json:"type"`     // 认证类型
+// 银行卡四要素认证入参
+type BankCard4Req struct {
+	UserId  int               `json:"userId" binding:"required"` // 用户ID
+	Type    int               `json:"type" binding:"required"`   // 实体类型 1:个人 2:企业
+	Person  *PersonBankCard4  `json:"person"`                    // 个人银行卡四要素,实体类型为个人时必填
+	Company *CompanyBankCard4 `json:"company"`                   // 企业法人银行卡四要素,实体类型为企业时必填
 }
 
-// CaptchaVerifyReq 认证验证码校验入参
-type CaptchaVerifyReq struct {
-	SerialNo string `json:"serialNo" binding:"required"` // 认证流水号
-	Captcha  string `json:"captcha" binding:"required"`  // 短信验证码
-}
-
-// CaptchaVerifyRsp 认证验证码校验出参
-type CaptchaVerifyRsp struct {
-	Result   int    `json:"result"`   // 认证结果 0.暂无结果/认证中 1.成功 2.失败
+// 银行卡四要素认证出参
+type BankCard4Rsp struct {
 	SerialNo string `json:"serialNo"` // 认证流水号
-	Type     string `json:"type"`     // 认证类型
-}
-
-// AddPersonalUserReq 添加个人用户(V2)入参
-type AddPersonalUserReq struct {
-	Account         string `json:"account" binding:"required"` // 用户唯一识别码(请转入UserID)
-	SerialNo        string `json:"serialNo"`                   // 实名认证流水号
-	Name            string `json:"name"`                       // 用户姓名
-	IdCard          string `json:"idCard"`                     // 个人身份证、台胞证、港澳通行证等证件号
-	IdCardType      int    `json:"idCardType"`                 // 证件类型 1:居民身份证 2:台湾居民来往内地通行证 3:港澳居民往来内地通行证 10:武装警察身份证 11:军人身份证 15:警察(警官)证 21:外国人永久居留证 23:护照
-	Mobile          string `json:"mobile"`                     // 手机号码
-	SignPwd         string `json:"signPwd"`                    // 签约密码(MTP2登录密码加密方式),如果为空将随机生成签约密码(当签约方式为“签约密码签约”时会使用到,可通过重置接口修改)
-	IsSignPwdNotice int    `json:"isSignPwdNotice"`            // 是否将签约密码以短信形式通知用户 0:不通知(默认) 1:通知
-	IsNotice        int    `json:"isNotice"`                   // 用户发起合同或需要签署时是否进行短信通知 0:否(默认) 1:是
-}
-
-// AddPersonalUserRsp 添加个人用户(V2)出参
-type AddPersonalUserRsp struct {
-	SealNo string `json:"sealNo"  binding:"required"` // 生成默认印章编号
-}
-
-type Template struct {
-	TemplateNo string `json:"templateNo"` // 合同模板编号
 }
 
-type CreateContractReq struct {
-	ContractNo   string `json:"contractNo" binding:"required"`   // 合同ID,合同唯一编号
-	ContractName string `json:"contractName" binding:"required"` // 合同名称
-	ValidityTime int    `json:"validityTime"`                    // 合同签署剩余天数(系统当前时间+该天数=在此日期之前可以签署合同日期),【注】与合同有效截止日期必传其一,【例】可传剩余天数:15
-	ValidityDate string `json:"validityDate"`                    // 合同有效截止日期(在此日期之前可以签署合同,格式要求:yyyyMMddHHmmss),【注】与合同有效天数必传其一,【例】传值“20231207190000” 为:2023年12月07日19时00分00秒
-	SignOrder    int    `json:"signOrder" binding:"required"`    // 签约方式 1:无序签约(默认) 2:顺序签约
+type CaptchaResendReq struct {
+	SerialNo  string    `json:"serialNo"`  // 认证流水号
+	TimeStamp time.Time `json:"timeStamp"` // 时间戳,可不传(S1016)
 }

+ 103 - 0
services/asign/servcies.go

@@ -0,0 +1,103 @@
+package asign
+
+import (
+	"errors"
+	"mtp2_if/db"
+	"mtp2_if/models"
+	"mtp2_if/utils"
+	"strconv"
+)
+
+// BankCard4 银行卡四要素认证
+func BankCard4(req BankCard4Req) (rsp BankCard4Rsp, err error) {
+	// 校验入参
+	if req.Type == 1 && req.Person == nil {
+		err = errors.New("缺少参数")
+		return
+	}
+	if req.Type == 2 && req.Company == nil {
+		err = errors.New("缺少参数")
+		return
+	}
+
+	// 判断证件号码是否已经在爱签平台存在
+	var getUserReq APIGetUserReq
+	getUserReq.Account = utils.SetPointValue(strconv.Itoa(req.UserId))
+	apiRsp, err := APIGetUser(getUserReq)
+	if err != nil {
+		return
+	}
+	if apiRsp.Code == CODE_SUCCESS {
+		err = errors.New("电子签平台用户编号已存在")
+		return
+	}
+	getUserReq.Account = nil
+	if req.Type == 1 {
+		getUserReq.IdCard = utils.SetPointValue(req.Person.IdCardNo)
+	} else {
+		getUserReq.CreditCode = utils.SetPointValue(req.Company.CreditCode)
+	}
+	apiRsp, err = APIGetUser(getUserReq)
+	if err != nil {
+		return
+	}
+	if apiRsp.Code == CODE_SUCCESS {
+		err = errors.New("电子签平台证件号码已存在")
+		return
+	}
+
+	// 从交易库中获取类型为实名认证的电子签信息
+	var record models.Useresignrecord
+	has, err := db.GetEngine().Where("TEMPLATETYPE = 1 AND USERID = ?").Get(&record)
+	if err != nil {
+		return
+	}
+	if !has {
+		err = errors.New("无对应实名认证记录信息")
+		return
+	}
+
+	// 调用爱签接口
+	var bankCard4Rsp *APIRsp[APIBankCard4Rsp]
+	if req.Type == 1 { // 个人
+		personBankCard4Req := APIPersonBankCard4Req{
+			RealName: req.Person.RealName,
+			IdCardNo: req.Person.IdCardNo,
+			BankCard: req.Person.BankCard,
+			Mobile:   req.Person.Mobile,
+		}
+		if bankCard4Rsp, err = APIPersonBankCard4(personBankCard4Req); err != nil {
+			return
+		}
+	} else { // 企业
+		companyBankCard4Req := APICompanyBankCard4Req{
+			CompanyName: req.Company.CompanyName,
+			CreditCode:  req.Company.CreditCode,
+			RealName:    req.Company.RealName,
+			IdCardNo:    req.Company.IdCardNo,
+			BankCard:    req.Company.BankCard,
+			Mobile:      req.Company.Mobile,
+		}
+		if bankCard4Rsp, err = APICompanyBankCard4(companyBankCard4Req); err != nil {
+			return
+		}
+	}
+	if bankCard4Rsp.Code != CODE_SUCCESS {
+		err = errors.New(bankCard4Rsp.Msg)
+		return
+	}
+	rsp.SerialNo = bankCard4Rsp.Data.SerialNo
+
+	return
+}
+
+func CaptcaResend(req CaptchaResendReq) (err error) {
+	apiReq := APICaptchaResendReq{SerialNo: req.SerialNo}
+	apiRsp, err := APICaptchaResend(apiReq)
+	if apiRsp.Code != CODE_SUCCESS {
+		err = errors.New(apiRsp.Msg)
+		return
+	}
+
+	return
+}

BIN
services/asign/templates/中融/综合版本ZH_20231313.doc