qhjPCWeb.go 79 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488
  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'"` // 开户状态(网上开户表wskh_userinfo) 1:未提交 2: 待初审 3:初审拒绝 4:待复审 5:复审拒绝 6:测评不通过 ; 账户状态(正式表useraccount) 1:待激活 2:待审核 3:待复审 4:正常 5:审核拒绝 6:停用(注销) 7:注销(删除)
  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. PROXYSTATEMENTURL string `json:"proxystatementurl" xorm:"'PROXYSTATEMENTURL'"` // 授权委托书
  72. COUNTRYID int32 `json:"countryid" xorm:"'COUNTRYID'"` // 国家
  73. PROVINCEID int32 `json:"provinceid" xorm:"'PROVINCEID'"` // 省
  74. CITYID int32 `json:"cityid" xorm:"'CITYID'"` // 市
  75. DISTRICTID int32 `json:"districtid" xorm:"'DISTRICTID'"` // 区域
  76. CREATETIME string `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  77. MODIFYTIME string `json:"modifytime" xorm:"'MODIFYTIME'"` // 修改时间
  78. AUDITTIME string `json:"audittime" xorm:"'AUDITTIME'"` // 审核时间
  79. NICKNAME string `json:"nickname" xorm:"'NICKNAME'"` // 昵称
  80. TAXPAYERNUM string `json:"taxpayernum" xorm:"'taxpayernum'"` // 纳税人识别号
  81. LEGALPERSONNAME string `json:"legalpersonname" xorm:"'legalpersonname'"` // 法人姓名(企业)
  82. CONTACTNAME string `json:"contactname" xorm:"'contactname'"` // 联系人
  83. EMAIL string `json:"email" xorm:"'EMAIL'"` // 邮件
  84. USERNAME string `json:"username" xorm:"'USERNAME'"` // 用户名称
  85. LOGINCODE string `json:"logincode" xorm:"'LOGINCODE'"` // 登录账号(代码)
  86. BROKERID int64 `json:"brokerid" xorm:"'BROKERID'"` // 所属客户经理id
  87. BROKERNAME string `json:"brokername" xorm:"'BROKERNAME'"` // 所属客户经理名称
  88. BIRTHDAY string `json:"birthday" xorm:"'BIRTHDAY'" form:"birthday"` // 生日
  89. SEX int32 `json:"sex" xorm:"'SEX'"` // 性别 0-女 1-男
  90. COUNTRYNAME string `json:"countryname"` // 国家名称
  91. CITYNAME string `json:"cityname"` // 城市名称
  92. PROVINCENAME string `json:"provincename"` // 省名称
  93. DISTRICTNAME string `json:"districtname"` // 地区名称
  94. CARDTYPENAME string `json:"cardtypename"` // 证件类型名称
  95. MEMBERUSERNAME string `json:"memberusername"` // 所属会员名称
  96. PARENTUSERNAME string `json:"parentusername"` //所属机构名称
  97. QUERYTYPE int32 `json:"querytype"` // 查询类型 1:未提交(网上开户表) 2:待审核(网上开户表) 3:正常 4:停用
  98. IncludeSub int32 `json:"-"` // 包子机构客户 1-包含
  99. }
  100. func (r *QhjMgrCustomer) calc() {
  101. r.MEMBERUSERNAME = mtpcache.GetUserNameByUserId(r.MEMBERUSERID)
  102. if len(r.USERNAME) == 0 {
  103. r.USERNAME = mtpcache.GetUserNameByUserId(r.USERID)
  104. }
  105. r.PARENTUSERNAME = mtpcache.GetUserNameByUserId(r.PARENTUSERID)
  106. r.COUNTRYNAME = mtpcache.GetDivisionName(r.COUNTRYID)
  107. r.CITYNAME = mtpcache.GetDivisionName(r.CITYID)
  108. r.PROVINCENAME = mtpcache.GetDivisionName(r.PROVINCEID)
  109. r.DISTRICTNAME = mtpcache.GetDivisionName(r.DISTRICTID)
  110. r.CARDTYPENAME = mtpcache.GetCardName(r.CARDTYPE)
  111. fDesc := func(status int32, vDesc string) {
  112. if r.STATUS == status {
  113. r.STATUSDESC = vDesc
  114. }
  115. }
  116. switch r.QUERYTYPE {
  117. case 1, 2: // 网上开户表
  118. r.ADDRESS = DecryptField(r.ADDRESS)
  119. r.TELPHONE = DecryptField(r.TELPHONE)
  120. //开户状态 - 1:未提交 2: 待初审 3:初审拒绝 4:待复审 5:复审拒绝 6:测评不通过
  121. fDesc(1, "未提交")
  122. fDesc(2, "待初审")
  123. fDesc(3, "初审拒绝")
  124. fDesc(4, "待复审")
  125. fDesc(5, "复审拒绝")
  126. fDesc(6, "测评不通过")
  127. case 3, 4: // 正式表
  128. r.TELPHONE = DecryptField(r.TELPHONE)
  129. //账户状态 - 1:待激活 2:待审核 3:待复审 4:正常 5:审核拒绝 6:停用(注销) 7:注销(删除)
  130. fDesc(1, "待激活")
  131. fDesc(2, "待审核")
  132. fDesc(3, "待复审")
  133. fDesc(4, "正常")
  134. fDesc(5, "审核拒绝")
  135. fDesc(6, "停用(注销)")
  136. fDesc(7, "注销(删除)")
  137. }
  138. r.CARDNUM = DecryptField(r.CARDNUM)
  139. r.MOBILE = DecryptField(r.MOBILE)
  140. r.EMAIL = DecryptField(r.EMAIL)
  141. if r.LOGINCODE == "" {
  142. r.LOGINCODE = r.MOBILE
  143. }
  144. }
  145. func (r *QhjMgrCustomer) level() int32 {
  146. if r.IncludeSub > 0 {
  147. // 层级, 最多20层
  148. return 20
  149. }
  150. return 1
  151. }
  152. func (r *QhjMgrCustomer) buildSql() string {
  153. if r.QUERYTYPE == 1 || r.QUERYTYPE == 2 {
  154. return r.buildSqlWskh()
  155. }
  156. return r.buildSqlNormal()
  157. }
  158. func (r *QhjMgrCustomer) buildSqlWskh() string {
  159. var sqlId utils.SQLVal = `
  160. select u.accountname brokername, a.*
  161. from (select t.userid,
  162. t.memberareaid MEMBERUSERID,
  163. t.USERINFOTYPE,
  164. t.username,
  165. t.CUSTOMERNAME,
  166. t.NICKNAME,
  167. t.CARDTYPE,
  168. t.CARDNUM,
  169. t.mobilephone MOBILE,
  170. t.TELPHONE,
  171. t.cardaddress ADDRESS,
  172. t.REMARK,
  173. t.ATTACHMENT1,
  174. t.CARDFRONTPHOTOURL,
  175. t.CARDBACKPHOTOURL,
  176. t.proxystatementurl,
  177. t.userstate status,
  178. t.countryid,
  179. t.provinceid,
  180. t.districtid,
  181. to_char(t.createtime, 'yyyy-mm-dd hh24:mi:ss') createtime,
  182. t.cityid,
  183. to_char(t.modifiedtime, 'yyyy-mm-dd hh24:mi:ss') modifytime,
  184. to_char(t.auditime, 'yyyy-mm-dd hh24:mi:ss') audittime,
  185. t.taxpayernum,
  186. t.legalpersonname,
  187. t.contactname,
  188. t.email,
  189. t.areaid parentuserid,
  190. t.logincode,
  191. t.usertype,
  192. t.sex,
  193. to_char(t.birthday, 'yyyy-mm-dd hh24:mi:ss') birthday,
  194. to_number(t.brokerid) brokerid,
  195. t.birthday birthday2
  196. from wskh_userinfo t
  197. where 1=1 %v) a
  198. left join useraccount u
  199. on a.brokerid = u.userid
  200. where 1 = 1
  201. and a.status in (%v)
  202. `
  203. var strParm string
  204. if r.IncludeSub == 0 {
  205. strParm = fmt.Sprintf(" and t.areaid = %v", r.USERID)
  206. } else {
  207. str := `
  208. and t.areaid in (select t.userid
  209. from useraccount t
  210. where t.subarealevelpath like '%%,%v,%%'
  211. )
  212. `
  213. strParm = fmt.Sprintf(str, r.USERID)
  214. }
  215. status := DecodeStr(r.QUERYTYPE == 1, "1", "2,4,5")
  216. sqlId.FormatParam(strParm, status)
  217. sqlId.AndEx("a.USERINFOTYPE", r.USERINFOTYPE, r.USERINFOTYPE > 0)
  218. sqlId.JoinEx(len(r.CUSTOMERNAME) > 0, fmt.Sprintf(` and a.customername like '%%%v%%'`, r.CUSTOMERNAME))
  219. sqlId.JoinEx(len(r.NICKNAME) > 0, fmt.Sprintf(` and a.nickname like '%%%v%%'`, r.NICKNAME))
  220. sqlId.JoinEx(len(r.BROKERNAME) > 0, fmt.Sprintf(` and u.accountname like '%%%v%%'`, r.BROKERNAME))
  221. if len(r.BIRTHDAY) == 2 {
  222. sqlId.JoinFormat(" and to_char(a.birthday2, 'mm') = '%v'", r.BIRTHDAY)
  223. } else if len(r.BIRTHDAY) == 4 {
  224. sqlId.JoinFormat(" and to_char(a.birthday2, 'mmdd') = '%v'", r.BIRTHDAY)
  225. }
  226. return sqlId.String()
  227. }
  228. func (r *QhjMgrCustomer) buildSqlNormal() string {
  229. var sqlId utils.SQLVal = `
  230. with tmp as
  231. (select t.userid, wm_concat(t.logincode) logincode
  232. from loginaccount t
  233. group by t.userid)
  234. select a.*,
  235. k.logincode,
  236. u.USERINFOTYPE,
  237. u.CUSTOMERNAME,
  238. u.NICKNAME,
  239. u.CARDTYPEID CARDTYPE,
  240. u.CARDNUM,
  241. u.MOBILE,
  242. u.TELPHONE,
  243. u.ADDRESS,
  244. u.REMARK,
  245. u.ATTACHMENT1,
  246. u.CARDFRONTPHOTOURL,
  247. u.CARDBACKPHOTOURL,
  248. u.proxystatementurl,
  249. u.countryid,
  250. u.provinceid,
  251. u.districtid,
  252. u.taxpayernum,
  253. u.legalpersonname,
  254. u.contactname,
  255. u.email,
  256. u.cityid,
  257. u.sex,
  258. to_char(u.birthday, 'yyyy-mm-dd hh24:mi:ss') birthday,
  259. u2.accountname brokername
  260. from (select t.userid,
  261. t.usertype,
  262. t.parentuserid,
  263. t.memberuserid,
  264. t.broker,
  265. t.accountstatus status,
  266. to_char(t.createtime, 'yyyy-mm-dd hh24:mi:ss') createtime,
  267. to_char(t.modifytime, 'yyyy-mm-dd hh24:mi:ss') modifytime,
  268. to_char(t.audittime, 'yyyy-mm-dd hh24:mi:ss') audittime
  269. from useraccount t
  270. where 1 = 1
  271. and t.usertype = 6 %v) a
  272. left join tmp k
  273. on a.userid = k.userid
  274. left join userinfo u
  275. on a.userid = u.userid
  276. left join useraccount u2 on a.broker=u2.userid
  277. where 1 = 1
  278. `
  279. status := DecodeStr(r.QUERYTYPE == 3, "4", "6")
  280. var sqlParam utils.SQLVal
  281. sqlParam.And("t.accountstatus", status)
  282. if r.IncludeSub == 1 {
  283. sqlParam.Join(fmt.Sprintf(" and t.subarealevelpath like '%%,%v,%%'", r.USERID))
  284. } else {
  285. sqlParam.And("t.parentuserid", r.USERID)
  286. }
  287. sqlId.FormatParam(sqlParam.String())
  288. sqlId.AndEx("u.USERINFOTYPE", r.USERINFOTYPE, r.USERINFOTYPE > 0)
  289. sqlId.JoinEx(len(r.CUSTOMERNAME) > 0, fmt.Sprintf(` and u.customername like '%%%v%%'`, r.CUSTOMERNAME))
  290. sqlId.JoinEx(len(r.NICKNAME) > 0, fmt.Sprintf(` and u.nickname like '%%%v%%'`, r.NICKNAME))
  291. sqlId.JoinEx(len(r.BROKERNAME) > 0, fmt.Sprintf(` and u2.accountname like '%%%v%%'`, r.BROKERNAME))
  292. if len(r.BIRTHDAY) == 2 {
  293. sqlId.JoinFormat(" and to_char(u.birthday, 'mm') = '%v'", r.BIRTHDAY)
  294. } else if len(r.BIRTHDAY) == 4 {
  295. sqlId.JoinFormat(" and to_char(u.birthday, 'mmdd') = '%v'", r.BIRTHDAY)
  296. }
  297. return sqlId.String()
  298. }
  299. // GetDataEx 获取客户资料
  300. func (r *QhjMgrCustomer) GetDataEx() (interface{}, error) {
  301. sData := make([]QhjMgrCustomer, 0)
  302. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  303. for i := range sData {
  304. sData[i].QUERYTYPE = r.QUERYTYPE
  305. sData[i].calc()
  306. }
  307. return sData, err
  308. }
  309. // QhjMgrAccountOutInApply 充值提现(出入金)
  310. type QhjMgrAccountOutInApply struct {
  311. EXECUTETYPE int32 `json:"executetype" xorm:"EXECUTETYPE"` // 申请类型 - 1:出金 2:入金 3: 单边账调整:入金; 4:单边账调整:出金 5:外部母账户调整:入金 6:外部母账户调整:出金 7:外部子账户:入金 8:外部子账户:出金
  312. AMOUNT float64 `json:"amount" xorm:"AMOUNT"` // 金额
  313. CURRENCY string `json:"currency" xorm:"CURRENCY"` // 币种
  314. CHARGE float64 `json:"charge" xorm:"CHARGE"` // 手续费
  315. ACCOUNTPWD string `json:"accountpwd" xorm:"ACCOUNTPWD"` // 资金密码
  316. UPDATETIME string `json:"updatetime" xorm:"UPDATETIME"` // 更新时间(申请时间)
  317. BANKID string `json:"bankid" xorm:"BANKID"` // 银行编号
  318. BANKNAME string `json:"bankname" xorm:"'BANKNAME'"` // 银行名称
  319. BRANCHBANKID string `json:"branchbankid" xorm:"BRANCHBANKID"` // 银行支行号
  320. BRANCHBANKNAME string `json:"branchbankname" xorm:"BRANCHBANKNAME"` // 银行支行名称
  321. BANKACCOUNTNO string `json:"bankaccountno" xorm:"BANKACCOUNTNO"` // 银行卡号
  322. BANKACCOUNTNAME string `json:"bankaccountname" xorm:"BANKACCOUNTNAME"` // 银行账户名
  323. EXTENDINFO string `json:"extendinfo" xorm:"EXTENDINFO"` // 扩展信息
  324. AUDITID int64 `json:"auditid" xorm:"AUDITID"` // 审核人
  325. AUDITTIME string `json:"audittime" xorm:"AUDITTIME"` // 审核时间
  326. REMARK string `json:"remark" xorm:"REMARK"` // 备注
  327. NETADDR string `json:"netaddr" xorm:"NETADDR"` // 调转网址
  328. ACCOUNTTICKET string `json:"accountticket" xorm:"ACCOUNTTICKET"` // 最新账户服务流水号
  329. CHECKERRORFLAG int32 `json:"checkerrorflag" xorm:"CHECKERRORFLAG"` // 对账差错标志 - 1:为单边账;其它为正常出入金
  330. REMARK2 string `json:"remark2" xorm:"REMARK2"` // 备注(失败原因)
  331. REAUDITID int64 `json:"reauditid" xorm:"REAUDITID"` // 复审人
  332. REAUDITTIME string `json:"reaudittime" xorm:"REAUDITTIME"` // 复审时间
  333. REAUDITREMARK string `json:"reauditremark" xorm:"REAUDITREMARK"` // 复审备注
  334. APPLYREMARK string `json:"applyremark" xorm:"APPLYREMARK"` // 申请备注
  335. RELATEDORDERID string `json:"relatedorderid" xorm:"RELATEDORDERID"` // 三方关联ID
  336. CAPAMOUNTOUT float64 `json:"capamountout" xorm:"CAPAMOUNTOUT"` // 出金(劣后本金) - 外部子账户
  337. INFAMOUNT float64 `json:"infamount" xorm:"INFAMOUNT"` // 劣后金额(自有)
  338. PRIAMOUNT float64 `json:"priamount" xorm:"PRIAMOUNT"` // 优先金额(授信)
  339. BANK_APPLY_TICKET string `json:"bank_apply_ticket" xorm:"BANK_APPLY_TICKET"` // 银行申请流水
  340. CERTIFICATEPHOTOURL string `json:"certificatephotourl" xorm:"CERTIFICATEPHOTOURL"` // 凭证地址
  341. SOUCREAMOUNT float64 `json:"soucreamount" xorm:"SOUCREAMOUNT"` // 原始出入金金额
  342. SOUCRECURRENCYID int64 `json:"soucrecurrencyid" xorm:"SOUCRECURRENCYID"` // 原始出入金币种
  343. ACCOUNTCODE string `json:"accountcode" xorm:"ACCOUNTCODE"` // 资金账号
  344. CUSBANKID string `json:"cusbankid" xorm:"CUSBANKID"` // 托管银行编号
  345. TRADEDATE string `json:"tradedate" xorm:"TRADEDATE"` // 交易日(yyyyMMdd)
  346. EXCHTICKET string `json:"exchticket" xorm:"EXCHTICKET"` // 银行服务流水号
  347. EXTOPERATEID int64 `json:"extoperateid" xorm:"EXTOPERATEID"` // 交易服务流水号
  348. BANKTICKET string `json:"bankticket" xorm:"BANKTICKET"` // 银行流水
  349. 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: 复审通过,账户冻结金额检查中;
  350. USERID int64 `json:"userid" xorm:"'USERID'"` // 用户id
  351. LOGINCODE string `json:"logincode" xorm:"'LOGINCODE'"` // 登录账号(账号)
  352. USERINFOTYPE int32 `json:"userinfotype" xorm:"'USERINFOTYPE'"` // 账户类型 1-个人 2-企业
  353. ACCOUNTNAME string `json:"accountname" xorm:"'ACCOUNTNAME'"` // 用户名称(名称)
  354. QUERYTYPE int32 `json:"-"` // 查询类型 1-提现 2-充值
  355. STATUS int32 `json:"-"` // 查询状态 1-待审核 2-审核通过 3-审核拒绝
  356. BeginDate string `json:"-"` // 开始日期(yyyymmdd)
  357. EndDate string `json:"-"` // 结束日期(yyyymmdd)
  358. FilterName string `json:"-"` // 账户(模糊匹配)
  359. }
  360. func (r *QhjMgrAccountOutInApply) calc() {
  361. r.BANKACCOUNTNAME = DecryptField(r.BANKACCOUNTNAME)
  362. r.BANKACCOUNTNO = DecryptField(r.BANKACCOUNTNO)
  363. }
  364. func (r *QhjMgrAccountOutInApply) buildSql() string {
  365. var sqlId utils.SQLVal = "with tmp as(select t.userid, wm_concat(t.logincode) logincode from loginaccount t group by t.userid)" +
  366. "SELECT t.EXECUTETYPE," +
  367. " t.AMOUNT," +
  368. " t.CURRENCY," +
  369. " t.CHARGE," +
  370. " t.ACCOUNTPWD," +
  371. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  372. " t.BANKID," +
  373. " t.BRANCHBANKID," +
  374. " t.BRANCHBANKNAME," +
  375. " t.BANKACCOUNTNO," +
  376. " t.BANKACCOUNTNAME," +
  377. " t.EXTENDINFO," +
  378. " t.AUDITID," +
  379. " to_char(t.AUDITTIME, 'yyyy-mm-dd hh24:mi:ss') AUDITTIME," +
  380. " t.REMARK," +
  381. " t.NETADDR," +
  382. " t.ACCOUNTTICKET," +
  383. " t.CHECKERRORFLAG," +
  384. " t.REMARK2," +
  385. " t.REAUDITID," +
  386. " to_char(t.REAUDITTIME, 'yyyy-mm-dd hh24:mi:ss') REAUDITTIME," +
  387. " t.REAUDITREMARK," +
  388. " t.APPLYREMARK," +
  389. " t.RELATEDORDERID," +
  390. " t.CAPAMOUNTOUT," +
  391. " t.INFAMOUNT," +
  392. " t.PRIAMOUNT," +
  393. " t.BANK_APPLY_TICKET," +
  394. " to_char(t.CERTIFICATEPHOTOURL) CERTIFICATEPHOTOURL," +
  395. " t.SOUCREAMOUNT," +
  396. " t.SOUCRECURRENCYID," +
  397. " t.ACCOUNTCODE," +
  398. " t.CUSBANKID," +
  399. " t.TRADEDATE," +
  400. " t.EXCHTICKET," +
  401. " t.EXTOPERATEID," +
  402. " t.BANKTICKET," +
  403. " t.APPLYSTATUS," +
  404. " ta.userid," +
  405. " u.accountname," +
  406. " ui.userinfotype," +
  407. " tmp.logincode," +
  408. " b.bankname" +
  409. " FROM BANK_ACCOUNTOUTINAPPLY t" +
  410. " INNER JOIN TAACCOUNT ta" +
  411. " on t.accountcode = to_char(ta.accountid)" +
  412. " INNER JOIN USERACCOUNT u" +
  413. " on ta.relateduserid = u.userid" +
  414. " INNER JOIN USERINFO ui" +
  415. " on u.userid = ui.userid" +
  416. " LEFT JOIN BANK_BANKINFO b on t.bankid=b.bankid" +
  417. " LEFT JOIN tmp" +
  418. " on u.userid = tmp.userid" +
  419. " WHERE 1 = 1"
  420. sqlId.And("EXECUTETYPE", r.QUERYTYPE)
  421. switch r.STATUS {
  422. case 1:
  423. sqlId.JoinFormat(" and t.APPLYSTATUS in(%v)", InStr(1, 2))
  424. case 2:
  425. sqlId.JoinFormat(" and t.APPLYSTATUS in(%v)", InStr(11, 18, 24, 25))
  426. case 3:
  427. sqlId.JoinFormat(" and t.APPLYSTATUS in(%v)", InStr(3, 12, 21))
  428. }
  429. if len(r.BeginDate) > 0 {
  430. sqlId.Join(fmt.Sprintf(" and t.TRADEDATE >= %v", r.BeginDate))
  431. }
  432. if len(r.EndDate) > 0 {
  433. sqlId.Join(fmt.Sprintf(" and t.TRADEDATE <= %v", r.EndDate))
  434. }
  435. if len(r.FilterName) > 0 {
  436. sqlId.Join(fmt.Sprintf(" and (tmp.logincode like '%%%v%%' or u.accountname like '%%%v%%')", r.FilterName, r.FilterName))
  437. }
  438. sqlId.Join(" order by t.UPDATETIME desc")
  439. return sqlId.String()
  440. }
  441. // GetDataEx 获取充值提现(出入金)
  442. func (r *QhjMgrAccountOutInApply) GetDataEx() (interface{}, error) {
  443. sData := make([]QhjMgrAccountOutInApply, 0)
  444. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  445. for i := range sData {
  446. sData[i].calc()
  447. }
  448. return sData, err
  449. }
  450. // QhjTradeEx 额外的用户和商品信息
  451. type QhjTradeEx struct {
  452. LOGINCODE string `json:"logincode" xorm:"'LOGINCODE'"` // 登录代码(账户)
  453. USERID int64 `json:"userid" xorm:"'USERID'"` // 用户id
  454. ACCOUNTNAME string `json:"accountname" xorm:"'ACCOUNTNAME'"` // 用户名称
  455. ENUMDICNAME string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 单位名称(商品)
  456. GOODSCODE string `json:"goodscode" xorm:"GOODSCODE"` // 商品代码(内部)
  457. GOODSNAME string `json:"goodsname" xorm:"GOODSNAME"` // 商品名称
  458. GOODUNITID int32 `json:"goodunitid" xorm:"GOODUNITID"` // 报价单位ID
  459. AGREEUNIT float64 `json:"agreeunit" xorm:"AGREEUNIT"` // 合约乘数
  460. DECIMALPLACE int32 `json:"decimalplace" xorm:"DECIMALPLACE"` // 报价小数位
  461. QTYDECIMALPLACE int32 `json:"qtydecimalplace" xorm:"QTYDECIMALPLACE"` // 成交量小数位
  462. USERINFOTYPE int32 `json:"userinfotype" xorm:"'USERINFOTYPE'"` // 账户类型 1-个人 2-企业
  463. MOBILE string `json:"-" xorm:"'MOBILE'"` // 手机号码
  464. MARKETID int32 `json:"marketid" xorm:"'MARKETID'"` // 市场id
  465. TRADEMODE int32 `json:"trademode" xorm:"'TRADEMODE'"` // 交易模式
  466. }
  467. func (r *QhjTradeEx) dealConvert() {
  468. if r.LOGINCODE == "" {
  469. r.LOGINCODE = DecryptField(r.MOBILE)
  470. }
  471. }
  472. // QhjMgrPositionRsp 持仓汇总
  473. type QhjMgrPositionRsp struct {
  474. QhjTradeEx `xorm:"extends"`
  475. ACCOUNTID int64 `json:"accountid"` // 账号Id
  476. GOODSID int32 `json:"goodsid"` // 商品Id
  477. HOLDERTYPE int32 `json:"holdertype"` // 持仓类别 - 1:单边持仓 2:双边持仓
  478. HOLDERQTY float64 `json:"holderqty"` // 持有数量
  479. FROZENQTY float64 `json:"frozenqty"` // 冻结数量
  480. AVIALQTY float64 `json:"avialqty"` // 可用数量
  481. HOLDERAMOUNT float64 `json:"holderamount"` // 金额
  482. AVERAGEPRICE float64 `json:"averageprice"` // 均价
  483. }
  484. // QhjMgrTradePosition 持仓汇总
  485. type QhjMgrTradePosition struct {
  486. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 账号Id
  487. GOODSID int32 `json:"goodsid" xorm:"GOODSID"` // 商品Id
  488. HOLDERTYPE int32 `json:"holdertype" xorm:"HOLDERTYPE"` // 持仓类别 - 1:单边持仓 2:双边持仓
  489. BUYPOSITIONQTY float64 `json:"buypositionqty" xorm:"BUYPOSITIONQTY"` // 买期初持仓数量
  490. BUYHOLDERAMOUNT float64 `json:"buyholderamount" xorm:"BUYHOLDERAMOUNT"` // 买期初持仓总金额[商品币种]
  491. BUYCURPOSITIONQTY float64 `json:"buycurpositionqty" xorm:"BUYCURPOSITIONQTY"` // 买当前持仓总数量
  492. BUYCURHOLDERAMOUNT float64 `json:"buycurholderamount" xorm:"BUYCURHOLDERAMOUNT"` // 买当前持仓总金额[商品币种]
  493. BUYFROZENQTY float64 `json:"buyfrozenqty" xorm:"BUYFROZENQTY"` // 买持仓冻结数量
  494. BUYOTHERFROZENQTY float64 `json:"buyotherfrozenqty" xorm:"BUYOTHERFROZENQTY"` // 买持仓其他冻结数量(交割冻结)
  495. BUYOPENREQQTY float64 `json:"buyopenreqqty" xorm:"BUYOPENREQQTY"` // 买开仓申请数量(用于比较最大持仓数量)
  496. BUYOPENTOTALQTY float64 `json:"buyopentotalqty" xorm:"BUYOPENTOTALQTY"` // 今日买开仓总数量
  497. BUYCLOSETOTALQTY float64 `json:"buyclosetotalqty" xorm:"BUYCLOSETOTALQTY"` // 今日买平仓总数量
  498. SELLPOSITIONQTY float64 `json:"sellpositionqty" xorm:"SELLPOSITIONQTY"` // 卖期初持仓数量
  499. SELLHOLDERAMOUNT float64 `json:"sellholderamount" xorm:"SELLHOLDERAMOUNT"` // 卖期初持仓总金额[商品币种]
  500. SELLCURPOSITIONQTY float64 `json:"sellcurpositionqty" xorm:"SELLCURPOSITIONQTY"` // 卖当前持仓数量
  501. SELLCURHOLDERAMOUNT float64 `json:"sellcurholderamount" xorm:"SELLCURHOLDERAMOUNT"` // 卖当前持仓总金额[商品币种]
  502. SELLFROZENQTY float64 `json:"sellfrozenqty" xorm:"SELLFROZENQTY"` // 卖持仓冻结
  503. SELLOTHERFROZENQTY float64 `json:"sellotherfrozenqty" xorm:"SELLOTHERFROZENQTY"` // 卖持仓其他冻结(交割冻结)
  504. SELLOPENREQQTY float64 `json:"sellopenreqqty" xorm:"SELLOPENREQQTY"` // 卖开仓申请数量(用于比较最大持仓数量)
  505. SELLOPENTOTALQTY float64 `json:"sellopentotalqty" xorm:"SELLOPENTOTALQTY"` // 今日卖开仓总数量
  506. SELLCLOSETOTALQTY float64 `json:"sellclosetotalqty" xorm:"SELLCLOSETOTALQTY"` // 今日卖平仓总数量
  507. USEDMARGIN float64 `json:"usedmargin" xorm:"USEDMARGIN"` // 占用保证金[商品币种]
  508. TRADEPROPERTY int32 `json:"tradeproperty" xorm:"TRADEPROPERTY"` // 交易属性
  509. BUYTNQTY float64 `json:"buytnqty" xorm:"BUYTNQTY"` // 买T+N冻结总量
  510. BUYTNUSEDQTY float64 `json:"buytnusedqty" xorm:"BUYTNUSEDQTY"` // 买T+N使用量(可以使用T+N的冻结数量)
  511. SELLTNQTY float64 `json:"selltnqty" xorm:"SELLTNQTY"` // 卖T+N冻结总量
  512. SELLTNUSEDQTY float64 `json:"selltnusedqty" xorm:"SELLTNUSEDQTY"` // 卖T+N使用量(可以使用T+N的冻结数量)
  513. BUYCURTDPOSITION float64 `json:"buycurtdposition" xorm:"BUYCURTDPOSITION"` // 买期末今日头寸
  514. BUYFRETDPOSITION float64 `json:"buyfretdposition" xorm:"BUYFRETDPOSITION"` // 买冻结今日头寸
  515. SELLCURTDPOSITION float64 `json:"sellcurtdposition" xorm:"SELLCURTDPOSITION"` // 卖期末今日头寸
  516. SELLFRETDPOSITION float64 `json:"sellfretdposition" xorm:"SELLFRETDPOSITION"` // 卖冻结今日头寸
  517. QhjTradeEx `xorm:"extends"`
  518. IncludeSub int32 `json:"-"` // 是否包含子级 1-包含
  519. FilterName string `json:"-"` // 模糊搜索
  520. }
  521. func (r *QhjMgrTradePosition) calc() {
  522. r.dealConvert()
  523. }
  524. func (r *QhjMgrTradePosition) buildSql() string {
  525. var sqlId utils.SQLVal = "with k as" +
  526. " (select t.userid, wm_concat(t.logincode) logincode" +
  527. " from loginaccount t" +
  528. " group by t.userid)" +
  529. "select u.userid," +
  530. " u.accountname," +
  531. " k.logincode," +
  532. " u.subarealevelpath," +
  533. " ui.userinfotype," +
  534. " ui.mobile," +
  535. " g.goodsname," +
  536. " g.goodscode," +
  537. " g.goodunitid," +
  538. " g.qtydecimalplace," +
  539. " g.decimalplace," +
  540. " g.agreeunit," +
  541. " m.marketid," +
  542. " m.trademode," +
  543. " e.enumdicname," +
  544. " t.*" +
  545. " from tradeposition t" +
  546. " inner join taaccount ta" +
  547. " on t.accountid = ta.accountid" +
  548. " inner join useraccount u" +
  549. " on ta.relateduserid = u.userid" +
  550. " inner join userinfo ui" +
  551. " on u.userid = ui.userid" +
  552. " left join k" +
  553. " on u.userid = k.userid" +
  554. " left join goods g" +
  555. " on t.goodsid = g.goodsid" +
  556. " left join market m on g.marketid=m.marketid" +
  557. " left join enumdicitem e" +
  558. " on e.enumitemname = g.goodunitid" +
  559. " and e.enumdiccode = 'goodsunit'" +
  560. " where 1 = 1"
  561. if r.IncludeSub == 1 {
  562. sqlId.JoinFormat(" and u.subarealevelpath like '%%,%v,%%'", r.USERID)
  563. } else {
  564. sqlId.And("u.parentuserid", r.USERID)
  565. }
  566. sqlId.AndEx("ui.USERINFOTYPE", r.USERINFOTYPE, r.USERINFOTYPE > 0)
  567. sqlId.AndEx("m.TRADEMODE", r.TRADEMODE, r.TRADEMODE > 0)
  568. sqlId.AndEx("t.goodsid", r.GOODSID, r.GOODSID > 0)
  569. if len(r.FilterName) > 0 {
  570. sqlId.JoinFormat(" and (k.logincode like '%%%v%%' or u.accountname like '%%%v%%')", r.FilterName, r.FilterName)
  571. }
  572. return sqlId.String()
  573. }
  574. // GetDataEx 获取持仓汇总
  575. func (r *QhjMgrTradePosition) GetDataEx() (interface{}, error) {
  576. sData := make([]QhjMgrTradePosition, 0)
  577. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  578. sData2 := make([]QhjMgrPositionRsp, 0)
  579. for i := range sData {
  580. sData[i].calc()
  581. v := QhjMgrPositionRsp{QhjTradeEx: sData[i].QhjTradeEx}
  582. v.GOODSID = sData[i].GOODSID
  583. v.ACCOUNTID, v.HOLDERTYPE = sData[i].ACCOUNTID, sData[i].HOLDERTYPE
  584. v.HOLDERAMOUNT = sData[i].BUYCURHOLDERAMOUNT
  585. v.HOLDERQTY = sData[i].BUYCURPOSITIONQTY
  586. v.FROZENQTY = sData[i].BUYFROZENQTY
  587. v.AVIALQTY = v.HOLDERQTY - v.FROZENQTY
  588. zoomFun := NewZoomFun(int(v.QTYDECIMALPLACE))
  589. zoomFun(&v.HOLDERQTY, &v.FROZENQTY, &v.AVIALQTY)
  590. if v.HOLDERQTY > 1e-10 {
  591. v.AVERAGEPRICE = v.HOLDERAMOUNT / v.HOLDERQTY
  592. }
  593. sData2 = append(sData2, v)
  594. }
  595. return sData2, err
  596. }
  597. // QhjMgrTradeDetailRsp
  598. type QhjMgrTradeDetailRsp struct {
  599. TRADEID string `json:"tradeid"` // 成交单号
  600. GOODSID int32 `json:"goodsid"` // 商品id
  601. BUYORSELL int32 `json:"buyorsell"` // 成交类型(方向) 0:买 1:卖
  602. ORDERID string `json:"orderid"` // 关联委托单号
  603. TRADEDATE string `json:"tradedate"` // 交易日
  604. ACCOUNTID int64 `json:"accountid"` // 资金账号
  605. TRADETIME string `json:"tradetime"` // 成交时间
  606. TRADEPRICE float64 `json:"tradeprice"` // 价格
  607. TRADEQTY float64 `json:"tradeqty"` // 数量
  608. TRADEAMOUNT float64 `json:"tradeamount"` // 金额
  609. QhjTradeEx `xorm:"extends"`
  610. }
  611. // QhjMgrTradeDetail 成交明细
  612. type QhjMgrTradeDetail struct {
  613. TRADEID string `json:"tradeid" xorm:"TRADEID2"` // 成交单号(101+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  614. BUYORSELL int32 `json:"buyorsell" xorm:"BUYORSELL"` // 方向 - 0:买 1:卖
  615. ORDERID string `json:"orderid" xorm:"ORDERID2"` // 委托单号
  616. TRADEDATE string `json:"tradedate" xorm:"TRADEDATE"` // 交易日(yyyyMMdd)
  617. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 账户ID[报价币种]
  618. GOODSID int32 `json:"goodsid" xorm:"GOODSID"` // 商品ID
  619. MEMBERUSERID int64 `json:"memberuserid" xorm:"MEMBERUSERID"` // 会员id 个人投资者 需要填写
  620. MATCHACCOUNTID int64 `json:"matchaccountid" xorm:"MATCHACCOUNTID"` // 对手账号id
  621. TRADETIME string `json:"tradetime" xorm:"TRADETIME2"` // 成交时间
  622. TRADEPRICE float64 `json:"tradeprice" xorm:"TRADEPRICE"` // 成交价格
  623. TRADEQTY float64 `json:"tradeqty" xorm:"TRADEQTY"` // 成交数量
  624. TRADEAMOUNT float64 `json:"tradeamount" xorm:"TRADEAMOUNT"` // 成交金额[账户币种,用于所有权]
  625. CLOSEPL float64 `json:"closepl" xorm:"CLOSEPL"` // 平仓盈亏
  626. INTCLOSEPL int64 `json:"intclosepl" xorm:"INTCLOSEPL"` // 整型盈亏(用于交易结算试算平衡-收益权)
  627. OPENCHARGE float64 `json:"opencharge" xorm:"OPENCHARGE"` // 建仓手续费(支付总手续费=(交易所比率+会员比率)*成交金额)
  628. CLOSECHARGE float64 `json:"closecharge" xorm:"CLOSECHARGE"` // 平仓手续费(支付总手续费=(交易所比率+会员比率)*成交金额)
  629. TRADETYPE int32 `json:"tradetype" xorm:"TRADETYPE"` // 成交类别 - 1:正常委托成交 2:定向做市成交(接单) 3:交割协议平仓成交 4:交割减仓成交 5:到期强平成交 6:风控斩仓成交 7:协议平仓(管理端)成交 8:仓单转持仓成交 9: 交割协议转让成交 10:受托竞价成交(接单) 11:协议转让成交 12:系统强行平仓 13:期权违约平仓
  630. BUILDTYPE int32 `json:"buildtype" xorm:"BUILDTYPE"` // 委托单据类型 1:建仓 2:平仓 3:先平后建
  631. OPENQTY float64 `json:"openqty" xorm:"OPENQTY"` // 开仓数量(先建后平操作 需要记录)
  632. CLOSEQTY float64 `json:"closeqty" xorm:"CLOSEQTY"` // 平仓数量(先建后平操作 需要记录)
  633. STATUS int32 `json:"status" xorm:"STATUS"` // 处理状态 - 1:待处理 2:已处理 3:处理失败
  634. ISRECKONED int32 `json:"isreckoned" xorm:"ISRECKONED"` // 是否结算 - 0:未结算 1:已结算
  635. TRADEPROPERTY int32 `json:"tradeproperty" xorm:"TRADEPROPERTY"` // 交易属性
  636. OPENFEEALGORITHM int32 `json:"openfeealgorithm" xorm:"OPENFEEALGORITHM"` // 建仓手续费收取方式 1:比率 2:固定
  637. OPENMEMBERCHARGEVALUE float64 `json:"openmemberchargevalue" xorm:"OPENMEMBERCHARGEVALUE"` // 建仓会员手续费设置值
  638. OPENEXCHAGECHARGEVALUE float64 `json:"openexchagechargevalue" xorm:"OPENEXCHAGECHARGEVALUE"` // 建仓交易所手续费设置值
  639. CLOSEFEEALGORITHM int32 `json:"closefeealgorithm" xorm:"CLOSEFEEALGORITHM"` // 平仓手续费收取方式 1:比率 2:固定
  640. CLOSEMEMBERCHARGEVALUE float64 `json:"closememberchargevalue" xorm:"CLOSEMEMBERCHARGEVALUE"` // 平仓会员手续费设置值
  641. CLOSEEXCHAGECHARGEVALUE float64 `json:"closeexchagechargevalue" xorm:"CLOSEEXCHAGECHARGEVALUE"` // 平仓交易所手续费设置值
  642. OPTIONTYPE int32 `json:"optiontype" xorm:"OPTIONTYPE"` // 期权类型 - 1:认购(看涨) 2:认沽(看跌)
  643. PREMIUM float64 `json:"premium" xorm:"PREMIUM"` // 权利金 - [持仓单的权利金]
  644. ISPREEXERCISE int32 `json:"ispreexercise" xorm:"ISPREEXERCISE"` // 是否预申报- 0:否 1:是
  645. PREEXERCISEPRICE float64 `json:"preexerciseprice" xorm:"PREEXERCISEPRICE"` // 预申报价格
  646. ISCONFIRMEXERCISE int32 `json:"isconfirmexercise" xorm:"ISCONFIRMEXERCISE"` // 是否确认行权- 0:否 1:是
  647. ISMAIN int32 `json:"ismain" xorm:"ISMAIN"` // 是否主单 - 0:不是 1:是
  648. PERFORMANCEPLANID int64 `json:"performanceplanid" xorm:"PERFORMANCEPLANID"` // 履约计划ID[期权]
  649. PERFORMANCESTATUS int32 `json:"performancestatus" xorm:"PERFORMANCESTATUS"` // 履约状态[期权] - 0:无履约 1:未履约 2:履约中 3:履约完成
  650. CREDITAMOUNT float64 `json:"creditamount" xorm:"CREDITAMOUNT"` // 授信金额
  651. GCACCOUNTID int64 `json:"gcaccountid" xorm:"GCACCOUNTID"` // 账户ID[合约币种]
  652. CLOSEPL2 float64 `json:"closepl2" xorm:"CLOSEPL2"` // 平仓盈亏[逐笔]
  653. RELATEDOUTTRADEID int64 `json:"relatedouttradeid" xorm:"RELATEDOUTTRADEID"` // 关联外部成交单ID
  654. QhjTradeEx `xorm:"extends"`
  655. IncludeSub int32 `json:"-"` // 是否包含子级 1-包含
  656. BeginDate string `json:"-"` // 开始交易日
  657. EndDate string `json:"-"` // 结束交易日
  658. FilterName string `json:"-"` // 模糊搜索
  659. }
  660. func (r *QhjMgrTradeDetail) calc() {
  661. r.dealConvert()
  662. }
  663. func (r *QhjMgrTradeDetail) buildSql(bQueryHis bool) string {
  664. var sqlId utils.SQLVal = "with k as" +
  665. " (select t.userid, wm_concat(t.logincode) logincode" +
  666. " from loginaccount t" +
  667. " group by t.userid)" +
  668. "select u.userid," +
  669. " u.accountname," +
  670. " k.logincode," +
  671. " u.subarealevelpath," +
  672. " ui.userinfotype," +
  673. " ui.mobile," +
  674. " g.goodsname," +
  675. " g.goodscode," +
  676. " g.goodunitid," +
  677. " g.qtydecimalplace," +
  678. " g.decimalplace," +
  679. " g.agreeunit," +
  680. " m.marketid," +
  681. " m.trademode," +
  682. " e.enumdicname," +
  683. " to_char(t.TRADEID) TRADEID2," +
  684. " to_char(t.ORDERID) ORDERID2," +
  685. " to_char(t.TRADETIME, 'yyyy-mm-dd hh24:mi:ss') TRADETIME2," +
  686. " t.*" +
  687. " from %v t" +
  688. " inner join taaccount ta" +
  689. " on t.accountid = ta.accountid" +
  690. " inner join useraccount u" +
  691. " on ta.relateduserid = u.userid" +
  692. " inner join userinfo ui" +
  693. " on u.userid = ui.userid" +
  694. " left join k" +
  695. " on u.userid = k.userid" +
  696. " left join goods g" +
  697. " on t.goodsid = g.goodsid" +
  698. " left join market m on g.marketid=m.marketid" +
  699. " left join enumdicitem e" +
  700. " on e.enumitemname = g.goodunitid" +
  701. " and e.enumdiccode = 'goodsunit'" +
  702. " where 1 = 1"
  703. if bQueryHis {
  704. sqlId.FormatParam("his_trade_tradedetail")
  705. sqlId.And("t.isvaliddata", 1)
  706. } else {
  707. sqlId.FormatParam("trade_tradedetail")
  708. }
  709. if r.IncludeSub == 1 {
  710. sqlId.JoinFormat(" and u.subarealevelpath like '%%,%v,%%'", r.USERID)
  711. } else {
  712. sqlId.And("u.parentuserid", r.USERID)
  713. }
  714. sqlId.AndEx("ui.USERINFOTYPE", r.USERINFOTYPE, r.USERINFOTYPE > 0)
  715. sqlId.AndEx("m.TRADEMODE", r.TRADEMODE, r.TRADEMODE > 0)
  716. sqlId.AndEx("t.goodsid", r.GOODSID, r.GOODSID > 0)
  717. if len(r.BeginDate) > 0 {
  718. sqlId.JoinFormat(" and t.TRADEDATE >=%v", r.BeginDate)
  719. }
  720. if len(r.EndDate) > 0 {
  721. sqlId.JoinFormat(" and t.TRADEDATE <=%v", r.EndDate)
  722. }
  723. if len(r.FilterName) > 0 {
  724. sqlId.JoinFormat(" and (k.logincode like '%%%v%%' or u.accountname like '%%%v%%')", r.FilterName, r.FilterName)
  725. }
  726. return sqlId.String()
  727. }
  728. // GetDataEx 获取成交明细
  729. func (r *QhjMgrTradeDetail) GetDataEx() (interface{}, error) {
  730. sData := make([]QhjMgrTradeDetail, 0)
  731. sCurData := make([]QhjMgrTradeDetail, 0)
  732. err := db.GetEngine().SQL(r.buildSql(false)).Find(&sCurData)
  733. sHisData := make([]QhjMgrTradeDetail, 0)
  734. err = db.GetEngine().SQL(r.buildSql(true)).Find(&sHisData)
  735. sData2 := make([]QhjMgrTradeDetailRsp, 0)
  736. sData = append(sData, sCurData...)
  737. sData = append(sData, sHisData...)
  738. for i := range sData {
  739. sData[i].calc()
  740. v := QhjMgrTradeDetailRsp{QhjTradeEx: sData[i].QhjTradeEx}
  741. v.ACCOUNTID, v.TRADEID = sData[i].ACCOUNTID, sData[i].TRADEID
  742. v.TRADEAMOUNT, v.TRADEQTY = sData[i].TRADEAMOUNT, sData[i].TRADEQTY
  743. v.TRADEDATE, v.TRADETIME = sData[i].TRADEDATE, sData[i].TRADETIME
  744. v.GOODSID, v.ORDERID = sData[i].GOODSID, sData[i].ORDERID
  745. v.TRADEPRICE, v.BUYORSELL = sData[i].TRADEPRICE, sData[i].BUYORSELL
  746. zoonFun := NewZoomFun(int(v.QTYDECIMALPLACE))
  747. zoonFun(&v.TRADEQTY)
  748. sData2 = append(sData2, v)
  749. }
  750. return sData2, err
  751. }
  752. // QhjMgrTradeOrderDetailRsp 委托明细(给终端)
  753. type QhjMgrTradeOrderDetailRsp struct {
  754. GOODSID int32 `json:"goodsid"` // 商品id
  755. ORDERID string `json:"orderid"` // 关联委托单号
  756. TRADEDATE string `json:"tradedate"` // 交易日
  757. ACCOUNTID int64 `json:"accountid"` // 资金账号
  758. ORDERTIME string `json:"ordertime"` // 委托时间
  759. ORDERPRICE float64 `json:"orderprice"` // 价格
  760. ORDERQTY float64 `json:"orderqty"` // 数量
  761. AMOUNT float64 `json:"amount"` // 金额
  762. ORDERSTATUS int32 `json:"orderstatus"` // 委托状态 - 1: 委托请求 2:待冻结 3:委托成功 4: 委托失败 5:配对成功 6: 已撤销 7:部分成交 8:已成交 9:部成部撤 10:成交失败 11:已拒绝 12:经过摘牌(先摘后挂专用-先摘后挂已摘过) 13:冻结成功(通道交易专用) 14:通道已撤 15:通道部成部撤 16:成交失败违约(荷兰式竞拍专用)
  763. QhjTradeEx `xorm:"extends"`
  764. }
  765. // QhjMgrTradeOrderDetail 委托明细
  766. type QhjMgrTradeOrderDetail struct {
  767. CLOSEMEMBERCHARGEVALUE float64 `json:"closememberchargevalue" xorm:"CLOSEMEMBERCHARGEVALUE"` // 平仓会员手续费设置值
  768. CLOSEEXCHAGECHARGEVALUE float64 `json:"closeexchagechargevalue" xorm:"CLOSEEXCHAGECHARGEVALUE"` // 平仓交易所手续费设置值
  769. OPTIONTYPE int32 `json:"optiontype" xorm:"OPTIONTYPE"` // 期权类型 - 1:认购(看涨) 2:认沽(看跌)
  770. PREMIUM float64 `json:"premium" xorm:"PREMIUM"` // 权利金
  771. ISPREEXERCISE int32 `json:"ispreexercise" xorm:"ISPREEXERCISE"` // 是否预申报- 0:否 1:是
  772. PREEXERCISEPRICE float64 `json:"preexerciseprice" xorm:"PREEXERCISEPRICE"` // 预申报价格
  773. ISCONFIRMEXERCISE int32 `json:"isconfirmexercise" xorm:"ISCONFIRMEXERCISE"` // 是否确认行权- 0:否 1:是
  774. QUOTEID int64 `json:"quoteid" xorm:"QUOTEID"` // 报价单ID
  775. GCACCOUNTID int64 `json:"gcaccountid" xorm:"GCACCOUNTID"` // 账户ID[合约币种]
  776. SESSIONID int64 `json:"sessionid" xorm:"SESSIONID"` // 会话ID
  777. FREEZEQTY float64 `json:"freezeqty" xorm:"FREEZEQTY"` // 冻结数量
  778. AMOUNTFLAG int32 `json:"amountflag" xorm:"AMOUNTFLAG"` // 资金标识 - 1:余额 2;待付
  779. ORDERFLAG int32 `json:"orderflag" xorm:"ORDERFLAG"` // 委托标识 - 1:按量 2:按金额
  780. ORDERID string `json:"orderid" xorm:"ORDERID2"` // 委托单号(100+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  781. TRADEDATE string `json:"tradedate" xorm:"TRADEDATE"` // 交易日(yyyyMMdd)
  782. BUILDTYPE int32 `json:"buildtype" xorm:"BUILDTYPE"` // 委托单据类型 - 1:建仓 2:平仓 3:先平后建
  783. PREORDERID string `json:"preorderid" xorm:"PREORDERID"` // 关联预埋单号(止盈止损单时填写)
  784. CANCELORDERID int64 `json:"cancelorderid" xorm:"CANCELORDERID"` // 撤单单号(撤单时填写)
  785. RELATEDID string `json:"relatedid" xorm:"RELATEDID"` // 关联单号(交割单)
  786. MARKETID int32 `json:"marketid" xorm:"MARKETID"` // 市场ID
  787. GOODSID int32 `json:"goodsid" xorm:"GOODSID"` // 商品ID
  788. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 账户ID[报价币种]
  789. MEMBERUSERID int64 `json:"memberuserid" xorm:"MEMBERUSERID"` // 所属会员UserID
  790. BUYORSELL int32 `json:"buyorsell" xorm:"BUYORSELL"` // 买卖 - 0:买 1:卖
  791. PRICEMODE int32 `json:"pricemode" xorm:"PRICEMODE"` // 取价方式 - 1:市价 2: 限价
  792. ORDERPRICE float64 `json:"orderprice" xorm:"ORDERPRICE"` // 委托价格
  793. MARKETMAXSUB float64 `json:"marketmaxsub" xorm:"MARKETMAXSUB"` // 市价最大偏移范围
  794. ORDERQTY float64 `json:"orderqty" xorm:"ORDERQTY"` // 委托数量
  795. TRADEQTY float64 `json:"tradeqty" xorm:"TRADEQTY"` // 成交数量
  796. CANCELQTY float64 `json:"cancelqty" xorm:"CANCELQTY"` // 撤单数量
  797. OPENQTY float64 `json:"openqty" xorm:"OPENQTY"` // 开仓数量(先建后平操作,需要记录)
  798. CLOSEQTY float64 `json:"closeqty" xorm:"CLOSEQTY"` // 平仓数量(先建后平操作 需要记录)
  799. OPENTRADEQTY float64 `json:"opentradeqty" xorm:"OPENTRADEQTY"` // 开仓成交数量(先建后平操作,需要记录)
  800. CLOSETRADEQTY float64 `json:"closetradeqty" xorm:"CLOSETRADEQTY"` // 平仓成交数量(先建后平操作,需要记录)
  801. FREEZEMARGIN float64 `json:"freezemargin" xorm:"FREEZEMARGIN"` // 冻结保证金(冻结交易金额)
  802. UNFREEZEMARGIN float64 `json:"unfreezemargin" xorm:"UNFREEZEMARGIN"` // 解冻保证金
  803. FREEZECHARGE float64 `json:"freezecharge" xorm:"FREEZECHARGE"` // 冻结手续费
  804. UNFREEZECHARGE float64 `json:"unfreezecharge" xorm:"UNFREEZECHARGE"` // 解冻手续费
  805. OPENFREEZECHARGE float64 `json:"openfreezecharge" xorm:"OPENFREEZECHARGE"` // 开仓冻结手续费(先建后平操作,需要记录)
  806. CLOSEFREEZECHARGE float64 `json:"closefreezecharge" xorm:"CLOSEFREEZECHARGE"` // 平仓冻结手续费(先建后平操作,需要记录)
  807. OPENUNFREEZECHARGE float64 `json:"openunfreezecharge" xorm:"OPENUNFREEZECHARGE"` // 开仓解冻手续费(先建后平操作,需要记录)
  808. CLOSEUNFREEZECHARGE float64 `json:"closeunfreezecharge" xorm:"CLOSEUNFREEZECHARGE"` // 平仓解冻手续费(先建后平操作,需要记录)
  809. VALIDTYPE int32 `json:"validtype" xorm:"VALIDTYPE"` // 有效类型 - 1当日有效 2本周有效 3指定日期有效 4一直有效 5指定时间有效
  810. VALIDTIME string `json:"validtime" xorm:"VALIDTIME"` // 有效期限
  811. VOLUMETYPE int32 `json:"volumetype" xorm:"VOLUMETYPE"` // 当时间有效类型为 “立即执行否则取消 IOC” 时,需要此项 - 0:任意量 1:最小量(暂时不支持) 2:全部量
  812. OPERATETYPE int32 `json:"operatetype" xorm:"OPERATETYPE"` // 操作类型 - 1:正常下单 2:斩仓 3:转单 4:结算撤单 5:系统卖出(适用于先平后建的卖出) 6:行情源报价 7:(结算)到期强平 8:(结算)协议转让 9:系统对冲单 10:(结算)到期无效 11:交割协议转让 12:交割协议平仓 13:交割成交(所有权) 14:管理端强行平仓 15:管理端协议转让 ... 23:融资买入
  813. ORDERTIME string `json:"ordertime" xorm:"ORDERTIME2"` // 委托时间
  814. ORDERSRC int32 `json:"ordersrc" xorm:"ORDERSRC"` // 委托来源 - 1:客户端 2:管理端 3:风控服务 4:交割服务 5:交易服务 6:交易日结 7:商品强平 8:管理端商品退市强平 9:交易接口 10:交割服务商被动(受托竞价) 11:预埋触发
  815. ORDERSTATUS int32 `json:"orderstatus" xorm:"ORDERSTATUS"` // 委托状态 - 1: 委托请求 2:待冻结 3:委托成功 4: 委托失败 5:配对成功 6: 已撤销 7:部分成交 8:已成交 9:部成部撤 10:成交失败 11:已拒绝 12:经过摘牌(先摘后挂专用-先摘后挂已摘过) 13:冻结成功(通道交易专用) 14:通道已撤 15:通道部成部撤 16:成交失败违约(荷兰式竞拍专用)
  816. OPERATORID int64 `json:"operatorid" xorm:"OPERATORID"` // 登录账号(LoginID)
  817. UPDATETIME string `json:"updatetime" xorm:"UPDATETIME"` // 更新时间
  818. CLIENTORDERTIME string `json:"clientordertime" xorm:"CLIENTORDERTIME"` // 客户端委托时间
  819. CLIENTTICKET string `json:"clientticket" xorm:"CLIENTTICKET"` // 客户端流水号
  820. UUID string `json:"uuid" xorm:"UUID"` // 发起端唯一id
  821. CLIENTTYPE int32 `json:"clienttype" xorm:"CLIENTTYPE"` // 客户端类型 - 0:保留为未填终端类型 1:PC管理端 2:PC交易端 3:手机客户端_安卓 4:网页客户端 5:微信客户端 6:手机客户端_苹果 7:网上开户客户端 8:无效终端编号 9:报价终端(中江)
  822. RETCODE int32 `json:"retcode" xorm:"RETCODE"` // 错误代码
  823. TRADEPROPERTY int32 `json:"tradeproperty" xorm:"TRADEPROPERTY"` // 交易属性
  824. LISTINGSELECTTYPE int32 `json:"listingselecttype" xorm:"LISTINGSELECTTYPE"` // 挂牌点选类型 - 1:挂牌 2:摘牌 3:先摘后挂
  825. DELISTINGTYPE int32 `json:"delistingtype" xorm:"DELISTINGTYPE"` // 摘牌类型 - 1:价格最优 2:点选成交
  826. MARGINALGORITHM int32 `json:"marginalgorithm" xorm:"MARGINALGORITHM"` // 保证金收取方式 1:比率 2:固定
  827. MARGINVALUE float64 `json:"marginvalue" xorm:"MARGINVALUE"` // 即市保证金设置值
  828. OPENFEEALGORITHM int32 `json:"openfeealgorithm" xorm:"OPENFEEALGORITHM"` // 建仓手续费收取方式 1:比率 2:固定
  829. OPENMEMBERCHARGEVALUE float64 `json:"openmemberchargevalue" xorm:"OPENMEMBERCHARGEVALUE"` // 建仓会员手续费设置值
  830. OPENEXCHAGECHARGEVALUE float64 `json:"openexchagechargevalue" xorm:"OPENEXCHAGECHARGEVALUE"` // 建仓交易所手续费设置值
  831. CLOSEFEEALGORITHM int32 `json:"closefeealgorithm" xorm:"CLOSEFEEALGORITHM"` // 平仓手续费收取方式 1:比率 2:固定
  832. QhjTradeEx `xorm:"extends"`
  833. IncludeSub int32 `json:"-"` // 是否包含子级 1-包含
  834. BeginDate string `json:"-"` // 开始交易日
  835. EndDate string `json:"-"` // 结束交易日
  836. FilterName string `json:"-"` // 模糊搜索
  837. }
  838. func (r *QhjMgrTradeOrderDetail) calc() {
  839. r.dealConvert()
  840. }
  841. func (r *QhjMgrTradeOrderDetail) buildSql(bQueryHis bool) string {
  842. var sqlId utils.SQLVal = "with k as" +
  843. " (select t.userid, wm_concat(t.logincode) logincode" +
  844. " from loginaccount t" +
  845. " group by t.userid)" +
  846. "select u.userid," +
  847. " u.accountname," +
  848. " k.logincode," +
  849. " u.subarealevelpath," +
  850. " ui.userinfotype," +
  851. " ui.mobile," +
  852. " g.goodsname," +
  853. " g.goodscode," +
  854. " g.goodunitid," +
  855. " g.qtydecimalplace," +
  856. " g.decimalplace," +
  857. " g.agreeunit," +
  858. " m.marketid," +
  859. " m.trademode," +
  860. " e.enumdicname," +
  861. " to_char(t.ORDERID) ORDERID2," +
  862. " to_char(t.ordertime, 'yyyy-mm-dd hh24:mi:ss') ORDERTIME2," +
  863. " t.*" +
  864. " from %v t" +
  865. " inner join taaccount ta" +
  866. " on t.accountid = ta.accountid" +
  867. " inner join useraccount u" +
  868. " on ta.relateduserid = u.userid" +
  869. " inner join userinfo ui" +
  870. " on u.userid = ui.userid" +
  871. " left join k" +
  872. " on u.userid = k.userid" +
  873. " left join goods g" +
  874. " on t.goodsid = g.goodsid" +
  875. " left join market m" +
  876. " on g.marketid = m.marketid" +
  877. " left join enumdicitem e" +
  878. " on e.enumitemname = g.goodunitid" +
  879. " and e.enumdiccode = 'goodsunit'" +
  880. " where 1 = 1"
  881. if bQueryHis {
  882. sqlId.FormatParam("his_trade_orderdetail")
  883. sqlId.And("t.isvaliddata", 1)
  884. } else {
  885. sqlId.FormatParam("trade_orderdetail")
  886. }
  887. if r.IncludeSub == 1 {
  888. sqlId.JoinFormat(" and u.subarealevelpath like '%%,%v,%%'", r.USERID)
  889. } else {
  890. sqlId.And("u.parentuserid", r.USERID)
  891. }
  892. sqlId.AndEx("ui.USERINFOTYPE", r.USERINFOTYPE, r.USERINFOTYPE > 0)
  893. sqlId.AndEx("m.TRADEMODE", r.TRADEMODE, r.TRADEMODE > 0)
  894. sqlId.AndEx("t.goodsid", r.GOODSID, r.GOODSID > 0)
  895. if len(r.BeginDate) > 0 {
  896. sqlId.JoinFormat(" and t.TRADEDATE >=%v", r.BeginDate)
  897. }
  898. if len(r.EndDate) > 0 {
  899. sqlId.JoinFormat(" and t.TRADEDATE <=%v", r.EndDate)
  900. }
  901. if len(r.FilterName) > 0 {
  902. sqlId.JoinFormat(" and (k.logincode like '%%%v%%' or u.accountname like '%%%v%%')", r.FilterName, r.FilterName)
  903. }
  904. return sqlId.String()
  905. }
  906. // GetDataEx 获取委托明细
  907. func (r *QhjMgrTradeOrderDetail) GetDataEx() (interface{}, error) {
  908. sData := make([]QhjMgrTradeOrderDetail, 0)
  909. sCurData := make([]QhjMgrTradeOrderDetail, 0)
  910. err := db.GetEngine().SQL(r.buildSql(false)).Find(&sCurData)
  911. sHisData := make([]QhjMgrTradeOrderDetail, 0)
  912. err = db.GetEngine().SQL(r.buildSql(true)).Find(&sHisData)
  913. sData2 := make([]QhjMgrTradeOrderDetailRsp, 0)
  914. sData = append(sData, sCurData...)
  915. sData = append(sData, sHisData...)
  916. for i := range sData {
  917. sData[i].calc()
  918. v := QhjMgrTradeOrderDetailRsp{QhjTradeEx: sData[i].QhjTradeEx}
  919. v.ACCOUNTID, v.ORDERID = sData[i].ACCOUNTID, sData[i].ORDERID
  920. v.ORDERPRICE, v.ORDERQTY = sData[i].ORDERPRICE, sData[i].ORDERQTY
  921. v.TRADEDATE, v.ORDERTIME = sData[i].TRADEDATE, sData[i].ORDERTIME
  922. v.GOODSID, v.ORDERSTATUS = sData[i].GOODSID, sData[i].ORDERSTATUS
  923. zoonFun := NewZoomFun(int(v.QTYDECIMALPLACE))
  924. zoonFun(&v.ORDERQTY)
  925. v.AMOUNT = v.ORDERPRICE * v.ORDERQTY * v.AGREEUNIT
  926. sData2 = append(sData2, v)
  927. }
  928. return sData2, err
  929. }
  930. // QhjMgrTradePayOrder 待付款单据
  931. type QhjMgrTradePayOrder struct {
  932. TRADEID string `json:"tradeid" xorm:"TRADEID"` // 成交单号(101+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  933. TRADEDATE string `json:"tradedate" xorm:"TRADEDATE"` // 交易日(yyyyMMdd)
  934. MARKETID int32 `json:"marketid" xorm:"MARKETID"` // 市场ID
  935. GOODSID int32 `json:"goodsid" xorm:"GOODSID"` // 商品ID
  936. BUYORDERID string `json:"buyorderid" xorm:"BUYORDERID"` // 买方委托单号(关联单号)
  937. BUYACCOUNTID int64 `json:"buyaccountid" xorm:"BUYACCOUNTID"` // 买方账号ID[报价币种]
  938. SELLORDERID string `json:"sellorderid" xorm:"SELLORDERID"` // 卖方委托单号
  939. SELLACCOUNTID int64 `json:"sellaccountid" xorm:"SELLACCOUNTID"` // 卖方账号ID[报价币种]
  940. TRADEAMOUNT float64 `json:"tradeamount" xorm:"TRADEAMOUNT"` // 成交金额(优惠后金额)
  941. TRADECHARGE float64 `json:"tradecharge" xorm:"TRADECHARGE"` // 成交手续费(买方)
  942. PAYFLAG int32 `json:"payflag" xorm:"PAYFLAG"` // 付款标识 - 1:未支付 2:已支付 3:已过期 4:已撤销 5:结算过期 6:预售终止
  943. CREATETIME string `json:"createtime" xorm:"CREATETIME2"` // 创建时间
  944. PAYTIME string `json:"paytime" xorm:"PAYTIME2"` // 付款时间
  945. PAYLIMITEDTIME string `json:"paylimitedtime" xorm:"PAYLIMITEDTIME2"` // 支付期限
  946. OFFAMOUNT float64 `json:"offamount" xorm:"OFFAMOUNT"` // 优惠金额
  947. TRADEPRICE float64 `json:"tradeprice" xorm:"TRADEPRICE"` // 成交价格(价格)
  948. TRADEQTY float64 `json:"tradeqty" xorm:"TRADEQTY"` // 成交数量(数量)
  949. PAYAMOUNT float64 `json:"payamount" xorm:"PAYAMOUNT"` // 支付金额(金额)
  950. OPERATETYPE int32 `json:"operatetype" xorm:"OPERATETYPE"` // 买委托操作类型 - 1:正常下单 16:融资买入
  951. ADVANCERATIO float64 `json:"advanceratio" xorm:"ADVANCERATIO"` // 首付比率
  952. TRADETIME string `json:"tradetime"` // 成交时间
  953. QhjTradeEx `xorm:"extends"`
  954. IncludeSub int32 `json:"-"` // 是否包含子级 1-包含
  955. BeginDate string `json:"-"` // 开始交易日
  956. EndDate string `json:"-"` // 结束交易日
  957. FilterName string `json:"-"` // 模糊搜索
  958. FilterPayFlag string `json:"-"` // 付款标识
  959. }
  960. func (r *QhjMgrTradePayOrder) calc() {
  961. ZoomByDecimal(int(r.QTYDECIMALPLACE), &r.TRADEQTY)
  962. r.TRADETIME = r.CREATETIME
  963. r.dealConvert()
  964. }
  965. func (r *QhjMgrTradePayOrder) buildSql() string {
  966. var sqlId utils.SQLVal = "with k as" +
  967. " (select t.userid, wm_concat(t.logincode) logincode" +
  968. " from loginaccount t" +
  969. " group by t.userid)" +
  970. "select u.userid," +
  971. " u.accountname," +
  972. " k.logincode," +
  973. " u.subarealevelpath," +
  974. " ui.userinfotype," +
  975. " ui.mobile," +
  976. " g.goodsname," +
  977. " g.goodscode," +
  978. " g.goodunitid," +
  979. " g.qtydecimalplace," +
  980. " g.decimalplace," +
  981. " g.agreeunit," +
  982. " m.marketid," +
  983. " m.trademode," +
  984. " e.enumdicname," +
  985. " to_char(t.BUYORDERID) BUYORDERID2," +
  986. " to_char(t.TRADEID) TRADEID2," +
  987. " to_char(t.Paylimitedtime, 'yyyy-mm-dd hh24:mi:ss') Paylimitedtime2," +
  988. " to_char(t.PAYTIME, 'yyyy-mm-dd hh24:mi:ss') PAYTIME2," +
  989. " to_char(t.CREATETIME, 'yyyy-mm-dd hh24:mi:ss') CREATETIME2," +
  990. " t.*" +
  991. " from TRADE_PAYORDER t" +
  992. " inner join taaccount ta" +
  993. " on t.buyaccountid = ta.accountid" +
  994. " inner join useraccount u" +
  995. " on ta.relateduserid = u.userid" +
  996. " inner join userinfo ui" +
  997. " on u.userid = ui.userid" +
  998. " left join k" +
  999. " on u.userid = k.userid" +
  1000. " left join goods g" +
  1001. " on t.goodsid = g.goodsid" +
  1002. " left join market m" +
  1003. " on g.marketid = m.marketid" +
  1004. " left join enumdicitem e" +
  1005. " on e.enumitemname = g.goodunitid" +
  1006. " and e.enumdiccode = 'goodsunit'" +
  1007. " where 1 = 1"
  1008. if r.IncludeSub == 1 {
  1009. sqlId.JoinFormat(" and u.subarealevelpath like '%%,%v,%%'", r.USERID)
  1010. } else {
  1011. sqlId.And("u.parentuserid", r.USERID)
  1012. }
  1013. sqlId.AndEx("ui.USERINFOTYPE", r.USERINFOTYPE, r.USERINFOTYPE > 0)
  1014. sqlId.AndEx("m.TRADEMODE", r.TRADEMODE, r.TRADEMODE > 0)
  1015. sqlId.AndEx("t.goodsid", r.GOODSID, r.GOODSID > 0)
  1016. if len(r.FilterPayFlag) > 0 {
  1017. sqlId.JoinFormat(" and t.PAYFLAG in(%v)", r.FilterPayFlag)
  1018. }
  1019. if len(r.BeginDate) > 0 {
  1020. sqlId.JoinFormat(" and t.TRADEDATE >=%v", r.BeginDate)
  1021. }
  1022. if len(r.EndDate) > 0 {
  1023. sqlId.JoinFormat(" and t.TRADEDATE <=%v", r.EndDate)
  1024. }
  1025. if len(r.FilterName) > 0 {
  1026. sqlId.JoinFormat(" and (k.logincode like '%%%v%%' or u.accountname like '%%%v%%')", r.FilterName, r.FilterName)
  1027. }
  1028. return sqlId.String()
  1029. }
  1030. // GetDataEx 获取待付款单据
  1031. func (r *QhjMgrTradePayOrder) GetDataEx() (interface{}, error) {
  1032. sData := make([]QhjMgrTradePayOrder, 0)
  1033. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1034. for i := range sData {
  1035. sData[i].calc()
  1036. }
  1037. return sData, err
  1038. }
  1039. // QhjMgrContract 千海金融资明细(合同)
  1040. type QhjMgrContract struct {
  1041. USERID int64 `json:"userid" xorm:"USERID"` // 用户ID
  1042. SCFCONTRACTID string `json:"scfcontractid" xorm:"SCFCONTRACTID"` // SCF合同ID(310+Unix秒时间戳(10位)+xxxxxx)
  1043. SCFCONTRACTTYPE int32 `json:"scfcontracttype" xorm:"SCFCONTRACTTYPE"` // 合同类型 - 1:仓单回购 2:仓单质押 3:合作套保 4:资金贷款 5:融资单
  1044. GOODSID int32 `json:"goodsid" xorm:"GOODSID"` // 商品ID [5:融资单]
  1045. CONTRACTCONFIRMTIME string `json:"contractconfirmtime" xorm:"CONTRACTCONFIRMTIME"` // 合同确认时间(时间)
  1046. WRQTY float64 `json:"wrqty" xorm:"WRQTY"` // 仓单数量(数量)
  1047. TRADEPRICE float64 `json:"tradeprice" xorm:"TRADEPRICE"` // 成交价格(成本价格)
  1048. LENDERAMOUNT float64 `json:"lenderamount" xorm:"LENDERAMOUNT"` // 贷款金额(总额|订单总额)
  1049. MARGINRATIO float64 `json:"marginratio" xorm:"MARGINRATIO"` // 保证金比率(首付比例)
  1050. INITMARGIN float64 `json:"initmargin" xorm:"'INITMARGIN'"` // 初始保证金(首付款)
  1051. RECOVEREDMARGIN float64 `json:"recoveredmargin" xorm:"'RECOVEREDMARGIN'"` // 已追缴保证金
  1052. REMAINAMOUNT float64 `json:"remainamount" xorm:"'REMAINAMOUNT'"` // 合同剩余金额(融资额)
  1053. TOTALINTEREST float64 `json:"totalinterest" xorm:"'TOTALINTEREST'"` // 已计总利息(利息)
  1054. GOODSCODE string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码
  1055. GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称
  1056. GOODUNITID int32 `json:"goodunitid" xorm:"'GOODUNITID'"` // 商品单位id
  1057. CURRISKLEVEL int32 `json:"currisklevel" xorm:"'CURRISKLEVEL'"` // 风险级别 - 1:正常 2:追加货款 3:支付尾款
  1058. RECKONRECOVERMARGIN float64 `json:"reckonrecovermargin" xorm:"'RECKONRECOVERMARGIN'"` // 结算应追缴保底金(结算时到过风险率时临时存储) - [仓单回购\仓单质押]
  1059. DECIMALPLACE int32 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 商品报价小数位
  1060. SCFCONTRACTSTATUS int32 `json:"scfcontractstatus" xorm:"'SCFCONTRACTSTATUS'"` // 合同状态 - 1:待确认 2:已确认 3:确认拒绝 4:已支付保证金 5:已激活 6:已违约 7:到期结束 8:延期结束 9:违约结束 10:已注销 11:已关闭 99:未提交
  1061. LOGINCODE string `json:"logincode" xorm:"'LOGINCODE'"` // 账号(登录代码)
  1062. USERINFOTYPE int32 `json:"userinfotype" xorm:"'USERINFOTYPE'"` // 用户类型 1-个人 2-企业
  1063. MOBILE string `json:"mobile" xorm:"'MOBILE'"` // 电话号码(用户资料里的电话)
  1064. TRADEDATE string `json:"tradedate" xorm:"'TRADEDATE'"` // 交易日
  1065. PAYAMOUNT float64 `json:"payamount" xorm:"'PAYAMOUNT'"` // 已付(已付货款)
  1066. USERNAME string `json:"username" xorm:"'USERNAME'"` // 用户名称
  1067. ENUMDICNAME string `json:"enumdicname"` // 单位名称
  1068. BeginDate string `json:"-"` // 开始交易日
  1069. EndDate string `json:"-"` // 结束交易日
  1070. FilterName string `json:"-"` // 模糊搜索
  1071. FilterRiskLevel string `json:"-"` // 风险级别
  1072. }
  1073. func (r *QhjMgrContract) calc() {
  1074. r.USERNAME = mtpcache.GetUserNameByUserId(r.USERID)
  1075. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.GOODUNITID)
  1076. // 已付(已付货款) = 已追缴保证金 + 初始保证金
  1077. r.PAYAMOUNT = r.RECOVEREDMARGIN + r.INITMARGIN
  1078. if r.SCFCONTRACTSTATUS == 10 || r.SCFCONTRACTSTATUS == 11 {
  1079. // 当合同关闭时, 利息重置为0
  1080. r.TOTALINTEREST = 0
  1081. }
  1082. if r.LOGINCODE == "" {
  1083. r.LOGINCODE = DecryptField(r.MOBILE)
  1084. }
  1085. }
  1086. func (r *QhjMgrContract) buildSql() string {
  1087. var sqlId utils.SQLVal = "with k as (select t.userid, wm_concat(t.logincode) logincode from loginaccount t group by t.userid)" +
  1088. "select t.borroweruserid userid," +
  1089. " to_char(t.scfcontractid) scfcontractid," +
  1090. " t.scfcontracttype," +
  1091. " t.goodsid," +
  1092. " to_char(t.contractconfirmtime, 'yyyy-mm-dd hh24:mi:ss') contractconfirmtime," +
  1093. " t.wrqty," +
  1094. " t.tradeprice," +
  1095. " t.lenderamount," +
  1096. " t.marginratio," +
  1097. " s.initmargin," +
  1098. " s.recoveredmargin," +
  1099. " s.remainamount," +
  1100. " s.totalinterest," +
  1101. " s.currisklevel," +
  1102. " s.reckonrecovermargin," +
  1103. " s.scfcontractstatus," +
  1104. " s.tradedate," +
  1105. " g.goodscode," +
  1106. " g.goodsname," +
  1107. " g.decimalplace," +
  1108. " g.goodunitid," +
  1109. " ui.userinfotype," +
  1110. " ui.mobile," +
  1111. " u.accountname," +
  1112. " k.logincode" +
  1113. " from scf_contract t" +
  1114. " left join scf_contractinfo s" +
  1115. " on t.scfcontractid = s.scfcontractid" +
  1116. " left join goods g" +
  1117. " on t.goodsid = g.goodsid" +
  1118. " left join userinfo ui on t.borroweruserid=ui.userid" +
  1119. " left join k on ui.userid=k.userid" +
  1120. " left join useraccount u on t.borroweruserid=u.userid" +
  1121. " where 1 = 1"
  1122. sqlId.AndEx("t.borroweruserid", r.USERID, r.USERID > 0)
  1123. sqlId.AndEx("ui.USERINFOTYPE", r.USERINFOTYPE, r.USERINFOTYPE > 0)
  1124. sqlId.AndEx("t.goodsid", r.GOODSID, r.GOODSID > 0)
  1125. if len(r.FilterRiskLevel) > 0 {
  1126. sqlId.JoinFormat(" and s.currisklevel in(%v)", r.FilterRiskLevel)
  1127. }
  1128. if len(r.BeginDate) > 0 {
  1129. sqlId.JoinFormat(" and s.TRADEDATE >=%v", r.BeginDate)
  1130. }
  1131. if len(r.EndDate) > 0 {
  1132. sqlId.JoinFormat(" and s.TRADEDATE <=%v", r.EndDate)
  1133. }
  1134. if len(r.FilterName) > 0 {
  1135. sqlId.JoinFormat(" and (k.logincode like '%%%v%%' or u.accountname like '%%%v%%')", r.FilterName, r.FilterName)
  1136. }
  1137. return sqlId.String()
  1138. }
  1139. // GetDataEx 获取融资明细(合同)
  1140. func (r *QhjMgrContract) GetDataEx() (interface{}, error) {
  1141. sData := make([]QhjMgrContract, 0)
  1142. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1143. for i := range sData {
  1144. sData[i].calc()
  1145. }
  1146. return sData, err
  1147. }
  1148. // QhjMgrPickGoods 提货商品
  1149. type QhjMgrPickGoods struct {
  1150. PICKUPGOODSID string `json:"pickupgoodsid" xorm:"PICKUPGOODSID"` // 提货商品ID
  1151. PICKUPGOODSNAME string `json:"pickupgoodsname" xorm:"PICKUPGOODSNAME"` // 提货商品名称
  1152. PICKUPGOODSUNITID int32 `json:"pickupgoodsunitid" xorm:"PICKUPGOODSUNITID"` // 单位ID
  1153. PICKUPGOODSAGREEUNIT float64 `json:"pickupgoodsagreeunit" xorm:"PICKUPGOODSAGREEUNIT"` // 合约乘数
  1154. PICKUPGOODSDESC string `json:"pickupgoodsdesc" xorm:"PICKUPGOODSDESC"` // 描述
  1155. IMAGEADDRESS string `json:"imageaddress" xorm:"IMAGEADDRESS"` // 图片
  1156. REMARK string `json:"remark" xorm:"REMARK"` // 备注
  1157. MODIFYSRC int32 `json:"modifysrc" xorm:"MODIFYSRC"` // 修改来源 - 1:管理端 2:终端
  1158. MODIFIERID int64 `json:"modifierid" xorm:"MODIFIERID"` // 修改人
  1159. UPDATETIME string `json:"updatetime" xorm:"UPDATETIME"` // 更新时间
  1160. PREPAREDAYS int32 `json:"preparedays" xorm:"PREPAREDAYS"` // 备货期(天)
  1161. PICKUPGOODSSTATUS int32 `json:"pickupgoodsstatus" xorm:"PICKUPGOODSSTATUS"` // 状态 - 1:正常 2:停用 3:注销
  1162. GOODSID int32 `json:"goodsid" xorm:"'GOODSID'"` // 商品id
  1163. PICKUPRATIO float64 `json:"pickupratio" xorm:"'PICKUPRATIO'"` // 提货系数
  1164. MODIFIERNAME string `json:"modifiername"` // 修改人名称
  1165. FilterStatus string `json:"-"` // 状态过淲
  1166. ENUMDICNAME string `json:"enumdicname"` // 单位名称(提货商品)
  1167. }
  1168. func (r *QhjMgrPickGoods) calc() {
  1169. if r.MODIFYSRC == 1 {
  1170. r.MODIFIERNAME = mtpcache.GetSystemmangerLoginCode(r.MODIFIERID)
  1171. } else {
  1172. r.MODIFIERNAME = mtpcache.GetLoginCodeByLoginId(r.MODIFIERID)
  1173. }
  1174. if r.MODIFIERNAME == "" {
  1175. r.MODIFIERNAME = mtpcache.GetUserNameByUserId(r.MODIFIERID)
  1176. }
  1177. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.PICKUPGOODSUNITID)
  1178. }
  1179. func (r *QhjMgrPickGoods) buildSql() string {
  1180. var sqlId utils.SQLVal = "SELECT t.PICKUPGOODSID," +
  1181. " t.PICKUPGOODSNAME," +
  1182. " t.PICKUPGOODSUNITID," +
  1183. " t.PICKUPGOODSAGREEUNIT," +
  1184. " to_char(t.PICKUPGOODSDESC) PICKUPGOODSDESC," +
  1185. " to_char(t.IMAGEADDRESS) IMAGEADDRESS," +
  1186. " t.REMARK," +
  1187. " t.MODIFYSRC," +
  1188. " t.MODIFIERID," +
  1189. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  1190. " t.PREPAREDAYS," +
  1191. " t.PICKUPGOODSSTATUS," +
  1192. " FROM PICKUPGOODS t" +
  1193. " WHERE 1 = 1"
  1194. if len(r.FilterStatus) > 0 {
  1195. sqlId.Join(fmt.Sprintf(" and t.PICKUPGOODSSTATUS in(%v)", r.FilterStatus))
  1196. }
  1197. return sqlId.String()
  1198. }
  1199. // GetDataEx 获取提货商品
  1200. func (r *QhjMgrPickGoods) GetDataEx() (interface{}, error) {
  1201. sData := make([]QhjMgrPickGoods, 0)
  1202. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1203. for i := range sData {
  1204. sData[i].calc()
  1205. }
  1206. return sData, err
  1207. }
  1208. // 经纪人扩展信息
  1209. type BrokerExInfo struct {
  1210. USERNAME string `json:"username" xorm:"'USERNAME'"` // 用户名称
  1211. PARENTUSERID int64 `json:"parentuserid" xorm:"'PARENTUSERID'"` // 所属机构id
  1212. USERINFOTYPE int32 `json:"userinfotype" xorm:"'USERINFOTYPE'"` // 用户类型 1-个人 2-企业
  1213. MOBILE string `json:"mobile" xorm:"'MOBILE'"` // 手机号码
  1214. PARENTUSERNAME string `json:"parentusername" xorm:"'PARENTUSERNAME'"` // 所属机构名称
  1215. LOGINCODE string `json:"logincode" xorm:"'LOGINCODE'"` // 登录代码
  1216. SUBAREALEVELPATH string `json:"subarealevelpath" xorm:"'SUBAREALEVELPATH'"` // 层级路径
  1217. REFEREEUSERID int64 `json:"refereeuserid" xorm:"'REFEREEUSERID'"` // 推荐人id(经纪人)
  1218. REFERNUM string `json:"refernum" xorm:"'REFERNUM'"` // 推荐码
  1219. }
  1220. // QhjMgrBrokerApply 经济人申请表
  1221. type QhjMgrBrokerApply struct {
  1222. APPLYSRC int32 `json:"applysrc" xorm:"APPLYSRC" form:"applysrc"` // 申请来源 - 1:管理端 2:终端
  1223. APPLYSTATUS int32 `json:"applystatus" xorm:"APPLYSTATUS" form:"applystatus"` // 申请状态 - 1:待审核 2:审核通过 3:审核拒绝 4:处理失败 5:已撤回
  1224. AUDITSRC int32 `json:"auditsrc" xorm:"AUDITSRC" form:"auditsrc"` // 审核来源 - 1:管理端 2:终端
  1225. APPLICANTID int64 `json:"applicantid" xorm:"APPLICANTID" form:"applicantid"` // 申请人
  1226. AUDITORID int64 `json:"auditorid" xorm:"AUDITORID" form:"auditorid"` // 审核人
  1227. BROKERAPPLYID int64 `json:"brokerapplyid" xorm:"BROKERAPPLYID" form:"brokerapplyid"` // 申请ID(SEQ_BROKERAPPLY)
  1228. USERID int64 `json:"userid" xorm:"USERID" form:"userid"` // 申请人用户ID
  1229. APPLYTIME string `json:"applytime" xorm:"APPLYTIME" form:"applytime"` // 申请时间
  1230. AUDITREMARK string `json:"auditremark" xorm:"AUDITREMARK" form:"auditremark"` // 审核备注
  1231. AUDITTIME string `json:"audittime" xorm:"AUDITTIME" form:"audittime"` // 审核时间
  1232. AUDITTRADEDATE string `json:"audittradedate" xorm:"AUDITTRADEDATE" form:"audittradedate"` // 审核交易日(yyyyMMdd)
  1233. CARDBACKPHOTOURL string `json:"cardbackphotourl" xorm:"CARDBACKPHOTOURL" form:"cardbackphotourl"` // 证件背面图片地址
  1234. CARDFRONTPHOTOURL string `json:"cardfrontphotourl" xorm:"CARDFRONTPHOTOURL" form:"cardfrontphotourl"` // 证件正面图片地址
  1235. CARDNUM string `json:"cardnum" xorm:"CARDNUM" form:"cardnum"` // 证件号码(加密存储) 注:数据库没存证件类型字段,产品说类型固定为身份证
  1236. CUSTOMERNAME string `json:"customername" xorm:"CUSTOMERNAME" form:"customername"` // 姓名
  1237. REMARK string `json:"remark" xorm:"REMARK" form:"remark"` // 备注
  1238. TRADEDATE string `json:"tradedate" xorm:"TRADEDATE" form:"tradedate"` // 交易日(yyyyMMdd)
  1239. BrokerExInfo `xorm:"extends"`
  1240. IncludeSub int32 `json:"-" form:"includesub"` // 是否包含子级 1-包含
  1241. FilterName string `json:"-" form:"filtername"` // 模糊搜索名称
  1242. FilterStatus string `json:"filterstatus" form:"filterstatus"` // 筛选条件
  1243. }
  1244. func (r *QhjMgrBrokerApply) calc() {
  1245. r.MOBILE = DecryptField(r.MOBILE)
  1246. r.CARDNUM = DecryptField(r.CARDNUM)
  1247. if r.LOGINCODE == "" {
  1248. r.LOGINCODE = r.MOBILE
  1249. }
  1250. }
  1251. func (r *QhjMgrBrokerApply) buildSql() string {
  1252. var sqlId utils.SQLVal = "with k as (select t.userid, wm_concat(t.logincode) logincode from loginaccount t group by t.userid)" +
  1253. "SELECT t.CUSTOMERNAME," +
  1254. " t.CARDNUM," +
  1255. " t.CARDFRONTPHOTOURL," +
  1256. " t.CARDBACKPHOTOURL," +
  1257. " t.BROKERAPPLYID," +
  1258. " t.USERID," +
  1259. " t.TRADEDATE," +
  1260. " t.APPLYSRC," +
  1261. " t.APPLICANTID," +
  1262. " t.REMARK," +
  1263. " to_char(t.APPLYTIME, 'yyyy-mm-dd hh24:mi:ss') APPLYTIME," +
  1264. " t.APPLYSTATUS," +
  1265. " t.AUDITTRADEDATE," +
  1266. " t.AUDITORID," +
  1267. " t.AUDITSRC," +
  1268. " to_char(t.AUDITTIME, 'yyyy-mm-dd hh24:mi:ss') AUDITTIME," +
  1269. " t.AUDITREMARK," +
  1270. " u.accountname USERNAME," +
  1271. " u.parentuserid," +
  1272. " u.refereeuserid," +
  1273. " u.refernum," +
  1274. " ui.userinfotype," +
  1275. " ui.mobile," +
  1276. " u2.accountname PARENTUSERNAME," +
  1277. " k.logincode," +
  1278. " u.subarealevelpath" +
  1279. " FROM BROKERAPPLY t" +
  1280. " INNER JOIN USERACCOUNT u on t.userid=u.userid" +
  1281. " INNER JOIN USERINFO ui on t.userid=ui.userid" +
  1282. " LEFT JOIN k on t.userid=k.userid" +
  1283. " LEFT JOIN USERACCOUNT u2 on u.parentuserid=u2.userid" +
  1284. " WHERE 1 = 1"
  1285. if r.IncludeSub == 1 {
  1286. sqlId.JoinFormat(" and u.subarealevelpath like '%%,%v,%%,%%'", r.USERID)
  1287. } else {
  1288. sqlId.And("u.parentuserid", r.USERID)
  1289. }
  1290. sqlId.JoinEx(r.FilterStatus != "", fmt.Sprintf(" and t.APPLYSTATUS in(%v)", r.FilterStatus))
  1291. sqlId.AndEx("ui.USERINFOTYPE", r.USERINFOTYPE, r.USERINFOTYPE > 0)
  1292. if len(r.FilterName) > 0 {
  1293. sqlId.JoinFormat(" and (k.logincode like '%%%v%%' or t.CUSTOMERNAME like '%%%v%%')", r.FilterName, r.FilterName)
  1294. }
  1295. return sqlId.String()
  1296. }
  1297. // GetDataEx 获取经济人申请表
  1298. func (r *QhjMgrBrokerApply) GetDataEx() (interface{}, error) {
  1299. sData := make([]QhjMgrBrokerApply, 0)
  1300. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1301. for i := range sData {
  1302. sData[i].calc()
  1303. }
  1304. return sData, err
  1305. }
  1306. // QhjMgrBrokerRewardReport 经纪人奖励报表
  1307. type QhjMgrBrokerRewardReport struct {
  1308. CYCLETIME string `json:"cycletime" xorm:"CYCLETIME" form:"cycletime"` // 周期时间 日(YYYYMMDD) 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYMMDD) 全(0)【原值】
  1309. CYCLETYPE int32 `json:"cycletype" xorm:"CYCLETYPE" form:"cycletype"` // 周期类型 - 0:日 1:月 2:季 3:年 4:周 5:全报表【原值】
  1310. USERID int64 `json:"userid" xorm:"USERID" form:"userid"` // 经纪人用户ID
  1311. DIRECTTOTALNUM int32 `json:"directtotalnum" xorm:"DIRECTTOTALNUM" form:"directtotalnum"` // 直推总人数【期末】
  1312. INDIRECTTOTALNUM int32 `json:"indirecttotalnum" xorm:"INDIRECTTOTALNUM" form:"indirecttotalnum"` // 间推总人数【期末】
  1313. TODAYREWARDAMOUNT float64 `json:"todayrewardamount" xorm:"TODAYREWARDAMOUNT" form:"todayrewardamount"` // 奖励总金额【汇总】
  1314. UPDATETIME string `json:"updatetime" xorm:"UPDATETIME" form:"updatetime"` // 更新时间
  1315. USERNAME string `json:"username" xorm:"'USERNAME'"` // 用户名称
  1316. REFEREEUSERID int64 `json:"refereeuserid" xorm:"'REFEREEUSERID'"` // 推荐人id(经纪人id)
  1317. REFERNUM string `json:"refernum" xorm:"'REFERNUM'"` // 推荐码
  1318. SUBAREALEVELPATH string `json:"subarealevelpath" xorm:"'SUBAREALEVELPATH'"` // 用户层级路径
  1319. CREATETIME string `json:"createtime" xorm:"'CREATETIME'"` // 创建时间(注册时间)
  1320. USERINFOTYPE int32 `json:"userinfotype" xorm:"'USERINFOTYPE'"` // 用户类型 1-个人 2-企业
  1321. MOBILE string `json:"mobile" xorm:"'MOBILE'"` // 电话号码
  1322. REFEREEUSERNAME string `json:"refereeusername" xorm:"'REFEREEUSERNAME'"` // 推荐人名称(经纪人) 上级经纪人名称
  1323. IncludeSub int32 `json:"-" form:"includesub"` // 是否包含子级 1-包含
  1324. FilterName string `json:"-" form:"filtername"` // 模糊搜索名称
  1325. }
  1326. func (r *QhjMgrBrokerRewardReport) calc() {
  1327. r.MOBILE = DecryptField(r.MOBILE)
  1328. }
  1329. func (r *QhjMgrBrokerRewardReport) sqlDay() string {
  1330. var sqlId utils.SQLVal = "SELECT t.reckondate as CYCLETIME," +
  1331. " 0 as CYCLETYPE," +
  1332. " t.USERID," +
  1333. " t.DIRECTTOTALNUM," +
  1334. " t.INDIRECTTOTALNUM," +
  1335. " t.TODAYREWARDAMOUNT," +
  1336. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  1337. " u.accountname USERNAME," +
  1338. " u.refereeuserid," +
  1339. " u.refernum," +
  1340. " u.subarealevelpath," +
  1341. " to_char(u.createtime, 'yyyy-mm-dd hh24:mi:ss') CREATETIME," +
  1342. " ui.userinfotype," +
  1343. " ui.mobile," +
  1344. " u2.accountname REFEREEUSERNAME" +
  1345. " FROM RECKON_BROKERREWARD t" +
  1346. " INNER JOIN USERACCOUNT u on t.userid=u.userid" +
  1347. " INNER JOIN USERINFO ui on t.userid=ui.userid" +
  1348. " LEFT JOIN USERACCOUNT u2 on u.refereeuserid=u2.userid" +
  1349. " WHERE 1 = 1"
  1350. return sqlId.String()
  1351. }
  1352. func (r *QhjMgrBrokerRewardReport) sqlCycle() string {
  1353. var sqlId utils.SQLVal = "SELECT t.CYCLETIME," +
  1354. " t.CYCLETYPE," +
  1355. " t.USERID," +
  1356. " t.DIRECTTOTALNUM," +
  1357. " t.INDIRECTTOTALNUM," +
  1358. " t.TODAYREWARDAMOUNT," +
  1359. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  1360. " u.accountname USERNAME," +
  1361. " u.refereeuserid," +
  1362. " u.refernum," +
  1363. " u.subarealevelpath," +
  1364. " to_char(u.createtime, 'yyyy-mm-dd hh24:mi:ss') CREATETIME," +
  1365. " ui.userinfotype," +
  1366. " ui.mobile," +
  1367. " u2.accountname REFEREEUSERNAME" +
  1368. " FROM REPORT_BROKERREWARD t" +
  1369. " INNER JOIN USERACCOUNT u on t.userid=u.userid" +
  1370. " INNER JOIN USERINFO ui on t.userid=ui.userid" +
  1371. " LEFT JOIN USERACCOUNT u2 on u.refereeuserid=u2.userid" +
  1372. " WHERE 1 = 1"
  1373. return sqlId.String()
  1374. }
  1375. func (r *QhjMgrBrokerRewardReport) buildSql() string {
  1376. var sqlId utils.SQLVal
  1377. if r.CYCLETYPE == 0 {
  1378. sqlId = utils.SQLVal(r.sqlDay())
  1379. sqlId.AndEx("t.reckondate", r.CYCLETIME, r.CYCLETIME != "")
  1380. } else {
  1381. sqlId = utils.SQLVal(r.sqlCycle())
  1382. sqlId.And("t.CYCLETYPE", r.CYCLETYPE)
  1383. // 转换时间
  1384. // 兼容性处理, 月报表日期如果是yyyymmdd, 只取yyyymm
  1385. if r.CYCLETYPE == 1 && len(r.CYCLETIME) > 6 {
  1386. r.CYCLETIME = r.CYCLETIME[:6]
  1387. } else if r.CYCLETYPE == 4 {
  1388. r.CYCLETIME = mtpcache.GetWeekIW(r.CYCLETIME)
  1389. }
  1390. sqlId.And("t.CYCLETIME", r.CYCLETIME)
  1391. }
  1392. if r.IncludeSub == 1 {
  1393. //sqlId.JoinFormat(" and u.subarealevelpath like '%%,%v,%%,%%'", r.USERID)
  1394. // 要用 refereeuserid 递归查询, 不能用subarealevelpath
  1395. } else {
  1396. sqlId.And("u.refereeuserid", r.USERID)
  1397. }
  1398. if len(r.FilterName) > 0 {
  1399. sqlId.JoinFormat(" and u.accountname like '%%%v%%'", r.FilterName)
  1400. }
  1401. return sqlId.String()
  1402. }
  1403. // GetDataEx 获取经纪人奖励报表
  1404. func (r *QhjMgrBrokerRewardReport) GetDataEx() (interface{}, error) {
  1405. sData := make([]QhjMgrBrokerRewardReport, 0)
  1406. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1407. for i := range sData {
  1408. sData[i].calc()
  1409. }
  1410. return sData, err
  1411. }