qhjPCWeb.go 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128
  1. /**
  2. * @Author: zou.yingbin
  3. * @Create : 2021/6/24 10:07
  4. * @Modify : 2021/6/24 10:07
  5. */
  6. package models
  7. import (
  8. "fmt"
  9. "mtp2_if/db"
  10. "mtp2_if/mtpcache"
  11. "mtp2_if/utils"
  12. )
  13. // QhjMgrSubArea 子机构列表
  14. type QhjMgrSubArea struct {
  15. PARENTTOPUSER string `json:"parenttopuser" xorm:"PARENTTOPUSER"` // 上级顶级机构 [092=0,1时,默认为1, 092=2时若自已为顶级,则填入自己,自己不为顶级,填入ParentUserID的"ParentTopUser"]
  16. SUBACCOUNTLEVEL int32 `json:"subaccountlevel" xorm:"SUBACCOUNTLEVEL"` // 子账户层数
  17. ROOTUSERID string `json:"rootuserid" xorm:"ROOTUSERID"` // 根用户ID
  18. USERID int64 `json:"userid" xorm:"USERID"` // 用户ID
  19. USERTYPE int32 `json:"usertype" xorm:"USERTYPE"` // 账户类型 - 1:交易所 2:机构 3:会员子机构 4:经纪人 5:投资者 6:客户 7:企业成员(云平台)
  20. ACCOUNTNAME string `json:"accountname" xorm:"ACCOUNTNAME"` // 账户名称(机构名称)
  21. PARENTUSERID int64 `json:"parentuserid" xorm:"PARENTUSERID"` // 所属机构ID
  22. SUBAREALEVELPATH string `json:"subarealevelpath" xorm:"SUBAREALEVELPATH"` // 子机构层级路径(逗号分隔,首尾加逗号)
  23. MEMBERUSERID int64 `json:"memberuserid" xorm:"MEMBERUSERID"` // 所属会员ID
  24. }
  25. func (r *QhjMgrSubArea) calc() {
  26. }
  27. func (r *QhjMgrSubArea) buildSql() string {
  28. var sqlId utils.SQLVal = "select t.userid," +
  29. " t.accountname," +
  30. " t.parentuserid," +
  31. " t.rootuserid," +
  32. " t.memberuserid," +
  33. " t.parenttopuser," +
  34. " t.subarealevelpath," +
  35. " t.subaccountlevel," +
  36. " t.usertype" +
  37. " from useraccount t" +
  38. " where 1 = 1"
  39. sqlId.And("t.usertype", 2)
  40. sqlId.Join(fmt.Sprintf("and t.userid != %v", r.USERID))
  41. sqlId.Join(fmt.Sprintf(" and t.subarealevelpath like ',%%%v%%,'", r.USERID))
  42. return sqlId.String()
  43. }
  44. // GetDataEx 获取子机构列表
  45. func (r *QhjMgrSubArea) GetDataEx() (interface{}, error) {
  46. sData := make([]QhjMgrSubArea, 0)
  47. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  48. for i := range sData {
  49. sData[i].calc()
  50. }
  51. return sData, err
  52. }
  53. // QhjMgrCustomer 客户资料
  54. type QhjMgrCustomer struct {
  55. USERID int64 `json:"userid" xorm:"'USERID'"` // 用户ID
  56. MEMBERUSERID int64 `json:"memberuserid" xorm:"'MEMBERUSERID'"` // 所属机构ID(所属会员)
  57. PARENTUSERID int64 `json:"parentuserid" xorm:"'PARENTUSERID'"` // 上级机构(所属机构)
  58. USERINFOTYPE int32 `json:"userinfotype" xorm:"'USERINFOTYPE'"` // 客户类型 1-个人 2-企业
  59. CUSTOMERNAME string `json:"customername" xorm:"'CUSTOMERNAME'"` // 客户名称
  60. CARDTYPE int32 `json:"cardtype" xorm:"'CARDTYPE'"` // 证件类型
  61. CARDNUM string `json:"cardnum" xorm:"'CARDNUM'"` // 证件号码
  62. MOBILE string `json:"mobile" xorm:"'MOBILE'"` // 手机号码
  63. TELPHONE string `json:"telphone" xorm:"'TELPHONE'"` // 联系电话
  64. ADDRESS string `json:"address" xorm:"'ADDRESS'"` // 通讯地址
  65. REMARK string `json:"remark" xorm:"'REMARK'"` // 备注
  66. STATUS int32 `json:"status" xorm:"'STATUS'"` // 账户状态 - 1:待激活 2:待审核 3:待复审 4:正常 5:审核拒绝 6:注销
  67. STATUSDESC string `json:"statusdesc"` // 账户状态中文描述
  68. ATTACHMENT1 string `json:"attachment1" xorm:"'ATTACHMENT1'"` // 附件1
  69. CARDFRONTPHOTOURL string `json:"cardfrontphotourl" xorm:"'CARDFRONTPHOTOURL'"` // 证件正面图片地址
  70. CARDBACKPHOTOURL string `json:"cardbackphotourl" xorm:"'CARDBACKPHOTOURL'"` // 证件反面图片地址
  71. COUNTRYID int32 `json:"countryid" xorm:"'COUNTRYID'"` // 国家
  72. PROVINCEID int32 `json:"provinceid" xorm:"'PROVINCEID'"` // 省
  73. CITYID int32 `json:"cityid" xorm:"'CITYID'"` // 市
  74. DISTRICTID int32 `json:"districtid" xorm:"'DISTRICTID'"` // 区域
  75. CREATETIME string `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  76. MODIFYTIME string `json:"modifytime" xorm:"'MODIFYTIME'"` // 修改时间
  77. AUDITTIME string `json:"audittime" xorm:"'AUDITTIME'"` // 审核时间
  78. NICKNAME string `json:"nickname" xorm:"'NICKNAME'"` // 昵称
  79. TAXPAYERNUM string `json:"taxpayernum" xorm:"'taxpayernum'"` // 纳税人识别号
  80. LEGALPERSONNAME string `json:"legalpersonname" xorm:"'legalpersonname'"` // 法人姓名(企业)
  81. CONTACTNAME string `json:"contactname" xorm:"'contactname'"` // 联系人
  82. EMAIL string `json:"email" xorm:"'EMAIL'"` // 邮件
  83. USERNAME string `json:"username" xorm:"'USERNAME'"` // 用户名称
  84. LOGINCODE string `json:"logincode" xorm:"'LOGINCODE'"` // 登录账号(代码)
  85. COUNTRYNAME string `json:"countryname"` // 国家名称
  86. CITYNAME string `json:"cityname"` // 城市名称
  87. PROVINCENAME string `json:"provincename"` // 省名称
  88. DISTRICTNAME string `json:"districtname"` // 地区名称
  89. CARDTYPENAME string `json:"cardtypename"` // 证件类型名称
  90. MEMBERUSERNAME string `json:"memberusername"` // 所属会员名称
  91. PARENTUSERNAME string `json:"parentusername"` //所属机构名称
  92. QUERYTYPE int32 `json:"-"` // 查询类型(1:未提交(网上开户表) 2:待审核(网上开户表) 3:正常 4:停用)
  93. IncludeSub int32 `json:"-"` // 包子机构客户 1-包含
  94. }
  95. func (r *QhjMgrCustomer) calc() {
  96. r.MEMBERUSERNAME = mtpcache.GetUserNameByUserId(r.MEMBERUSERID)
  97. if len(r.USERNAME) == 0 {
  98. r.USERNAME = mtpcache.GetUserNameByUserId(r.USERID)
  99. }
  100. r.PARENTUSERNAME = mtpcache.GetUserNameByUserId(r.PARENTUSERID)
  101. r.COUNTRYNAME = mtpcache.GetDivisionName(r.COUNTRYID)
  102. r.CITYNAME = mtpcache.GetDivisionName(r.CITYID)
  103. r.PROVINCENAME = mtpcache.GetDivisionName(r.PROVINCEID)
  104. r.DISTRICTNAME = mtpcache.GetDivisionName(r.DISTRICTID)
  105. switch r.QUERYTYPE {
  106. case 1, 2: // 网上开户表
  107. r.ADDRESS = DecryptField(r.ADDRESS)
  108. r.TELPHONE = DecryptField(r.TELPHONE)
  109. case 3, 4: // 正式表
  110. r.TELPHONE = DecryptField(r.TELPHONE)
  111. }
  112. r.CARDNUM = DecryptField(r.CARDNUM)
  113. r.MOBILE = DecryptField(r.MOBILE)
  114. r.EMAIL = DecryptField(r.EMAIL)
  115. if r.LOGINCODE == "" {
  116. r.LOGINCODE = r.MOBILE
  117. }
  118. }
  119. func (r *QhjMgrCustomer) level() int32 {
  120. if r.IncludeSub > 0 {
  121. // 层级, 最多20层
  122. return 20
  123. }
  124. return 1
  125. }
  126. func (r *QhjMgrCustomer) buildSql() string {
  127. if r.QUERYTYPE == 1 || r.QUERYTYPE == 2 {
  128. return r.buildSqlWskh()
  129. }
  130. return r.buildSqlNormal()
  131. }
  132. func (r *QhjMgrCustomer) buildSqlWskh() string {
  133. var sqlId utils.SQLVal = "select *" +
  134. " from (select t.userid," +
  135. " t.memberareaid MEMBERUSERID," +
  136. " t.USERINFOTYPE," +
  137. " t.username," +
  138. " t.CUSTOMERNAME," +
  139. " t.NICKNAME," +
  140. " t.CARDTYPE," +
  141. " t.CARDNUM," +
  142. " t.mobilephone MOBILE," +
  143. " t.TELPHONE," +
  144. " t.cardaddress ADDRESS," +
  145. " t.REMARK," +
  146. " t.ATTACHMENT1," +
  147. " t.CARDFRONTPHOTOURL," +
  148. " t.CARDBACKPHOTOURL," +
  149. " t.userstate status," +
  150. " t.countryid," +
  151. " t.provinceid," +
  152. " t.districtid," +
  153. " to_char(t.createtime, 'yyyy-mm-dd hh24:mi:ss') createtime," +
  154. " t.cityid," +
  155. " to_char(t.modifiedtime, 'yyyy-mm-dd hh24:mi:ss') modifytime," +
  156. " to_char(t.auditime, 'yyyy-mm-dd hh24:mi:ss') audittime," +
  157. " t.taxpayernum," +
  158. " t.legalpersonname," +
  159. " t.contactname," +
  160. " t.email," +
  161. " t.areaid parentuserid," +
  162. " t.logincode," +
  163. " t.usertype" +
  164. " from wskh_userinfo t" +
  165. " start with t.areaid = %v" +
  166. " connect by prior t.userid = t.areaid" +
  167. " and t.usertype in (2, 6)" +
  168. " and level = %v) a" +
  169. " where 1 = 1" +
  170. " and a.usertype != 2" +
  171. " and a.status in (%v)"
  172. status := DecodeStr(r.QUERYTYPE == 1, "1", "2,4,5")
  173. sqlId.FormatParam(r.USERID, r.level(), status)
  174. sqlId.AndEx("a.USERINFOTYPE", r.USERINFOTYPE, r.USERINFOTYPE > 0)
  175. sqlId.JoinEx(len(r.CUSTOMERNAME) > 0, fmt.Sprintf(` and a.customername like '%%%v%%'`, r.CUSTOMERNAME))
  176. sqlId.JoinEx(len(r.NICKNAME) > 0, fmt.Sprintf(` and a.nickname like '%%%v%%'`, r.NICKNAME))
  177. return sqlId.String()
  178. }
  179. func (r *QhjMgrCustomer) buildSqlNormal() string {
  180. var sqlId utils.SQLVal = "with tmp as" +
  181. " (select t.userid, wm_concat(t.logincode) logincode" +
  182. " from loginaccount t" +
  183. " group by t.userid)" +
  184. "select a.*," +
  185. " k.logincode," +
  186. " u.USERINFOTYPE," +
  187. " u.CUSTOMERNAME," +
  188. " u.NICKNAME," +
  189. " u.CARDTYPEID CARDTYPE," +
  190. " u.CARDNUM," +
  191. " u.MOBILE," +
  192. " u.TELPHONE," +
  193. " u.ADDRESS," +
  194. " u.REMARK," +
  195. " u.ATTACHMENT1," +
  196. " u.CARDFRONTPHOTOURL," +
  197. " u.CARDBACKPHOTOURL," +
  198. " u.countryid," +
  199. " u.provinceid," +
  200. " u.districtid," +
  201. " u.taxpayernum," +
  202. " u.legalpersonname," +
  203. " u.contactname," +
  204. " u.email," +
  205. " u.cityid" +
  206. " from (select t.userid," +
  207. " t.usertype," +
  208. " t.parentuserid," +
  209. " t.memberuserid," +
  210. " t.accountstatus status," +
  211. " to_char(t.createtime, 'yyyy-mm-dd hh24:mi:ss') createtime," +
  212. " to_char(t.modifytime, 'yyyy-mm-dd hh24:mi:ss') modifytime," +
  213. " to_char(t.audittime, 'yyyy-mm-dd hh24:mi:ss') audittime" +
  214. " from useraccount t where 1=1 and t.usertype = 6 %v" +
  215. " ) a" +
  216. " left join tmp k" +
  217. " on a.userid = k.userid" +
  218. " left join userinfo u" +
  219. " on a.userid = u.userid" +
  220. " where 1 = 1"
  221. status := DecodeStr(r.QUERYTYPE == 3, "4", "6")
  222. var sqlParam utils.SQLVal
  223. sqlParam.And("t.accountstatus", status)
  224. if r.IncludeSub == 1 {
  225. sqlParam.Join(fmt.Sprintf(" and t.subarealevelpath like '%%,%v,%%'", r.USERID))
  226. } else {
  227. sqlParam.And("t.parentuserid", r.USERID)
  228. }
  229. sqlId.FormatParam(sqlParam.String())
  230. sqlId.AndEx("u.USERINFOTYPE", r.USERINFOTYPE, r.USERINFOTYPE > 0)
  231. sqlId.JoinEx(len(r.CUSTOMERNAME) > 0, fmt.Sprintf(` and u.customername like '%%%v%%'`, r.CUSTOMERNAME))
  232. sqlId.JoinEx(len(r.NICKNAME) > 0, fmt.Sprintf(` and u.nickname like '%%%v%%'`, r.NICKNAME))
  233. return sqlId.String()
  234. }
  235. // GetDataEx 获取客户资料
  236. func (r *QhjMgrCustomer) GetDataEx() (interface{}, error) {
  237. sData := make([]QhjMgrCustomer, 0)
  238. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  239. for i := range sData {
  240. sData[i].QUERYTYPE = r.QUERYTYPE
  241. sData[i].calc()
  242. }
  243. return sData, err
  244. }
  245. // QhjMgrAccountOutInApply 充值提现(出入金)
  246. type QhjMgrAccountOutInApply struct {
  247. EXECUTETYPE int32 `json:"executetype" xorm:"EXECUTETYPE"` // 申请类型 - 1:出金 2:入金 3: 单边账调整:入金; 4:单边账调整:出金 5:外部母账户调整:入金 6:外部母账户调整:出金 7:外部子账户:入金 8:外部子账户:出金
  248. AMOUNT float64 `json:"amount" xorm:"AMOUNT"` // 金额
  249. CURRENCY string `json:"currency" xorm:"CURRENCY"` // 币种
  250. CHARGE float64 `json:"charge" xorm:"CHARGE"` // 手续费
  251. ACCOUNTPWD string `json:"accountpwd" xorm:"ACCOUNTPWD"` // 资金密码
  252. UPDATETIME string `json:"updatetime" xorm:"UPDATETIME"` // 更新时间(申请时间)
  253. BANKID string `json:"bankid" xorm:"BANKID"` // 银行编号
  254. BRANCHBANKID string `json:"branchbankid" xorm:"BRANCHBANKID"` // 银行支行号
  255. BRANCHBANKNAME string `json:"branchbankname" xorm:"BRANCHBANKNAME"` // 银行支行名称
  256. BANKACCOUNTNO string `json:"bankaccountno" xorm:"BANKACCOUNTNO"` // 银行卡号
  257. BANKACCOUNTNAME string `json:"bankaccountname" xorm:"BANKACCOUNTNAME"` // 银行账户名
  258. EXTENDINFO string `json:"extendinfo" xorm:"EXTENDINFO"` // 扩展信息
  259. AUDITID int64 `json:"auditid" xorm:"AUDITID"` // 审核人
  260. AUDITTIME string `json:"audittime" xorm:"AUDITTIME"` // 审核时间
  261. REMARK string `json:"remark" xorm:"REMARK"` // 备注
  262. NETADDR string `json:"netaddr" xorm:"NETADDR"` // 调转网址
  263. ACCOUNTTICKET string `json:"accountticket" xorm:"ACCOUNTTICKET"` // 最新账户服务流水号
  264. CHECKERRORFLAG int32 `json:"checkerrorflag" xorm:"CHECKERRORFLAG"` // 对账差错标志 - 1:为单边账;其它为正常出入金
  265. REMARK2 string `json:"remark2" xorm:"REMARK2"` // 备注(失败原因)
  266. REAUDITID int64 `json:"reauditid" xorm:"REAUDITID"` // 复审人
  267. REAUDITTIME string `json:"reaudittime" xorm:"REAUDITTIME"` // 复审时间
  268. REAUDITREMARK string `json:"reauditremark" xorm:"REAUDITREMARK"` // 复审备注
  269. APPLYREMARK string `json:"applyremark" xorm:"APPLYREMARK"` // 申请备注
  270. RELATEDORDERID string `json:"relatedorderid" xorm:"RELATEDORDERID"` // 三方关联ID
  271. CAPAMOUNTOUT float64 `json:"capamountout" xorm:"CAPAMOUNTOUT"` // 出金(劣后本金) - 外部子账户
  272. INFAMOUNT float64 `json:"infamount" xorm:"INFAMOUNT"` // 劣后金额(自有)
  273. PRIAMOUNT float64 `json:"priamount" xorm:"PRIAMOUNT"` // 优先金额(授信)
  274. BANK_APPLY_TICKET string `json:"bank_apply_ticket" xorm:"BANK_APPLY_TICKET"` // 银行申请流水
  275. CERTIFICATEPHOTOURL string `json:"certificatephotourl" xorm:"CERTIFICATEPHOTOURL"` // 凭证地址
  276. SOUCREAMOUNT float64 `json:"soucreamount" xorm:"SOUCREAMOUNT"` // 原始出入金金额
  277. SOUCRECURRENCYID int64 `json:"soucrecurrencyid" xorm:"SOUCRECURRENCYID"` // 原始出入金币种
  278. ACCOUNTCODE string `json:"accountcode" xorm:"ACCOUNTCODE"` // 资金账号
  279. CUSBANKID string `json:"cusbankid" xorm:"CUSBANKID"` // 托管银行编号
  280. TRADEDATE string `json:"tradedate" xorm:"TRADEDATE"` // 交易日(yyyyMMdd)
  281. EXCHTICKET string `json:"exchticket" xorm:"EXCHTICKET"` // 银行服务流水号
  282. EXTOPERATEID int64 `json:"extoperateid" xorm:"EXTOPERATEID"` // 交易服务流水号
  283. BANKTICKET string `json:"bankticket" xorm:"BANKTICKET"` // 银行流水
  284. APPLYSTATUS int32 `json:"applystatus" xorm:"APPLYSTATUS"` // 申请状态 - 1:待审核 2:待复审 3:初审拒绝 4:交易冻结中 5:交易解冻中 6:交易解冻扣款中 7:交易入金中 8:交易冻结/解冻/扣款中(银行发起出金时用) 9:银行出金中 10:银行入金中 11:成功 12:失败 13:银行审核中 14:账户服务入金失败; 15:账户服务解冻失败; 16:账户服务解冻扣款失败; 17:账户服务出金失败 18:复审通过 19:复审拒绝 20:提交审核,账户冻结中 21:审核拒绝,账户解冻中;22: 待审核,账户服务解冻回滚中; 23:待复审,账户服务解冻回滚中; 24: 审核通过,账户冻结金额检查中;25: 复审通过,账户冻结金额检查中;
  285. USERID int64 `json:"userid" xorm:"'USERID'"` // 用户id
  286. LOGINCODE string `json:"logincode" xorm:"'LOGINCODE'"` // 登录账号(账号)
  287. USERINFOTYPE int32 `json:"userinfotype" xorm:"'USERINFOTYPE'"` // 账户类型 1-个人 2-企业
  288. ACCOUNTNAME string `json:"accountname" xorm:"'ACCOUNTNAME'"` // 用户名称(名称)
  289. QUERYTYPE int32 `json:"-"` // 查询类型 1-提现 2-充值
  290. STATUS int32 `json:"-"` // 查询状态 1-待审核 2-审核通过 3-审核拒绝
  291. BeginDate string `json:"-"` // 开始日期(yyyymmdd)
  292. EndDate string `json:"-"` // 结束日期(yyyymmdd)
  293. FilterName string `json:"-"` // 账户(模糊匹配)
  294. }
  295. func (r *QhjMgrAccountOutInApply) calc() {
  296. r.BANKACCOUNTNAME = DecryptField(r.BANKACCOUNTNAME)
  297. r.BANKACCOUNTNO = DecryptField(r.BANKACCOUNTNO)
  298. }
  299. func (r *QhjMgrAccountOutInApply) buildSql() string {
  300. var sqlId utils.SQLVal = "with tmp as(select t.userid, wm_concat(t.logincode) logincode from loginaccount t group by t.userid)" +
  301. "SELECT t.EXECUTETYPE," +
  302. " t.AMOUNT," +
  303. " t.CURRENCY," +
  304. " t.CHARGE," +
  305. " t.ACCOUNTPWD," +
  306. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  307. " t.BANKID," +
  308. " t.BRANCHBANKID," +
  309. " t.BRANCHBANKNAME," +
  310. " t.BANKACCOUNTNO," +
  311. " t.BANKACCOUNTNAME," +
  312. " t.EXTENDINFO," +
  313. " t.AUDITID," +
  314. " to_char(t.AUDITTIME, 'yyyy-mm-dd hh24:mi:ss') AUDITTIME," +
  315. " t.REMARK," +
  316. " t.NETADDR," +
  317. " t.ACCOUNTTICKET," +
  318. " t.CHECKERRORFLAG," +
  319. " t.REMARK2," +
  320. " t.REAUDITID," +
  321. " to_char(t.REAUDITTIME, 'yyyy-mm-dd hh24:mi:ss') REAUDITTIME," +
  322. " t.REAUDITREMARK," +
  323. " t.APPLYREMARK," +
  324. " t.RELATEDORDERID," +
  325. " t.CAPAMOUNTOUT," +
  326. " t.INFAMOUNT," +
  327. " t.PRIAMOUNT," +
  328. " t.BANK_APPLY_TICKET," +
  329. " to_char(t.CERTIFICATEPHOTOURL) CERTIFICATEPHOTOURL," +
  330. " t.SOUCREAMOUNT," +
  331. " t.SOUCRECURRENCYID," +
  332. " t.ACCOUNTCODE," +
  333. " t.CUSBANKID," +
  334. " t.TRADEDATE," +
  335. " t.EXCHTICKET," +
  336. " t.EXTOPERATEID," +
  337. " t.BANKTICKET," +
  338. " t.APPLYSTATUS," +
  339. " ta.userid," +
  340. " u.accountname," +
  341. " ui.userinfotype," +
  342. " tmp.logincode" +
  343. " FROM BANK_ACCOUNTOUTINAPPLY t" +
  344. " INNER JOIN TAACCOUNT ta on t.accountcode=to_char(ta.accountid)" +
  345. " INNER JOIN USERACCOUNT u on ta.relateduserid=u.userid" +
  346. " INNER JOIN USERINFO ui on u.userid=ui.userid" +
  347. " LEFT JOIN tmp on u.userid=tmp.userid" +
  348. " WHERE 1 = 1"
  349. sqlId.And("EXECUTETYPE", r.QUERYTYPE)
  350. switch r.STATUS {
  351. case 1:
  352. sqlId.JoinFormat(" and t.APPLYSTATUS in(%v)", InStr(1, 2))
  353. case 2:
  354. sqlId.JoinFormat(" and t.APPLYSTATUS in(%v)", InStr(11, 18, 24, 25))
  355. case 3:
  356. sqlId.JoinFormat(" and t.APPLYSTATUS in(%v)", InStr(3, 12, 21))
  357. }
  358. if len(r.BeginDate) > 0 {
  359. sqlId.Join(fmt.Sprintf(" and t.TRADEDATE >= %v", r.BeginDate))
  360. }
  361. if len(r.EndDate) > 0 {
  362. sqlId.Join(fmt.Sprintf(" and t.TRADEDATE <= %v", r.EndDate))
  363. }
  364. if len(r.FilterName) > 0 {
  365. sqlId.Join(fmt.Sprintf(" and (tmp.logincode like '%%%v%%' or u.accountname like '%%%v%%')", r.FilterName, r.FilterName))
  366. }
  367. return sqlId.String()
  368. }
  369. // GetDataEx 获取充值提现(出入金)
  370. func (r *QhjMgrAccountOutInApply) GetDataEx() (interface{}, error) {
  371. sData := make([]QhjMgrAccountOutInApply, 0)
  372. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  373. for i := range sData {
  374. sData[i].calc()
  375. }
  376. return sData, err
  377. }
  378. // QhjTradeEx 额外的用户和商品信息
  379. type QhjTradeEx struct {
  380. LOGINCODE string `json:"logincode" xorm:"'LOGINCODE'"` // 登录代码(账户)
  381. USERID int64 `json:"userid" xorm:"'USERID'"` // 用户id
  382. ACCOUNTNAME string `json:"accountname" xorm:"'ACCOUNTNAME'"` // 用户名称
  383. ENUMDICNAME string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 单位名称(商品)
  384. GOODSCODE string `json:"goodscode" xorm:"GOODSCODE"` // 商品代码(内部)
  385. GOODSNAME string `json:"goodsname" xorm:"GOODSNAME"` // 商品名称
  386. GOODUNITID int32 `json:"goodunitid" xorm:"GOODUNITID"` // 报价单位ID
  387. AGREEUNIT float64 `json:"agreeunit" xorm:"AGREEUNIT"` // 合约乘数
  388. DECIMALPLACE int32 `json:"decimalplace" xorm:"DECIMALPLACE"` // 报价小数位
  389. QTYDECIMALPLACE int32 `json:"qtydecimalplace" xorm:"QTYDECIMALPLACE"` // 成交量小数位
  390. USERINFOTYPE int32 `json:"userinfotype" xorm:"'USERINFOTYPE'"` // 账户类型 1-个人 2-企业
  391. MOBILE string `json:"-" xorm:"'MOBILE'"` // 手机号码
  392. MARKETID int32 `json:"marketid" xorm:"'MARKETID'"` // 市场id
  393. TRADEMODE int32 `json:"trademode" xorm:"'TRADEMODE'"` // 交易模式
  394. }
  395. func (r *QhjTradeEx) dealConvert() {
  396. if r.LOGINCODE == "" {
  397. r.LOGINCODE = DecryptField(r.MOBILE)
  398. }
  399. }
  400. // QhjMgrPositionRsp 持仓汇总
  401. type QhjMgrPositionRsp struct {
  402. QhjTradeEx `xorm:"extends"`
  403. ACCOUNTID int64 `json:"accountid"` // 账号Id
  404. GOODSID int32 `json:"goodsid"` // 商品Id
  405. HOLDERTYPE int32 `json:"holdertype"` // 持仓类别 - 1:单边持仓 2:双边持仓
  406. HOLDERQTY float64 `json:"holderqty"` // 持有数量
  407. FROZENQTY float64 `json:"frozenqty"` // 冻结数量
  408. AVIALQTY float64 `json:"avialqty"` // 可用数量
  409. HOLDERAMOUNT float64 `json:"holderamount"` // 金额
  410. AVERAGEPRICE float64 `json:"averageprice"` // 均价
  411. }
  412. // QhjMgrTradePosition 持仓汇总
  413. type QhjMgrTradePosition struct {
  414. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 账号Id
  415. GOODSID int32 `json:"goodsid" xorm:"GOODSID"` // 商品Id
  416. HOLDERTYPE int32 `json:"holdertype" xorm:"HOLDERTYPE"` // 持仓类别 - 1:单边持仓 2:双边持仓
  417. BUYPOSITIONQTY float64 `json:"buypositionqty" xorm:"BUYPOSITIONQTY"` // 买期初持仓数量
  418. BUYHOLDERAMOUNT float64 `json:"buyholderamount" xorm:"BUYHOLDERAMOUNT"` // 买期初持仓总金额[商品币种]
  419. BUYCURPOSITIONQTY float64 `json:"buycurpositionqty" xorm:"BUYCURPOSITIONQTY"` // 买当前持仓总数量
  420. BUYCURHOLDERAMOUNT float64 `json:"buycurholderamount" xorm:"BUYCURHOLDERAMOUNT"` // 买当前持仓总金额[商品币种]
  421. BUYFROZENQTY float64 `json:"buyfrozenqty" xorm:"BUYFROZENQTY"` // 买持仓冻结数量
  422. BUYOTHERFROZENQTY float64 `json:"buyotherfrozenqty" xorm:"BUYOTHERFROZENQTY"` // 买持仓其他冻结数量(交割冻结)
  423. BUYOPENREQQTY float64 `json:"buyopenreqqty" xorm:"BUYOPENREQQTY"` // 买开仓申请数量(用于比较最大持仓数量)
  424. BUYOPENTOTALQTY float64 `json:"buyopentotalqty" xorm:"BUYOPENTOTALQTY"` // 今日买开仓总数量
  425. BUYCLOSETOTALQTY float64 `json:"buyclosetotalqty" xorm:"BUYCLOSETOTALQTY"` // 今日买平仓总数量
  426. SELLPOSITIONQTY float64 `json:"sellpositionqty" xorm:"SELLPOSITIONQTY"` // 卖期初持仓数量
  427. SELLHOLDERAMOUNT float64 `json:"sellholderamount" xorm:"SELLHOLDERAMOUNT"` // 卖期初持仓总金额[商品币种]
  428. SELLCURPOSITIONQTY float64 `json:"sellcurpositionqty" xorm:"SELLCURPOSITIONQTY"` // 卖当前持仓数量
  429. SELLCURHOLDERAMOUNT float64 `json:"sellcurholderamount" xorm:"SELLCURHOLDERAMOUNT"` // 卖当前持仓总金额[商品币种]
  430. SELLFROZENQTY float64 `json:"sellfrozenqty" xorm:"SELLFROZENQTY"` // 卖持仓冻结
  431. SELLOTHERFROZENQTY float64 `json:"sellotherfrozenqty" xorm:"SELLOTHERFROZENQTY"` // 卖持仓其他冻结(交割冻结)
  432. SELLOPENREQQTY float64 `json:"sellopenreqqty" xorm:"SELLOPENREQQTY"` // 卖开仓申请数量(用于比较最大持仓数量)
  433. SELLOPENTOTALQTY float64 `json:"sellopentotalqty" xorm:"SELLOPENTOTALQTY"` // 今日卖开仓总数量
  434. SELLCLOSETOTALQTY float64 `json:"sellclosetotalqty" xorm:"SELLCLOSETOTALQTY"` // 今日卖平仓总数量
  435. USEDMARGIN float64 `json:"usedmargin" xorm:"USEDMARGIN"` // 占用保证金[商品币种]
  436. TRADEPROPERTY int32 `json:"tradeproperty" xorm:"TRADEPROPERTY"` // 交易属性
  437. BUYTNQTY float64 `json:"buytnqty" xorm:"BUYTNQTY"` // 买T+N冻结总量
  438. BUYTNUSEDQTY float64 `json:"buytnusedqty" xorm:"BUYTNUSEDQTY"` // 买T+N使用量(可以使用T+N的冻结数量)
  439. SELLTNQTY float64 `json:"selltnqty" xorm:"SELLTNQTY"` // 卖T+N冻结总量
  440. SELLTNUSEDQTY float64 `json:"selltnusedqty" xorm:"SELLTNUSEDQTY"` // 卖T+N使用量(可以使用T+N的冻结数量)
  441. BUYCURTDPOSITION float64 `json:"buycurtdposition" xorm:"BUYCURTDPOSITION"` // 买期末今日头寸
  442. BUYFRETDPOSITION float64 `json:"buyfretdposition" xorm:"BUYFRETDPOSITION"` // 买冻结今日头寸
  443. SELLCURTDPOSITION float64 `json:"sellcurtdposition" xorm:"SELLCURTDPOSITION"` // 卖期末今日头寸
  444. SELLFRETDPOSITION float64 `json:"sellfretdposition" xorm:"SELLFRETDPOSITION"` // 卖冻结今日头寸
  445. QhjTradeEx `xorm:"extends"`
  446. IncludeSub int32 `json:"-"` // 是否包含子级 1-包含
  447. FilterName string `json:"-"` // 模糊搜索
  448. }
  449. func (r *QhjMgrTradePosition) calc() {
  450. r.dealConvert()
  451. }
  452. func (r *QhjMgrTradePosition) buildSql() string {
  453. var sqlId utils.SQLVal = "with k as" +
  454. " (select t.userid, wm_concat(t.logincode) logincode" +
  455. " from loginaccount t" +
  456. " group by t.userid)" +
  457. "select u.userid," +
  458. " u.accountname," +
  459. " k.logincode," +
  460. " u.subarealevelpath," +
  461. " ui.userinfotype," +
  462. " ui.mobile," +
  463. " g.goodsname," +
  464. " g.goodscode," +
  465. " g.goodunitid," +
  466. " g.qtydecimalplace," +
  467. " g.decimalplace," +
  468. " g.agreeunit," +
  469. " m.marketid," +
  470. " m.trademode," +
  471. " e.enumdicname," +
  472. " t.*" +
  473. " from tradeposition t" +
  474. " inner join taaccount ta" +
  475. " on t.accountid = ta.accountid" +
  476. " inner join useraccount u" +
  477. " on ta.relateduserid = u.userid" +
  478. " inner join userinfo ui" +
  479. " on u.userid = ui.userid" +
  480. " left join k" +
  481. " on u.userid = k.userid" +
  482. " left join goods g" +
  483. " on t.goodsid = g.goodsid" +
  484. " left join market m on g.marketid=m.marketid" +
  485. " left join enumdicitem e" +
  486. " on e.enumitemname = g.goodunitid" +
  487. " and e.enumdiccode = 'goodsunit'" +
  488. " where 1 = 1"
  489. if r.IncludeSub == 1 {
  490. sqlId.JoinFormat(" and u.subarealevelpath like '%%,%v,%%'", r.USERID)
  491. } else {
  492. sqlId.And("u.parentuserid", r.USERID)
  493. }
  494. sqlId.AndEx("ui.USERINFOTYPE", r.USERINFOTYPE, r.USERINFOTYPE > 0)
  495. sqlId.AndEx("m.TRADEMODE", r.TRADEMODE, r.TRADEMODE > 0)
  496. sqlId.AndEx("t.goodsid", r.GOODSID, r.GOODSID > 0)
  497. if len(r.FilterName) > 0 {
  498. sqlId.JoinFormat(" and (k.logincode like '%%%v%%' or u.accountname like '%%%v%%')", r.FilterName, r.FilterName)
  499. }
  500. return sqlId.String()
  501. }
  502. // GetDataEx 获取持仓汇总
  503. func (r *QhjMgrTradePosition) GetDataEx() (interface{}, error) {
  504. sData := make([]QhjMgrTradePosition, 0)
  505. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  506. sData2 := make([]QhjMgrPositionRsp, 0)
  507. for i := range sData {
  508. sData[i].calc()
  509. v := QhjMgrPositionRsp{QhjTradeEx: sData[i].QhjTradeEx}
  510. v.GOODSID = sData[i].GOODSID
  511. v.ACCOUNTID, v.HOLDERTYPE = sData[i].ACCOUNTID, sData[i].HOLDERTYPE
  512. v.HOLDERAMOUNT = sData[i].BUYCURHOLDERAMOUNT
  513. v.HOLDERQTY = sData[i].BUYCURPOSITIONQTY
  514. v.FROZENQTY = sData[i].BUYFROZENQTY
  515. v.AVIALQTY = v.HOLDERQTY - v.FROZENQTY
  516. zoomFun := NewZoomFun(int(v.QTYDECIMALPLACE))
  517. zoomFun(&v.HOLDERQTY, &v.FROZENQTY, &v.AVIALQTY)
  518. if v.HOLDERQTY > 1e-10 {
  519. v.AVERAGEPRICE = v.HOLDERAMOUNT / v.HOLDERQTY
  520. }
  521. sData2 = append(sData2, v)
  522. }
  523. return sData2, err
  524. }
  525. // QhjMgrTradeDetailRsp
  526. type QhjMgrTradeDetailRsp struct {
  527. TRADEID string `json:"tradeid"` // 成交单号
  528. GOODSID int32 `json:"goodsid"` // 商品id
  529. BUYORSELL int32 `json:"buyorsell"` // 成交类型(方向) 0:买 1:卖
  530. ORDERID string `json:"orderid"` // 关联委托单号
  531. TRADEDATE string `json:"tradedate"` // 交易日
  532. ACCOUNTID int64 `json:"accountid"` // 资金账号
  533. TRADETIME string `json:"tradetime"` // 成交时间
  534. TRADEPRICE float64 `json:"tradeprice"` // 价格
  535. TRADEQTY float64 `json:"tradeqty"` // 数量
  536. TRADEAMOUNT float64 `json:"tradeamount"` // 金额
  537. QhjTradeEx `xorm:"extends"`
  538. }
  539. // QhjMgrTradeDetail 成交明细
  540. type QhjMgrTradeDetail struct {
  541. TRADEID string `json:"tradeid" xorm:"TRADEID2"` // 成交单号(101+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  542. BUYORSELL int32 `json:"buyorsell" xorm:"BUYORSELL"` // 方向 - 0:买 1:卖
  543. ORDERID string `json:"orderid" xorm:"ORDERID2"` // 委托单号
  544. TRADEDATE string `json:"tradedate" xorm:"TRADEDATE"` // 交易日(yyyyMMdd)
  545. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 账户ID[报价币种]
  546. GOODSID int32 `json:"goodsid" xorm:"GOODSID"` // 商品ID
  547. MEMBERUSERID int64 `json:"memberuserid" xorm:"MEMBERUSERID"` // 会员id 个人投资者 需要填写
  548. MATCHACCOUNTID int64 `json:"matchaccountid" xorm:"MATCHACCOUNTID"` // 对手账号id
  549. TRADETIME string `json:"tradetime" xorm:"TRADETIME2"` // 成交时间
  550. TRADEPRICE float64 `json:"tradeprice" xorm:"TRADEPRICE"` // 成交价格
  551. TRADEQTY float64 `json:"tradeqty" xorm:"TRADEQTY"` // 成交数量
  552. TRADEAMOUNT float64 `json:"tradeamount" xorm:"TRADEAMOUNT"` // 成交金额[账户币种,用于所有权]
  553. CLOSEPL float64 `json:"closepl" xorm:"CLOSEPL"` // 平仓盈亏
  554. INTCLOSEPL int64 `json:"intclosepl" xorm:"INTCLOSEPL"` // 整型盈亏(用于交易结算试算平衡-收益权)
  555. OPENCHARGE float64 `json:"opencharge" xorm:"OPENCHARGE"` // 建仓手续费(支付总手续费=(交易所比率+会员比率)*成交金额)
  556. CLOSECHARGE float64 `json:"closecharge" xorm:"CLOSECHARGE"` // 平仓手续费(支付总手续费=(交易所比率+会员比率)*成交金额)
  557. TRADETYPE int32 `json:"tradetype" xorm:"TRADETYPE"` // 成交类别 - 1:正常委托成交 2:定向做市成交(接单) 3:交割协议平仓成交 4:交割减仓成交 5:到期强平成交 6:风控斩仓成交 7:协议平仓(管理端)成交 8:仓单转持仓成交 9: 交割协议转让成交 10:受托竞价成交(接单) 11:协议转让成交 12:系统强行平仓 13:期权违约平仓
  558. BUILDTYPE int32 `json:"buildtype" xorm:"BUILDTYPE"` // 委托单据类型 1:建仓 2:平仓 3:先平后建
  559. OPENQTY float64 `json:"openqty" xorm:"OPENQTY"` // 开仓数量(先建后平操作 需要记录)
  560. CLOSEQTY float64 `json:"closeqty" xorm:"CLOSEQTY"` // 平仓数量(先建后平操作 需要记录)
  561. STATUS int32 `json:"status" xorm:"STATUS"` // 处理状态 - 1:待处理 2:已处理 3:处理失败
  562. ISRECKONED int32 `json:"isreckoned" xorm:"ISRECKONED"` // 是否结算 - 0:未结算 1:已结算
  563. TRADEPROPERTY int32 `json:"tradeproperty" xorm:"TRADEPROPERTY"` // 交易属性
  564. OPENFEEALGORITHM int32 `json:"openfeealgorithm" xorm:"OPENFEEALGORITHM"` // 建仓手续费收取方式 1:比率 2:固定
  565. OPENMEMBERCHARGEVALUE float64 `json:"openmemberchargevalue" xorm:"OPENMEMBERCHARGEVALUE"` // 建仓会员手续费设置值
  566. OPENEXCHAGECHARGEVALUE float64 `json:"openexchagechargevalue" xorm:"OPENEXCHAGECHARGEVALUE"` // 建仓交易所手续费设置值
  567. CLOSEFEEALGORITHM int32 `json:"closefeealgorithm" xorm:"CLOSEFEEALGORITHM"` // 平仓手续费收取方式 1:比率 2:固定
  568. CLOSEMEMBERCHARGEVALUE float64 `json:"closememberchargevalue" xorm:"CLOSEMEMBERCHARGEVALUE"` // 平仓会员手续费设置值
  569. CLOSEEXCHAGECHARGEVALUE float64 `json:"closeexchagechargevalue" xorm:"CLOSEEXCHAGECHARGEVALUE"` // 平仓交易所手续费设置值
  570. OPTIONTYPE int32 `json:"optiontype" xorm:"OPTIONTYPE"` // 期权类型 - 1:认购(看涨) 2:认沽(看跌)
  571. PREMIUM float64 `json:"premium" xorm:"PREMIUM"` // 权利金 - [持仓单的权利金]
  572. ISPREEXERCISE int32 `json:"ispreexercise" xorm:"ISPREEXERCISE"` // 是否预申报- 0:否 1:是
  573. PREEXERCISEPRICE float64 `json:"preexerciseprice" xorm:"PREEXERCISEPRICE"` // 预申报价格
  574. ISCONFIRMEXERCISE int32 `json:"isconfirmexercise" xorm:"ISCONFIRMEXERCISE"` // 是否确认行权- 0:否 1:是
  575. ISMAIN int32 `json:"ismain" xorm:"ISMAIN"` // 是否主单 - 0:不是 1:是
  576. PERFORMANCEPLANID int64 `json:"performanceplanid" xorm:"PERFORMANCEPLANID"` // 履约计划ID[期权]
  577. PERFORMANCESTATUS int32 `json:"performancestatus" xorm:"PERFORMANCESTATUS"` // 履约状态[期权] - 0:无履约 1:未履约 2:履约中 3:履约完成
  578. CREDITAMOUNT float64 `json:"creditamount" xorm:"CREDITAMOUNT"` // 授信金额
  579. GCACCOUNTID int64 `json:"gcaccountid" xorm:"GCACCOUNTID"` // 账户ID[合约币种]
  580. CLOSEPL2 float64 `json:"closepl2" xorm:"CLOSEPL2"` // 平仓盈亏[逐笔]
  581. RELATEDOUTTRADEID int64 `json:"relatedouttradeid" xorm:"RELATEDOUTTRADEID"` // 关联外部成交单ID
  582. QhjTradeEx `xorm:"extends"`
  583. IncludeSub int32 `json:"-"` // 是否包含子级 1-包含
  584. BeginDate string `json:"-"` // 开始交易日
  585. EndDate string `json:"-"` // 结束交易日
  586. FilterName string `json:"-"` // 模糊搜索
  587. }
  588. func (r *QhjMgrTradeDetail) calc() {
  589. r.dealConvert()
  590. }
  591. func (r *QhjMgrTradeDetail) buildSql(bQueryHis bool) string {
  592. var sqlId utils.SQLVal = "with k as" +
  593. " (select t.userid, wm_concat(t.logincode) logincode" +
  594. " from loginaccount t" +
  595. " group by t.userid)" +
  596. "select u.userid," +
  597. " u.accountname," +
  598. " k.logincode," +
  599. " u.subarealevelpath," +
  600. " ui.userinfotype," +
  601. " ui.mobile," +
  602. " g.goodsname," +
  603. " g.goodscode," +
  604. " g.goodunitid," +
  605. " g.qtydecimalplace," +
  606. " g.decimalplace," +
  607. " g.agreeunit," +
  608. " m.marketid," +
  609. " m.trademode," +
  610. " e.enumdicname," +
  611. " to_char(t.TRADEID) TRADEID2," +
  612. " to_char(t.ORDERID) ORDERID2," +
  613. " to_char(t.TRADETIME, 'yyyy-mm-dd hh24:mi:ss') TRADETIME2," +
  614. " t.*" +
  615. " from %v t" +
  616. " inner join taaccount ta" +
  617. " on t.accountid = ta.accountid" +
  618. " inner join useraccount u" +
  619. " on ta.relateduserid = u.userid" +
  620. " inner join userinfo ui" +
  621. " on u.userid = ui.userid" +
  622. " left join k" +
  623. " on u.userid = k.userid" +
  624. " left join goods g" +
  625. " on t.goodsid = g.goodsid" +
  626. " left join market m on g.marketid=m.marketid" +
  627. " left join enumdicitem e" +
  628. " on e.enumitemname = g.goodunitid" +
  629. " and e.enumdiccode = 'goodsunit'" +
  630. " where 1 = 1"
  631. if bQueryHis {
  632. sqlId.FormatParam("his_trade_tradedetail")
  633. sqlId.And("t.isvaliddata", 1)
  634. } else {
  635. sqlId.FormatParam("trade_tradedetail")
  636. }
  637. if r.IncludeSub == 1 {
  638. sqlId.JoinFormat(" and u.subarealevelpath like '%%,%v,%%'", r.USERID)
  639. } else {
  640. sqlId.And("u.parentuserid", r.USERID)
  641. }
  642. sqlId.AndEx("ui.USERINFOTYPE", r.USERINFOTYPE, r.USERINFOTYPE > 0)
  643. sqlId.AndEx("m.TRADEMODE", r.TRADEMODE, r.TRADEMODE > 0)
  644. sqlId.AndEx("t.goodsid", r.GOODSID, r.GOODSID > 0)
  645. if len(r.BeginDate) > 0 {
  646. sqlId.JoinFormat(" and t.TRADEDATE >=%v", r.BeginDate)
  647. }
  648. if len(r.EndDate) > 0 {
  649. sqlId.JoinFormat(" and t.TRADEDATE <=%v", r.EndDate)
  650. }
  651. if len(r.FilterName) > 0 {
  652. sqlId.JoinFormat(" and (k.logincode like '%%%v%%' or u.accountname like '%%%v%%')", r.FilterName, r.FilterName)
  653. }
  654. return sqlId.String()
  655. }
  656. // GetDataEx 获取成交明细
  657. func (r *QhjMgrTradeDetail) GetDataEx() (interface{}, error) {
  658. sData := make([]QhjMgrTradeDetail, 0)
  659. sCurData := make([]QhjMgrTradeDetail, 0)
  660. err := db.GetEngine().SQL(r.buildSql(false)).Find(&sCurData)
  661. sHisData := make([]QhjMgrTradeDetail, 0)
  662. err = db.GetEngine().SQL(r.buildSql(true)).Find(&sHisData)
  663. sData2 := make([]QhjMgrTradeDetailRsp, 0)
  664. sData = append(sData, sCurData...)
  665. sData = append(sData, sHisData...)
  666. for i := range sData {
  667. sData[i].calc()
  668. v := QhjMgrTradeDetailRsp{QhjTradeEx: sData[i].QhjTradeEx}
  669. v.ACCOUNTID, v.TRADEID = sData[i].ACCOUNTID, sData[i].TRADEID
  670. v.TRADEAMOUNT, v.TRADEQTY = sData[i].TRADEAMOUNT, sData[i].TRADEQTY
  671. v.TRADEDATE, v.TRADETIME = sData[i].TRADEDATE, sData[i].TRADETIME
  672. v.GOODSID, v.ORDERID = sData[i].GOODSID, sData[i].ORDERID
  673. zoonFun := NewZoomFun(int(v.QTYDECIMALPLACE))
  674. zoonFun(&v.TRADEQTY)
  675. sData2 = append(sData2, v)
  676. }
  677. return sData2, err
  678. }
  679. // QhjMgrTradeOrderDetailRsp 委托明细(给终端)
  680. type QhjMgrTradeOrderDetailRsp struct {
  681. GOODSID int32 `json:"goodsid"` // 商品id
  682. ORDERID string `json:"orderid"` // 关联委托单号
  683. TRADEDATE string `json:"tradedate"` // 交易日
  684. ACCOUNTID int64 `json:"accountid"` // 资金账号
  685. ORDERTIME string `json:"ordertime"` // 委托时间
  686. ORDERPRICE float64 `json:"orderprice"` // 价格
  687. ORDERQTY float64 `json:"orderqty"` // 数量
  688. AMOUNT float64 `json:"amount"` // 金额
  689. QhjTradeEx `xorm:"extends"`
  690. }
  691. // QhjMgrTradeOrderDetail 委托明细
  692. type QhjMgrTradeOrderDetail struct {
  693. CLOSEMEMBERCHARGEVALUE float64 `json:"closememberchargevalue" xorm:"CLOSEMEMBERCHARGEVALUE"` // 平仓会员手续费设置值
  694. CLOSEEXCHAGECHARGEVALUE float64 `json:"closeexchagechargevalue" xorm:"CLOSEEXCHAGECHARGEVALUE"` // 平仓交易所手续费设置值
  695. OPTIONTYPE int32 `json:"optiontype" xorm:"OPTIONTYPE"` // 期权类型 - 1:认购(看涨) 2:认沽(看跌)
  696. PREMIUM float64 `json:"premium" xorm:"PREMIUM"` // 权利金
  697. ISPREEXERCISE int32 `json:"ispreexercise" xorm:"ISPREEXERCISE"` // 是否预申报- 0:否 1:是
  698. PREEXERCISEPRICE float64 `json:"preexerciseprice" xorm:"PREEXERCISEPRICE"` // 预申报价格
  699. ISCONFIRMEXERCISE int32 `json:"isconfirmexercise" xorm:"ISCONFIRMEXERCISE"` // 是否确认行权- 0:否 1:是
  700. QUOTEID int64 `json:"quoteid" xorm:"QUOTEID"` // 报价单ID
  701. GCACCOUNTID int64 `json:"gcaccountid" xorm:"GCACCOUNTID"` // 账户ID[合约币种]
  702. SESSIONID int64 `json:"sessionid" xorm:"SESSIONID"` // 会话ID
  703. FREEZEQTY float64 `json:"freezeqty" xorm:"FREEZEQTY"` // 冻结数量
  704. AMOUNTFLAG int32 `json:"amountflag" xorm:"AMOUNTFLAG"` // 资金标识 - 1:余额 2;待付
  705. ORDERFLAG int32 `json:"orderflag" xorm:"ORDERFLAG"` // 委托标识 - 1:按量 2:按金额
  706. ORDERID string `json:"orderid" xorm:"ORDERID2"` // 委托单号(100+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  707. TRADEDATE string `json:"tradedate" xorm:"TRADEDATE"` // 交易日(yyyyMMdd)
  708. BUILDTYPE int32 `json:"buildtype" xorm:"BUILDTYPE"` // 委托单据类型 - 1:建仓 2:平仓 3:先平后建
  709. PREORDERID string `json:"preorderid" xorm:"PREORDERID"` // 关联预埋单号(止盈止损单时填写)
  710. CANCELORDERID int64 `json:"cancelorderid" xorm:"CANCELORDERID"` // 撤单单号(撤单时填写)
  711. RELATEDID string `json:"relatedid" xorm:"RELATEDID"` // 关联单号(交割单)
  712. MARKETID int32 `json:"marketid" xorm:"MARKETID"` // 市场ID
  713. GOODSID int32 `json:"goodsid" xorm:"GOODSID"` // 商品ID
  714. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 账户ID[报价币种]
  715. MEMBERUSERID int64 `json:"memberuserid" xorm:"MEMBERUSERID"` // 所属会员UserID
  716. BUYORSELL int32 `json:"buyorsell" xorm:"BUYORSELL"` // 买卖 - 0:买 1:卖
  717. PRICEMODE int32 `json:"pricemode" xorm:"PRICEMODE"` // 取价方式 - 1:市价 2: 限价
  718. ORDERPRICE float64 `json:"orderprice" xorm:"ORDERPRICE"` // 委托价格
  719. MARKETMAXSUB float64 `json:"marketmaxsub" xorm:"MARKETMAXSUB"` // 市价最大偏移范围
  720. ORDERQTY float64 `json:"orderqty" xorm:"ORDERQTY"` // 委托数量
  721. TRADEQTY float64 `json:"tradeqty" xorm:"TRADEQTY"` // 成交数量
  722. CANCELQTY float64 `json:"cancelqty" xorm:"CANCELQTY"` // 撤单数量
  723. OPENQTY float64 `json:"openqty" xorm:"OPENQTY"` // 开仓数量(先建后平操作,需要记录)
  724. CLOSEQTY float64 `json:"closeqty" xorm:"CLOSEQTY"` // 平仓数量(先建后平操作 需要记录)
  725. OPENTRADEQTY float64 `json:"opentradeqty" xorm:"OPENTRADEQTY"` // 开仓成交数量(先建后平操作,需要记录)
  726. CLOSETRADEQTY float64 `json:"closetradeqty" xorm:"CLOSETRADEQTY"` // 平仓成交数量(先建后平操作,需要记录)
  727. FREEZEMARGIN float64 `json:"freezemargin" xorm:"FREEZEMARGIN"` // 冻结保证金(冻结交易金额)
  728. UNFREEZEMARGIN float64 `json:"unfreezemargin" xorm:"UNFREEZEMARGIN"` // 解冻保证金
  729. FREEZECHARGE float64 `json:"freezecharge" xorm:"FREEZECHARGE"` // 冻结手续费
  730. UNFREEZECHARGE float64 `json:"unfreezecharge" xorm:"UNFREEZECHARGE"` // 解冻手续费
  731. OPENFREEZECHARGE float64 `json:"openfreezecharge" xorm:"OPENFREEZECHARGE"` // 开仓冻结手续费(先建后平操作,需要记录)
  732. CLOSEFREEZECHARGE float64 `json:"closefreezecharge" xorm:"CLOSEFREEZECHARGE"` // 平仓冻结手续费(先建后平操作,需要记录)
  733. OPENUNFREEZECHARGE float64 `json:"openunfreezecharge" xorm:"OPENUNFREEZECHARGE"` // 开仓解冻手续费(先建后平操作,需要记录)
  734. CLOSEUNFREEZECHARGE float64 `json:"closeunfreezecharge" xorm:"CLOSEUNFREEZECHARGE"` // 平仓解冻手续费(先建后平操作,需要记录)
  735. VALIDTYPE int32 `json:"validtype" xorm:"VALIDTYPE"` // 有效类型 - 1当日有效 2本周有效 3指定日期有效 4一直有效 5指定时间有效
  736. VALIDTIME string `json:"validtime" xorm:"VALIDTIME"` // 有效期限
  737. VOLUMETYPE int32 `json:"volumetype" xorm:"VOLUMETYPE"` // 当时间有效类型为 “立即执行否则取消 IOC” 时,需要此项 - 0:任意量 1:最小量(暂时不支持) 2:全部量
  738. OPERATETYPE int32 `json:"operatetype" xorm:"OPERATETYPE"` // 操作类型 - 1:正常下单 2:斩仓 3:转单 4:结算撤单 5:系统卖出(适用于先平后建的卖出) 6:行情源报价 7:(结算)到期强平 8:(结算)协议转让 9:系统对冲单 10:(结算)到期无效 11:交割协议转让 12:交割协议平仓 13:交割成交(所有权) 14:管理端强行平仓 15:管理端协议转让 ... 23:融资买入
  739. ORDERTIME string `json:"ordertime" xorm:"ORDERTIME"` // 委托时间
  740. ORDERSRC int32 `json:"ordersrc" xorm:"ORDERSRC"` // 委托来源 - 1:客户端 2:管理端 3:风控服务 4:交割服务 5:交易服务 6:交易日结 7:商品强平 8:管理端商品退市强平 9:交易接口 10:交割服务商被动(受托竞价) 11:预埋触发
  741. ORDERSTATUS int32 `json:"orderstatus" xorm:"ORDERSTATUS"` // 委托状态 - 1: 委托请求 2:待冻结 3:委托成功 4: 委托失败 5:配对成功 6: 已撤销 7:部分成交 8:已成交 9:部成部撤 10:成交失败 11:已拒绝 12:经过摘牌(先摘后挂专用-先摘后挂已摘过) 13:冻结成功(通道交易专用) 14:通道已撤 15:通道部成部撤 16:成交失败违约(荷兰式竞拍专用)
  742. OPERATORID int64 `json:"operatorid" xorm:"OPERATORID"` // 登录账号(LoginID)
  743. UPDATETIME string `json:"updatetime" xorm:"UPDATETIME"` // 更新时间
  744. CLIENTORDERTIME string `json:"clientordertime" xorm:"CLIENTORDERTIME"` // 客户端委托时间
  745. CLIENTTICKET string `json:"clientticket" xorm:"CLIENTTICKET"` // 客户端流水号
  746. UUID string `json:"uuid" xorm:"UUID"` // 发起端唯一id
  747. CLIENTTYPE int32 `json:"clienttype" xorm:"CLIENTTYPE"` // 客户端类型 - 0:保留为未填终端类型 1:PC管理端 2:PC交易端 3:手机客户端_安卓 4:网页客户端 5:微信客户端 6:手机客户端_苹果 7:网上开户客户端 8:无效终端编号 9:报价终端(中江)
  748. RETCODE int32 `json:"retcode" xorm:"RETCODE"` // 错误代码
  749. TRADEPROPERTY int32 `json:"tradeproperty" xorm:"TRADEPROPERTY"` // 交易属性
  750. LISTINGSELECTTYPE int32 `json:"listingselecttype" xorm:"LISTINGSELECTTYPE"` // 挂牌点选类型 - 1:挂牌 2:摘牌 3:先摘后挂
  751. DELISTINGTYPE int32 `json:"delistingtype" xorm:"DELISTINGTYPE"` // 摘牌类型 - 1:价格最优 2:点选成交
  752. MARGINALGORITHM int32 `json:"marginalgorithm" xorm:"MARGINALGORITHM"` // 保证金收取方式 1:比率 2:固定
  753. MARGINVALUE float64 `json:"marginvalue" xorm:"MARGINVALUE"` // 即市保证金设置值
  754. OPENFEEALGORITHM int32 `json:"openfeealgorithm" xorm:"OPENFEEALGORITHM"` // 建仓手续费收取方式 1:比率 2:固定
  755. OPENMEMBERCHARGEVALUE float64 `json:"openmemberchargevalue" xorm:"OPENMEMBERCHARGEVALUE"` // 建仓会员手续费设置值
  756. OPENEXCHAGECHARGEVALUE float64 `json:"openexchagechargevalue" xorm:"OPENEXCHAGECHARGEVALUE"` // 建仓交易所手续费设置值
  757. CLOSEFEEALGORITHM int32 `json:"closefeealgorithm" xorm:"CLOSEFEEALGORITHM"` // 平仓手续费收取方式 1:比率 2:固定
  758. QhjTradeEx `xorm:"extends"`
  759. IncludeSub int32 `json:"-"` // 是否包含子级 1-包含
  760. BeginDate string `json:"-"` // 开始交易日
  761. EndDate string `json:"-"` // 结束交易日
  762. FilterName string `json:"-"` // 模糊搜索
  763. }
  764. func (r *QhjMgrTradeOrderDetail) calc() {
  765. r.dealConvert()
  766. }
  767. func (r *QhjMgrTradeOrderDetail) buildSql(bQueryHis bool) string {
  768. var sqlId utils.SQLVal = "with k as" +
  769. " (select t.userid, wm_concat(t.logincode) logincode" +
  770. " from loginaccount t" +
  771. " group by t.userid)" +
  772. "select u.userid," +
  773. " u.accountname," +
  774. " k.logincode," +
  775. " u.subarealevelpath," +
  776. " ui.userinfotype," +
  777. " ui.mobile," +
  778. " g.goodsname," +
  779. " g.goodscode," +
  780. " g.goodunitid," +
  781. " g.qtydecimalplace," +
  782. " g.decimalplace," +
  783. " g.agreeunit," +
  784. " m.marketid," +
  785. " m.trademode," +
  786. " e.enumdicname," +
  787. " to_char(t.ORDERID) ORDERID2," +
  788. " to_char(t.ordertime, 'yyyy-mm-dd hh24:mi:ss') ORDERTIME2," +
  789. " t.*" +
  790. " from %v t" +
  791. " inner join taaccount ta" +
  792. " on t.accountid = ta.accountid" +
  793. " inner join useraccount u" +
  794. " on ta.relateduserid = u.userid" +
  795. " inner join userinfo ui" +
  796. " on u.userid = ui.userid" +
  797. " left join k" +
  798. " on u.userid = k.userid" +
  799. " left join goods g" +
  800. " on t.goodsid = g.goodsid" +
  801. " left join market m" +
  802. " on g.marketid = m.marketid" +
  803. " left join enumdicitem e" +
  804. " on e.enumitemname = g.goodunitid" +
  805. " and e.enumdiccode = 'goodsunit'" +
  806. " where 1 = 1"
  807. if bQueryHis {
  808. sqlId.FormatParam("his_trade_orderdetail")
  809. sqlId.And("t.isvaliddata", 1)
  810. } else {
  811. sqlId.FormatParam("trade_orderdetail")
  812. }
  813. if r.IncludeSub == 1 {
  814. sqlId.JoinFormat(" and u.subarealevelpath like '%%,%v,%%'", r.USERID)
  815. } else {
  816. sqlId.And("u.parentuserid", r.USERID)
  817. }
  818. sqlId.AndEx("ui.USERINFOTYPE", r.USERINFOTYPE, r.USERINFOTYPE > 0)
  819. sqlId.AndEx("m.TRADEMODE", r.TRADEMODE, r.TRADEMODE > 0)
  820. sqlId.AndEx("t.goodsid", r.GOODSID, r.GOODSID > 0)
  821. if len(r.BeginDate) > 0 {
  822. sqlId.JoinFormat(" and t.TRADEDATE >=%v", r.BeginDate)
  823. }
  824. if len(r.EndDate) > 0 {
  825. sqlId.JoinFormat(" and t.TRADEDATE <=%v", r.EndDate)
  826. }
  827. if len(r.FilterName) > 0 {
  828. sqlId.JoinFormat(" and (k.logincode like '%%%v%%' or u.accountname like '%%%v%%')", r.FilterName, r.FilterName)
  829. }
  830. return sqlId.String()
  831. }
  832. // GetDataEx 获取委托明细
  833. func (r *QhjMgrTradeOrderDetail) GetDataEx() (interface{}, error) {
  834. sData := make([]QhjMgrTradeOrderDetail, 0)
  835. sCurData := make([]QhjMgrTradeOrderDetail, 0)
  836. err := db.GetEngine().SQL(r.buildSql(false)).Find(&sCurData)
  837. sHisData := make([]QhjMgrTradeOrderDetail, 0)
  838. err = db.GetEngine().SQL(r.buildSql(true)).Find(&sHisData)
  839. sData2 := make([]QhjMgrTradeOrderDetailRsp, 0)
  840. sData = append(sData, sCurData...)
  841. sData = append(sData, sHisData...)
  842. for i := range sData {
  843. sData[i].calc()
  844. v := QhjMgrTradeOrderDetailRsp{QhjTradeEx: sData[i].QhjTradeEx}
  845. v.ACCOUNTID, v.ORDERID = sData[i].ACCOUNTID, sData[i].ORDERID
  846. v.ORDERPRICE, v.ORDERQTY = sData[i].ORDERPRICE, sData[i].ORDERQTY
  847. v.TRADEDATE, v.ORDERTIME = sData[i].TRADEDATE, sData[i].ORDERTIME
  848. v.GOODSID = sData[i].GOODSID
  849. zoonFun := NewZoomFun(int(v.QTYDECIMALPLACE))
  850. zoonFun(&v.ORDERQTY)
  851. v.AMOUNT = v.ORDERPRICE * v.ORDERQTY * v.AGREEUNIT
  852. sData2 = append(sData2, v)
  853. }
  854. return sData2, err
  855. }
  856. // QhjMgrTradePayOrder 待付款单据
  857. type QhjMgrTradePayOrder struct {
  858. TRADEID string `json:"tradeid" xorm:"TRADEID"` // 成交单号(101+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  859. TRADEDATE string `json:"tradedate" xorm:"TRADEDATE"` // 交易日(yyyyMMdd)
  860. MARKETID int32 `json:"marketid" xorm:"MARKETID"` // 市场ID
  861. GOODSID int32 `json:"goodsid" xorm:"GOODSID"` // 商品ID
  862. BUYORDERID string `json:"buyorderid" xorm:"BUYORDERID"` // 买方委托单号(关联单号)
  863. BUYACCOUNTID int64 `json:"buyaccountid" xorm:"BUYACCOUNTID"` // 买方账号ID[报价币种]
  864. SELLORDERID string `json:"sellorderid" xorm:"SELLORDERID"` // 卖方委托单号
  865. SELLACCOUNTID int64 `json:"sellaccountid" xorm:"SELLACCOUNTID"` // 卖方账号ID[报价币种]
  866. TRADEAMOUNT float64 `json:"tradeamount" xorm:"TRADEAMOUNT"` // 成交金额(优惠后金额)
  867. TRADECHARGE float64 `json:"tradecharge" xorm:"TRADECHARGE"` // 成交手续费(买方)
  868. PAYFLAG int32 `json:"payflag" xorm:"PAYFLAG"` // 付款标识 - 1:未支付 2:已支付 3:已过期 4:已撤销 5:结算过期 6:预售终止
  869. CREATETIME string `json:"createtime" xorm:"CREATETIME2"` // 创建时间
  870. PAYTIME string `json:"paytime" xorm:"PAYTIME2"` // 付款时间
  871. PAYLIMITEDTIME string `json:"paylimitedtime" xorm:"PAYLIMITEDTIME2"` // 支付期限
  872. OFFAMOUNT float64 `json:"offamount" xorm:"OFFAMOUNT"` // 优惠金额
  873. TRADEPRICE float64 `json:"tradeprice" xorm:"TRADEPRICE"` // 成交价格(价格)
  874. TRADEQTY float64 `json:"tradeqty" xorm:"TRADEQTY"` // 成交数量(数量)
  875. PAYAMOUNT float64 `json:"payamount" xorm:"PAYAMOUNT"` // 支付金额(金额)
  876. OPERATETYPE int32 `json:"operatetype" xorm:"OPERATETYPE"` // 买委托操作类型 - 1:正常下单 16:融资买入
  877. ADVANCERATIO float64 `json:"advanceratio" xorm:"ADVANCERATIO"` // 首付比率
  878. TRADETIME string `json:"tradetime"` // 成交时间
  879. QhjTradeEx `xorm:"extends"`
  880. IncludeSub int32 `json:"-"` // 是否包含子级 1-包含
  881. BeginDate string `json:"-"` // 开始交易日
  882. EndDate string `json:"-"` // 结束交易日
  883. FilterName string `json:"-"` // 模糊搜索
  884. FilterPayFlag string `json:"-"` // 付款标识
  885. }
  886. func (r *QhjMgrTradePayOrder) calc() {
  887. ZoomByDecimal(int(r.QTYDECIMALPLACE), &r.TRADEQTY)
  888. r.TRADETIME = r.CREATETIME
  889. r.dealConvert()
  890. }
  891. func (r *QhjMgrTradePayOrder) buildSql() string {
  892. var sqlId utils.SQLVal = "with k as" +
  893. " (select t.userid, wm_concat(t.logincode) logincode" +
  894. " from loginaccount t" +
  895. " group by t.userid)" +
  896. "select u.userid," +
  897. " u.accountname," +
  898. " k.logincode," +
  899. " u.subarealevelpath," +
  900. " ui.userinfotype," +
  901. " ui.mobile," +
  902. " g.goodsname," +
  903. " g.goodscode," +
  904. " g.goodunitid," +
  905. " g.qtydecimalplace," +
  906. " g.decimalplace," +
  907. " g.agreeunit," +
  908. " m.marketid," +
  909. " m.trademode," +
  910. " e.enumdicname," +
  911. " to_char(t.BUYORDERID) BUYORDERID2," +
  912. " to_char(t.TRADEID) TRADEID2," +
  913. " to_char(t.Paylimitedtime, 'yyyy-mm-dd hh24:mi:ss') Paylimitedtime2," +
  914. " to_char(t.PAYTIME, 'yyyy-mm-dd hh24:mi:ss') PAYTIME2," +
  915. " to_char(t.CREATETIME, 'yyyy-mm-dd hh24:mi:ss') CREATETIME2," +
  916. " t.*" +
  917. " from TRADE_PAYORDER t" +
  918. " inner join taaccount ta" +
  919. " on t.buyaccountid = ta.accountid" +
  920. " inner join useraccount u" +
  921. " on ta.relateduserid = u.userid" +
  922. " inner join userinfo ui" +
  923. " on u.userid = ui.userid" +
  924. " left join k" +
  925. " on u.userid = k.userid" +
  926. " left join goods g" +
  927. " on t.goodsid = g.goodsid" +
  928. " left join market m" +
  929. " on g.marketid = m.marketid" +
  930. " left join enumdicitem e" +
  931. " on e.enumitemname = g.goodunitid" +
  932. " and e.enumdiccode = 'goodsunit'" +
  933. " where 1 = 1"
  934. if r.IncludeSub == 1 {
  935. sqlId.JoinFormat(" and u.subarealevelpath like '%%,%v,%%'", r.USERID)
  936. } else {
  937. sqlId.And("u.parentuserid", r.USERID)
  938. }
  939. sqlId.AndEx("ui.USERINFOTYPE", r.USERINFOTYPE, r.USERINFOTYPE > 0)
  940. sqlId.AndEx("m.TRADEMODE", r.TRADEMODE, r.TRADEMODE > 0)
  941. sqlId.AndEx("t.goodsid", r.GOODSID, r.GOODSID > 0)
  942. if len(r.FilterPayFlag) > 0 {
  943. sqlId.JoinFormat(" and t.PAYFLAG in(%v)", r.FilterPayFlag)
  944. }
  945. if len(r.BeginDate) > 0 {
  946. sqlId.JoinFormat(" and t.TRADEDATE >=%v", r.BeginDate)
  947. }
  948. if len(r.EndDate) > 0 {
  949. sqlId.JoinFormat(" and t.TRADEDATE <=%v", r.EndDate)
  950. }
  951. if len(r.FilterName) > 0 {
  952. sqlId.JoinFormat(" and (k.logincode like '%%%v%%' or u.accountname like '%%%v%%')", r.FilterName, r.FilterName)
  953. }
  954. return sqlId.String()
  955. }
  956. // GetDataEx 获取待付款单据
  957. func (r *QhjMgrTradePayOrder) GetDataEx() (interface{}, error) {
  958. sData := make([]QhjMgrTradePayOrder, 0)
  959. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  960. for i := range sData {
  961. sData[i].calc()
  962. }
  963. return sData, err
  964. }
  965. // QhjMgrContract 千海金融资明细(合同)
  966. type QhjMgrContract struct {
  967. USERID int64 `json:"userid" xorm:"USERID"` // 用户ID
  968. SCFCONTRACTID string `json:"scfcontractid" xorm:"SCFCONTRACTID"` // SCF合同ID(310+Unix秒时间戳(10位)+xxxxxx)
  969. SCFCONTRACTTYPE int32 `json:"scfcontracttype" xorm:"SCFCONTRACTTYPE"` // 合同类型 - 1:仓单回购 2:仓单质押 3:合作套保 4:资金贷款 5:融资单
  970. GOODSID int32 `json:"goodsid" xorm:"GOODSID"` // 商品ID [5:融资单]
  971. CONTRACTCONFIRMTIME string `json:"contractconfirmtime" xorm:"CONTRACTCONFIRMTIME"` // 合同确认时间(时间)
  972. WRQTY float64 `json:"wrqty" xorm:"WRQTY"` // 仓单数量(数量)
  973. TRADEPRICE float64 `json:"tradeprice" xorm:"TRADEPRICE"` // 成交价格(成本价格)
  974. LENDERAMOUNT float64 `json:"lenderamount" xorm:"LENDERAMOUNT"` // 贷款金额(总额|订单总额)
  975. MARGINRATIO float64 `json:"marginratio" xorm:"MARGINRATIO"` // 保证金比率(首付比例)
  976. INITMARGIN float64 `json:"initmargin" xorm:"'INITMARGIN'"` // 初始保证金(首付款)
  977. RECOVEREDMARGIN float64 `json:"recoveredmargin" xorm:"'RECOVEREDMARGIN'"` // 已追缴保证金
  978. REMAINAMOUNT float64 `json:"remainamount" xorm:"'REMAINAMOUNT'"` // 合同剩余金额(融资额)
  979. TOTALINTEREST float64 `json:"totalinterest" xorm:"'TOTALINTEREST'"` // 已计总利息(利息)
  980. GOODSCODE string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码
  981. GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称
  982. GOODUNITID int32 `json:"goodunitid" xorm:"'GOODUNITID'"` // 商品单位id
  983. CURRISKLEVEL int32 `json:"currisklevel" xorm:"'CURRISKLEVEL'"` // 风险级别 - 1:正常 2:追加货款 3:支付尾款
  984. RECKONRECOVERMARGIN float64 `json:"reckonrecovermargin" xorm:"'RECKONRECOVERMARGIN'"` // 结算应追缴保底金(结算时到过风险率时临时存储) - [仓单回购\仓单质押]
  985. DECIMALPLACE int32 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 商品报价小数位
  986. SCFCONTRACTSTATUS int32 `json:"scfcontractstatus" xorm:"'SCFCONTRACTSTATUS'"` // 合同状态 - 1:待确认 2:已确认 3:确认拒绝 4:已支付保证金 5:已激活 6:已违约 7:到期结束 8:延期结束 9:违约结束 10:已注销 11:已关闭 99:未提交
  987. LOGINCODE string `json:"logincode" xorm:"'LOGINCODE'"` // 账号(登录代码)
  988. USERINFOTYPE int32 `json:"userinfotype" xorm:"'USERINFOTYPE'"` // 用户类型 1-个人 2-企业
  989. MOBILE string `json:"mobile" xorm:"'MOBILE'"` // 电话号码(用户资料里的电话)
  990. TRADEDATE string `json:"tradedate" xorm:"'TRADEDATE'"` // 交易日
  991. PAYAMOUNT float64 `json:"payamount" xorm:"'PAYAMOUNT'"` // 已付(已付货款)
  992. USERNAME string `json:"username" xorm:"'USERNAME'"` // 用户名称
  993. ENUMDICNAME string `json:"enumdicname"` // 单位名称
  994. BeginDate string `json:"-"` // 开始交易日
  995. EndDate string `json:"-"` // 结束交易日
  996. FilterName string `json:"-"` // 模糊搜索
  997. FilterRiskLevel string `json:"-"` // 风险级别
  998. }
  999. func (r *QhjMgrContract) calc() {
  1000. r.USERNAME = mtpcache.GetUserNameByUserId(r.USERID)
  1001. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.GOODUNITID)
  1002. // 已付(已付货款) = 已追缴保证金 + 初始保证金
  1003. r.PAYAMOUNT = r.RECOVEREDMARGIN + r.INITMARGIN
  1004. if r.SCFCONTRACTSTATUS == 10 || r.SCFCONTRACTSTATUS == 11 {
  1005. // 当合同关闭时, 利息重置为0
  1006. r.TOTALINTEREST = 0
  1007. }
  1008. if r.LOGINCODE == "" {
  1009. r.LOGINCODE = DecryptField(r.MOBILE)
  1010. }
  1011. }
  1012. func (r *QhjMgrContract) buildSql() string {
  1013. var sqlId utils.SQLVal = "with k as (select t.userid, wm_concat(t.logincode) logincode from loginaccount t group by t.userid)" +
  1014. "select t.borroweruserid userid," +
  1015. " to_char(t.scfcontractid) scfcontractid," +
  1016. " t.scfcontracttype," +
  1017. " t.goodsid," +
  1018. " to_char(t.contractconfirmtime, 'yyyy-mm-dd hh24:mi:ss') contractconfirmtime," +
  1019. " t.wrqty," +
  1020. " t.tradeprice," +
  1021. " t.lenderamount," +
  1022. " t.marginratio," +
  1023. " s.initmargin," +
  1024. " s.recoveredmargin," +
  1025. " s.remainamount," +
  1026. " s.totalinterest," +
  1027. " s.currisklevel," +
  1028. " s.reckonrecovermargin," +
  1029. " s.scfcontractstatus," +
  1030. " s.tradedate," +
  1031. " g.goodscode," +
  1032. " g.goodsname," +
  1033. " g.decimalplace," +
  1034. " g.goodunitid," +
  1035. " ui.userinfotype," +
  1036. " ui.mobile," +
  1037. " u.accountname," +
  1038. " k.logincode" +
  1039. " from scf_contract t" +
  1040. " left join scf_contractinfo s" +
  1041. " on t.scfcontractid = s.scfcontractid" +
  1042. " left join goods g" +
  1043. " on t.goodsid = g.goodsid" +
  1044. " left join userinfo ui on t.borroweruserid=ui.userid" +
  1045. " left join k on ui.userid=k.userid" +
  1046. " left join useraccount u on t.borroweruserid=u.userid" +
  1047. " where 1 = 1"
  1048. sqlId.AndEx("t.borroweruserid", r.USERID, r.USERID > 0)
  1049. sqlId.AndEx("ui.USERINFOTYPE", r.USERINFOTYPE, r.USERINFOTYPE > 0)
  1050. sqlId.AndEx("t.goodsid", r.GOODSID, r.GOODSID > 0)
  1051. if len(r.FilterRiskLevel) > 0 {
  1052. sqlId.JoinFormat(" and s.currisklevel in(%v)", r.FilterRiskLevel)
  1053. }
  1054. if len(r.BeginDate) > 0 {
  1055. sqlId.JoinFormat(" and s.TRADEDATE >=%v", r.BeginDate)
  1056. }
  1057. if len(r.EndDate) > 0 {
  1058. sqlId.JoinFormat(" and s.TRADEDATE <=%v", r.EndDate)
  1059. }
  1060. if len(r.FilterName) > 0 {
  1061. sqlId.JoinFormat(" and (k.logincode like '%%%v%%' or u.accountname like '%%%v%%')", r.FilterName, r.FilterName)
  1062. }
  1063. return sqlId.String()
  1064. }
  1065. // GetDataEx 获取融资明细(合同)
  1066. func (r *QhjMgrContract) GetDataEx() (interface{}, error) {
  1067. sData := make([]QhjMgrContract, 0)
  1068. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1069. for i := range sData {
  1070. sData[i].calc()
  1071. }
  1072. return sData, err
  1073. }