From 105271ec401cecf421bb434e6471149b504ae7d5 Mon Sep 17 00:00:00 2001 From: renzhiyuan <465386466@qq.com> Date: Thu, 7 Aug 2025 11:07:41 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BC=98=E5=8C=96=E5=88=97=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=202.=E8=AF=A6=E7=BB=86=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/func.go | 18 +++- tysk.go | 32 ++++++ tyskFacecade.go | 60 ++++++++++- tysk_constant/param_type.go | 64 ++++++++++-- tysk_constant/request_code.go | 4 + tysk_entity/sk_req.go | 128 ++++++++++++++++++----- tysk_entity/sk_res.go | 191 ++++++++++++++++++++++------------ tysk_test.go | 115 ++++++++++++++++++-- 8 files changed, 505 insertions(+), 107 deletions(-) diff --git a/pkg/func.go b/pkg/func.go index 31e805c..1d3fcdc 100644 --- a/pkg/func.go +++ b/pkg/func.go @@ -47,7 +47,7 @@ func (req XmlRequest) MarshalToXML() ([]byte, error) { buf.WriteString("\n") } buf.WriteString("\n") - // 可以根据需要添加其他类型的处理 + case []string: // 处理列表数据 buf.WriteString(fmt.Sprintf("\n", key)) @@ -57,7 +57,21 @@ func (req XmlRequest) MarshalToXML() ([]byte, error) { } buf.WriteString("\n") buf.WriteString("\n") - // 可以根据需要添加其他类型的处理 + case []interface{}: + // 处理列表数据 + buf.WriteString(fmt.Sprintf("\n", key)) + + for _, row := range v { + buf.WriteString("\n") + if vmap, isMapList := row.(map[string]interface{}); isMapList { + for rowKey, rowValue := range vmap { + buf.WriteString(fmt.Sprintf("<%s>%v\n", rowKey, rowValue, rowKey)) + } + } + buf.WriteString("\n") + } + + buf.WriteString("\n") case map[string]interface{}: // 处理列表数据 buf.WriteString(fmt.Sprintf("\n", key)) diff --git a/tysk.go b/tysk.go index 9b367c0..67a0e7c 100644 --- a/tysk.go +++ b/tysk.go @@ -127,3 +127,35 @@ func (g *Tysk) SinglePay(singlePayReq tysk_entity.SinglePayReq) (res tysk_entity } return } + +func (g *Tysk) SinglePayQuery(singlePayQueryReq tysk_entity.SinglePayQueryReq) (res tysk_entity.SinglePayQueryResp, err error) { + err = g.handleRequest(tysk_constant.SinglePayQuery, g.handleReqStructToMap(singlePayQueryReq), &res) + if err != nil { + return + } + return +} + +func (g *Tysk) BatchPay(batchPayReq tysk_entity.BatchPayReq) (res tysk_entity.BatchPayResp, err error) { + err = g.handleRequest(tysk_constant.BatchPay, g.handleReqStructToMap(batchPayReq), &res) + if err != nil { + return + } + return +} + +func (g *Tysk) BatchPayQuery(batchPayQueryReq tysk_entity.BatchPayQueryReq) (res tysk_entity.BatchPayQueryResp, err error) { + err = g.handleRequest(tysk_constant.BatchPayQueryReq, g.handleReqStructToMap(batchPayQueryReq), &res) + if err != nil { + return + } + return +} + +func (g *Tysk) PayArrange(payArrangeReq tysk_entity.PayArrangeReq) (success bool, err error) { + err = g.handleRequest(tysk_constant.PayArrangeReq, g.handleReqStructToMap(payArrangeReq), nil) + if err != nil { + return + } + return true, nil +} diff --git a/tyskFacecade.go b/tyskFacecade.go index a2d02e7..ae3c0f9 100644 --- a/tyskFacecade.go +++ b/tyskFacecade.go @@ -79,7 +79,7 @@ type Account interface { //请求使用的银企直联用户需有相关账号的查询权限。 TransHisQueryApply(transHisReq tysk_entity.TransHisQueryApplyReq) (res tysk_entity.TransHisQueryApplyResp, err error) - // TransHisQuery 历史明细查询申请 + // TransHisQuery 历史明细查询查询 //使该接口用于查询账户的历史交易明细信息。 // 注意事项: //1.请求使用的银企直联用户需有相关账号的查询权限 ; @@ -114,5 +114,61 @@ type Account interface { } type Settle interface { - SinglePay(singlePayReq tysk_entity.SinglePayReq) (res tysk_entity.SinglePayRes, err error) + //SinglePay 单笔支付 + //用于发起单笔付款申请,企业调用该接口推送单笔付款请求,司库系统接收该请求后生成单笔付款的申请任务,并返回受理状态。受理成功后,客户需依据司库系统配置的审批流程参数及工作流,完成司库系统的审批流转。待审批通过后,系统自动执行单笔付款交易指令,用户可通过单笔查证交易进行交易状态的查询。 + // 注意事项: + //1.付方账号需提前在司库系统内维护为直联账户并为直联用户赋予单笔付款支付权限及付方单位的机构权限; + //2.接口调用后立即返回司库受理状态,此状态只表示交易请求是否受理,若校验通过该笔付款将进入【司库系统】-【结算中心】-【单笔付款】功能,支付是否成功需稍后使用单笔查证交易进行查询。 + //3.在司库中优先级按照如下处理模式: + //按照【金额】或【附言】进行审批流配置;若公共中心内,结算中心业务参数中开启按金额审批,则需同时配置按金额审批阈值。当ERP推送的单笔付款的付款金额超过设定的审批阈值时,则需落地审批,否则依据附言审批开关匹配是否需要审批。【金额】或【附言】开关均关闭时按照【业务模式参数】进行处理。 + //按照业务模式参数可支持三种模式: + //1)审批处理,ERP传输的单据,直接到流程中心-待审批任务; + //2)直接出账,只走司库接口,单据可在单笔付款查询功能查询; + //3)经办处理时,需要在司库公共中心进行流程配置,单笔付款经办页面进行后续操作。 + //4.若该账户支持联动支付,资金会先从核心账户转入该支付账户中进行支付,资金下拨结果可在【单笔付款查证】接口中进行查看; + //5.是否跨行,非必输字段,若用户上送,则以用户上送为准,若用户不上送,司库仍按照收付方银行判断是否跨行; + SinglePay(singlePayReq tysk_entity.SinglePayReq) (res tysk_entity.SinglePayResp, err error) + + //SinglePayQuery 单笔付款查证 + //企业ERP等系统调用该接口查询单笔付款执行情况 + // 注意事项: + //11.直联用户需在司库系统配置付方单位的查询权限; + //2.返回的支付任务状态若为处理中,不代表该笔交易失败,请勿重复提交,防止重复动账。 + SinglePayQuery(singlePayReq tysk_entity.SinglePayQueryReq) (res tysk_entity.SinglePayQueryResp, err error) + + //BatchPay 批量付款 + //该接口用于发起多笔付款申请,调用该接口推送多笔付款请求,司库系统接收该请求后生成多笔付款的申请任务,并返回受理状态。受理成功后,客户需依据司库系统配置的审批流程参数及工作流,完成司库系统的审批流转。待审批通过后,系统自动执行付款交易指令,用户可通过批量查证交易进行交易状态的查询。 + // 注意事项: + //1.本交易为一借多贷模式,1个付方账号,多个收方账号; + //2.付方账号需提前在司库系统内维护为直联账户并为直联用户赋予批量付款支付权限及付方单位的机构权限; + //3.接口调用后立即返回司库受理状态,此状态只表示交易请求是否受理,若校验通过该笔付款将进入【司库系统】-【结算中心】-【批量付款】功能,支付是否成功需稍后使用多笔查证交易进行查询。 + //4.在司库中按照如下业务模式参数进行处理: + //1)审批处理,ERP传输的单据,直接到流程中心-待审批任务; + //2)直接出账,只走司库接口,单据可在批量付款查询功能查询; + //3)经办处理时,需要在司库公共中心进行流程配置,批量付款经办页面进行后续操作。 + //5.若该账户支持联动支付,资金会先从核心账户转入该支付账户中进行支付,资金下拨结果可在【批量付款查证】接口中进行查看; + //6.接口请求参数中提供明细校验模式,“明细校验处理模式”。处理模式包含两种,整批验证模式、明细验证模式,为空时默认为单条明细异常整批失败。 + //整批验证模式 01:即现有处理模式,当批次内存在一条明细验证不通过时,整批状态失败,不入库,接口返回批次失败及错误信息。 + //明细验证模式02:新模式,当批次内存在一条明细验证不通过时,跳过该异常明细继续执行后续明细验证,验证通过的明细进行入库,根据外部请求批次号、外部请求流水号进行保存,同时接口返回部分成功及部分失败明细的条目信息,当采用明细验证模式下,单条明细校验不通过时交易状态返回“BBBBBBB”交易状态信息返回“交易部分成功!”。 + //7.是否跨行,非必输字段,若用户上送,则以用户上送为准,若用户不上送,司库仍按照收付方银行判断是否跨行; + BatchPay(batchPayReq tysk_entity.BatchPayReq) (res tysk_entity.BatchPayResp, err error) + + //BatchPayQuery 多笔付款查证 + //调用该接口查询批量付款执行情况。 + // 注意事项: + //1.1.直联用户需在司库系统配置付方单位的查询权限; + //2.返回的批次支付任务状态若为处理中,不代表整批次交易失败,请勿重复提交,防止重复动账; + //3.返回的批次支付任务状态若为部分成功,代表该批次中存在交易失败的支付明细。 + BatchPayQuery(batchPayQueryReq tysk_entity.BatchPayQueryReq) (res tysk_entity.BatchPayQueryResp, err error) + + //PayArrange 排款 + //企业ERP等系统调用该接口推送排款请求,司库系统接收该请求后在【司库系统】-【结算中心】-【排款管理】功能生成排款任务,并返回受理状态。 + // 注意事项: + //1.接口调用后返回司库受理状态,此状态只表示排款请求是否受理;后续的排款及支付情况需使用排款查证交易进行查询; + //2.付方账号需提前在司库系统内维护为直联账户并按需为直联用户赋予单笔付款或批量付款的支付权限及付方单位的机构权限; + //3.收方明细信息数量最大支持1000笔; + //4.若推送的明细单据数量为单条时,系统默认生成单笔付款类型的排款任务;当推送的明细单据数量为多条时,系统默认生成批量付款类型的排款任务。 + //5.若联动支付为是时,系统对应生成单笔或批量类型的联动支付排款任务。若未通过校验,则接口报错并提示“该账户无法支持联动支付”。 + //6.预算占用校验规则:若该排款请求根据配置需占用预算,则对预算占用事项进行校验,若未通过校验则返回错误及提示“无预算占用记录”,进行校验时,预算占用事项流水号(预算占用接口中“交易流水号”)需与本接口“外部排款流水号”保持一致。 + PayArrange(payArrangeReq tysk_entity.PayArrangeReq) (success bool, err error) } diff --git a/tysk_constant/param_type.go b/tysk_constant/param_type.go index 4e2db21..6b6d87b 100644 --- a/tysk_constant/param_type.go +++ b/tysk_constant/param_type.go @@ -210,15 +210,65 @@ var PyAccTpMap = map[PyAccTp]string{ PyAccTpPri: "对私", } -// IsInterbnk 是否跨行 -type IsInterbnk string +//// IsInterbnk 是否跨行 +//type IsInterbnk string +// +//const ( +// IsInterbnkNo IsInterbnk = "00" +// IsInterbnkIs IsInterbnk = "01" +//) +// +//var IsInterbnkMap = map[IsInterbnk]string{ +// IsInterbnkNo: "不跨行", +// IsInterbnkIs: "跨行", +//} + +// CheckMode 明细校验处理模式 +type CheckMode string const ( - IsInterbnkNo IsInterbnk = "00" - IsInterbnkIs IsInterbnk = "01" + CheckModeBatch CheckMode = "01" //整批验证模式 01:即现有处理模式,当批次内存在一条明细验证不通过时,整批状态失败,不入库,接口返回批次失败及错误信息。 + CheckModeDetail CheckMode = "02" //明细验证模式02:新模式,当批次内存在一条明细验证不通过时,跳过该异常明细继续执行后续明细验证,验证通过的明细进行入库,根据外部请求批次号、外部请求流水号进行保存,同时接口返回部分成功及部分失败明细的条目信息,后续操作逻辑、业务规则未发生变化 ) -var IsInterbnkMap = map[IsInterbnk]string{ - IsInterbnkNo: "不跨行", - IsInterbnkIs: "跨行", +var CheckModeMap = map[CheckMode]string{ + CheckModeBatch: "整批验证模式", + CheckModeDetail: "明细验证模式", +} + +// SettlementMode 结算方式 +type SettlementMode string + +const ( + SettlementModePayTrans SettlementMode = "01" + SettlementModeBankBill SettlementMode = "02" + SettlementModeBusinessBill SettlementMode = "03" + SettlementModeBankTrans SettlementMode = "04" + SettlementModeBusinessTrans SettlementMode = "05" + SettlementModeCashCheque SettlementMode = "06" + SettlementModeTransCheque SettlementMode = "07" + SettlementModeBankWarrant SettlementMode = "08" + SettlementModeCredit SettlementMode = "09" + SettlementModeBankOrder SettlementMode = "0A" + SettlementModeBankSelfOrder SettlementMode = "0B" + SettlementModeSupPay SettlementMode = "0C" + SettlementModeProjectLoan SettlementMode = "0D" + SettlementModeOther SettlementMode = "10" +) + +var SettlementModeMap = map[SettlementMode]string{ + SettlementModePayTrans: "支付转账", + SettlementModeBankBill: "银承开票", + SettlementModeBusinessBill: "商承开票", + SettlementModeBankTrans: "银承转让", + SettlementModeBusinessTrans: "商承转让", + SettlementModeCashCheque: "现金支票", + SettlementModeTransCheque: "转账支票", + SettlementModeBankWarrant: "银行保函", + SettlementModeCredit: "信用证", + SettlementModeBankOrder: "银行汇票", + SettlementModeBankSelfOrder: "银行本票", + SettlementModeSupPay: "供应链凭证支付", + SettlementModeProjectLoan: "项目贷支付", + SettlementModeOther: "其他", } diff --git a/tysk_constant/request_code.go b/tysk_constant/request_code.go index 286812d..af9ac1d 100644 --- a/tysk_constant/request_code.go +++ b/tysk_constant/request_code.go @@ -15,6 +15,10 @@ const ( BalanceHisQuery RequestCode = "SKBALHCX" AccountsTransHisQuery RequestCode = "SKTRNNCT" SinglePay RequestCode = "SKDLTTRN" + SinglePayQuery RequestCode = "SKDLBATD" + BatchPay RequestCode = "SKDLPAAT" + BatchPayQueryReq RequestCode = "SKDLBATC" + PayArrangeReq RequestCode = "SKDLFNMA" ) type ResponseCode string diff --git a/tysk_entity/sk_req.go b/tysk_entity/sk_req.go index 542a692..8a050a9 100644 --- a/tysk_entity/sk_req.go +++ b/tysk_entity/sk_req.go @@ -107,29 +107,109 @@ type ( // SinglePayReq 单笔支付 SinglePayReq struct { - Action string `json:"action" comment:"接口请求代码" validate:"required,max=8"` // 标识要请求的接口,交易代码 - UserName string `json:"userName" comment:"登录名" validate:"required,max=50"` // 银企直联用户名 - ExternalNum string `json:"externalNum" comment:"外部请求流水号" validate:"required,max=50"` // 最大长度为50,不能重复 - LinkPayFlag *tysk_constant.CommonBool `json:"linkPayFlag" comment:"联动支付" validate:"omitempty,oneof=00 01"` // 00:否,01:是 默认为否 - PypartyAccnum string `json:"pypartyAccnum" comment:"付方账号" validate:"required,max=32,accountFormat"` // 允许输入特定字符,至少一个数字 - RcvpyAccnum string `json:"rcvpyAccnum" comment:"收方账号" validate:"required,max=32,accountFormat"` // 允许输入特定字符,至少一个数字 - RcvpyAccnm string `json:"rcvpyAccnm" comment:"收方户名" validate:"required,max=300,nameFormat"` // 最大支持长度300(汉字占3,非汉字占1) - IsCheckRcvpartyDepbnkId *tysk_constant.IsCheckRcvpartyDepbnkId `json:"isCheckRcvpartyDepbnkId" comment:"是否准确校验开户行行名" validate:"omitempty,oneof=00 01"` // 00:是  01:否 默认为是 当该字段为00是时:同时传入开户行行名和联行号,以联行号为准; 当该字段为01否时:同时传入开户行行名和联行号,以联行号为准;只传入开户行行名直接返显开户行,不再校验开户行行名在境内网点表是否存在,若用户上送的开户行行名匹配不上所属银行,则【收方银行】展示--,【是否跨行】字段,若用户上送,则以用户上送的为准,若用户未上送,收方银行为空,则无法按照收付方银行判断出是否跨行,则是否跨行默认为是;若用户上送的开户行行名匹配不出联行号时,则【收方联行号】、【收方地区】展示为--;只传入联行号,以联行号为准。 - RcvpartyDepbnkId *string `json:"rcvpartyDepbnkId" comment:"收方开户行" validate:"omitempty,max=80"` // 收方开户行 - RcvpartyBnkgId *string `json:"rcvpartyBnkgId" comment:"收方联行号" validate:"omitempty,max=40"` // 收方联行号 - TxnCntprTp *tysk_constant.TxnCntprTp `json:"txnCntprTp" comment:"交易对手类型" validate:"omitempty,oneof=01 02 03 04"` // 客户:01 供应商:02 经销商:03 其他:04 - PyAccTp tysk_constant.PyAccTp `json:"pyAccTp" comment:"付款种类" validate:"required,oneof=00 01"` // 00:对公 01:对私 - Amt float64 `json:"amt" comment:"付款金额" validate:"required,numeric,min=0.01,max=9999999999999.99"` // 整数最长13位,2位小数 - CurrencyID string `json:"currencyID" comment:"币种" validate:"required,oneof=CNY"` // 币种仅支持人民币(CNY) - IsInterbnk *tysk_constant.IsInterbnk `json:"isInterbnk" comment:"是否跨行" validate:"omitempty,oneof=00 01"` // 00:不跨行 01:跨行 - UrgntAprvFlag *tysk_constant.CommonBool `json:"urgntAprvFlag" comment:"加急审批" validate:"omitempty,oneof=00 01"` // 00:否,01:是 默认为否 - PyTmlnsFlag *tysk_constant.CommonBool `json:"pyTmlnsFlag" comment:"预约付款" validate:"omitempty,oneof=00 01"` // 00:否 01:是 默认为否 - RsrvtnTms string `json:"rsrvtnTms" comment:"预约时间" validate:"omitempty,datetime=2006-01-02 15:04:05,timeRange"` // 预约时间格式 yyyy-MM-dd HH:mm:ss,时间范围06:00-22:00 - Pscpt string `json:"pscpt" comment:"附言" validate:"required,max=300,noteFormat"` // 银行附言,最大支持长度300(汉字占3,非汉字占1) - Rmrk string `json:"rmrk" comment:"备注" validate:"omitempty,max=120"` // 最大长度为120 - Rmrk1 string `json:"rmrk1" comment:"备用字段1" validate:"omitempty,max=600"` // 最大长度为600 - Rmrk2 string `json:"rmrk2" comment:"备用字段2" validate:"omitempty,max=600"` // 最大长度为600 - Rmrk3 string `json:"rmrk3" comment:"备用字段3" validate:"omitempty,max=600"` // 最大长度为600 - Rmrk4 string `json:"rmrk4" comment:"备用字段4" validate:"omitempty,max=600"` // 最大长度为600 + ExternalNum string `json:"externalNum" comment:"外部请求流水号" validate:"required,max=50"` // 最大长度为50,不能重复 + LinkPayFlag *tysk_constant.CommonBool `json:"linkPayFlag,omitempty" comment:"联动支付" validate:"omitempty,oneof=00 01"` // 00:否,01:是 默认为否 + PypPartyAccnum string `json:"pypartyAccnum" comment:"付方账号" validate:"required,max=32,accountFormat"` // 允许输入特定字符,至少一个数字 + RcvPyAccnum string `json:"rcvpyAccnum" comment:"收方账号" validate:"required,max=32,accountFormat"` // 允许输入特定字符,至少一个数字 + RcvPyAccnm string `json:"rcvpyAccnm" comment:"收方户名" validate:"required,max=300,nameFormat"` // 最大支持长度300(汉字占3,非汉字占1) + IsCheckRcvpartyDepbnkId *tysk_constant.IsCheckRcvpartyDepbnkId `json:"isCheckRcvpartyDepbnkId,omitempty" comment:"是否准确校验开户行行名" validate:"omitempty,oneof=00 01"` // 00:是  01:否 默认为是 当该字段为00是时:同时传入开户行行名和联行号,以联行号为准; 当该字段为01否时:同时传入开户行行名和联行号,以联行号为准;只传入开户行行名直接返显开户行,不再校验开户行行名在境内网点表是否存在,若用户上送的开户行行名匹配不上所属银行,则【收方银行】展示--,【是否跨行】字段,若用户上送,则以用户上送的为准,若用户未上送,收方银行为空,则无法按照收付方银行判断出是否跨行,则是否跨行默认为是;若用户上送的开户行行名匹配不出联行号时,则【收方联行号】、【收方地区】展示为--;只传入联行号,以联行号为准。 + RcvPartyDepbnkId *string `json:"rcvpartyDepbnkId,omitempty" comment:"收方开户行" validate:"omitempty,max=80"` // 收方开户行 ,收方开户行和收方联行号选择一个输入即可 付款种类对私付款且账户为银联卡时,可根据卡BIN号识别收方开户行、收方联行号字段,两字段不必输,非空情况以上送值为准 + RcvPartyBnkgId *string `json:"rcvpartyBnkgId,omitempty" comment:"收方联行号" validate:"omitempty,max=40"` // 收方联行号 + TxnCntprTp *tysk_constant.TxnCntprTp `json:"txnCntprTp" comment:"交易对手类型" validate:"omitempty,oneof=01 02 03 04"` // 客户:01 供应商:02 经销商:03 其他:04 + PyAccTp tysk_constant.PyAccTp `json:"pyAccTp,omitempty" comment:"付款种类" validate:"required,oneof=00 01"` // 00:对公 01:对私 + Amt float64 `json:"amt" comment:"付款金额" validate:"required,numeric,min=0.01,max=9999999999999.99"` // 整数最长13位,2位小数 + CurrencyID string `json:"currencyID" comment:"币种" validate:"required,oneof=CNY"` // 币种仅支持人民币(CNY) + IsInterbnk *tysk_constant.CommonBool `json:"isInterbnk,omitempty" comment:"是否跨行" validate:"omitempty,oneof=00 01"` // 00:不跨行 01:跨行 + UrgntAprvFlag *tysk_constant.CommonBool `json:"urgntAprvFlag,omitempty" comment:"加急审批" validate:"omitempty,oneof=00 01"` // 00:否,01:是 默认为否 + PyTmlnsFlag *tysk_constant.CommonBool `json:"pyTmlnsFlag,omitempty" comment:"预约付款" validate:"omitempty,oneof=00 01"` // 00:否 01:是 默认为否,是否预约付款状态为01,预约时间必填 + RsrvtnTms *string `json:"rsrvtnTms,omitempty" comment:"预约时间" validate:"omitempty,datetime=2006-01-02 15:04,timeRange"` // 预约时间格式 yyyy-MM-dd HH:mm,时间范围06:00-22:00 + Pscpt string `json:"pscpt" comment:"附言" validate:"required,max=300,noteFormat"` // 银行附言,最大支持长度300(汉字占3,非汉字占1),不同付方银行支持附言长度不同 + Rmrk *string `json:"rmrk,omitempty" comment:"备注" validate:"omitempty,max=120"` // 最大长度为120 + Rmrk1 *string `json:"rmrk1,omitempty" comment:"备用字段1" validate:"omitempty,max=600"` // 最大长度为600 + Rmrk2 *string `json:"rmrk2,omitempty" comment:"备用字段2" validate:"omitempty,max=600"` // 最大长度为600 + Rmrk3 *string `json:"rmrk3,omitempty" comment:"备用字段3" validate:"omitempty,max=600"` // 最大长度为600 + Rmrk4 *string `json:"rmrk4,omitempty" comment:"备用字段4" validate:"omitempty,max=600"` // 最大长度为600 + } + + // SinglePayQueryReq 单笔付款查证 + SinglePayQueryReq struct { + ExternalNum string `json:"externalNum" comment:"外部请求流水号" validate:"required,max=50"` // 最大长度为50,不能重复 + } + + // BatchPayReq 批量付款请求结构体 + BatchPayReq struct { + ExternalBatNum string `json:"externalBatNum" validate:"required,max=30"` // 外部请求批次号 + LinkPayFlag *tysk_constant.CommonBool `json:"linkPayFlag,omitempty" validate:"omitempty,oneof=00 01"` // 联动支付标志 + PyPartyAccNum string `json:"pypartyAccnum" validate:"required,max=32,account"` // 付方账号 + CurrencyID string `json:"currencyID" validate:"required,oneof=CNY"` // 币种(只支持CNY) + TotNbr string `json:"totNbr" validate:"required,len=4,numeric,max=1000"` // 付款总笔数 + Amt float64 `json:"amt" validate:"required,numeric,len=15"` // 付款总金额(decimal(15,2)) + UrgntAprvFlag *tysk_constant.CommonBool `json:"urgntAprvFlag,omitempty" validate:"required,oneof=00 01"` // 00:否,01:是 默认为否 + RsrvtnFlag *tysk_constant.CommonBool `json:"rsrvtnFlag,omitempty" validate:"required,oneof=00 01"` // 00:否 01:是 默认为否,是否预约付款状态为01,预约时间必填 + RsrvtnTms *string `json:"rsrvtnTms,omitempty" validate:"omitempty,datetime=2006-01-02 15:04"` // 预约时间 yyyy-MM-dd HH:mm,时间范围06:00-22:00 + CheckMode *tysk_constant.CheckMode `json:"checkMode,omitempty" validate:"omitempty,oneof=01 02"` // 明细校验处理模式,整批验证模式 01:即现有处理模式,当批次内存在一条明细验证不通过时,整批状态失败,不入库,接口返回批次失败及错误信息。 明细验证模式02:新模式,当批次内存在一条明细验证不通过时,跳过该异常明细继续执行后续明细验证,验证通过的明细进行入库,根据外部请求批次号、外部请求流水号进行保存,同时接口返回部分成功及部分失败明细的条目信息,后续操作逻辑、业务规则未发生变化 + List []BatchPayList `json:"debitList" validate:"required,dive"` // 付款明细列表 + } + + // PaymentDetail 单笔付款明细 + BatchPayList struct { + ExternalNum string `json:"externalNum" validate:"required,max=50"` // 外部请求流水号 + RcvPyAccNum string `json:"rcvpyAccnum" validate:"required,max=32,account"` // 收方账号 + RcvPyAccNm string `json:"rcvpyAccnm" validate:"required,max=300,name"` // 收方户名 + IsInterBnk *tysk_constant.CommonBool `json:"isInterbnk,omitempty" validate:"omitempty,oneof=00 01"` // 是否跨行 + IsCheckRcvPartyDepBnkId *tysk_constant.IsCheckRcvpartyDepbnkId `json:"isCheckRcvpartyDepbnkId,omitempty" validate:"omitempty,oneof=00 01"` // 是否准确校验开户行行名 00:是 01:否 默认为是, 当该字段为00是时: + RcvPartyDepBnkId *string `json:"rcvpartyDepbnkId,omitempty" validate:"omitempty,max=80"` // 收方开户行 ,收方开户行和收方联行号选择一个输入即可 付款种类对私付款且账户为银联卡时,可根据卡BIN号识别收方开户行、收方联行号字段,两字段不必输,非空情况以上送值为准 + RcvPartyBnkgId *string `json:"rcvpartyBnkgId,omitempty" validate:"omitempty,max=40"` // 收方联行号 + TxnCntprTp *tysk_constant.TxnCntprTp `json:"txnCntprTp,omitempty" validate:"omitempty,oneof=01 02 03 04"` // 交易对手类型 + PyAccTp tysk_constant.PyAccTp `json:"pyAccTp" validate:"required,oneof=00 01"` // 付款种类 + DebitAmt float64 `json:"debitAmt" validate:"required,numeric,len=15"` // 付款金额(decimal(15,2)) + Pscpt string `json:"pscpt" validate:"required,max=300,note"` // 附言,最大支持长度300(汉字占3,非汉字占1),不同付方银行支持附言长度不同 + Rmrk *string `json:"rmrk,omitempty" validate:"omitempty,max=120"` // 备注 + } + + BatchPayQueryReq struct { + ExternalBatNum string `json:"externalBatNum" validate:"required,max=30"` // 外部请求批次号(varchar(30),必填) + List []BatchPayQueryReqTransaction `json:"extNumList.externalNum" validate:"dive"` // 交易明细列表 + } + + BatchPayQueryReqTransaction struct { + ExternalNum string `json:"externalNum,omitempty" validate:"max=50"` // 外部请求流水号(varchar(50),选填) + } + + // PayArrangeReq 排款 + PayArrangeReq struct { + FndarBatNum string `json:"fndarBatNum" validate:"required,max=30,alphanum_special"` // 外部排款批次号 + PypartyAccnum string `json:"pypartyAccnum" validate:"required,account_format"` // 付方账号 + BusinessType *string `json:"businessType,omitempty" validate:"max=30"` // 业务类型 + SettlementMode *tysk_constant.SettlementMode `json:"settlementMode,omitempty" validate:"omitempty,settlement"` // 结算方式:01支付转账 02 银承开票 03 商承开票 04银承转让 05商承转让 06 现金支票 07转账支票 08 银行保函 09信用证 0A 银行汇票 0B银行本票0C供应链凭证支付0D项目贷支付10其他,不传默认01支付转账 + PayRat *string `json:"payRat,omitempty" validate:"omitempty,pay_rat_json"` // 排款份额(JSON格式),参考:@struct PayRatItem + PayDt string `json:"payDt" validate:"required,datetime=2006-01-02"` // 应付日期(yyyy-MM-dd) + LinkPayFlag *tysk_constant.CommonBool `json:"linkPayFlag,omitempty" validate:"omitempty,oneof=00 01"` // 联动支付标志 + List []PayArrangeList `json:"fndarList" validate:"required,dive"` // 交易明细列表 + } + + PayArrangeList struct { + FndarNum string `json:"fndarNum" validate:"required,max=50"` // 外部排款流水号 + RcvpyAccnum string `json:"rcvpyAccnum" validate:"required,account_format"` // 收方账号 + RcvpyAccnm string `json:"rcvpyAccnm" validate:"required,max=300,name_length"` // 收方户名 + RcvpartyDepbnkId *string `json:"rcvpartyDepbnkId,omitempty" validate:"omitempty,max=80"` // 收方开户行,收方开户行和收方联行号选择一个输入即可 付款种类对私付款且账户为银联卡时,可根据卡BIN号识别收方开户行、收方联行号字段,两字段不必输,非空情况以上送值为准 + RcvpartyBnkgId *string `json:"rcvpartyBnkgId,omitempty" validate:"omitempty,max=40"` // 收方联行号 + TxnCntprTp *tysk_constant.TxnCntprTp `json:"txnCntprTp,omitempty" validate:"omitempty,oneof=01 02 03 04"` // 交易对手类型 + PyAccTp tysk_constant.PyAccTp `json:"pyAccTp" validate:"required,oneof=00 01"` // 付款种类 + Amt float64 `json:"amt" validate:"required,numeric,amt_format"` // 付款金额 + CurrencyID string `json:"currencyID" validate:"required,oneof=CNY"` // 币种 + Pscpt string `json:"pscpt" validate:"required,max=300,remark_length"` // 附言 + Rmrk *string `json:"rmrk,omitempty" validate:"omitempty,max=120"` // 备注 + Rmrk1 *string `json:"rmrk1,omitempty" validate:"omitempty,max=600"` // 备用字段1 + Rmrk2 *string `json:"rmrk2,omitempty" validate:"omitempty,max=600"` // 备用字段2 + Rmrk3 *string `json:"rmrk3,omitempty" validate:"omitempty,max=600"` // 备用字段3 + Rmrk4 *string `json:"rmrk4,omitempty" validate:"omitempty,max=600"` // 备用字段4 + } + + // PayRatItem 排款份额明细项 + PayRatItem struct { + Pcode string `json:"pcode" validate:"required,max=2"` // 支付代码 + Pamt string `json:"pamt" validate:"required,numeric"` // 支付金额 + PayAccNum string `json:"payAccNum" validate:"required,account_format"` // 支付账号 } ) diff --git a/tysk_entity/sk_res.go b/tysk_entity/sk_res.go index b395e83..cbb838d 100644 --- a/tysk_entity/sk_res.go +++ b/tysk_entity/sk_res.go @@ -24,12 +24,9 @@ type ( } TodayTransHisResp struct { - List struct { - Name string `json:"-name"` - Row []TodayTransHisList `json:"row"` - } `json:"list"` - ReturnRecords string `json:"returnRecords"` //登陆用户本次查询获取到的账户明细数量 - TotalRecords string `json:"totalRecords" comment:"已查询到的回单总记录条数"` //交易成功时返回,返回该登陆用户具有查询权限的所有账户数量 + UserDataList []TodayTransHisList `json:"userDataList"` + ReturnRecords string `json:"returnRecords"` //登陆用户本次查询获取到的账户明细数量 + TotalRecords string `json:"totalRecords" comment:"已查询到的回单总记录条数"` //交易成功时返回,返回该登陆用户具有查询权限的所有账户数量 } TodayTransHisList struct { @@ -39,10 +36,10 @@ type ( AccTpId string `json:"accTpId" comment:"存款类型"` //1活期 2定期 3通知 4活期保证金 5定期保证金 6其他 AccountName string `json:"accountName" comment:"本方户名"` AccountNo string `json:"accountNo" comment:"本方账号"` - AccountingDate string `json:"accountingDate" comment:"记账日期"` //银行起息记账日期,使用yyyyMMdd格式 - Balance string `json:"balance" comment:"账户余额"` //该账户中全部余额,包含冻结金额、可操作余额 - BankName string `json:"bankName" comment:"本方所属银行"` //本方所属银行名称 - BnkSrlnum string `json:"bnkSrlnum" comment:"银行流水号"` + AccountingDate string `json:"accountingDate" comment:"记账日期"` //银行起息记账日期,使用yyyyMMdd格式 + Balance string `json:"balance" comment:"账户余额"` //该账户中全部余额,包含冻结金额、可操作余额 + BankName string `json:"bankName" comment:"本方所属银行"` //本方所属银行名称 + BnkSrlnum string `json:"bnkSrlnum" comment:"银行流水号"` //交易成功且查询到交易明细时返回,是司库返回的交易明细流水号 CashTfrId string `json:"cashTfrId" comment:"现转标识"` //0现金 1转账 CurrencyID string `json:"currencyID" comment:"币种"` //CNY:人民币 USD:美元 DataSource string `json:"dataSource" comment:"数据来源"` // 交易数据查询来源,1:接口查询(通过各行银企直联或中信网银);2:用户导入(自行导入的交易数据) @@ -70,16 +67,13 @@ type ( TranDate string `json:"tranDate" comment:"交易日期"` TranTime string `json:"tranTime" comment:"交易时间"` TranType string `json:"tranType" comment:"交易类型(借贷方向)"` //01:全部交易;02:账户支出(借);03:账户收入(贷) - TxnSrlnum string `json:"txnSrlnum" comment:"交易流水号"` + TxnSrlnum string `json:"txnSrlnum" comment:"交易流水号"` //交易匹配号,支持付款单与明细关联的银行返回,详见接口说明中支持付款与明细关联的银行列表 } AccountInfoResp struct { - List struct { - Name string `json:"-name"` - Row []AccountInfoList `json:"row"` - } `json:"list"` - ReturnRecords string `json:"returnRecords"` //登陆用户本次查询获取到的账户明细数量 - TotalRecords string `json:"totalRecords"` //登陆用户具有查询权限的所有账户明细数量 + UserDataList []AccountInfoList `json:"userDataList"` + ReturnRecords string `json:"returnRecords"` //登陆用户本次查询获取到的账户明细数量 + TotalRecords string `json:"totalRecords"` //登陆用户具有查询权限的所有账户明细数量 } AccountInfoList struct { @@ -198,10 +192,10 @@ type ( } TransHisQueryRespRow struct { - SumTranNo string `json:"sumTranNo" comment:"系统交易流水号"` // 系统交易流水号(varchar(20),选填) - TranDate string `json:"tranDate" comment:"交易日期"` // 交易日期(char(8),选填) - TranTime string `json:"tranTime" comment:"交易时间"` // 交易时间(char(6),选填) - AccountingDate string `json:"accountingDate" comment:"记账日期"` // 记账日期(char(8),选填) + SumTranNo string `json:"sumTranNo" comment:"系统交易流水号"` // 系统交易流水号(varchar(20),选填)交易成功且查询到交易明细时返回,是对方银行返回的交易明细流水号 + TranDate string `json:"tranDate" comment:"交易日期"` // 交易日期(char(8),选填)交易成功且查询到交易明细时返回,交易发生日期 + TranTime string `json:"tranTime" comment:"交易时间"` // 交易时间(char(6),选填)交易成功时返回,交易发生时间 + AccountingDate string `json:"accountingDate" comment:"记账日期"` // 记账日期(char(8),选填)该日期为银行起息记账日期,使用yyyyMMdd格式直联接口返回则记录,若未返回,则使用交易日期。规则如上,仅供参考 OppAccountNo string `json:"oppAccountNo" comment:"对方账号"` // 对方账号(varchar(40),选填) OppAccountName string `json:"oppAccountName" comment:"对方账户名称"` // 对方账户名称(varchar(120),选填) OppOpenBankName string `json:"oppOpenBankName" comment:"对方开户行名"` // 对方开户行名(varchar(120),选填) @@ -209,16 +203,16 @@ type ( TranAmount string `json:"tranAmount" comment:"交易金额"` // 交易金额(decimal(15,2),选填) Balance string `json:"balance" comment:"账户余额"` // 账户余额(decimal(15,2),选填) CurrencyID string `json:"currencyID" comment:"币种"` // 币种(varchar(5),选填) - BnkSrlnum string `json:"bnkSrlnum" comment:"银行流水号"` // 银行流水号(varchar(200),选填) - OriginalSrlNum string `json:"originalSrlNum" comment:"原始银行流水号"` // 原始银行流水号(varchar(100),选填) + BnkSrlnum string `json:"bnkSrlnum" comment:"银行流水号"` // 银行流水号(varchar(200),选填)是对方银行返回的交易明细流水号 + OriginalSrlNum string `json:"originalSrlNum" comment:"原始银行流水号"` // 原始银行流水号(varchar(100),选填) 是对方银行返回的交易明细流水号(目前仅支持平安银行) DataSource string `json:"dataSource" comment:"数据来源"` // 数据来源(varchar(2),选填) 1:接口查询;2:用户导入 Lvmsg string `json:"lvmsg" comment:"附言"` // 附言(varchar(512),选填) Smy string `json:"smy" comment:"摘要"` // 摘要(varchar(512),选填) Rmrk string `json:"rmrk" comment:"备注"` // 备注(varchar(512),选填) Purpose string `json:"purpose" comment:"用途"` // 用途(varchar(512),选填) - ExternalNum string `json:"externalNum" comment:"外部请求流水号"` // 外部请求流水号(varchar(50),选填) - ExternalBatNum string `json:"externalBatNum" comment:"外部请求批次号"` // 外部请求批次号(varchar(30),选填) - AccDtlId string `json:"accDtlId" comment:"系统交易流水号"` // 系统交易流水号(varchar(20),选填) + ExternalNum string `json:"externalNum" comment:"外部请求流水号"` // 外部请求流水号(varchar(50),选填)对方行支持明细对账时返回 + ExternalBatNum string `json:"externalBatNum" comment:"外部请求批次号"` // 外部请求批次号(varchar(30),选填)对方行支持明细对账、且为批量支付生成时返回 + AccDtlId string `json:"accDtlId" comment:"系统交易流水号"` // 系统交易流水号(varchar(20),选填)该流水号是司库系统内该笔明细的唯一性标识,与sumTranNo保持一致 ExtendRemark string `json:"extendRemark" comment:"扩展字段1"` // 扩展字段1(varchar(20),选填) // 机构信息 @@ -234,7 +228,7 @@ type ( // BalanceHisQueryResp 银企直联交易明细查询响应 BalanceHisQueryResp struct { - ClientID string `json:"clientID" comment:"记录申请编号"` // 客户查询自定义的流水号,用于查询结果信息,流水号需唯一(char(20),必填) + ClientID string `json:"clientID" comment:"记录申请编号"` // 客户查询自定义的流水号,用于查询结果信息,流水号需唯一 // 账户交易明细列表(交易成功时返回) List []BalanceHisQueryRespRow `json:"userDataList" comment:"交易明细记录"` @@ -262,68 +256,69 @@ type ( AccountsTransHisQueryRow struct { // 基础交易信息 - SumTranNo string `json:"sumTranNo" comment:"系统交易流水号(varchar(20),选填)"` - TranDate string `json:"tranDate" comment:"交易日期(char(8),格式yyyyMMdd,选填)"` - TranTime string `json:"tranTime" comment:"交易时间(char(6),格式hhmmss,选填)"` - AccountingDate string `json:"accountingDate" comment:"记账日期(char(8),格式yyyyMMdd,选填)"` + SumTranNo string `json:"sumTranNo,omitempty" comment:"系统交易流水号"` // 交易成功且查询到交易明细时返回,对方银行返回的交易明细流水号 + TranDate string `json:"tranDate,omitempty" comment:"交易日期"` // 交易成功且查询到交易明细时返回,交易发生日期使用yyyyMMdd格式 + TranTime string `json:"tranTime,omitempty" comment:"交易时间"` // 交易成功时返回,交易发生时间使用hhmmss格式 + AccountingDate string `json:"accountingDate,omitempty" comment:"记账日期"` // 银行起息记账日期,使用yyyyMMdd格式 // 本方账户信息 - AccountNo string `json:"accountNo" comment:"本方账号(varchar(40),选填)"` - AccountName string `json:"accountName" comment:"账户名称(varchar(120),选填)"` - OpenBankName string `json:"openBankName" comment:"开户行名称(varchar(300),选填)"` - BankName string `json:"bankName" comment:"本方所属银行(varchar(120),选填)"` - InstName string `json:"instName" comment:"机构名称(varchar(360),选填)"` - InstCode string `json:"instCode" comment:"机构编码(varchar(20),选填)"` + AccountNo string `json:"accountNo,omitempty" comment:"本方账号"` // 交易成功时返回,查询输入的账号 + AccountName string `json:"accountName,omitempty" comment:"账户名称"` // 交易成功时返回,查询输入的账号对应的账户名称 + OpenBankName string `json:"openBankName,omitempty" comment:"开户行名称"` // 交易成功时返回,查询输入的账号对应的开户行名称 + BankName string `json:"bankName,omitempty" comment:"本方所属银行"` // 交易成功时返回,查询输入的账号对应的所属银行名称 + InstName string `json:"instName,omitempty" comment:"机构名称"` // 交易成功时返回,查询输入的账号对应的机构名称 + InstCode string `json:"instCode,omitempty" comment:"机构编码"` // 交易成功时返回,查询输入的账号对应的机构编码 // 对方账户信息 - OppAccountNo string `json:"oppAccountNo" comment:"对方账号(varchar(40),选填)"` - OppAccountName string `json:"oppAccountName" comment:"对方账户名称(varchar(120),选填)"` - OppOpenBankName string `json:"oppOpenBankName" comment:"对方开户行名(varchar(120),选填)"` - OppOpenBankNo string `json:"oppOpenBankNo" comment:"对方开户行联行号(varchar(32),选填)"` + OppAccountNo string `json:"oppAccountNo,omitempty" comment:"对方账号"` // 交易成功且查询到交易明细时返回 + OppAccountName string `json:"oppAccountName,omitempty" comment:"对方账户名称"` // 交易成功且查询到交易明细时返回 + OppOpenBankName string `json:"oppOpenBankName,omitempty" comment:"对方开户行名"` // 交易成功且查询到交易明细时返回 + OppOpenBankNo string `json:"oppOpenBankNo,omitempty" comment:"对方开户行联行号"` // 交易成功且查询到交易明细时返回 // 交易属性 - TranType string `json:"tranType" comment:"借贷方向(char(2),02:借;03:贷,选填)"` - TranAmount string `json:"tranAmount" comment:"交易金额(decimal(15,2),选填)"` - Rrtanid string `json:"rrtanid" comment:"退汇标识(char(1),0已退汇;1非退汇;2手工退汇,选填)"` + TranType string `json:"tranType,omitempty" comment:"借贷方向"` // 交易成功且查询到交易明细时返回,02:借;03:贷 + TranAmount float64 `json:"tranAmount,omitempty" comment:"交易金额"` // 交易成功且查询到交易明细时返回 + Rrtanid string `json:"rrtanid,omitempty" comment:"退汇标识"` // 0已退汇 1非退汇 2手工退汇 // 余额信息 - Balance string `json:"balance" comment:"账户余额(decimal(15,2),选填)"` - CurrencyID string `json:"currencyID" comment:"币种(varchar(5),选填)"` + Balance float64 `json:"balance,omitempty" comment:"账户余额"` // 交易成功且查询到账户时返回,标识该账户中全部余额 + CurrencyID string `json:"currencyID,omitempty" comment:"币种"` // 交易成功且查询到账户时返回 // 流水号信息 - TxnSrlnum string `json:"txnSrlnum" comment:"交易流水号(varchar(200),选填)"` - BnkSrlnum string `json:"bnkSrlnum" comment:"银行流水号(varchar(200),选填)"` - OriginalSrlnum string `json:"originalSrlnum" comment:"原始银行流水号(varchar(100),选填,仅平安银行支持)"` - AccDtlId string `json:"accDtlId" comment:"系统交易流水号(varchar(20),选填,与sumTranNo一致)"` + TxnSrlnum string `json:"txnSrlnum,omitempty" comment:"交易流水号"` // 交易匹配号 + BnkSrlnum string `json:"bnkSrlnum,omitempty" comment:"银行流水号"` // 回单匹配号 + OriginalSrlnum string `json:"originalSrlnum,omitempty" comment:"原始银行流水号"` // 交易成功且查询到交易明细时返回(目前仅支持平安银行) + AccDtlId string `json:"accDtlId,omitempty" comment:"系统交易流水号"` // 交易成功且查询到交易明细时返回,与sumTranNo保持一致 // 数据来源信息 - DataSource string `json:"dataSource" comment:"数据来源(varchar(2),1直联;2非直联-人工;3非直联-智能,选填)"` + DataSource string `json:"dataSource,omitempty" comment:"数据来源"` // 交易成功且查询到交易明细时返回,1:直联;2:非直联-人工;3:非直联-智能(RPA导入) // 交易描述信息 - Lvmsg string `json:"lvmsg" comment:"附言(varchar(512),选填)"` - Smy string `json:"smy" comment:"摘要(varchar(512),选填)"` - Rmrk string `json:"rmrk" comment:"备注(varchar(512),选填)"` - Purpose string `json:"purpose" comment:"用途(varchar(512),选填)"` + Lvmsg string `json:"lvmsg,omitempty" comment:"附言"` // 交易成功且查询到交易明细时返回 + Smy string `json:"smy,omitempty" comment:"摘要"` // 交易成功且查询到交易明细时返回 + Rmrk string `json:"rmrk,omitempty" comment:"备注"` // 交易成功且查询到交易明细时返回 + Purpose string `json:"purpose,omitempty" comment:"用途"` // 交易成功且查询到交易明细时返回 // 交易类型标识 - CashTfrId string `json:"cashTfrId" comment:"现转标识(char(1),0现金;1转账,选填)"` + CashTfrId string `json:"cashTfrId,omitempty" comment:"现转标识"` // 0现金 1转账 // 系统时间信息 - HdlTms string `json:"hdlTms" comment:"直联获取时间(TIMESTAMP,格式yyyy-MM-dd HH:mm:ss,选填)"` + HdlTms string `json:"hdlTms,omitempty" comment:"直联获取时间"` // 系统存储时间,格式为:yyyy-MM-dd HH:mm:ss // 外部对账信息 - ExternalNum string `json:"externalNum" comment:"外部请求流水号(varchar(50),选填)"` - ExternalBatNum string `json:"externalBatNum" comment:"外部请求批次号(varchar(30),选填)"` + ExternalNum string `json:"externalNum,omitempty" comment:"外部请求流水号"` // 对方行支持明细对账时返回 + ExternalBatNum string `json:"externalBatNum,omitempty" comment:"外部请求批次号"` // 对方行支持明细对账、且为批量支付生成时返回 // 扩展字段 - ExtendRemark string `json:"extendRemark" comment:"扩展字段1(varchar(20),仅兴业银行支持,选填)"` + ExtendRemark string `json:"extendRemark,omitempty" comment:"扩展字段1"` // 仅支持兴业银行 // 账户属性信息 - IsOpnDirconId string `json:"isOpnDirconId" comment:"联网方式(char(1),0非直联;1直联,选填)"` - AccCgyId string `json:"accCgyId" comment:"账户性质(char(20),1一般账户;2基本账户;3专用账户;4临时账户;5其他,选填)"` - AccTpId string `json:"accTpId" comment:"存款类型(char(20),1活期;2定期;3通知;4活期保证金;5定期保证金;6其他,选填)"` - IsFrgnAccId string `json:"isFrgnAccId" comment:"境内/境外账户(char(1),0境内;1境外,选填)"` - AccCharId string `json:"accCharId" comment:"账户属性(char(20),1实账户;2登记簿,选填)"` + IsOpnDirconId string `json:"isOpnDirconId,omitempty" comment:"联网方式"` // 0非直联 1直联 + AccCgyId string `json:"accCgyId,omitempty" comment:"账户性质"` // 1一般账户 2基本账户 3专用账户 4临时账户 5其他 + AccTpId string `json:"accTpId,omitempty" comment:"存款类型"` // 1活期 2定期 3通知 4活期保证金 5定期保证金 6其他 + IsFrgnAccId string `json:"isFrgnAccId,omitempty" comment:"境内/境外账户"` // 0境内 1境外 + AccCharId string `json:"accCharId,omitempty" comment:"账户属性"` // 1实账户 2登记簿 + } // SinglePayResp 单笔付款 @@ -331,4 +326,70 @@ type ( ExternalNum string `json:"externalNum" comment:"外部请求流水号"` // 入参流水号返回 DealMode string `json:"dealMode" comment:"处理模式"` // 1.审批处理 2.直接出账 3.经办处理 } + + SinglePayQueryResp struct { + PyStat string `json:"pyStat" comment:"支付任务状态"` // 支付任务状态 + AlocStat string `json:"alocStat" comment:"资金下拨结果"` // 资金下拨结果(联动支付时展示) + BnkRetCode string `json:"bnkRetCode" comment:"银行交易结果"` // 银行返回结果 + ExtendRemark string `json:"extendRemark" comment:"备注"` // JSON格式字符串,包含额外信息,参考:@struct SinglePayQueryExtendRemark + PyPartyAccNum string `json:"pypartyAccnum" comment:"付方账号"` // 付方账号 + PyPartyAccNm string `json:"pypartyAccnm" comment:"付方户名"` // 付方户名 + PyPartyDepBnkNm string `json:"pypartyDepBnkNm" comment:"付方开户行"` // 付方开户行 + PyPartyBnkgId string `json:"pypartyBnkgId" comment:"付方开户行联行号"` // 付方开户行联行号 + } + + // SinglePayQueryExtendRemark 扩展备注字段结构体 + SinglePayQueryExtendRemark struct { + ApprovalTime string `json:"approvalTime,omitempty" comment:"终审通过/拒绝时间"` // yyyy-MM-dd HH:mm:ss + CreateTime string `json:"createTime,omitempty" comment:"外系统提单时间"` // yyyy-MM-dd HH:mm:ss + RcvBnkTime string `json:"rcvBnkTime,omitempty" comment:"交易时间"` // yyyy-MM-dd HH:mm:ss + RejectReason string `json:"rejectReason,omitempty" comment:"拒绝原因"` // 审批不同意时的审批意见 + PyTmlnsFlag string `json:"pyTmlnsFlag,omitempty" comment:"预约付款标志"` // 00:否 01:是 02:已取消 + OptUserNm string `json:"optUserNm,omitempty" comment:"操作人用户名称"` // 操作人名称 + } + + // BatchPayResp 批量付款 + BatchPayResp struct { + ExternalBatNum string `json:"externalBatNum" validate:"required" comment:"外部请求批次号"` // 业务批次唯一标识 + DealMode string `json:"dealMode" validate:"required,oneof=1 2 3" comment:"处理模式"` // 1:审批处理 2:直接出账 3:经办处理 + List []BatchPayRespDetail `json:"list" validate:"dive" comment:"明细校验结果列表"` // 明细级校验结果 + } + + // BatchPayRespDetail 单笔明细校验结果 + BatchPayRespDetail struct { + ExternalNum string `json:"externalNum" validate:"required" comment:"明细流水号"` // 业务明细唯一标识 + RowStat string `json:"rowStat" validate:"required,oneof=AAAAAAA" comment:"校验状态"` // AAAAAAA:校验成功 + RowStatMsg string `json:"rowStatMsg,omitempty" comment:"校验状态补充信息"` // 成功时通常为空 + } + + // BatchPayQueryResp X多笔付款查证 + BatchPayQueryResp struct { + PyStat string `json:"pyStat" validate:"required,oneof=01 02 03 04 05 06 07" comment:"批次支付任务状态"` + // 01:待提交 02:待付款 03:处理中 04:付款成功 05:付款失败 06:已拒绝 07:部分成功 + AlocStat string `json:"alocStat,omitempty" validate:"omitempty,oneof=00 01 02 03 04" comment:"资金下拨结果"` + // 00-待处理 01-处理中 02-无需下拨 03-成功 04-失败 + ExternalBatNum string `json:"externalBatNum" validate:"required" comment:"外部请求批次号"` // 业务批次唯一标识 + ExtendRemark string `json:"extendRemark,omitempty" comment:"扩展备注(JSON格式)"` // JSON格式备注信息 + PyPartyAccNum string `json:"pypartyAccnum" validate:"required" comment:"付方账号"` // 付款账号 + PyPartyAccNm string `json:"pypartyAccnm" validate:"required" comment:"付方户名"` // 付款户名 + PyPartyDepBnkNm string `json:"pypartyDepBnkNm" validate:"required" comment:"付方开户行"` // 开户行名称 + PyPartyBnkgId string `json:"pypartyBnkgId" validate:"required" comment:"付方开户行联行号"` // 11位联行号 + List []PayDetail `json:"batchInfoList" validate:"dive" comment:"明细支付结果列表"` // 明细支付结果列表 + } + + // PayDetail 单笔明细支付结果 + PayDetail struct { + BnkRetCode string `json:"bnkRetCode" validate:"required" comment:"银行处理结果"` // 银行返回信息 + PyStat string `json:"pyStat" validate:"required,oneof=01 02 03 04 05" comment:"明细支付状态"` + // 01:待提交 02:待付款 03:处理中 04:成功 05:失败 + ExternalNum string `json:"externalNum" validate:"required" comment:"外部请求流水号"` // 业务明细唯一标识 + } + + // ExtendRemark 扩展备注信息结构体(用于解析extendRemark字段) + ExtendRemark struct { + ApprovalTime string `json:"approvalTime,omitempty" comment:"审批时间(yyyy-MM-dd HH:mm:ss)"` // 终审时间 + CreateTime string `json:"createTime,omitempty" comment:"创建时间(yyyy-MM-dd HH:mm:ss)"` // 提单时间 + RejectReason string `json:"rejectReason,omitempty" comment:"拒绝原因"` // 审批拒绝原因 + OptUserNm string `json:"optUserNm,omitempty" comment:"操作人姓名"` // 操作人名称 + } ) diff --git a/tysk_test.go b/tysk_test.go index 910272d..85b0eb2 100644 --- a/tysk_test.go +++ b/tysk_test.go @@ -4,6 +4,7 @@ import ( "gitea.cdlsxd.cn/self-tools/tysk/tysk_constant" "gitea.cdlsxd.cn/self-tools/tysk/tysk_entity" "testing" + "time" ) const UserName = "LSXDWL003_ZL" @@ -125,14 +126,114 @@ func Test_AccountsTransHisQuery(t *testing.T) { } func Test_SinglePay(t *testing.T) { - req := tysk_entity.AccountsTransHisQueryReq{ - TranType: tysk_constant.TranTypeAll, - StartDate: "20250728", - EndDate: "20250803", - StartRecord: 1, - PageNumber: 10, - AccountNo: []tysk_constant.AccountNo{"8110701013301269598", "8110701012401269599", "8110701013801269600"}, + // 模拟常量值 + linkPayFlag := tysk_constant.CommonBoolFalse // 默认不联动支付 + isCheck := tysk_constant.IsCheckRcvpartyDepbnkIdNot + txnType := tysk_constant.TxnCntprTpCus // 客户类型 + accType := tysk_constant.PyAccTpPub // 对公账户 + isInterbnk := tysk_constant.CommonBoolFalse + urgntFlag := tysk_constant.CommonBoolFalse + pyTmlnsFlag := tysk_constant.CommonBoolTrue + + req := tysk_entity.SinglePayReq{ + ExternalNum: "MOCK123456789", + LinkPayFlag: &linkPayFlag, + PypPartyAccnum: "8110701013301269598", + RcvPyAccnum: "8110701012401269599", + RcvPyAccnm: "成都蓝色兄弟网络科技有限公司ERP", + IsCheckRcvpartyDepbnkId: &isCheck, + RcvPartyDepbnkId: stringPtr("中信银行北京朝阳支行"), + //RcvpartyBnkgId: stringPtr("10140"), + TxnCntprTp: &txnType, + PyAccTp: accType, + Amt: 1000.50, + CurrencyID: "CNY", + IsInterbnk: &isInterbnk, + UrgntAprvFlag: &urgntFlag, + PyTmlnsFlag: &pyTmlnsFlag, + RsrvtnTms: stringPtr(time.Now().Add(120 * time.Second).Format("2006-01-02 15:04")), + Pscpt: "测试付款附言", + Rmrk: stringPtr("测试备注"), + Rmrk1: stringPtr("备用字段1"), + Rmrk2: stringPtr("备用字段2"), } res, err := g.SinglePay(req) + //{"dealMode":"1","externalNum":"MOCK123456789","failReason":"","status":"AAAAAAA","statusText":"交易成功"} t.Log(res, err) } + +func Test_SinglePayQuery(t *testing.T) { + req := tysk_entity.SinglePayQueryReq{ + ExternalNum: "MOCK123456789", + } + res, err := g.SinglePayQuery(req) + t.Log(res, err) +} + +func Test_BatchPay(t *testing.T) { + linkPayFlag := tysk_constant.CommonBoolFalse + urgntFlag := tysk_constant.CommonBoolFalse + rsrvtnFlag := tysk_constant.CommonBoolTrue + checkMode := tysk_constant.CheckModeBatch + isInterbnk := tysk_constant.CommonBoolFalse + isCheckDepBnk := tysk_constant.IsCheckRcvpartyDepbnkIdNot + txnType := tysk_constant.TxnCntprTpCus // 客户类型 + accType := tysk_constant.PyAccTpPub // 对公账户 + rsvTime := time.Now().Add(2 * time.Minute).Format("2006-01-02 15:04") + req := tysk_entity.BatchPayReq{ + ExternalBatNum: "MOCK123456789BATCH", + LinkPayFlag: &linkPayFlag, + PyPartyAccNum: "8110701013301269598", + CurrencyID: "CNY", + TotNbr: "2", + Amt: 1000.75, + UrgntAprvFlag: &urgntFlag, + RsrvtnFlag: &rsrvtnFlag, + RsrvtnTms: stringPtr(rsvTime), + CheckMode: &checkMode, + List: []tysk_entity.BatchPayList{ + { + + ExternalNum: "BATCH001", + RcvPyAccNum: "8110701012401269599", + RcvPyAccNm: "成都蓝色兄弟网络科技有限公司ERP", + IsInterBnk: &isInterbnk, + IsCheckRcvPartyDepBnkId: &isCheckDepBnk, + RcvPartyDepBnkId: stringPtr("中信银行北京朝阳支行"), + // RcvPartyBnkgId: stringPtr("105100000017"), + TxnCntprTp: &txnType, + PyAccTp: accType, + DebitAmt: 500.75, + Pscpt: "货款支付", + Rmrk: stringPtr("月度结算"), + }, + { + ExternalNum: "BATCH002", + RcvPyAccNum: "8110701013801269600", + RcvPyAccNm: "成都蓝色兄弟网络科技有限公司ERP", + IsInterBnk: &isInterbnk, + IsCheckRcvPartyDepBnkId: &isCheckDepBnk, + RcvPartyDepBnkId: stringPtr("中信银行北京朝阳支行"), + TxnCntprTp: &txnType, // 客户 + PyAccTp: "00", // 对公 + DebitAmt: 500, + Pscpt: "服务费", + }, + }, + } + res, err := g.BatchPay(req) + t.Log(res, err) +} + +func Test_BatchPayQuery(t *testing.T) { + req := tysk_entity.BatchPayQueryReq{ + ExternalBatNum: "MOCK123456789BATCH", + } + res, err := g.BatchPayQuery(req) + t.Log(res, err) +} + +// stringPtr 辅助函数:生成字符串指针 +func stringPtr(s string) *string { + return &s +}