bank.go 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. package models
  2. import (
  3. "mtp2_if/db"
  4. "mtp2_if/utils"
  5. )
  6. // Bankcusbankextendconfig 托管银行扩展配置表
  7. type Bankcusbankextendconfig struct {
  8. CUSBANKID string `json:"cusbankid" xorm:"CUSBANKID" form:"cusbankid" binding:"required"` // 托管银行编号
  9. EXTENDBIZTYPE int32 `json:"extendbiztype" xorm:"EXTENDBIZTYPE" form:"extendbiztype"` // 扩展业务类型 - 1:签约 2:入金 3:出金 4:签约信息修改
  10. FIELDID int64 `json:"fieldid" xorm:"FIELDID"` // 字段ID
  11. ISMANDATORY int32 `json:"ismandatory" xorm:"ISMANDATORY"` // 是否必填 - 0:不必填 1:必填
  12. FIELDCODE string `json:"fieldcode" xorm:"FIELDCODE"` // 字段代码
  13. FIELDNAME string `json:"fieldname" xorm:"FIELDNAME"` // 字段名称
  14. STATUS int32 `json:"status" xorm:"STATUS"` // 状态 - 0:正常 1:注销
  15. FIELDTYPE int32 `json:"fieldtype" xorm:"FIELDTYPE"` // 字段类型 - 1:扩展字段 2:协议字段
  16. USABLETYPE int32 `json:"usabletype" xorm:"USABLETYPE"` // 可用类型 - 1:通用 2:机构专用 3:投资者专用
  17. }
  18. func (r *Bankcusbankextendconfig) calc() {}
  19. func (r *Bankcusbankextendconfig) buildSql() string {
  20. var sqlId utils.SQLVal = `
  21. SELECT
  22. t.cusbankid,
  23. t.extendbiztype,
  24. t.fieldid,
  25. t.ismandatory,
  26. e.fieldcode,
  27. e.fieldname,
  28. e.status,
  29. e.fieldtype,
  30. e.usabletype
  31. FROM Bank_Cusbankextendconfig t
  32. LEFT JOIN BANK_EXTENDFIELD e ON
  33. e.fieldid = t.fieldid
  34. WHERE 1=1
  35. `
  36. sqlId.And("t.cusbankid", r.CUSBANKID)
  37. sqlId.AndEx("t.extendbiztype", r.EXTENDBIZTYPE, r.EXTENDBIZTYPE > 0)
  38. sqlId.OrderBy("t.fieldid")
  39. return sqlId.String()
  40. }
  41. // GetDataEx 获取掉期商品订单详情(交易确认书)
  42. func (r *Bankcusbankextendconfig) GetDataEx() (interface{}, error) {
  43. sData := make([]Bankcusbankextendconfig, 0)
  44. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  45. for i := range sData {
  46. sData[i].calc()
  47. }
  48. return sData, err
  49. }
  50. // Bankbranchnuminfo 银行支行联行号信息表
  51. type Bankbranchnuminfo struct {
  52. BRANCHNUM string `json:"branchnum" xorm:"BRANCHNUM"` // 支行行号
  53. BRANCHNAME string `json:"branchname" xorm:"BRANCHNAME" form:"branchname" binding:"required"` // 支行名称
  54. BRANCHPROVINCE string `json:"branchprovince" xorm:"BRANCHPROVINCE"` // 省份
  55. BRANCHCITY string `json:"branchcity" xorm:"BRANCHCITY"` // 市县
  56. ISEXPIRED string `json:"isexpired" xorm:"ISEXPIRED"` // 是否过期
  57. PageEx `xorm:"extends"` // 页码信息
  58. }
  59. func (r *Bankbranchnuminfo) calc() {
  60. }
  61. func (r *Bankbranchnuminfo) buildSql() string {
  62. var sqlId utils.SQLVal = `
  63. select t.branchnum,
  64. t.branchname,
  65. t.branchprovince,
  66. t.branchcity
  67. from BANK_BRANCHNUMINFO t
  68. where t.branchname like '%%%v%%'
  69. `
  70. sqlId.FormatParam(r.BRANCHNAME)
  71. sqlId.Page(r.Page, r.PageSize)
  72. return sqlId.String()
  73. }
  74. func (r *Bankbranchnuminfo) GetDataByPage() (interface{}, error, int, int, int) {
  75. sData := make([]Bankbranchnuminfo, 0)
  76. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  77. total := 0
  78. for i := range sData {
  79. sData[i].calc()
  80. total = sData[i].Total
  81. }
  82. return sData, err, r.Page, r.PageSize, total
  83. }
  84. type GetAmtInByPaidUrlRsp struct {
  85. ChannelMode string `json:"channelmode"` // 渠道类型:ChillPay,PayerMax,AsiaPay
  86. URL string `json:"url"` // 支付跳转地址
  87. Params string `json:"params"` // 支付参数,只有 AsiaPay 渠道需要
  88. }
  89. func GetAmtInByPaid(accountId int, exchticket string, channelMode string) (rsp *GetAmtInByPaidUrlRsp, err error) {
  90. engine := db.GetEngine()
  91. var has bool
  92. // 尝试 ChillPay
  93. if channelMode == "chillpay" || channelMode == "" {
  94. var rec Chillpayamtinrec
  95. has, err = engine.Where("accountid = ? and exch_seq = ? and deal_status = 2", accountId, exchticket).Get(&rec)
  96. if err != nil {
  97. return
  98. }
  99. if has {
  100. rsp = &GetAmtInByPaidUrlRsp{
  101. ChannelMode: "chillpay",
  102. URL: rec.PAYMENTURL,
  103. }
  104. return
  105. }
  106. }
  107. // 尝试 PayerMax
  108. if channelMode == "payermax" || channelMode == "" {
  109. var rec Payermaxamtinrec
  110. has, err = engine.Where("accountid = ? and exch_seq = ? and deal_status = 2", accountId, exchticket).Get(&rec)
  111. if err != nil {
  112. return
  113. }
  114. if has {
  115. rsp = &GetAmtInByPaidUrlRsp{
  116. ChannelMode: "payermax",
  117. URL: rec.REDIRECTURL,
  118. }
  119. return
  120. }
  121. }
  122. // 尝试 Asia Pay
  123. // if channelMode == "asiapay" || channelMode == "" {
  124. // var rec Asiapayamtinrec
  125. // has, err = engine.Where("accountid = ? and exch_seq = ? and deal_status = 2", accountId, exchticket).Get(&rec)
  126. // if err != nil {
  127. // return
  128. // }
  129. // if has {
  130. // rsp = &GetAmtInByPaidUrlRsp{
  131. // ChannelMode: "asiapay",
  132. // URL: rec.REDIRECTURL,
  133. // Params: rec.REDIRECTPARAMS,
  134. // }
  135. // return
  136. // }
  137. // }
  138. // 尝试混合支付
  139. if channelMode == "hybrid" || channelMode == "" {
  140. var rec Hybridamtrec
  141. has, err = engine.Where("TRADE_ACCT = ? and exch_seq = ? and deal_status = 2 and out_in_flag = 1", accountId, exchticket).Get(&rec)
  142. if err != nil {
  143. return
  144. }
  145. if has {
  146. rsp = &GetAmtInByPaidUrlRsp{
  147. ChannelMode: "hybrid",
  148. URL: rec.PAYMENT_URL,
  149. }
  150. return
  151. }
  152. }
  153. return
  154. }
  155. func GetCusBankInfos() ([]Bankcusbankinfo, error) {
  156. engine := db.GetEngine()
  157. infos := make([]Bankcusbankinfo, 0)
  158. if err := engine.Find(&infos); err != nil {
  159. return nil, err
  160. }
  161. return infos, nil
  162. }
  163. // PaymentCenterHybridConfig 支付中心混合支付渠道配置信息
  164. type PaymentCenterHybridConfig struct {
  165. CHANNEL_CODE string `json:"channel_code"` // 渠道代码
  166. CHANNEL_NAME string `json:"channel_name"` // 渠道名称
  167. CAN_AMT_IN int32 `json:"can_amt_in"` // 入金是否可用 0-不可用 1-可用
  168. CAN_AMT_OUT int32 `json:"can_amt_out"` // 出金是否可用 0-不可用 1-可用
  169. InBankInfos map[string][]Hybridbankinfo `json:"in_bank_infos"` // 入金银行信息列表
  170. OutBankInfos map[string][]Hybridbankinfo `json:"out_bank_infos"` // 出金银行信息列表
  171. }
  172. func GetPaymentCenterHybridConfig() (paymentCenterHybridConfigs []PaymentCenterHybridConfig, err error) {
  173. engine := db.GetEngine()
  174. paymentCenterHybridConfigs = make([]PaymentCenterHybridConfig, 0)
  175. hybridchannelconfigs := make([]Hybridchannelconfig, 0)
  176. if err = engine.Find(&hybridchannelconfigs); err != nil {
  177. return
  178. }
  179. for _, item := range hybridchannelconfigs {
  180. paymentCenterHybridConfig := PaymentCenterHybridConfig{
  181. CHANNEL_CODE: item.CHANNEL_CODE,
  182. CHANNEL_NAME: item.CHANNEL_NAME,
  183. CAN_AMT_IN: item.CAN_AMT_IN,
  184. CAN_AMT_OUT: item.CAN_AMT_OUT,
  185. }
  186. // 入金银行信息
  187. in_datas := make([]Hybridbankinfo, 0)
  188. if err = engine.Where("CHANNEL_CODE = ? AND OUT_IN_FLAG = 1 AND IS_ENABLED = 1", item.CHANNEL_CODE).Find(&in_datas); err != nil {
  189. return
  190. }
  191. in := make(map[string][]Hybridbankinfo)
  192. for _, data := range in_datas {
  193. in[data.METHOD_TYPE] = append(in[data.METHOD_TYPE], data)
  194. }
  195. paymentCenterHybridConfig.InBankInfos = in
  196. // 出金银行信息
  197. out_datas := make([]Hybridbankinfo, 0)
  198. if err = engine.Where("CHANNEL_CODE = ? AND OUT_IN_FLAG = 0 AND IS_ENABLED = 1", item.CHANNEL_CODE).Find(&out_datas); err != nil {
  199. return
  200. }
  201. out := make(map[string][]Hybridbankinfo)
  202. for _, data := range out_datas {
  203. out[data.METHOD_TYPE] = append(out[data.METHOD_TYPE], data)
  204. }
  205. paymentCenterHybridConfig.OutBankInfos = out
  206. paymentCenterHybridConfigs = append(paymentCenterHybridConfigs, paymentCenterHybridConfig)
  207. }
  208. return
  209. }
  210. // Hybridreceiveronboard 混合支付出金接收者表
  211. type Hybridreceiveronboard struct {
  212. CHANNEL_CODE string `json:"channel_code" xorm:"CHANNEL_CODE"` // 渠道代码
  213. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 资金账户ID
  214. RECEIVERTYPE string `json:"receiver_type" xorm:"RECEIVERTYPE"` // 接收者类型 // 个人-Individual 企业-Organization
  215. NAME string `json:"name" xorm:"NAME"` // 名称 / 企业名称
  216. TAXID string `json:"cert_no" xorm:"TAXID"` // 证件号码
  217. TELNUMBER string `json:"phone_number" xorm:"TELNUMBER"` // 电话号码
  218. BANK string `json:"bank_code" xorm:"BANK"` // 银行代码
  219. BANKACCOUNT string `json:"bank_account" xorm:"BANKACCOUNT"` // 银行卡号
  220. BANKBRANCH string `json:"bankbranch" xorm:"BANKBRANCH"` // 银行支行名称
  221. BANK_NAME string `json:"bank_name" xorm:"BANK_NAME"` // 银行名称
  222. METHOD_TYPE string `json:"method_type" xorm:"METHOD_TYPE"` // 银行卡号
  223. USERID int64 `json:"-" xorm:"-"` // 用户ID
  224. }
  225. func (r *Hybridreceiveronboard) calc() {
  226. if r.CHANNEL_CODE == "mypay" {
  227. r.BANK_NAME = r.BANK
  228. }
  229. }
  230. func (r *Hybridreceiveronboard) buildSql() string {
  231. var sqlId utils.SQLVal = `
  232. select
  233. t.channel_code,
  234. t.accountid,
  235. t.id,
  236. t.receivertype,
  237. t.name,
  238. t.taxid,
  239. t.telnumber,
  240. t.bank,
  241. t.bankaccount,
  242. t.email,
  243. t.datecreated,
  244. t.datemodified,
  245. t.relationship,
  246. t.status,
  247. t.bankbranch,
  248. b.bank_name,
  249. b.method_type
  250. from HYBRID_RECEIVERONBOARD t
  251. left join HYBRID_BANKINFO b on b.channel_code = t.channel_code and b.bank_code = t.bank and b.out_in_flag = 0
  252. inner join taaccount ta on ta.accountid = t.accountid
  253. inner join useraccount u on u.userid = ta.userid
  254. `
  255. sqlId.And("u.userid", r.USERID)
  256. return sqlId.String()
  257. }
  258. func (r *Hybridreceiveronboard) GetDataEx() (interface{}, error) {
  259. sData := make([]Hybridreceiveronboard, 0)
  260. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  261. for i := range sData {
  262. sData[i].calc()
  263. }
  264. return sData, err
  265. }