|
|
@@ -46,6 +46,7 @@ type ErmcpRealExposureModel struct {
|
|
|
OriTotalFutuQty float64 // 期初期货数量=期初买入期货数量-期初卖出期货数量
|
|
|
DiffSpotQty float64 // 今日变动量(现货) = 现货数量 - 期初现货数量
|
|
|
DiffFutuQty float64 // 今日变动量(期货) = (买入 - 买入期初) - (卖出 - 卖出期初)
|
|
|
+ ENUMDICNAME string // 单位名称
|
|
|
}
|
|
|
|
|
|
// 计算相关字段
|
|
|
@@ -95,7 +96,8 @@ func (r *ErmcpRealExposureModel) GetData() ([]ErmcpRealExposureModel, error) {
|
|
|
var data pb.ErmcpAreaExposure
|
|
|
if err := proto.Unmarshal([]byte(ret), &data); err == nil {
|
|
|
var m = ErmcpRealExposureModel{MiddleGoodsName: sGoods[i].MIDDLEGOODSNAME,
|
|
|
- MiddleGoodsCode: sGoods[i].MIDDLEGOODSCODE, MiddleGoodsHedgeRatio: sGoods[i].NEEDHEDGERATIO}
|
|
|
+ MiddleGoodsCode: sGoods[i].MIDDLEGOODSCODE, MiddleGoodsHedgeRatio: sGoods[i].NEEDHEDGERATIO,
|
|
|
+ ENUMDICNAME: mtpcache.GetEnumDicitemName(sGoods[i].GOODSUNITID)}
|
|
|
m.ParseFromProto(&data)
|
|
|
sData = append(sData, m)
|
|
|
}
|
|
|
@@ -379,61 +381,94 @@ func (r *ErmcpAreaSpotDetailModel) GetData() ([]interface{}, error) {
|
|
|
/*历史/历史敞口*/
|
|
|
type ErmcpHisExposure struct {
|
|
|
RECKONDATE string `json:"reckondate" xorm:"'RECKONDATE'"` // 日照时期(yyyyMMdd)
|
|
|
- MIDDLEGOODSID int32 `json:"middlegoodsid" xorm:"'MIDDLEGOODSID'"` // 套保品种ID
|
|
|
- AREAUSERID int32 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构
|
|
|
- TOTALSPOTQTY float64 `json:"totalspotqty" xorm:"'TOTALSPOTQTY'"` // 现货头寸总量
|
|
|
- TOTALFUTUREQTY float64 `json:"totalfutureqty" xorm:"'TOTALFUTUREQTY'"` // 期货头寸总量
|
|
|
+ MIDDLEGOODSID int32 `json:"-" xorm:"'MIDDLEGOODSID'"` // 套保品种ID
|
|
|
+ AREAUSERID int32 `json:"-" xorm:"'AREAUSERID'"` // 所属机构
|
|
|
TOTALEXPOSURE float64 `json:"totalexposure" xorm:"'TOTALEXPOSURE'"` // 总敞口
|
|
|
- TOTALHEDGERATIO float64 `json:"totalhedgeratio" xorm:"'TOTALHEDGERATIO'"` // 敞口比例
|
|
|
- TOTALNEEDHEDGEQTY float64 `json:"totalneedhedgeqty" xorm:"'TOTALNEEDHEDGEQTY'"` // 应套保总量
|
|
|
- NEEDHEDGEEXPOSOURE float64 `json:"needhedgeexposourE" xorm:"'NEEDHEDGEEXPOSOURE'"` // 应套保敞口
|
|
|
- NEEDHEDGERATIO float64 `json:"needhedgeratio" xorm:"'NEEDHEDGERATIO'"` // 应套保敞口比例
|
|
|
- MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保品种名称
|
|
|
- MIDDLEGOODSCODE string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保品种代码
|
|
|
- LastNum int32 `json:"-"` // 查询条数
|
|
|
+ NEEDHEDGEEXPOSOURE float64 `json:"needhedgeexposoure" xorm:"'NEEDHEDGEEXPOSOURE'"` // 应套保敞口
|
|
|
+ MIDDLEGOODSNAME string `json:"-" xorm:"'MIDDLEGOODSNAME'"` // 套保品种名称
|
|
|
+ MIDDLEGOODSCODE string `json:"-" xorm:"'MIDDLEGOODSCODE'"` // 套保品种代码
|
|
|
+ GOODSUNITID int32 `json:"-" xorm:"'GOODSUNITID'"` // 套保品种单位id
|
|
|
+
|
|
|
+ LastNum int32 `json:"-"` // 查询条数
|
|
|
}
|
|
|
|
|
|
// 历史分品种嵌套结构
|
|
|
type ErmcpHisExposureS struct {
|
|
|
MIDDLEGOODSID int32 `json:"middlegoodsid"` // 套保品种ID
|
|
|
MIDDLEGOODSNAME string `json:"middlegoodsname"` // 套保品种名称
|
|
|
+ MIDDLEGOODSCODE string `json:"middlegoodscode"` // 套保品种代码
|
|
|
+ ENUMDICNAME string `json:"enumdicname"` // 单位名称
|
|
|
Data []ErmcpHisExposure `json:"data"` // 历史敞口
|
|
|
}
|
|
|
|
|
|
func (r *ErmcpHisExposure) buildSql() string {
|
|
|
- str := "select *" +
|
|
|
- " from (select t.RECKONDATE," +
|
|
|
- " t.MIDDLEGOODSID," +
|
|
|
- " t.AREAUSERID," +
|
|
|
- " t.TOTALSPOTQTY," +
|
|
|
- " t.TOTALFUTUREQTY," +
|
|
|
- " t.TOTALEXPOSURE," +
|
|
|
- " t.TOTALHEDGERATIO," +
|
|
|
- " t.TOTALNEEDHEDGEQTY," +
|
|
|
- " t.NEEDHEDGEEXPOSOURE," +
|
|
|
- " t.NEEDHEDGERATIO," +
|
|
|
- " g.MIDDLEGOODSNAME," +
|
|
|
- " g.MIDDLEGOODSCODE" +
|
|
|
- " from Reckon_ERMCP_AreaExposure t" +
|
|
|
- " left join erms_middlegoods g" +
|
|
|
- " on t.middlegoodsid = g.middlegoodsid" +
|
|
|
- " where t.areauserid = %v" +
|
|
|
- " order by t.middlegoodsid, t.reckondate desc) a" +
|
|
|
- " where rownum <= %v"
|
|
|
+ str := "select a.*, g.middlegoodsname, g.middlegoodscode, g.goodsunitid from (" +
|
|
|
+ "select t.middlegoodsid," +
|
|
|
+ " t.areauserid," +
|
|
|
+ " t.totalexposure," +
|
|
|
+ " t.needhedgeexposoure," +
|
|
|
+ " t.reckondate" +
|
|
|
+ " from RECKON_ERMCP_AREAEXPOSURE t" +
|
|
|
+ " inner join RECKON_ERMCP_AREAEXPOSURE t2" +
|
|
|
+ " on t.middlegoodsid = t2.middlegoodsid" +
|
|
|
+ " and t.reckondate <= t2.reckondate" +
|
|
|
+ " where t.areauserid=%v" +
|
|
|
+ " group by t.middlegoodsid," +
|
|
|
+ " t.areauserid," +
|
|
|
+ " t.reckondate," +
|
|
|
+ " t.totalexposure," +
|
|
|
+ " t.needhedgeexposoure" +
|
|
|
+ " having count(1) <= %v" +
|
|
|
+ " order by t.middlegoodsid, t.reckondate desc" +
|
|
|
+ ")a left join erms_middlegoods g on a.middlegoodsid=g.middlegoodsid"
|
|
|
if r.LastNum <= 0 {
|
|
|
- r.LastNum = 100000 //限制最多查10W条
|
|
|
+ r.LastNum = 1000 //限制最多查1000条(每个品种)
|
|
|
}
|
|
|
return fmt.Sprintf(str, r.AREAUSERID, r.LastNum)
|
|
|
}
|
|
|
|
|
|
// 获取历史敞口
|
|
|
-func (r *ErmcpHisExposure) GetData() ([]ErmcpHisExposure, error) {
|
|
|
+func (r *ErmcpHisExposure) GetData() ([]ErmcpHisExposureS, error) {
|
|
|
e := db.GetEngine()
|
|
|
sData := make([]ErmcpHisExposure, 0)
|
|
|
if err := e.SQL(r.buildSql()).Find(&sData); err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
- return sData, nil
|
|
|
+
|
|
|
+ // 按套保品种合并处理
|
|
|
+ mData := make(map[int32]*[]ErmcpHisExposure)
|
|
|
+ for i := range sData {
|
|
|
+ if v, ok := mData[sData[i].MIDDLEGOODSID]; ok {
|
|
|
+ *v = append(*v, sData[i])
|
|
|
+ } else {
|
|
|
+ d := make([]ErmcpHisExposure, 0)
|
|
|
+ d = append(d, sData[i])
|
|
|
+ mData[sData[i].MIDDLEGOODSID] = &d
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ lst := make([]ErmcpHisExposureS, 0)
|
|
|
+ for _, v := range mData {
|
|
|
+ if len(*v) >= int(r.LastNum) {
|
|
|
+ val := ErmcpHisExposureS{
|
|
|
+ MIDDLEGOODSID: (*v)[0].MIDDLEGOODSID,
|
|
|
+ MIDDLEGOODSCODE: (*v)[0].MIDDLEGOODSCODE,
|
|
|
+ MIDDLEGOODSNAME: (*v)[0].MIDDLEGOODSNAME,
|
|
|
+ ENUMDICNAME: mtpcache.GetEnumDicitemName((*v)[0].GOODSUNITID),
|
|
|
+ }
|
|
|
+
|
|
|
+ // 旧的敞口数据找不到对应的套保商品
|
|
|
+ if val.MIDDLEGOODSCODE == "" {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ for i := range *v {
|
|
|
+ val.Data = append(val.Data, (*v)[i])
|
|
|
+ }
|
|
|
+ lst = append(lst, val)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return lst, nil
|
|
|
}
|
|
|
|
|
|
// 套保品种关联交易商品
|