tjmd.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. /**
  2. * @Author: zou.yingbin
  3. * @Create : 2021/9/7 16:01
  4. * @Modify : 2021/9/7 16:01
  5. * @note : 天津麦顿
  6. */
  7. package models
  8. import (
  9. "fmt"
  10. "github.com/golang/protobuf/proto"
  11. "mtp2_if/db"
  12. "mtp2_if/pb"
  13. "mtp2_if/utils"
  14. )
  15. // TjmdQuoteGoods 掉期报价列表
  16. type TjmdQuoteGoods struct {
  17. GOODSID int64 `json:"goodsid" xorm:"'GOODSID'" form:"goodsid"` // 合约id
  18. GOODSCODE string `json:"goodscode" xorm:"'GOODSCODE'"` // 合约代码
  19. GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'"` // 合约名称
  20. REFGOODSID int64 `json:"refgoodsid" xorm:"'REFGOODSID'"` // 标的合约id
  21. REFGOODSCODE string `json:"refgoodscode" xorm:"'REFGOODSCODE'"` // 标的合约代码
  22. REFGOODSNAME string `json:"refgoodsname" xorm:"'REFGOODSNAME'"` // 标的合约名称
  23. SELLQTY float64 `json:"sellqty" xorm:"'SELLQTY'"` // 卖量(暂不做, 无值, 保留字段)
  24. BUYQTY float64 `json:"buyqty" xorm:"'BUYQTY'"` // 买量(暂不做, 无值, 保留字段)
  25. GOODSGROUPID int64 `json:"goodsgroupid" xorm:"'GOODSGROUPID'" form:"goodsgroupid"` // 商品组ID(自增ID)
  26. GOODSGROUPNAME string `json:"goodsgroupname" xorm:"'GOODSGROUPNAME'"` // 商品组名称
  27. UserType int32 `json:"-" form:"usertype"` // 用户类型
  28. FtMarketIds string `json:"-" form:"marketids"` // 市场id, 格式 1,2,3
  29. }
  30. func (r *TjmdQuoteGoods) calc() {
  31. }
  32. func (r *TjmdQuoteGoods) buildSql() string {
  33. var sqlId utils.SQLVal = `
  34. select g1.goodsid,
  35. g1.goodscode,
  36. g1.goodsname,
  37. g2.goodsid refgoodsid,
  38. g2.goodscode refgoodscode,
  39. g2.goodsname refgoodsname,
  40. gp.goodsgroupid,
  41. gp.goodsgroupname,
  42. gp.outergroupcode goodsgroupcode,
  43. gp.marketid
  44. from goods g1
  45. left join goods g2
  46. on g1.refgoodsid = g2.goodsid
  47. left join goodsgroup gp
  48. on g1.goodsgroupid = gp.goodsgroupid
  49. where 1=1 and g1.goodsstatus = 3
  50. `
  51. sqlId.JoinEx(r.FtMarketIds != "", fmt.Sprintf(" and gp.marketid in(%v)", r.FtMarketIds))
  52. return sqlId.String()
  53. }
  54. // GetDataEx 获取掉期报价列表
  55. func (r *TjmdQuoteGoods) GetDataEx() (interface{}, error) {
  56. sData := make([]TjmdQuoteGoods, 0)
  57. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  58. for i := range sData {
  59. sData[i].calc()
  60. }
  61. return sData, err
  62. }
  63. // TjmdTradeOrderDetail 买卖大厅
  64. type TjmdTradeOrderDetail struct {
  65. ORDERID string `json:"orderid" xorm:"'ORDERID'"` // 委托单号
  66. GOODSID int32 `json:"goodsid" xorm:"'GOODSID'" form:"goodsid"` // 商品id
  67. BUYORSELL int32 `json:"buyorsell" xorm:"'BUYORSELL'" form:"buyorsell"` // 买卖方向 0-买 1-卖
  68. ORDERPRICE SFLOAT64 `json:"orderprice" xorm:"'ORDERPRICE'"` // 委托价格
  69. ORDERQTY int64 `json:"orderqty" xorm:"'ORDERQTY'"` // 委托数量
  70. USERID int64 `json:"userid" xorm:"'USERID'" form:"userid"` // 用户id
  71. USERNAME string `json:"username" xorm:"'USERNAME'"` // 用户名称(已脱敏)
  72. PRICEMODE int32 `json:"pricemode" xorm:"'PRICEMODE'"` // 取价方式 - 1:市价 2: 限价 3:浮动价
  73. MARKETMAXSUB float64 `json:"marketmaxsub" xorm:"'MARKETMAXSUB'"` // 市价最大偏移范围 [浮动价 - 点差]
  74. PageEx `xorm:"extends"`
  75. USERTYPE int32 `json:"-" form:"usertype"` // 用户类型
  76. FtMarketIds string `json:"-" form:"marketids"` // 市场id, 格式 1,2,3
  77. }
  78. func (r *TjmdTradeOrderDetail) calc() {
  79. r.USERNAME = EncryptByStar(r.USERNAME)
  80. }
  81. func (r *TjmdTradeOrderDetail) buildSql() string {
  82. var sqlId utils.SQLVal = `
  83. select to_char(t.orderid) orderid,
  84. t.buyorsell,
  85. t.goodsid,
  86. t.orderprice,
  87. t.orderqty - t.tradeqty orderqty,
  88. u.userid,
  89. u.accountname username,
  90. t.orderstatus,
  91. t.pricemode,
  92. t.marketmaxsub,
  93. g.marketid
  94. from trade_orderdetail t
  95. left join taaccount ta
  96. on t.accountid = ta.accountid
  97. left join useraccount u
  98. on ta.relateduserid = u.userid
  99. left join goods g on t.goodsid=g.goodsid
  100. where 1 = 1
  101. and t.orderstatus in (3, 7)
  102. and (u.usertype = decode(%v,2,5,2) or u.userid = %v)
  103. `
  104. // 投资者只能看到会员的单, 会员只能看到投资者的单, decode(%v,2,5,-1); or u.userid=r.userid 则为自己的挂单可见
  105. sqlId.FormatParam(r.USERTYPE, r.USERID)
  106. sqlId.And("t.GOODSID", r.GOODSID)
  107. sqlId.And("t.BUYORSELL", r.BUYORSELL)
  108. sqlId.JoinEx(r.FtMarketIds != "", fmt.Sprintf(" and g.marketid in(%v)", r.FtMarketIds))
  109. if r.BUYORSELL == 0 {
  110. sqlId.Join(" order by t.orderprice desc, t.ordertime desc")
  111. } else {
  112. sqlId.Join(" order by t.orderprice, t.ordertime desc")
  113. }
  114. sqlId.Page(r.Page, r.PageSize)
  115. return sqlId.String()
  116. }
  117. // GetDataByPage 获取买卖大厅
  118. func (r *TjmdTradeOrderDetail) GetDataByPage() (interface{}, error, int, int, int) {
  119. sData := make([]TjmdTradeOrderDetail, 0)
  120. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  121. for i := range sData {
  122. sData[i].calc()
  123. }
  124. if len(sData) > 0 {
  125. r.Total = sData[0].Total
  126. }
  127. return sData, err, r.Page, r.PageSize, r.Total
  128. }
  129. // TjmdTransferApply 协议转让申请
  130. type TjmdTransferApply struct {
  131. APPLYID int64 `json:"applyid" xorm:"'APPLYID'"` // 申请ID(自增ID SEQ_TRADE_HOLDTRANSFERAPPLY)
  132. MARKETID int32 `json:"marketid" xorm:"MARKETID" form:"marketid"` // 市场ID
  133. INACCOUNTID int64 `json:"-" xorm:"INACCOUNTID" form:"inaccountid"` // 转入方资金ID(确认方) --对方申请
  134. OUTACCOUNTID int64 `json:"-" xorm:"OUTACCOUNTID" form:"outaccountid"` // 转出方资金ID(申请方) --我的申请
  135. GOODSID int32 `json:"goodsid" xorm:"'GOODSID'"` // 商品ID
  136. GOODSCODE string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码
  137. GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称
  138. QTYDECIMALPLACE int `json:"-" xorm:"'QTYDECIMALPLACE'"` // 成交量小数位
  139. BUYORSELL int32 `json:"buyorsell" xorm:"'BUYORSELL'"` // 买卖 - 0:买 1:卖
  140. TRANSFERPRICE float64 `json:"transferprice" xorm:"'TRANSFERPRICE'"` // 转让价格(协议价格)
  141. QTY SFLOAT64 `json:"qty" xorm:"'QTY'"` // 转让数量(数量)
  142. TRANSFERAMOUNT float64 `json:"transferamount" xorm:"'TRANSFERAMOUNT'"` // 转让总金额(金额)
  143. APPLYSTATUS int32 `json:"applystatus" xorm:"'APPLYSTATUS'"` // 状态 - 0:未提交 1:待审核 2:审核中 3:审核通过 4:审核拒绝 5:审核失败 6:已撤销
  144. TRADEID string `json:"tradeid" xorm:"'TRADEID'"` // 成交单号(关联持仓)
  145. APPLYTIME string `json:"applytime" xorm:"'APPLYTIME'"` // 申请时间(时间)
  146. AUDITREMARK string `json:"auditremark" xorm:"'AUDITREMARK'"` // 审核备注(拒绝原因?)
  147. ApplyType int32 `json:"-" form:"applytype"` // 类型 1-我的申请 2-对方申请
  148. FtMarketIds string `json:"-" form:"marketids"` // 市场 格式 1,2,3
  149. FtAccountIds string `json:"-" form:"accountids"` // 资金账号 格式 1,2,3
  150. BEGINDATE string `json:"begindate" form:"begindate"` // 开始交易日(yyyymmdd)
  151. ENDDATE string `json:"enddate" form:"enddate"` // 结束交易日(yyyymmdd)
  152. }
  153. func (r *TjmdTransferApply) calc() {
  154. if r.QTYDECIMALPLACE != 0 {
  155. r.QTY.Power10(r.QTYDECIMALPLACE * -1)
  156. }
  157. }
  158. func (r *TjmdTransferApply) buildSql() string {
  159. var sqlId utils.SQLVal = `
  160. select t.applyid,
  161. t.marketid,
  162. t.goodsid,
  163. g.goodscode,
  164. g.goodsname,
  165. g.qtydecimalplace,
  166. t.buyorsell,
  167. t.transferprice,
  168. t.qty,
  169. t.transferamount,
  170. t.applystatus,
  171. to_char(t.tradeid) tradeid,
  172. to_char(t.applytime,'yyyy-mm-dd hh24:mi:ss') applytime,
  173. t.auditremark
  174. from trade_holdtransferapply t
  175. left join goods g
  176. on t.goodsid = g.goodsid
  177. where 1=1
  178. `
  179. // 格式 yyyymmdd
  180. if len(r.BEGINDATE) > 0 {
  181. sqlId.JoinFormat(" and t.TRADEDATE >= '%v'", r.BEGINDATE)
  182. }
  183. if len(r.ENDDATE) > 0 {
  184. sqlId.JoinFormat(" and t.TRADEDATE <= '%v'", r.ENDDATE)
  185. }
  186. sqlId.JoinEx(r.FtMarketIds != "", fmt.Sprintf(" and t.marketid in(%v)", r.FtMarketIds))
  187. if r.ApplyType == 1 {
  188. sqlId.JoinEx(r.FtAccountIds != "", fmt.Sprintf(" and t.outaccountid in(%v)", r.FtAccountIds))
  189. } else if r.ApplyType == 2 {
  190. sqlId.JoinEx(r.FtAccountIds != "", fmt.Sprintf(" and t.inaccountid in(%v)", r.FtAccountIds))
  191. }
  192. return sqlId.String()
  193. }
  194. // GetDataEx 获取协议转让申请
  195. func (r *TjmdTransferApply) GetDataEx() (interface{}, error) {
  196. sData := make([]TjmdTransferApply, 0)
  197. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  198. for i := range sData {
  199. sData[i].calc()
  200. }
  201. return sData, err
  202. }
  203. // TjmdTodayAccountMargin 账户保证金配置
  204. type TjmdTodayAccountMargin struct {
  205. ACCOUNTID int64 `json:"accountid" xorm:"'ACCOUNTID'" form:"accountid"` // 账号ID
  206. GOODSID int32 `json:"goodsid" xorm:"'GOODSID'" form:"goodsid"` // 商品ID
  207. INFOCONTENT string `json:"-" xorm:"'INFOCONTENT'"` // 保证金信息(存储配置的Protobuffer串)
  208. MARKETID int32 `json:"marketid" xorm:"'MARKETID'" form:"marketid"` // 市场ID
  209. INFOC pb.GoodsMarginCfgStruct `json:"infoc"` // 配置参数
  210. }
  211. func (r *TjmdTodayAccountMargin) calc() {
  212. if len(r.INFOCONTENT) > 0 {
  213. proto.Unmarshal([]byte(r.INFOCONTENT), &r.INFOC)
  214. }
  215. }
  216. func (r *TjmdTodayAccountMargin) buildSql() string {
  217. var sqlId utils.SQLVal = `
  218. select t.accountid, t.goodsid, t.infocontent, t.createdate, t.marketid
  219. from today_accountmargin t
  220. where 1 = 1
  221. `
  222. if r.ACCOUNTID > 0 {
  223. sqlId.JoinFormat(" and t.ACCOUNTID in(0, %v)", r.ACCOUNTID)
  224. }
  225. sqlId.AndEx("t.GOODSID", r.GOODSID, r.GOODSID > 0)
  226. sqlId.AndEx("t.MARKETID", r.MARKETID, r.MARKETID > 0)
  227. sqlId.Join(" order by t.accountid desc")
  228. sqlId.Page(1, 1) // 只取一条
  229. return sqlId.String()
  230. }
  231. // GetDataEx 获取账户保证金配置
  232. func (r *TjmdTodayAccountMargin) GetDataEx() (interface{}, error) {
  233. sData := make([]TjmdTodayAccountMargin, 0)
  234. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  235. for i := range sData {
  236. sData[i].calc()
  237. }
  238. return sData, err
  239. }
  240. // TjmdMarketSection 市场板块
  241. type TjmdMarketSection struct {
  242. MARKETSECTIONID int64 `json:"marketsectionid" xorm:"'MARKETSECTIONID'"` // 市场版块ID(SEQ_MARKETSECTION)
  243. MARKETSECTIONNAME string `json:"marketsectionname" xorm:"'MARKETSECTIONNAME'"` // 市场版块名称
  244. ORDERINDEX int32 `json:"orderindex" xorm:"'ORDERINDEX'"` // 排序
  245. REMARK string `json:"remark" xorm:"'REMARK'"` // 备注
  246. MLIST []TjmdMarketSectionConfig `json:"mlist"` // 市场列表(板块下面有多少个市场)
  247. }
  248. func (r *TjmdMarketSection) calc() {
  249. r.MLIST = make([]TjmdMarketSectionConfig, 0)
  250. }
  251. func (r *TjmdMarketSection) addMarketList(lst []TjmdMarketSectionConfig) {
  252. for i := range lst {
  253. if lst[i].MARKETSECTIONID == r.MARKETSECTIONID {
  254. r.MLIST = append(r.MLIST, lst[i])
  255. }
  256. }
  257. }
  258. func (r *TjmdMarketSection) buildSql() string {
  259. var sqlId utils.SQLVal = `
  260. SELECT t.MARKETSECTIONID, t.MARKETSECTIONNAME, t.ORDERINDEX, t.REMARK
  261. FROM MARKETSECTION t
  262. WHERE t.isvalid = 1
  263. order by t.orderindex
  264. `
  265. return sqlId.String()
  266. }
  267. // GetDataEx 获取市场板块
  268. func (r *TjmdMarketSection) GetDataEx() (interface{}, error) {
  269. sData := make([]TjmdMarketSection, 0)
  270. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  271. for i := range sData {
  272. sData[i].calc()
  273. }
  274. // 获取版块详细配置
  275. if len(sData) > 0 {
  276. m := TjmdMarketSectionConfig{}
  277. if d, err := m.GetDataEx(); err == nil {
  278. lst := d.([]TjmdMarketSectionConfig)
  279. for i := range sData {
  280. sData[i].addMarketList(lst)
  281. }
  282. }
  283. }
  284. return sData, err
  285. }
  286. // TjmdMarketSectionConfig 市场板块设置
  287. type TjmdMarketSectionConfig struct {
  288. MARKETSECTIONID int64 `json:"marketsectionid" xorm:"'MARKETSECTIONID'"` // 市场版块ID(SEQ_MARKETSECTION)
  289. MARKETID int64 `json:"marketid" xorm:"'MARKETID'"` // 市场ID正常5位,前三位固定:两位表示交易模式, 一位表示交易属性(1:收益权,2:所有权) 其它特殊市场:0-系统 1-交割服务 2-账户服务3-履约服务 4-仓单服务 5-积分服务 6-银行服务
  290. ORDERINDEX int32 `json:"orderindex" xorm:"'ORDERINDEX'"` // 排序
  291. MARKETNAME string `json:"marketname" xorm:"'MARKETNAME'"` // 市场名称
  292. MARKETTYPE int32 `json:"markettype" xorm:"'MARKETTYPE'"` // 市场类型 1:非交易服务 2:交易服务
  293. AUCTIONWRTYPE int32 `json:"auctionwrtype" xorm:"'AUCTIONWRTYPE'"` // 仓单类型(现货交易) 1:无仓单 2:有仓单 3;有无仓单均可
  294. NOWRQUOTAFLAG int32 `json:"nowrquotaflag" xorm:"'NOWRQUOTAFLAG'"` // 是否校验无仓单额度(仓单贸易) 0:否 1:是
  295. LISTINGMODE int32 `json:"listingmode" xorm:"'LISTINGMODE'"` // 挂牌方式 1:一口价 2:浮动价 3:贸易圈 4:协议指定
  296. }
  297. func (r *TjmdMarketSectionConfig) calc() {
  298. }
  299. func (r *TjmdMarketSectionConfig) buildSql() string {
  300. var sqlId utils.SQLVal = `
  301. select t.marketsectionid,
  302. t.marketid,
  303. t.orderindex,
  304. m.marketname,
  305. m.markettype,
  306. m.auctionwrtype,
  307. c.nowrquotaflag,
  308. c.listingmode
  309. from marketsectionconfig t
  310. inner join market m
  311. on t.marketid = m.marketid
  312. inner join markettradeconfig c
  313. on t.marketid = c.marketid
  314. where 1 = 1
  315. order by t.orderindex
  316. `
  317. return sqlId.String()
  318. }
  319. // GetDataEx 获取市场板块设置
  320. func (r *TjmdMarketSectionConfig) GetDataEx() (interface{}, error) {
  321. sData := make([]TjmdMarketSectionConfig, 0)
  322. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  323. for i := range sData {
  324. sData[i].calc()
  325. }
  326. return sData, err
  327. }