Explorar el Código

修改历史敞口接口、增加敞口日报表接口

zou.yingbin hace 4 años
padre
commit
8c914152eb
Se han modificado 9 ficheros con 7851 adiciones y 7613 borrados
  1. 5 5
      controllers/ermcp/qryExposure.go
  2. 21 1
      controllers/ermcp/qryReport.go
  3. 2673 2626
      docs/docs.go
  4. 2673 2626
      docs/swagger.json
  5. 2306 2312
      docs/swagger.yaml
  6. 69 34
      models/ermcpExposure.go
  7. 93 2
      models/ermcpReport.go
  8. 10 7
      mtpcache/enumdicitem.go
  9. 1 0
      routers/router.go

+ 5 - 5
controllers/ermcp/qryExposure.go

@@ -160,14 +160,14 @@ type HisExposureReq struct {
 }
 
 // 敞口/历史敞口应答
-type HisExposureRsp models.ErmcpHisExposure
+type HisExposureRsp models.ErmcpHisExposureS
 
 // QueryUserInfo 查询历史敞口
 // @Summary 查询历史敞口(菜单:敞口/历史敞口)
 // @Produce json
 // @Security ApiKeyAuth
 // @Param areaUserId query int true "所属机构ID"
-// @Param lastNum query int true "最近多少条记录, -1:为查全部"
+// @Param lastNum query int true "每个品种记录数"
 // @Success 200 {array} HisExposureRsp
 // @Failure 500 {object} app.Response
 // @Router /Ermcp/QueryHisExposure [get]
@@ -246,8 +246,8 @@ func QueryExposureHedgePosition(c *gin.Context) {
 
 // 期货明细请求
 type ExposureHedgePosDetailReq struct {
-	AreaUserId    int32 `form:"areaUserId" json:"areaUserId"`       // 所属机构ID
-	GoodsId int32 `form:"goodsId" json:"goodsId"` // 套保商品
+	AreaUserId int32 `form:"areaUserId" json:"areaUserId"` // 所属机构ID
+	GoodsId    int32 `form:"goodsId" json:"goodsId"`       // 套保商品
 }
 
 // 期货明细应答
@@ -268,4 +268,4 @@ func QueryExposureHedgePositionDetail(c *gin.Context) {
 	appG.DoBindReq(&req)
 	m := models.ErmcpHedgePositionDetail{AREAUSERID: req.AreaUserId, HEDGEGOODSID: req.GoodsId}
 	appG.DoGetDataEx(&m)
-}
+}

+ 21 - 1
controllers/ermcp/qryReport.go

@@ -100,4 +100,24 @@ func QryReportMonthFinance(c *gin.Context) {
 	a.DoBindReq(&req)
 	m := models.ErmcpReportMonthFR{AREAUSERID: req.UserId, CYCLETIME: req.CycleTime}
 	a.DoGetDataEx(&m)
-}
+}
+
+// 敞口日报表
+type QryReportExposureDayRsp models.ErmcpReportDayExposure
+
+// @Summary 查询敞口日报表(菜单:报表查询/敞口报表/敞口日报表)
+// @Produce json
+// @Security ApiKeyAuth
+// @Param userid query int true "用户ID"
+// @Param tradedate query string true "交易日(格式:yyyyMMdd)"
+// @Success 200 {array} QryReportExposureDayRsp
+// @Failure 500 {object} app.Response
+// @Router /Ermcp/QryReportDayExposure [get]
+// @Tags 企业风险管理(app)
+func QryReportDayExposure(c *gin.Context) {
+	a := app.GinUtils{Gin: app.Gin{C: c}}
+	req := QryReportDayReq{}
+	a.DoBindReq(&req)
+	m := models.ErmcpReportDayExposure{AREAUSERID: req.UserId, RECKONDATE: req.TradeDate}
+	a.DoGetDataEx(&m)
+}

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 2673 - 2626
docs/docs.go


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 2673 - 2626
docs/swagger.json


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 2306 - 2312
docs/swagger.yaml


+ 69 - 34
models/ermcpExposure.go

@@ -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
 }
 
 // 套保品种关联交易商品

+ 93 - 2
models/ermcpReport.go

