qhjPCWeb.go 79 KB

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