|
|
@@ -393,3 +393,143 @@ func (r *QhjMgrAccountOutInApply) GetDataEx() (interface{}, error) {
|
|
|
}
|
|
|
return sData, err
|
|
|
}
|
|
|
+
|
|
|
+// QhjTradeEx 额外的用户和商品信息
|
|
|
+type QhjTradeEx struct {
|
|
|
+ LOGINCODE string `json:"logincode" xorm:"'LOGINCODE'"` // 登录代码(账户)
|
|
|
+ USERID int64 `json:"userid" xorm:"'USERID'"` // 用户id
|
|
|
+ ACCOUNTNAME string `json:"accountname" xorm:"'ACCOUNTNAME'"` // 用户名称
|
|
|
+ ENUMDICNAME string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 单位名称(商品)
|
|
|
+ GOODSCODE string `json:"goodscode" xorm:"GOODSCODE"` // 商品代码(内部)
|
|
|
+ GOODSNAME string `json:"goodsname" xorm:"GOODSNAME"` // 商品名称
|
|
|
+ GOODUNITID int32 `json:"goodunitid" xorm:"GOODUNITID"` // 报价单位ID
|
|
|
+ AGREEUNIT float64 `json:"agreeunit" xorm:"AGREEUNIT"` // 合约乘数
|
|
|
+ DECIMALPLACE int32 `json:"decimalplace" xorm:"DECIMALPLACE"` // 报价小数位
|
|
|
+ QTYDECIMALPLACE int32 `json:"qtydecimalplace" xorm:"QTYDECIMALPLACE"` // 成交量小数位
|
|
|
+ USERINFOTYPE int32 `json:"userinfotype" xorm:"'USERINFOTYPE'"` // 账户类型 1-个人 2-企业
|
|
|
+}
|
|
|
+
|
|
|
+// QhjMgrPosition 持仓汇总
|
|
|
+type QhjMgrPosition struct {
|
|
|
+ QhjTradeEx `xorm:"extends"`
|
|
|
+ ACCOUNTID int64 `json:"accountid"` // 账号Id
|
|
|
+ GOODSID int32 `json:"goodsid"` // 商品Id
|
|
|
+ HOLDERTYPE int32 `json:"holdertype"` // 持仓类别 - 1:单边持仓 2:双边持仓
|
|
|
+ HOLDERQTY float64 `json:"holderqty"` // 持有数量
|
|
|
+ FROZENQTY float64 `json:"frozenqty"` // 冻结数量
|
|
|
+ AVIALQTY float64 `json:"avialqty"` // 可用数量
|
|
|
+ HOLDERAMOUNT float64 `json:"holderamount"` // 金额
|
|
|
+ AVERAGEPRICE float64 `json:"averageprice"` // 均价
|
|
|
+}
|
|
|
+
|
|
|
+// QhjMgrTradePosition 持仓汇总
|
|
|
+type QhjMgrTradePosition struct {
|
|
|
+ ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 账号Id
|
|
|
+ GOODSID int32 `json:"goodsid" xorm:"GOODSID"` // 商品Id
|
|
|
+ HOLDERTYPE int32 `json:"holdertype" xorm:"HOLDERTYPE"` // 持仓类别 - 1:单边持仓 2:双边持仓
|
|
|
+ BUYPOSITIONQTY float64 `json:"buypositionqty" xorm:"BUYPOSITIONQTY"` // 买期初持仓数量
|
|
|
+ BUYHOLDERAMOUNT float64 `json:"buyholderamount" xorm:"BUYHOLDERAMOUNT"` // 买期初持仓总金额[商品币种]
|
|
|
+ BUYCURPOSITIONQTY float64 `json:"buycurpositionqty" xorm:"BUYCURPOSITIONQTY"` // 买当前持仓总数量
|
|
|
+ BUYCURHOLDERAMOUNT float64 `json:"buycurholderamount" xorm:"BUYCURHOLDERAMOUNT"` // 买当前持仓总金额[商品币种]
|
|
|
+ BUYFROZENQTY float64 `json:"buyfrozenqty" xorm:"BUYFROZENQTY"` // 买持仓冻结数量
|
|
|
+ BUYOTHERFROZENQTY float64 `json:"buyotherfrozenqty" xorm:"BUYOTHERFROZENQTY"` // 买持仓其他冻结数量(交割冻结)
|
|
|
+ BUYOPENREQQTY float64 `json:"buyopenreqqty" xorm:"BUYOPENREQQTY"` // 买开仓申请数量(用于比较最大持仓数量)
|
|
|
+ BUYOPENTOTALQTY float64 `json:"buyopentotalqty" xorm:"BUYOPENTOTALQTY"` // 今日买开仓总数量
|
|
|
+ BUYCLOSETOTALQTY float64 `json:"buyclosetotalqty" xorm:"BUYCLOSETOTALQTY"` // 今日买平仓总数量
|
|
|
+ SELLPOSITIONQTY float64 `json:"sellpositionqty" xorm:"SELLPOSITIONQTY"` // 卖期初持仓数量
|
|
|
+ SELLHOLDERAMOUNT float64 `json:"sellholderamount" xorm:"SELLHOLDERAMOUNT"` // 卖期初持仓总金额[商品币种]
|
|
|
+ SELLCURPOSITIONQTY float64 `json:"sellcurpositionqty" xorm:"SELLCURPOSITIONQTY"` // 卖当前持仓数量
|
|
|
+ SELLCURHOLDERAMOUNT float64 `json:"sellcurholderamount" xorm:"SELLCURHOLDERAMOUNT"` // 卖当前持仓总金额[商品币种]
|
|
|
+ SELLFROZENQTY float64 `json:"sellfrozenqty" xorm:"SELLFROZENQTY"` // 卖持仓冻结
|
|
|
+ SELLOTHERFROZENQTY float64 `json:"sellotherfrozenqty" xorm:"SELLOTHERFROZENQTY"` // 卖持仓其他冻结(交割冻结)
|
|
|
+ SELLOPENREQQTY float64 `json:"sellopenreqqty" xorm:"SELLOPENREQQTY"` // 卖开仓申请数量(用于比较最大持仓数量)
|
|
|
+ SELLOPENTOTALQTY float64 `json:"sellopentotalqty" xorm:"SELLOPENTOTALQTY"` // 今日卖开仓总数量
|
|
|
+ SELLCLOSETOTALQTY float64 `json:"sellclosetotalqty" xorm:"SELLCLOSETOTALQTY"` // 今日卖平仓总数量
|
|
|
+ USEDMARGIN float64 `json:"usedmargin" xorm:"USEDMARGIN"` // 占用保证金[商品币种]
|
|
|
+ TRADEPROPERTY int32 `json:"tradeproperty" xorm:"TRADEPROPERTY"` // 交易属性
|
|
|
+ BUYTNQTY float64 `json:"buytnqty" xorm:"BUYTNQTY"` // 买T+N冻结总量
|
|
|
+ BUYTNUSEDQTY float64 `json:"buytnusedqty" xorm:"BUYTNUSEDQTY"` // 买T+N使用量(可以使用T+N的冻结数量)
|
|
|
+ SELLTNQTY float64 `json:"selltnqty" xorm:"SELLTNQTY"` // 卖T+N冻结总量
|
|
|
+ SELLTNUSEDQTY float64 `json:"selltnusedqty" xorm:"SELLTNUSEDQTY"` // 卖T+N使用量(可以使用T+N的冻结数量)
|
|
|
+ BUYCURTDPOSITION float64 `json:"buycurtdposition" xorm:"BUYCURTDPOSITION"` // 买期末今日头寸
|
|
|
+ BUYFRETDPOSITION float64 `json:"buyfretdposition" xorm:"BUYFRETDPOSITION"` // 买冻结今日头寸
|
|
|
+ SELLCURTDPOSITION float64 `json:"sellcurtdposition" xorm:"SELLCURTDPOSITION"` // 卖期末今日头寸
|
|
|
+ SELLFRETDPOSITION float64 `json:"sellfretdposition" xorm:"SELLFRETDPOSITION"` // 卖冻结今日头寸
|
|
|
+ QhjTradeEx `xorm:"extends"`
|
|
|
+
|
|
|
+ IncludeSub int32 `json:"-"` // 是否包含子级 1-包含
|
|
|
+ FilterName string `json:"-"` // 模糊搜索
|
|
|
+}
|
|
|
+
|
|
|
+func (r *QhjMgrTradePosition) calc() {
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+func (r *QhjMgrTradePosition) buildSql() string {
|
|
|
+ var sqlId utils.SQLVal = "with k as" +
|
|
|
+ " (select t.userid, wm_concat(t.logincode) logincode" +
|
|
|
+ " from loginaccount t" +
|
|
|
+ " group by t.userid)" +
|
|
|
+ "select u.userid," +
|
|
|
+ " u.accountname," +
|
|
|
+ " k.logincode," +
|
|
|
+ " u.subarealevelpath," +
|
|
|
+ " ui.userinfotype," +
|
|
|
+ " g.goodsname," +
|
|
|
+ " g.goodscode," +
|
|
|
+ " g.goodunitid," +
|
|
|
+ " g.qtydecimalplace," +
|
|
|
+ " g.decimalplace," +
|
|
|
+ " e.enumdicname," +
|
|
|
+ " t.*" +
|
|
|
+ " from tradeposition t" +
|
|
|
+ " inner join taaccount ta" +
|
|
|
+ " on t.accountid = ta.accountid" +
|
|
|
+ " inner join useraccount u" +
|
|
|
+ " on ta.relateduserid = u.userid" +
|
|
|
+ " inner join userinfo ui" +
|
|
|
+ " on u.userid = ui.userid" +
|
|
|
+ " left join k" +
|
|
|
+ " on u.userid = k.userid" +
|
|
|
+ " left join goods g" +
|
|
|
+ " on t.goodsid = g.goodsid" +
|
|
|
+ " left join enumdicitem e" +
|
|
|
+ " on e.enumitemname = g.goodunitid" +
|
|
|
+ " and e.enumdiccode = 'goodsunit'" +
|
|
|
+ " where 1 = 1"
|
|
|
+ if r.IncludeSub == 1 {
|
|
|
+ sqlId.JoinFormat(" and u.subarealevelpath like '%%,%v,%%'", r.USERID)
|
|
|
+ } else {
|
|
|
+ sqlId.And("u.parentuserid", r.USERID)
|
|
|
+ }
|
|
|
+ sqlId.AndEx("ui.USERINFOTYPE", r.USERINFOTYPE, r.USERINFOTYPE > 0)
|
|
|
+ sqlId.AndEx("t.goodsid", r.GOODSID, r.GOODSID > 0)
|
|
|
+ if len(r.FilterName) > 0 {
|
|
|
+ sqlId.JoinFormat(" and (k.logincode like '%%%v%%' or u.accountname like '%%%v%%')", r.FilterName, r.FilterName)
|
|
|
+ }
|
|
|
+ return sqlId.String()
|
|
|
+}
|
|
|
+
|
|
|
+// GetDataEx 获取持仓汇总
|
|
|
+func (r *QhjMgrTradePosition) GetDataEx() (interface{}, error) {
|
|
|
+ sData := make([]QhjMgrTradePosition, 0)
|
|
|
+ err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
|
|
|
+ sData2 := make([]QhjMgrPosition, 0)
|
|
|
+ for i := range sData {
|
|
|
+ sData[i].calc()
|
|
|
+ v := QhjMgrPosition{QhjTradeEx: sData[i].QhjTradeEx}
|
|
|
+ v.GOODSID = sData[i].GOODSID
|
|
|
+ v.ACCOUNTID, v.HOLDERTYPE = sData[i].ACCOUNTID, sData[i].HOLDERTYPE
|
|
|
+ v.HOLDERAMOUNT = sData[i].BUYCURHOLDERAMOUNT
|
|
|
+ v.HOLDERQTY = sData[i].BUYCURPOSITIONQTY
|
|
|
+ v.FROZENQTY = sData[i].BUYFROZENQTY
|
|
|
+ v.AVIALQTY = v.HOLDERQTY - v.FROZENQTY
|
|
|
+ zoomFun := NewZoomFun(int(v.QTYDECIMALPLACE))
|
|
|
+ zoomFun(&v.HOLDERQTY, &v.FROZENQTY, &v.AVIALQTY)
|
|
|
+ if v.HOLDERQTY > 1e-10 {
|
|
|
+ v.AVERAGEPRICE = v.HOLDERAMOUNT / v.HOLDERQTY
|
|
|
+ }
|
|
|
+ sData2 = append(sData2, v)
|
|
|
+ }
|
|
|
+ return sData2, err
|
|
|
+}
|