@@ -87,10 +87,10 @@ func (r *ErmcpReportDayFRKx) GetDataEx() (interface{}, error) {
 
 // 报表合同操作记录通用查询
 type ErmcpReportOPLog struct {
-	LOGID          string  `json:"logid"  xorm:"'lOGID'"`                   // 流水ID(604+Unix秒时间戳(10位)+xxxxxx)
+	LOGID          string `json:"logid"  xorm:"'lOGID'"`                   // 流水ID(604+Unix秒时间戳(10位)+xxxxxx)
 	BIZTYPE        int32  `json:"biztype"  xorm:"'BIZTYPE'"`               // 业务类型 - 1:套保计划 2:现货合同
 	OPERATELOGTYPE int32  `json:"operatelogtype"  xorm:"'OPERATELOGTYPE'"` // 操作流水类型 -
-	RELATEDID      string  `json:"relatedid"  xorm:"'RELATEDID'"`           // 现货合同ID\套保计划
+	RELATEDID      string `json:"relatedid"  xorm:"'RELATEDID'"`           // 现货合同ID\套保计划
 	LOGVALUE       string `json:"logvalue"  xorm:"'LOGVALUE'"`             // 数值
 	LOGDATETIME    string `json:"logdatetime"  xorm:"'LOGDATETIME'"`       // 流水日期(时间)
 	TRADEDATE      string `json:"tradedate"  xorm:"'TRADEDATE'"`           // 交易日(yyyyMMdd)
@@ -257,3 +257,94 @@ func (r *ErmcpReportMonthFR) GetDataEx() (interface{}, error) {
 
 	return sData, err
 }
+
+// 敞口日报表
+type ErmcpReportDayExposure struct {
+	RECKONDATE            string  `json:"reckondate"  xorm:"'RECKONDATE'"`                       // 日照时期(yyyyMMdd)
+	MIDDLEGOODSID         int64   `json:"middlegoodsid"  xorm:"'MIDDLEGOODSID'"`                 // 套保品种ID
+	AREAUSERID            int64   `json:"areauserid"  xorm:"'AREAUSERID'"`                       // 所属机构
+	ORIBUYPLANQTY         float64 `json:"oribuyplanqty"  xorm:"'ORIBUYPLANQTY'"`                 // 期初采购计划数量
+	ORIBUYPRICEDQTY       float64 `json:"oribuypricedqty"  xorm:"'ORIBUYPRICEDQTY'"`             // 期初采购合同已定价数量
+	ORISELLPLANQTY        float64 `json:"orisellplanqty"  xorm:"'ORISELLPLANQTY'"`               // 期初销售计划数量
+	ORISELLPRICEDQTY      float64 `json:"orisellpricedqty"  xorm:"'ORISELLPRICEDQTY'"`           // 期初销售合同已定价数量
+	ORIBUYFUTUREQTY       float64 `json:"oribuyfutureqty"  xorm:"'ORIBUYFUTUREQTY'"`             // 期初买入期货数量
+	ORISELLFUTUREQTY      float64 `json:"orisellfutureqty"  xorm:"'ORISELLFUTUREQTY'"`           // 期初卖出期货数量
+	BUYPLANQTY            float64 `json:"buyplanqty"  xorm:"'BUYPLANQTY'"`                       // 采购计划数量
+	BUYPRICEDQTY          float64 `json:"buypricedqty"  xorm:"'BUYPRICEDQTY'"`                   // 采购合同已定价数量
+	SELLPLANQTY           float64 `json:"sellplanqty"  xorm:"'SELLPLANQTY'"`                     // 销售计划数量
+	SELLPRICEDQTY         float64 `json:"sellpricedqty"  xorm:"'SELLPRICEDQTY'"`                 // 销售合同已定价数量
+	BUYFUTUREQTY          float64 `json:"buyfutureqty"  xorm:"'BUYFUTUREQTY'"`                   // 买入期货数量
+	SELLFUTUREQTY         float64 `json:"sellfutureqty"  xorm:"'SELLFUTUREQTY'"`                 // 卖出期货数量
+	TOTALSPOTQTY          float64 `json:"totalspotqty"  xorm:"'TOTALSPOTQTY'"`                   // 现货数量
+	TOTALFUTUREQTY        float64 `json:"totalfutureqty"  xorm:"'TOTALFUTUREQTY'"`               // 期货数量
+	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'"`             // 套保品种代码
+	MIDDLEGOODSHEDGERATIO float64 `json:"middlegoodshedgeratio"  xorm:"'MIDDLEGOODSHEDGERATIO'"` // 应套保比例
+	GOODSUNITID           int32   `json:"-"  xorm:"'GOODSUNITID'"`                               // 套保商品单位id
+
+	ENUMDICNAME     string  `json:"enumdicname"`     // 单位名称
+	OriTotalSpotQty float64 `json:"oriTotalSpotQty"` // 期初现货数量=(期初销售计划数量-期初销售合同已定价数量)-(期初采购计划数量-期初采购合同已定价数量)
+	OriTotalFutuQty float64 `json:"oriTotalFutuQty"` // 期初期货数量=期初买入期货数量-期初卖出期货数量
+	DiffSpotQty     float64 `json:"diffSpotQty"`     // 今日变动量(现货) = 现货数量 - 期初现货数量
+	DiffFutuQty     float64 `json:"diffFutuQty"`     // 今日变动量(期货) = (买入 - 买入期初) - (卖出 - 卖出期初)
+}
+
+// 数据处理
+func (r *ErmcpReportDayExposure) Calc() {
+	r.OriTotalSpotQty = (r.ORISELLPLANQTY - r.ORISELLPRICEDQTY) - (r.ORIBUYPLANQTY - r.ORIBUYPRICEDQTY)
+	r.OriTotalFutuQty = r.ORIBUYFUTUREQTY - r.ORISELLFUTUREQTY
+	r.DiffSpotQty = r.TOTALSPOTQTY - r.OriTotalSpotQty
+	r.DiffFutuQty = (r.BUYFUTUREQTY - r.ORIBUYFUTUREQTY) - (r.SELLFUTUREQTY - r.ORISELLFUTUREQTY)
+	r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.GOODSUNITID)
+}
+
+func (r *ErmcpReportDayExposure) buildSql() string {
+	var sqlId utils.SQLVal = "SELECT t.RECKONDATE," +
+		"       t.MIDDLEGOODSID," +
+		"       t.AREAUSERID," +
+		"       t.ORIBUYPLANQTY," +
+		"       t.ORIBUYPRICEDQTY," +
+		"       t.ORISELLPLANQTY," +
+		"       t.ORISELLPRICEDQTY," +
+		"       t.ORIBUYFUTUREQTY," +
+		"       t.ORISELLFUTUREQTY," +
+		"       t.BUYPLANQTY," +
+		"       t.BUYPRICEDQTY," +
+		"       t.SELLPLANQTY," +
+		"       t.SELLPRICEDQTY," +
+		"       t.BUYFUTUREQTY," +
+		"       t.SELLFUTUREQTY," +
+		"       t.TOTALSPOTQTY," +
+		"       t.TOTALFUTUREQTY," +
+		"       t.TOTALEXPOSURE," +
+		"       t.TOTALHEDGERATIO," +
+		"       t.TOTALNEEDHEDGEQTY," +
+		"       t.NEEDHEDGEEXPOSOURE," +
+		"       t.NEEDHEDGERATIO," +
+		"       g.middlegoodsname," +
+		"       g.middlegoodscode," +
+		"       g.needhedgeratio MIDDLEGOODSHEDGERATIO," +
+		"       g.goodsunitid" +
+		"  FROM RECKON_ERMCP_AREAEXPOSURE t" +
+		"  left join ERMS_MIDDLEGOODS g" +
+		"    on t.middlegoodsid = g.middlegoodsid" +
+		" WHERE 1 = 1"
+	sqlId.And("t.AREAUSERID", r.AREAUSERID)
+	sqlId.And("t.RECKONDATE", r.RECKONDATE)
+	return sqlId.String()
+}
+
+// 获取敞口日报表
+func (r *ErmcpReportDayExposure) GetDataEx() (interface{}, error) {
+	sData := make([]ErmcpReportDayExposure, 0)
+	err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
+	for i := range sData {
+		sData[i].Calc()
+	}
+	return sData, err
+}

+ 10 - 7
mtpcache/enumdicitem.go

@@ -35,14 +35,14 @@ func init() {
 func (r *enumdicitem) load() {
 	now := time.Now()
 	// 间隔3秒以上才重新加载
-	if d := now.Sub(r.last); d.Seconds() < 3{
+	if d := now.Sub(r.last); d.Seconds() < 3 {
 		return
 	}
 
 	r.mtx.Lock()
 	defer r.mtx.Unlock()
 	e := db.GetEngine()
-	if e == nil{
+	if e == nil {
 		return
 	}
 
@@ -67,11 +67,11 @@ func (r *enumdicitem) get(id int32) string {
 	r.mtx.RLock()
 	defer r.mtx.RUnlock()
 
-	if r.data == nil{
+	if r.data == nil {
 		return ""
 	}
 
-	if v, ok := r.data[id]; ok{
+	if v, ok := r.data[id]; ok {
 		return v
 	}
 	return ""
@@ -79,11 +79,14 @@ func (r *enumdicitem) get(id int32) string {
 
 // 获取商品单位枚举名称
 func GetEnumDicitemName(id int32) string {
-	if v := vDic.get(id); v !=""{
+	if id <= 0 {
+		return ""
+	}
+	if v := vDic.get(id); v != "" {
 		return v
-	}else{
+	} else {
 		vDic.load()
 	}
 
 	return vDic.get(id)
-}
+}

+ 1 - 0
routers/router.go

@@ -342,6 +342,7 @@ func InitRouter() *gin.Engine {
 		ermcpR.GET("/QryReportDayFinanceKx", ermcp.QryReportDayFinanceKx)
 		ermcpR.GET("/QryReportDayFinanceFp", ermcp.QryReportDayFinanceFp)
 		ermcpR.GET("/QryReportMonthFinance", ermcp.QryReportMonthFinance)
+		ermcpR.GET("/QryReportDayExposure", ermcp.QryReportDayExposure)
 	}
 
 	return r

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio