ermcpUser.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. /**
  2. * @Author: zou.yingbin
  3. * @Create : 2021/1/7 17:31
  4. * @Modify : 2021/1/7 17:31
  5. */
  6. package models
  7. import (
  8. "encoding/hex"
  9. "fmt"
  10. "mtp2_if/db"
  11. "mtp2_if/logger"
  12. "mtp2_if/utils"
  13. )
  14. // Hedgeoutmainconfig 外部母账号对冲配置表
  15. // (要在系统参数表额外添加两个全局配置 1: 下单接口平台登录用户名[HedgePlateform_UserName] 2:下单接口平台登录密码[HedgePlateform_PWD])
  16. type Hedgeoutmainconfig struct {
  17. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'" binding:"required"` // 资金账号ID(母账号)
  18. Channelid int64 `json:"channelid" xorm:"'CHANNELID'"` // 对冲渠道ID
  19. Marketid int64 `json:"marketid" xorm:"'MARKETID'"` // 内部市场ID(母账号的操作
  20. Hedgeaccountcode string `json:"hedgeaccountcode" xorm:"'HEDGEACCOUNTCODE'"` // 对冲账号ID
  21. Hedgeaccountpwd string `json:"hedgeaccountpwd" xorm:"-"` // 对冲账号密码
  22. Channeladdress string `json:"channeladdress" xorm:"'CHANNELADDRESS'"` // 对冲渠道服务地址(多个地址用逗号分隔) -- 192.168.30.10:3000,192.168.30.10:3001
  23. Brokerid string `json:"brokerid" xorm:"'BROKERID'"` // 经纪公司代码
  24. Exchangeratecurrencygroup string `json:"exchangeratecurrencygroup" xorm:"'EXCHANGERATECURRENCYGROUP'"` // 汇率币种组 [易盛]
  25. Accountcurrency string `json:"accountcurrency" xorm:"'ACCOUNTCURRENCY'"` // 资金账户基币 [易盛]
  26. Accountcurrecnygroup string `json:"accountcurrecnygroup" xorm:"'ACCOUNTCURRECNYGROUP'"` // 资金账户币种组 [易盛]
  27. Authcode string `json:"authcode" xorm:"'AUTHCODE'"` // 授权码[易盛]
  28. Status int32 `json:"status" xorm:"'STATUS'"` // 渠道账号状态 1-可买入可卖出 2-可卖出不可买入
  29. Limitnumber int64 `json:"limitnumber" xorm:"'LIMITNUMBER'"` // 挂单笔数限额
  30. Appid string `json:"appid" xorm:"'APPID'"` // AppID
  31. Userproductinfo string `json:"userproductinfo" xorm:"'USERPRODUCTINFO'"` // 客户端产品信息
  32. Connectflag int32 `json:"connectflag" xorm:"'CONNECTFLAG'"` // 是否联接外部交易 - 0:不连接 1:连接
  33. Hedgeaccounttype int32 `json:"hedgeaccounttype" xorm:"'HEDGEACCOUNTTYPE'"` // 母账号类型 - 1-交易下单 2-跟单
  34. Fcid int32 `json:"fcid" xorm:"'FCID'"` // 期货公司ID
  35. }
  36. // TableName is HEDGE_OUTMAINCONFIG
  37. func (Hedgeoutmainconfig) TableName() string {
  38. return "HEDGE_OUTMAINCONFIG"
  39. }
  40. // GetOutAccountStatus 获取目标登录账号当前对冲账号在线状态
  41. func (r *Hedgeoutmainconfig) GetOutAccountStatus(loginID int) ([]Hedgeoutmainconfig, error) {
  42. datas := make([]Hedgeoutmainconfig, 0)
  43. // 获取登录账号相关的所有资金账户
  44. taAccounts, err := GetTaAccountsByLoginID(loginID, 0)
  45. if err != nil {
  46. return nil, err
  47. }
  48. ids := make([]int, 0)
  49. for _, v := range taAccounts {
  50. if v.Ismain == 1 {
  51. // 母账户
  52. ids = append(ids, int(v.Accountid))
  53. } else {
  54. // 子账户
  55. ids = append(ids, int(v.Parentaccountid))
  56. }
  57. }
  58. if err := db.GetEngine().In("ACCOUNTID", ids).Find(&datas); err != nil {
  59. return nil, err
  60. }
  61. return datas, nil
  62. }
  63. // ErmcpUserModel 客户资料结构
  64. type ErmcpUserModel struct {
  65. USERID int `json:"userid" xorm:"'USERID'"` // 用户ID
  66. MEMBERUSERID int `json:"memberuserid" xorm:"'MEMBERUSERID'"` // 所属机构ID
  67. USERINFOTYPE string `json:"userinfotype" xorm:"'USERINFOTYPE'"` // 客户类型
  68. CUSTOMERNAME string `json:"customername" xorm:"'CUSTOMERNAME'"` // 企业名称
  69. CARDTYPE int32 `json:"cardtype" xorm:"'CARDTYPE'"` // 证件类型
  70. CARDTYPENAME string `json:"cardtypename" xorm:"'CARDTYPENAME'"` // 证件类型名称
  71. CARDNUM string `json:"cardnum" xorm:"'CARDNUM'"` // 证件号码
  72. MOBILE string `json:"mobile" xorm:"'MOBILE'"` // 手机号码
  73. TELPHONE string `json:"telphone" xorm:"'TELPHONE'"` // 联系电话
  74. ADDRESS string `json:"address" xorm:"'ADDRESS'"` // 通讯地址
  75. REMARK string `json:"remark" xorm:"'REMARK'"` // 备注
  76. STATUS int32 `json:"status" xorm:"'STATUS'"` // 账户状态 - 1:待激活 2:待审核 3:待复审 4:正常 5:审核拒绝 6:注销
  77. STATUSDESC string `json:"statusdesc"` // 账户状态中文描述
  78. ATTACHMENT1 string `json:"attachment1" xorm:"'ATTACHMENT1'"` // 附件1
  79. CARDFRONTPHOTOURL string `json:"cardfrontphotourl" xorm:"'CARDFRONTPHOTOURL'"` // 证件正面图片地址
  80. COUNTRYID int32 `json:"countryid" xorm:"'COUNTRYID'"` // 国家
  81. PROVINCEID int32 `json:"provinceid" xorm:"'PROVINCEID'"` // 省
  82. CITYID int32 `json:"cityid" xorm:"'CITYID'"` // 市
  83. DISTRICTID int32 `json:"districtid" xorm:"'DISTRICTID'"` // 区域
  84. CREATETIME string `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  85. MODIFYTIME string `json:"modifytime" xorm:"'MODIFYTIME'"` // 修改时间
  86. AUDITTIME string `json:"audittime" xorm:"'AUDITTIME'"` // 审核时间
  87. NICKNAME string `json:"nickname" xorm:"'NICKNAME'"` // 昵称
  88. }
  89. func (r *ErmcpUserModel) buildWskhSql(accStatus string) string {
  90. str := "select t.userid," +
  91. " t.memberareaid MEMBERUSERID," +
  92. " t.USERINFOTYPE," +
  93. " t.CUSTOMERNAME," +
  94. " t.NICKNAME," +
  95. " t.CARDTYPE," +
  96. " e.enumdicname CARDTYPENAME," +
  97. " t.CARDNUM," +
  98. " t.mobilephone MOBILE," +
  99. " t.TELPHONE," +
  100. " t.cardaddress ADDRESS," +
  101. " t.REMARK," +
  102. " t.ATTACHMENT1," +
  103. " t.CARDFRONTPHOTOURL," +
  104. " t.userstate status," +
  105. " t.countryid," +
  106. " t.provinceid," +
  107. " t.districtid," +
  108. " to_char(t.createtime,'yyyy-mm-dd hh24:mi:ss') createtime," +
  109. " t.cityid," +
  110. " to_char(t.modifiedtime,'yyyy-mm-dd hh24:mi:ss') modifytime," +
  111. " to_char(t.auditime,'yyyy-mm-dd hh24:mi:ss') audittime" +
  112. " from wskh_userinfo t" +
  113. " left join enumdicitem e" +
  114. " on t.cardtype = e.enumitemname" +
  115. " and e.enumdiccode = 'certificatetype'" +
  116. " where t.userstate in (%v)" +
  117. " and t.usertype = 6" +
  118. " and t.memberareaid = %v" +
  119. " order by t.modifiedtime desc"
  120. return fmt.Sprintf(str, accStatus, r.MEMBERUSERID)
  121. }
  122. func (r *ErmcpUserModel) buildSql(accStatus string) string {
  123. str := "select t.userid," +
  124. " t.memberuserid," +
  125. " u.USERINFOTYPE," +
  126. " u.CUSTOMERNAME," +
  127. " u.NICKNAME," +
  128. " u.CARDTYPEID CARDTYPE," +
  129. " e.enumdicname CARDTYPENAME," +
  130. " u.CARDNUM," +
  131. " u.MOBILE," +
  132. " u.TELPHONE," +
  133. " u.ADDRESS," +
  134. " u.REMARK," +
  135. " u.ATTACHMENT1," +
  136. " u.CARDFRONTPHOTOURL," +
  137. " t.accountstatus status," +
  138. " u.countryid," +
  139. " u.provinceid," +
  140. " u.districtid," +
  141. " to_char(t.createtime,'yyyy-mm-dd hh24:mi:ss') createtime," +
  142. " to_char(t.modifytime,'yyyy-mm-dd hh24:mi:ss') modifytime," +
  143. " to_char(t.audittime,'yyyy-mm-dd hh24:mi:ss') audittime," +
  144. " u.cityid" +
  145. " from useraccount t" +
  146. " left join userinfo u" +
  147. " on t.userid = u.userid" +
  148. " left join enumdicitem e" +
  149. " on u.cardtypeid = e.enumitemname" +
  150. " and e.enumdiccode = 'certificatetype'" +
  151. " where t.usertype = 6" +
  152. " and t.accountstatus in (%v)" +
  153. " and t.memberuserid = %v"
  154. // 查正常状态,按审核时间排序
  155. if accStatus == "4" {
  156. str += " order by t.audittime desc"
  157. } else if accStatus == "6" {
  158. // 停用状态按修改时间排序
  159. str += " order by t.modifytime desc"
  160. }
  161. return fmt.Sprintf(str, accStatus, r.MEMBERUSERID)
  162. }
  163. // DecryptField 解密卡号和电话号码字段
  164. func (r *ErmcpUserModel) DecryptField(isWskh bool) {
  165. key := "0d299ce2d4105282f7471074cb0f9f9d"
  166. key2, _ := hex.DecodeString(key)
  167. fd := func(str string) string {
  168. if str == "" {
  169. return str
  170. }
  171. d, _ := hex.DecodeString(str)
  172. if dst, err := utils.AESDecrypt(d, key2); err == nil {
  173. return string(dst)
  174. }
  175. return str
  176. }
  177. r.CARDNUM = fd(r.CARDNUM)
  178. r.MOBILE = fd(r.MOBILE)
  179. if !isWskh {
  180. // 正式用户表(非网上开户)需要解密电话号码
  181. r.TELPHONE = fd(r.TELPHONE)
  182. }
  183. if isWskh && len(r.ADDRESS) != 0 { // 地址不为空
  184. r.ADDRESS = fd(r.ADDRESS)
  185. }
  186. }
  187. // DecodeStausName 账户状态名称
  188. func (r *ErmcpUserModel) DecodeStausName(queryType int32) {
  189. if queryType == 1 || queryType == 2 {
  190. // 网上开户状态
  191. if r.STATUS == 1 {
  192. r.STATUSDESC = "未提交"
  193. } else if r.STATUS == 2 || r.STATUS == 4 {
  194. r.STATUSDESC = "待审核"
  195. } else if r.STATUS == 3 || r.STATUS == 5 {
  196. r.STATUSDESC = "审核拒绝"
  197. }
  198. } else if queryType == 3 || queryType == 4 {
  199. if r.STATUS == 4 {
  200. r.STATUSDESC = "正常"
  201. } else if r.STATUS == 6 {
  202. r.STATUSDESC = "已注销"
  203. }
  204. }
  205. }
  206. // GetData 查询客户资料
  207. func (r *ErmcpUserModel) GetData(queryType int32) ([]ErmcpUserModel, error) {
  208. sData := make([]ErmcpUserModel, 0)
  209. e := db.GetEngine()
  210. var sqlId string
  211. var isWskh bool = false
  212. switch queryType {
  213. case 1: //未提交
  214. sqlId = r.buildWskhSql("1")
  215. isWskh = true
  216. case 2: //待审核
  217. sqlId = r.buildWskhSql("2,4,5")
  218. isWskh = true
  219. case 3: //正常
  220. sqlId = r.buildSql("4")
  221. case 4: //已停用
  222. sqlId = r.buildSql("6")
  223. }
  224. s := e.SQL(sqlId)
  225. if err := s.Find(&sData); err != nil {
  226. logger.GetLogger().Errorf("ermcp query fail:%v", err)
  227. return sData, err
  228. }
  229. // 解密
  230. for i := range sData {
  231. sData[i].DecryptField(isWskh)
  232. sData[i].DecodeStausName(queryType)
  233. }
  234. return sData, nil
  235. }