瀏覽代碼

Merge branch 'master' of 192.168.30.132:MTP2.0/MTP20_IF

zhou.xiaoning 4 年之前
父節點
當前提交
8e6f3dbe8f

+ 76 - 11
controllers/ermcp/qryExposure.go

@@ -56,13 +56,13 @@ func QueryRealtimeExposure(c *gin.Context) {
 //敞口现货明细请求
 type ExposureDetailReq struct {
 	AreaUserId    uint32 `form:"areaUserId" json:"areaUserId"`       // 所属机构ID
-	MiddleGoodsId int32 `form:"middleGoodsId" json:"middlegoodsid"` // 套保商品
+	MiddleGoodsId int32  `form:"middleGoodsId" json:"middlegoodsid"` // 套保商品
 }
 
 //敞口现货明细响应
 type ExposureDetailRsp models.ErmcpExposureDetailModel
 
-// QueryUserInfo 查询敞口现货明细
+// 查询敞口现货明细
 // @Summary 查询敞口现货明细
 // @Produce json
 // @Security ApiKeyAuth
@@ -75,15 +75,15 @@ type ExposureDetailRsp models.ErmcpExposureDetailModel
 func QueryExposureDetail(c *gin.Context) {
 	appG := app.Gin{C: c}
 	var req ExposureDetailReq
-	if err := c.ShouldBind(&req); err != nil{
+	if err := c.ShouldBind(&req); err != nil {
 		appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
 		return
 	}
 
 	var m = models.ErmcpExposureDetailModel{Areauserid: req.AreaUserId, MiddlegoodsId: req.MiddleGoodsId}
-	if d, err := m.GetData(); err == nil{
+	if d, err := m.GetData(); err == nil {
 		appG.Response(http.StatusOK, e.SUCCESS, d)
-	}else {
+	} else {
 		appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
 	}
 }
@@ -98,7 +98,7 @@ type ExposureSpotReq struct {
 // 敞口/现货头寸应答
 type ExposureSpotRsp models.AreaSpotModel
 
-// QueryUserInfo 查询敞口现货头寸
+// QueryExposureSpot 查询敞口现货头寸
 // @Summary 查询敞口现货头寸(敞口/现货头寸)
 // @Produce json
 // @Security ApiKeyAuth
@@ -107,17 +107,82 @@ type ExposureSpotRsp models.AreaSpotModel
 // @Failure 500 {object} app.Response
 // @Router /Ermcp/QueryExposureSpot [get]
 // @Tags 企业风险管理(app)
-func QueryExposureSpot(c *gin.Context)  {
+func QueryExposureSpot(c *gin.Context) {
 	appG := app.Gin{C: c}
 	var req ExposureSpotReq
-	if err := c.ShouldBind(&req); err != nil{
+	if err := c.ShouldBind(&req); err != nil {
 		appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
 		return
 	}
 	var m = models.AreaSpotModel{AREAUSERID: req.AreaUserID}
-	if d, err := m.GetData(); err == nil{
+	if d, err := m.GetData(); err == nil {
+		appG.Response(http.StatusOK, e.SUCCESS, d)
+	} else {
+		appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
+	}
+}
+
+////////////////////////////////////////////
+
+// 敞口/现货头寸/现货明细请求
+type ExposureSpotDetailReq struct {
+	AreaUserID   int `form:"areaUserId" binding:"required"`   //所属机构ID
+	WrstandardId int32 `form:"wrstandardId" binding:"required"` // 现货商品ID
+}
+
+// 敞口/现货头寸/现货明细应答
+type ExposureSpotDetailRsp models.ErmcpAreaSpotDetailModel
+
+// @Summary 查询敞口现货头寸明细(敞口/现货头寸/现货明细)
+// @Produce json
+// @Security ApiKeyAuth
+// @Param areaUserId query int true "所属机构ID"
+// @Param wrstandardId query int true "现货品种ID"
+// @Success 200 {array} ExposureSpotDetailRsp
+// @Failure 500 {object} app.Response
+// @Router /Ermcp/QueryExposureSpotDetail [get]
+// @Tags 企业风险管理(app)
+func QueryExposureSpotDetail(c *gin.Context) {
+	appG := app.GinUtils{Gin:app.Gin{C: c}}
+	var req ExposureSpotDetailReq
+	appG.DoBindReq(&req)
+	m := models.ErmcpAreaSpotDetailModel{UserId: req.AreaUserID, WrstandardId: req.WrstandardId}
+	// m必须传指针类型,否则无法进行类型转换
+	appG.DoGetData(&m)
+}
+
+///////////////////////////////////////////
+
+// 敞口/历史敞口请求
+type HisExposureReq struct {
+	AreaUserID int32 `form:"areaUserId" binding:"required"` //所属机构ID
+	LastNum    int32 `form:"lastNum" binding:"required"`    //查询最近多少条记录
+}
+
+// 敞口/历史敞口应答
+type HisExposureRsp models.ErmcpHisExposure
+
+// QueryUserInfo 查询历史敞口
+// @Summary 查询历史敞口(菜单:敞口/历史敞口)
+// @Produce json
+// @Security ApiKeyAuth
+// @Param areaUserId query int true "所属机构ID"
+// @Param lastNum query int true "最近多少条记录, -1:为查全部"
+// @Success 200 {array} HisExposureRsp
+// @Failure 500 {object} app.Response
+// @Router /Ermcp/QueryHisExposure [get]
+// @Tags 企业风险管理(app)
+func QueryHisExposure(c *gin.Context) {
+	appG := app.Gin{C: c}
+	var req HisExposureReq
+	if err := c.ShouldBind(&req); err != nil {
+		appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
+		return
+	}
+	var m = models.ErmcpHisExposure{AREAUSERID: req.AreaUserID, LastNum: req.LastNum}
+	if d, err := m.GetData(); err == nil {
 		appG.Response(http.StatusOK, e.SUCCESS, d)
-	}else{
+	} else {
 		appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
 	}
-}
+}

+ 39 - 0
controllers/ermcp/qryMiddleGoods.go

@@ -0,0 +1,39 @@
+/**
+* @Author: zou.yingbin
+* @Create  : 2021/1/26 13:41
+* @Modify  : 2021/1/26 13:41
+ */
+
+package ermcp
+
+import (
+	"github.com/gin-gonic/gin"
+	"mtp2_if/global/app"
+	"mtp2_if/models"
+)
+
+// 查询套保品种请求
+type QryMiddleGoodsReq struct {
+	UserId uint32 `form:"userid" binding:"required"` //用户ID
+	Status *int32 `form:"status" binding:"required"` //状态
+}
+
+// 查询套保品种应答
+type QryMiddleGoodsRsp models.ErmcpMiddleGoodsModel
+
+// @Summary 查询套保品种(菜单:套保品种)
+// @Produce json
+// @Security ApiKeyAuth
+// @Param userid query int true  "所属机构ID"
+// @Param status query int true  "状态 0-停用 1-正常"
+// @Success 200 {array} QryMiddleGoodsRsp
+// @Failure 500 {object} app.Response
+// @Router /Ermcp/QueryMiddleGoods [get]
+// @Tags 企业风险管理(app)
+func QueryMiddleGoods(c *gin.Context) {
+	appG := app.GinUtils{Gin:app.Gin{C: c}}
+	var req QryMiddleGoodsReq
+	appG.DoBindReq(&req)
+	m := models.ErmcpMiddleGoodsModel{AREAUSERID: req.UserId, ISVALID: *req.Status}
+	appG.DoGetData(&m)
+}

+ 41 - 3
controllers/ermcp/qryWrstandard.go

@@ -18,6 +18,7 @@ import (
 //查询现货商品请求
 type QryWrStandardReq struct {
 	UserId int `form:"userid" binding:"required"` //用户ID
+	Status *int32 `form:"status" binding:"required"` //状态
 }
 
 //查询现货商品响应
@@ -28,18 +29,19 @@ type QryWrStandardRsp models.ErmcpWrstandard
 // @Produce json
 // @Security ApiKeyAuth
 // @Param userid query int true  "所属机构ID"
+// @Param status query int true  "状态 0-停用 1-正常"
 // @Success 200 {array} QryWrStandardRsp
 // @Failure 500 {object} app.Response
 // @Router /Ermcp/QueryWrStandard [get]
 // @Tags 企业风险管理(app)
-func QueryWrStandard(c *gin.Context)  {
+func QueryWrStandard(c *gin.Context) {
 	appG := app.Gin{C: c}
 	var req QryWrStandardReq
-	if err := c.ShouldBind(&req); err != nil{
+	if err := c.ShouldBind(&req); err != nil {
 		appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
 		return
 	}
-	m := models.ErmcpWrstandard{AREAUSERID: req.UserId}
+	m := models.ErmcpWrstandard{AREAUSERID: req.UserId, ISVALID: *req.Status}
 	if d, err := m.GetData(); err == nil {
 		for i := range d {
 			d[i].EnumdicName = mtpcache.GetEnumDicitemName(d[i].UNITID)
@@ -49,3 +51,39 @@ func QueryWrStandard(c *gin.Context)  {
 		appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
 	}
 }
+
+///////////////////////////////
+
+//查询现货商品请求
+type QryWrStandardDetailReq struct {
+	UserId       int `form:"userid" binding:"required"`       //用户ID
+	Wrstandardid int `form:"wrstandardid" binding:"required"` // 现货商品ID
+}
+
+//查询现货商品响应
+type QryWrStandardDetailRsp models.ErmcpWrstandDetail
+
+// @Summary 查询现货商品详情(菜单:现货品种/现货品种详情)
+// @Produce json
+// @Security ApiKeyAuth
+// @Param userid query int true  "所属机构ID"
+// @Param wrstandardid query int true  "现货商品ID"
+// @Success 200 {array} QryWrStandardDetailRsp
+// @Failure 500 {object} app.Response
+// @Router /Ermcp/QueryWrStandardDetail [get]
+// @Tags 企业风险管理(app)
+func QueryWrStandardDetail(c *gin.Context) {
+	appG := app.Gin{C: c}
+	var req QryWrStandardDetailReq
+	if err := c.ShouldBind(&req); err != nil {
+		appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
+		return
+	}
+	m := models.ErmcpWrstandDetail{Wrd: models.ErmcpWrstandard{AREAUSERID: req.UserId,
+		WRSTANDARDID: int64(req.Wrstandardid)}}
+	if d, err := m.GetData(); err == nil {
+		appG.Response(http.StatusOK, e.SUCCESS, d)
+	} else {
+		appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
+	}
+}

File diff suppressed because it is too large
+ 649 - 403
docs/docs.go


File diff suppressed because it is too large
+ 649 - 403
docs/swagger.json


File diff suppressed because it is too large
+ 1447 - 1225
docs/swagger.yaml


+ 60 - 0
global/app/ginUtils.go

@@ -0,0 +1,60 @@
+/**
+* @Author: zou.yingbin
+* @Create  : 2021/1/25 9:42
+* @Modify  : 2021/1/25 9:42
+ */
+
+package app
+
+import (
+	"mtp2_if/global/e"
+	"mtp2_if/logger"
+	"net/http"
+)
+
+// 获取数据接口
+type IGetData interface {
+	GetData()([]interface{}, error)
+}
+
+// 数据处理接口
+type ICalc interface {
+	Calc()
+}
+
+// 封装绑定和数据获取处理
+type GinUtils struct {
+	Gin
+	err error
+}
+
+// 处理参数绑定
+func (r *GinUtils) DoBindReq(req interface{}) {
+	if r.err = r.C.ShouldBind(req); r.err != nil{
+		r.Gin.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
+	}
+}
+
+// 处理数据获取, 参数obj为models结构体
+func (r *GinUtils) DoGetData(obj interface{}) {
+	// 如果在参数绑定阶段有错误, 则不执行数据获取
+	if r.err != nil{
+		return
+	}
+	if v, ok := obj.(IGetData); ok{
+		if d, err := v.GetData(); err == nil{
+			// 执行数据处理
+			for i := range d {
+				if val, ok := d[i].(ICalc); ok{
+					val.Calc()
+				}else{
+					break
+				}
+			}
+			r.Gin.Response(http.StatusOK, e.SUCCESS, d)
+		}else{
+			logger.GetLogger().Errorf("query fail, %v", err)
+			r.Gin.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
+		}
+	}
+}

+ 1 - 0
go.sum

@@ -310,6 +310,7 @@ golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd h1:GGJVjV8waZKRHrgwvtH66z9ZGVurTD1MT0n1Bb+q4aM=
 golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/image v0.0.0-20180628062038-cc896f830ced/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=

+ 147 - 2
models/ermcpExposure.go

@@ -227,7 +227,7 @@ func (r *AreaSpotModel) buildSql() string {
 		"       t.SELLPLANQTY," +
 		"       t.SELLPRICEDQTY," +
 		"       t.TOTALSPOTQTY," +
-		"       to_char(t.UPDATETIME,'yyyy-mm-dd hh24:mi:ss') UPDATETIME"+
+		"       to_char(t.UPDATETIME,'yyyy-mm-dd hh24:mi:ss') UPDATETIME" +
 		"  from ermcp_areaspot t" +
 		"  left join wrstandard w" +
 		"    on t.wrstandardid = w.wrstandardid" +
@@ -239,7 +239,7 @@ func (r *AreaSpotModel) buildSql() string {
 func (r *AreaSpotModel) GetData() ([]AreaSpotModel, error) {
 	e := db.GetEngine()
 	sData := make([]AreaSpotModel, 0)
-	if err := e.SQL(r.buildSql()).Find(&sData); err != nil{
+	if err := e.SQL(r.buildSql()).Find(&sData); err != nil {
 		return nil, err
 	}
 	for i := range sData {
@@ -247,3 +247,148 @@ func (r *AreaSpotModel) GetData() ([]AreaSpotModel, error) {
 	}
 	return sData, nil
 }
+
+// 现货头寸-现货明细
+type ErmcpAreaSpotDetailModel struct {
+	Relatedid      string  `json:"relatedid"  xorm:"'relatedid'"`           // 套保计划ID/现货合同ID
+	Relatedno      string  `json:"relatedno"  xorm:"'relatedno'"`           // 编号
+	LogType        int32   `json:"logtype"  xorm:"'logType'"`               // 记录类型 1-套保 2-现货合同
+	Contracttype   int32   `json:"contracttype"  xorm:"'contracttype'"`     // 合同类型 1-采购 -1-销售
+	Wrstandardname string  `json:"wrstandardname"  xorm:"'wrstandardname'"` // 现货商品名称
+	Wrstandardcode string  `json:"wrstandardcode"  xorm:"'wrstandardcode'"` // 现货商品代码
+	Qty            float64 `json:"qty"  xorm:"'qty'"`                       // 数量
+	Strtime        string  `json:"strtime"  xorm:"'strtime'"`               // 时间
+	Enumdicname    string  `json:"enumdicname"`                             // 现货商品单位名称
+	Recordname     string  `json:"recordname"`                              // 类型名称
+	Unitid         int32   `json:"-"  xorm:"'UNITID'"`                      // 单位ID
+	UserId         int     `json:"-"`                                       // 所属用户ID
+	WrstandardId   int32   `json:"-"`                                       // 现货商品ID
+}
+
+// 组建查询SQL
+func (r *ErmcpAreaSpotDetailModel) buildSql() string {
+	str := "select to_char(t.hedgeplanid) relatedid," +
+		"       t.hedgeplanno relatedno," +
+		"       1 as logType," +
+		"       t.contracttype," +
+		"       w.wrstandardname," +
+		"       w.wrstandardcode," +
+		"       t.planqty qty," +
+		"        w.unitid," +
+		"       to_char(t.createtime, 'yyyy-mm-dd hh:mi:ss') strtime" +
+		"  from ermcp_hedgeplan t" +
+		"  left join wrstandard w" +
+		"    on t.wrstandardid = w.wrstandardid" +
+		" where t.hedgeplanstatus in (2, 3, 5)" +
+		"   and t.areauserid = %v and t.wrstandardid = %v" +
+		" union all " +
+		"select to_char(t.spotcontractid)," +
+		"       t.contractno," +
+		"       1 as logType," +
+		"       t.contracttype," +
+		"       w.wrstandardname," +
+		"       w.wrstandardcode," +
+		"       t.qty," +
+		"       w.unitid," +
+		"       to_char(t.createtime, 'yyyy-mm-dd hh:mi:ss') strtime" +
+		"  from ermcp_spotcontract t" +
+		"  left join wrstandard w" +
+		"    on t.wrstandardid = w.wrstandardid" +
+		" where t.contractstatus in (2, 3, 5)" +
+		"   and t.userid = %v and t.wrstandardid = %v"
+
+	return fmt.Sprintf(str, r.UserId, r.WrstandardId, r.UserId, r.WrstandardId)
+}
+
+// 现货头寸-明细:数据加工处理
+func (r *ErmcpAreaSpotDetailModel) Calc() {
+	var logTypeName, contractTypeName string
+	if r.LogType == 1 {
+		logTypeName = "计划"
+	} else {
+		logTypeName = "合同"
+	}
+
+	if r.Contracttype == 1 {
+		contractTypeName = "采购"
+	} else {
+		contractTypeName = "销售"
+	}
+
+	r.Recordname = contractTypeName + logTypeName
+	r.Enumdicname = mtpcache.GetEnumDicitemName(r.Unitid)
+}
+
+// 现货头寸-明细:从数据库中查询敞口现货头寸明细数据
+func (r *ErmcpAreaSpotDetailModel) GetData() ([]interface{}, error) {
+	sData := make([]ErmcpAreaSpotDetailModel, 0)
+	err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
+	iDatas := make([]interface{}, 0)
+	for i := range sData {
+		// 注意要传指针类型(&sData[i]),因为要接口转换
+		iDatas = append(iDatas, &sData[i])
+	}
+	return iDatas, err
+}
+
+///////////////////////////
+
+/*历史/历史敞口*/
+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'"`         // 期货头寸总量
+	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:"-"`                                               // 查询条数
+}
+
+// 历史分品种嵌套结构
+type ErmcpHisExposureS struct {
+	MIDDLEGOODSID   int32              `json:"middlegoodsid"`   // 套保品种ID
+	MIDDLEGOODSNAME string             `json:"middlegoodsname"` // 套保品种名称
+	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"
+	if r.LastNum <= 0 {
+		r.LastNum = 100000 //限制最多查10W条
+	}
+	return fmt.Sprintf(str, r.AREAUSERID, r.LastNum)
+}
+
+// 获取历史敞口
+func (r *ErmcpHisExposure) GetData() ([]ErmcpHisExposure, error) {
+	e := db.GetEngine()
+	sData := make([]ErmcpHisExposure, 0)
+	if err := e.SQL(r.buildSql()).Find(&sData); err != nil {
+		return nil, err
+	}
+	return sData, nil
+}

+ 73 - 0
models/ermcpMiddleGoods.go

@@ -0,0 +1,73 @@
+/**
+* @Author: zou.yingbin
+* @Create  : 2021/1/26 13:42
+* @Modify  : 2021/1/26 13:42
+ */
+
+package models
+
+import (
+	"fmt"
+	"mtp2_if/db"
+	"mtp2_if/logger"
+	"mtp2_if/mtpcache"
+)
+
+// 套保品种
+type ErmcpMiddleGoodsModel struct {
+	MIDDLEGOODSID    uint32  `json:"middlegoodsid"  xorm:"'MIDDLEGOODSID'"`       // 套保品种ID(SEQ_ERMS_MIDDLEGOODS)
+	MIDDLEGOODSNAME  string  `json:"middlegoodsname"  xorm:"'MIDDLEGOODSNAME'"`   // 套保品种名称
+	MIDDLEGOODSCODE  string  `json:"middlegoodscode"  xorm:"'MIDDLEGOODSCODE'"`   // 套保品种代码
+	GOODSUNITID      int32   `json:"-"  xorm:"'GOODSUNITID'"`                     // 单位ID
+	RELATEDGOODSID   int32   `json:"relatedgoodsid"  xorm:"'RELATEDGOODSID'"`     // 关联交易商品ID
+	EVALUATERATIO    float64 `json:"evaluateratio"  xorm:"'EVALUATERATIO'"`       // 估价系数
+	QTYDECIMALPLACE  int32   `json:"qtydecimalplace"  xorm:"'QTYDECIMALPLACE'"`   // 数量小数位
+	RELATEDGOODSTYPE int32   `json:"relatedgoodstype"  xorm:"'RELATEDGOODSTYPE'"` // 关联商品类型 - 1:期货合约 2:现货品种
+	NEEDHEDGERATIO   float64 `json:"needhedgeratio"  xorm:"'NEEDHEDGERATIO'"`     // 套保比率
+	AREAUSERID       uint32  `json:"areauserid"  xorm:"'AREAUSERID'"`             // 机构用户ID
+	GOODSGROUPID     int32   `json:"goodsgroupid"  xorm:"'GOODSGROUPID'"`         // 关联期货品种ID
+	ISVALID          int32   `json:"isvalid"  xorm:"'ISVALID'"`                   // 状态 0-无效(停用) 1-有效(正常)
+	MODIFYTIME       string  `json:"modifytime"  xorm:"'MODIFYTIME'"`             // 修改时间
+	ENUMDICNAME      string  `json:"enumdicname"`                                 // 单位名称
+}
+
+func (r *ErmcpMiddleGoodsModel) Calc() {
+	r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.GOODSUNITID)
+}
+
+// 获取套保品种数据
+func (r *ErmcpMiddleGoodsModel) GetData() ([]interface{}, error) {
+	sData := make([]ErmcpMiddleGoodsModel, 0)
+	if err := db.GetEngine().SQL(r.buildSql()).Find(&sData); err != nil{
+		logger.GetLogger().Error(err)
+		return nil, err
+	}
+	iData := make([]interface{}, 0)
+	for i := range sData {
+		iData = append(iData, &sData[i])
+	}
+	return iData, nil
+}
+
+func (r *ErmcpMiddleGoodsModel) buildSql() string {
+	sqlId := "select MIDDLEGOODSID," +
+		"       MIDDLEGOODSNAME," +
+		"       MIDDLEGOODSCODE," +
+		"       GOODSUNITID," +
+		"       RELATEDGOODSID," +
+		"       EVALUATERATIO," +
+		"       QTYDECIMALPLACE," +
+		"       RELATEDGOODSTYPE," +
+		"       NEEDHEDGERATIO," +
+		"       AREAUSERID," +
+		"       GOODSGROUPID," +
+		"       to_char(MODIFYTIME, 'yyyy-mm-dd hh24:mi:ss') MODIFYTIME," +
+		"       ISVALID" +
+		"  from erms_middlegoods t" +
+		"  where 1=1 "
+	if r.AREAUSERID > 0{
+		sqlId = sqlId + fmt.Sprintf(" and AREAUSERID = %v", r.AREAUSERID)
+	}
+	sqlId = sqlId + fmt.Sprintf(" and ISVALID=%v", r.ISVALID)
+	return sqlId
+}

+ 1 - 1
models/ermcpUser.go

@@ -147,7 +147,7 @@ func (r *ErmcpUserModel) GetData(queryType int32) ([]ErmcpUserModel, error) {
 		sqlId = r.buildWskhSql("1")
 		decryptAddr = true
 	case 2: //待审核
-		sqlId = r.buildWskhSql("2,4")
+		sqlId = r.buildWskhSql("2,4,5")
 		decryptAddr = true
 	case 3: //正常
 		sqlId = r.buildSql("4")

+ 199 - 19
models/ermcpWrstandard.go

@@ -14,23 +14,25 @@ import (
 
 // 现货商品表
 type ErmcpWrstandard struct {
-	WRSTANDARDID    int64  `json:"wrstandardid"  xorm:"'WRSTANDARDID'"`       //现货商品ID(SEQ_WRSTANDARD)
-	WRSTANDARDCODE  string `json:"wrstandardcode"  xorm:"'WRSTANDARDCODE'"`   //现货商品代码
-	DELIVERYGOODSID int32  `json:"deliverygoodsid"  xorm:"'DELIVERYGOODSID'"` //品种ID
-	UNITID          int32  `json:"unitid"  xorm:"'UNITID'"`                   //单位ID
-	MINIVALUE       int32  `json:"minivalue"  xorm:"'MINIVALUE'"`             //最小变动值
-	MINIVALUEDP     int32  `json:"minivaluedp"  xorm:"'MINIVALUEDP'"`         //最小变动值小数位
-	REALMINIVALUE   int32  `json:"realminivalue"  xorm:"'REALMINIVALUE'"`     //实际最小变动值
-	REALMINIVALUEDP int32  `json:"realminivaluedp"  xorm:"'REALMINIVALUEDP'"` //实际最小变动值小数位
-	CREATORID       int64  `json:"creatorid"  xorm:"'CREATORID'"`             //创建人
-	CREATETIME      string `json:"createtime"  xorm:"'CREATETIME'"`           //创建时间
-	WRSTANDARDNAME  string `json:"wrstandardname"  xorm:"'WRSTANDARDNAME'"`   //现货商品名称
-	AREAUSERID      int    `json:"areauserid"  xorm:"'AREAUSERID'"`           //所属机构
-	EnumdicName     string `json:"enumdicname"`                               //单位名称
+	WRSTANDARDID    int64  `json:"wrstandardid"  xorm:"'WRSTANDARDID'"`       // 现货商品ID(SEQ_WRSTANDARD)
+	WRSTANDARDCODE  string `json:"wrstandardcode"  xorm:"'WRSTANDARDCODE'"`   // 现货商品代码
+	DELIVERYGOODSID int32  `json:"deliverygoodsid"  xorm:"'DELIVERYGOODSID'"` // 品种ID
+	UNITID          int32  `json:"unitid"  xorm:"'UNITID'"`                   // 单位ID
+	MINIVALUE       int32  `json:"minivalue"  xorm:"'MINIVALUE'"`             // 最小变动值
+	MINIVALUEDP     int32  `json:"minivaluedp"  xorm:"'MINIVALUEDP'"`         // 最小变动值小数位
+	REALMINIVALUE   int32  `json:"realminivalue"  xorm:"'REALMINIVALUE'"`     // 实际最小变动值
+	REALMINIVALUEDP int32  `json:"realminivaluedp"  xorm:"'REALMINIVALUEDP'"` // 实际最小变动值小数位
+	CREATORID       int64  `json:"creatorid"  xorm:"'CREATORID'"`             // 创建人
+	CREATETIME      string `json:"createtime"  xorm:"'CREATETIME'"`           // 创建时间
+	WRSTANDARDNAME  string `json:"wrstandardname"  xorm:"'WRSTANDARDNAME'"`   // 现货商品名称
+	AREAUSERID      int    `json:"areauserid"  xorm:"'AREAUSERID'"`           // 所属机构
+	EnumdicName     string `json:"enumdicname"`                               // 单位名称
+	ISVALID         int32  `json:"isvalid"  xorm:"'ISVALID'"`                 // 是否有效 0-无效(停用) 1-有效(正常)
+	UPDATETIME      string `json:"updatetime"  xorm:"'UPDATETIME'"`           // 更新时间
+	REMARK          string `json:"remark"  xorm:"'REMARK'"`                   // 备注
 }
 
-// 查询现货商品
-func (r *ErmcpWrstandard) GetData() ([]ErmcpWrstandard, error) {
+func (r *ErmcpWrstandard) buildSql() string {
 	str := "select WRSTANDARDID," +
 		"       WRSTANDARDCODE," +
 		"       DELIVERYGOODSID," +
@@ -40,18 +42,196 @@ func (r *ErmcpWrstandard) GetData() ([]ErmcpWrstandard, error) {
 		"       REALMINIVALUE," +
 		"       REALMINIVALUEDP," +
 		"       CREATORID," +
-		"       CREATETIME," +
+		"       to_char(CREATETIME, 'yyyy-mm-dd hh24:mi:ss') CREATETIME," +
 		"       WRSTANDARDNAME," +
+		"       ISVALID," +
+		"       to_char(UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
+		"       REMARK," +
 		"       AREAUSERID" +
 		"  from wrstandard t" +
-		" where t.isvalid = 1 and t.AREAUSERID=%v"
+		" where t.AREAUSERID=%v and t.ISVALID=%v"
+	sqlId := fmt.Sprintf(str, r.AREAUSERID, r.ISVALID)
+	if r.WRSTANDARDID > 0 {
+		sqlId = sqlId + fmt.Sprintf(" and WRSTANDARDID=%v", r.WRSTANDARDID)
+	}
+	return sqlId
+}
 
-	sqlId := fmt.Sprintf(str, r.AREAUSERID)
+// 查询现货商品
+func (r *ErmcpWrstandard) GetData() ([]ErmcpWrstandard, error) {
 	sData := make([]ErmcpWrstandard, 0)
 	e := db.GetEngine()
-	if err := e.SQL(sqlId).Find(&sData); err != nil {
+	if err := e.SQL(r.buildSql()).Find(&sData); err != nil {
 		logger.GetLogger().Errorf("query wrstardard fail, %v", err)
 		return sData, err
 	}
 	return sData, nil
 }
+
+// 商品型号表
+type GoodsTypeModel struct {
+	MODELID         int    `json:"modelid"  xorm:"'MODELID'"`       // 型号ID
+	MODELNAME       string `json:"modelname"  xorm:"'MODELNAME'"`   // 型号名称
+	WRSTANDARDID    int64  `json:"-"  xorm:"'WRSTANDARDID'"`        // 现货商品ID
+	DELIVERYGOODSID int32  `json:"-"  xorm:"'DELIVERYGOODSID'"`     // 现货品种ID
+	AREAUSERID      int    `json:"-"  xorm:"'AREAUSERID'"`          // 所属机构
+	ISVALID         int32  `json:"-"  xorm:"'ISVALID'"`             // 是否有效 - 0:无效 1:有效
+	CREATORSRC      int32  `json:"-"  xorm:"'CREATORSRC'"`          // 创建人来源 - 1:管理端 2:终端
+	CREATORID       int32  `json:"-"  xorm:"'CREATORID'"`           // 创建人
+	CREATETIME      string `json:"-"  xorm:"'CREATETIME'"`          // SYSDATE		创建时间
+	UPDATORSRC      int32  `json:"-"  xorm:"'UPDATORSRC'"`          // 更新人来源 - 1:管理端 2:终端
+	UPDATORID       int32  `json:"-"  xorm:"'UPDATORID'"`           // 更新人
+	UPDATETIME      string `json:"updatetime"  xorm:"'UPDATETIME'"` // 更新时间
+}
+
+// 获取商品型号表数据
+func (r *GoodsTypeModel) GetData() ([]GoodsTypeModel, error) {
+	sData := make([]GoodsTypeModel, 0)
+	if err := db.GetEngine().SQL(r.buildSql()).Find(&sData); err != nil {
+		logger.GetLogger().Errorf("query goodsTypeModel fail, %v", err)
+		return nil, err
+	}
+	return sData, nil
+}
+
+func (r *GoodsTypeModel) buildSql() string {
+	sqlId := "select MODELID," +
+		"       MODELNAME," +
+		"       WRSTANDARDID," +
+		"       DELIVERYGOODSID," +
+		"       AREAUSERID," +
+		"       ISVALID," +
+		"       CREATORSRC," +
+		"       CREATORID," +
+		"       to_char(CREATETIME, 'yyyy-mm-dd hh24:mi:ss') CREATETIME," +
+		"       UPDATORSRC," +
+		"       UPDATORID," +
+		"       to_char(UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME" +
+		"  from spotgoodsmodel where ISVALID=1"
+	if r.AREAUSERID > 0 {
+		sqlId = sqlId + fmt.Sprintf(" and AREAUSERID=%v", r.AREAUSERID)
+	}
+	if r.WRSTANDARDID > 0 {
+		sqlId = sqlId + fmt.Sprintf(" and WRSTANDARDID=%v", r.WRSTANDARDID)
+	}
+	return sqlId
+}
+
+// 商品品牌
+type GoodsBrand struct {
+	BRANDID         int    `json:"brandid"  xorm:"'bRANDID'"`     // 品牌ID
+	BRANDNAME       string `json:"brandname"  xorm:"'BRANDNAME'"` // 品牌名称
+	WRSTANDARDID    int64  `json:"-"  xorm:"'WRSTANDARDID'"`      // 现货商品ID
+	DELIVERYGOODSID int32  `json:"-"  xorm:"'DELIVERYGOODSID'"`   // 现货品种ID
+	AREAUSERID      int    `json:"-"  xorm:"'AREAUSERID'"`        // 所属机构
+	ISVALID         int32  `json:"isvalid"  xorm:"'ISVALID'"`     // 是否有效 - 0:无效 1:有效
+}
+
+func (r *GoodsBrand) buildSql() string {
+	sqlId := "select BRANDID," +
+		"       BRANDNAME," +
+		"       WRSTANDARDID," +
+		"       DELIVERYGOODSID," +
+		"       AREAUSERID," +
+		"       ISVALID" +
+		"  from spotgoodsbrand" +
+		" where ISVALID = 1"
+	if r.AREAUSERID > 0 {
+		sqlId = sqlId + fmt.Sprintf(" and AREAUSERID=%v", r.AREAUSERID)
+	}
+	if r.WRSTANDARDID > 0 {
+		sqlId = sqlId + fmt.Sprintf(" and WRSTANDARDID=%v", r.WRSTANDARDID)
+	}
+	return sqlId
+}
+
+// 获取品牌数据
+func (r *GoodsBrand) GetData() ([]GoodsBrand, error) {
+	sData := make([]GoodsBrand, 0)
+	if err := db.GetEngine().SQL(r.buildSql()).Find(&sData); err != nil {
+		logger.GetLogger().Errorf("query GoodsBrand fail, %v", err)
+		return nil, err
+	}
+	return sData, nil
+}
+
+// 现货商品折算配置明细表
+type WRSConverTDetail struct {
+	WRSTANDARDID    int64   `json:"wrstandardid"  xorm:"'WRSTANDARDID'"`       // 现货商品ID
+	DELIVERYGOODSID int32   `json:"deliverygoodsid"  xorm:"'DELIVERYGOODSID'"` // 现货品种ID
+	MIDDLEGOODSID   int64   `json:"middlegoodsid"  xorm:"'MIDDLEGOODSID'"`     // 套保品种ID
+	CONVERTRATIO    float64 `json:"convertratio"  xorm:"'CONVERTRATIO'"`       // 套保系数
+	MODIFYTIME      string  `json:"modifytime"  xorm:"'MODIFYTIME'"`           // 修改时间
+	MIDDLEGOODSNAME string  `json:"middlegoodsname"  xorm:"'middlegoodsname'"` // 套保品种名称
+	MIDDLEGOODSCODE string  `json:"middlegoodscode"  xorm:"'middlegoodscode'"` // 套保品种代码
+}
+
+func (r *WRSConverTDetail) buildSql() string {
+	sqlId := "select t.WRSTANDARDID," +
+		"       t.DELIVERYGOODSID," +
+		"       t.MIDDLEGOODSID," +
+		"       t.CONVERTRATIO," +
+		"       to_char(t.MODIFYTIME, 'yyyy-mm-dd hh24:mi:ss') MODIFYTIME," +
+		"       m.middlegoodsname," +
+		"       m.middlegoodscode" +
+		"  from Erms2_Wrsconvertdetail t" +
+		"  left join erms_middlegoods m" +
+		"    on t.middlegoodsid = m.middlegoodsid" +
+		"    where 1=1"
+	if r.WRSTANDARDID > 0 {
+		sqlId = sqlId + fmt.Sprintf(" and t.wrstandardid=%v", r.WRSTANDARDID)
+	}
+	return sqlId
+}
+
+// 获取现货商品折算配置明细表数据
+func (r *WRSConverTDetail) GetData() ([]WRSConverTDetail, error) {
+	sData := make([]WRSConverTDetail, 0)
+	if err := db.GetEngine().SQL(r.buildSql()).Find(&sData); err != nil {
+		logger.GetLogger().Errorf("query WRSConverTDetail fail, %v", err)
+		return nil, err
+	}
+	return sData, nil
+}
+
+// 现货商品详细
+type ErmcpWrstandDetail struct {
+	Wrd     ErmcpWrstandard    `json:"wrd"`     // 基本信息
+	GtList  []GoodsTypeModel   `json:"gtList"`  // 型号列表
+	GbList  []GoodsBrand       `json:"gbList"`  // 品牌列表
+	WrsList []WRSConverTDetail `json:"wrsList"` // 套保信息列表
+}
+
+// 查询现货商品详细
+func (r *ErmcpWrstandDetail) GetData() (ErmcpWrstandDetail, error) {
+	// 获取基本信息
+	m := ErmcpWrstandard{AREAUSERID: r.Wrd.AREAUSERID, WRSTANDARDID: r.Wrd.WRSTANDARDID}
+	d, err := m.GetData()
+	if err != nil {
+		return ErmcpWrstandDetail{}, err
+	}
+	if d == nil || len(d) == 0 {
+		return ErmcpWrstandDetail{}, fmt.Errorf("no record")
+	}
+	rsp := ErmcpWrstandDetail{}
+	rsp.Wrd = d[0]
+	// 获取型号信息
+	gt := GoodsTypeModel{AREAUSERID: rsp.Wrd.AREAUSERID, WRSTANDARDID: rsp.Wrd.WRSTANDARDID}
+	if val, err := gt.GetData(); err == nil {
+		rsp.GtList = val
+	}
+
+	// 获取品牌信息
+	gb := GoodsBrand{AREAUSERID: rsp.Wrd.AREAUSERID, WRSTANDARDID: rsp.Wrd.WRSTANDARDID}
+	if val, err := gb.GetData(); err == nil {
+		rsp.GbList = val
+	}
+
+	// 获取套保信息
+	wrs := WRSConverTDetail{WRSTANDARDID: rsp.Wrd.WRSTANDARDID}
+	if val, err := wrs.GetData(); err == nil {
+		rsp.WrsList = val
+	}
+
+	return rsp, nil
+}

+ 32 - 17
mtpcache/middlegoods.go

@@ -25,27 +25,32 @@ type middleGoodsMgr struct {
 
 // 套保品种
 type MiddleGoods struct {
-	MIDDLEGOODSID    uint32  `json:"MIDDLEGOODSID"  xorm:"'MIDDLEGOODSID'"`       // 套保品种ID(SEQ_ERMS_MIDDLEGOODS)
-	MIDDLEGOODSNAME  string  `json:"MIDDLEGOODSNAME"  xorm:"'MIDDLEGOODSNAME'"`   // 套保品种名称
-	MIDDLEGOODSCODE  string  `json:"MIDDLEGOODSCODE"  xorm:"'MIDDLEGOODSCODE'"`   // 套保品种代码
-	GOODSUNITID      int32   `json:"GOODSUNITID"  xorm:"'GOODSUNITID'"`           // 单位ID
-	RELATEDGOODSID   int32   `json:"RELATEDGOODSID"  xorm:"'RELATEDGOODSID'"`     // 关联交易商品ID
-	EVALUATERATIO    float64 `json:"EVALUATERATIO"  xorm:"'EVALUATERATIO'"`       // 估价系数
-	QTYDECIMALPLACE  int32   `json:"QTYDECIMALPLACE"  xorm:"'QTYDECIMALPLACE'"`   // 数量小数位
-	RELATEDGOODSTYPE int32   `json:"RELATEDGOODSTYPE"  xorm:"'RELATEDGOODSTYPE'"` // 关联商品类型 - 1:期货合约 2:现货品种
-	NEEDHEDGERATIO   float64 `json:"NEEDHEDGERATIO"  xorm:"'NEEDHEDGERATIO'"`     // 套保比率
-	AREAUSERID       uint32  `json:"AREAUSERID"  xorm:"'AREAUSERID'"`             // 机构用户ID
-	GOODSGROUPID     int32   `json:"GOODSGROUPID"  xorm:"'GOODSGROUPID'"`         // 关联期货品种ID
+	MIDDLEGOODSID    uint32  `json:"middlegoodsid"  xorm:"'MIDDLEGOODSID'"`       // 套保品种ID(SEQ_ERMS_MIDDLEGOODS)
+	MIDDLEGOODSNAME  string  `json:"middlegoodsname"  xorm:"'MIDDLEGOODSNAME'"`   // 套保品种名称
+	MIDDLEGOODSCODE  string  `json:"middlegoodscode"  xorm:"'MIDDLEGOODSCODE'"`   // 套保品种代码
+	GOODSUNITID      int32   `json:"goodsunitid"  xorm:"'GOODSUNITID'"`           // 单位ID
+	RELATEDGOODSID   int32   `json:"relatedgoodsid"  xorm:"'RELATEDGOODSID'"`     // 关联交易商品ID
+	EVALUATERATIO    float64 `json:"evaluateratio"  xorm:"'EVALUATERATIO'"`       // 估价系数
+	QTYDECIMALPLACE  int32   `json:"qtydecimalplace"  xorm:"'QTYDECIMALPLACE'"`   // 数量小数位
+	RELATEDGOODSTYPE int32   `json:"relatedgoodstype"  xorm:"'RELATEDGOODSTYPE'"` // 关联商品类型 - 1:期货合约 2:现货品种
+	NEEDHEDGERATIO   float64 `json:"needhedgeratio"  xorm:"'NEEDHEDGERATIO'"`     // 套保比率
+	AREAUSERID       uint32  `json:"areauserid"  xorm:"'AREAUSERID'"`             // 机构用户ID
+	GOODSGROUPID     int32   `json:"goodsgroupid"  xorm:"'GOODSGROUPID'"`         // 关联期货品种ID
+	ISVALID          int32   `json:"isvalid"  xorm:"'ISVALID'"`                   // 状态 0-无效(停用) 1-有效(正常)
+	MODIFYTIME       string  `json:"modifytime"  xorm:"'MODIFYTIME'"`             // 修改时间
 }
 
-// 加载数据
-func (r *middleGoodsMgr) load() {
+func (r *middleGoodsMgr) isNeedLoad() bool {
 	now := time.Now()
 	// 间隔3秒以上重新加载
-	if d := now.Sub(r.last); d.Seconds() < 3 {
-		return
+	if d := now.Sub(r.last); d.Seconds() >= 3 {
+		return true
 	}
+	return false
+}
 
+// 加载数据
+func (r *middleGoodsMgr) load() {
 	r.mtx.Lock()
 	defer r.mtx.Unlock()
 	e := db.GetEngine()
@@ -63,7 +68,9 @@ func (r *middleGoodsMgr) load() {
 		"       RELATEDGOODSTYPE," +
 		"       NEEDHEDGERATIO," +
 		"       AREAUSERID," +
-		"       GOODSGROUPID" +
+		"       GOODSGROUPID," +
+		"       MODIFYTIME," +
+		"       ISVALID" +
 		"  from erms_middlegoods t"
 	sData := make([]MiddleGoods, 0)
 	s := e.SQL(sqlId)
@@ -97,7 +104,7 @@ func (r *middleGoodsMgr) getByUserID(userId uint32) ([]MiddleGoods, error) {
 	defer r.mtx.RUnlock()
 	ret := make([]MiddleGoods, 0)
 	for _, v := range r.data {
-		if v.AREAUSERID == userId{
+		if v.AREAUSERID == userId {
 			ret = append(ret, v)
 		}
 	}
@@ -118,6 +125,14 @@ func GetMiddleGoods(middlGoodsId uint32) (MiddleGoods, error) {
 
 // 获取指定用户套保商品
 func GetMiddleGoodsByUserID(userId uint32) ([]MiddleGoods, error) {
+	if vGoodMgr.isNeedLoad() {
+		vGoodMgr.load()
+	}
+	return vGoodMgr.getByUserID(userId)
+}
+
+// 从数据库中获取套保商品
+func GetMiddleGoodsFromDB(userId uint32) ([]MiddleGoods, error) {
 	vGoodMgr.load()
 	return vGoodMgr.getByUserID(userId)
 }

+ 4 - 0
routers/router.go

@@ -310,6 +310,7 @@ func InitRouter() *gin.Engine {
 		// 查询待点价、履约和全部合同
 		ermcpR.GET("/QueryUserInfo", ermcp.QueryUserInfo)
 		ermcpR.GET("/QueryWrStandard", ermcp.QueryWrStandard)
+		ermcpR.GET("/QueryWrStandardDetail", ermcp.QueryWrStandardDetail)
 		ermcpR.GET("/QuerySpotContract", ermcp.QuerySpotContract)
 		ermcpR.GET("/QueryContract", ermcp.QueryContract)
 		ermcpR.GET("/QueryHedgePlan", ermcp.QueryHedgePlan)
@@ -321,6 +322,9 @@ func InitRouter() *gin.Engine {
 		ermcpR.GET("/QueryRealtimeExposure", ermcp.QueryRealtimeExposure)
 		ermcpR.GET("/QueryExposureDetail", ermcp.QueryExposureDetail)
 		ermcpR.GET("/QueryExposureSpot", ermcp.QueryExposureSpot)
+		ermcpR.GET("/QueryExposureSpotDetail", ermcp.QueryExposureSpotDetail)
+		ermcpR.GET("/QueryHisExposure", ermcp.QueryHisExposure)
+		ermcpR.GET("/QueryMiddleGoods", ermcp.QueryMiddleGoods)
 	}
 
 	return r

Some files were not shown because too many files changed in this diff