| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- package erms3
- import (
- "mtp2_if/global/app"
- "mtp2_if/global/e"
- "mtp2_if/logger"
- "mtp2_if/models"
- "mtp2_if/pb"
- "mtp2_if/rediscli"
- "net/http"
- "strconv"
- "strings"
- "github.com/gin-gonic/gin"
- "github.com/golang/protobuf/proto"
- )
- // QueryBusinessInfoReq 查询业务请求.
- type QueryBusinessInfoReq struct {
- Accountids string `form:"accountids" binding:"required"` // 资金账号ID列表,逗号分隔.
- Status int32 `form:"status"` // 合同状态,0-未结束 1-已结束.
- }
- // QueryBusinessInfoRsp 查询业务响应.
- type QueryBusinessInfoRsp struct {
- BusinessID int64 `json:"businessid"` // 业务ID.
- Type int32 `json:"type"` // 业务类型,1-期现套利,2-仓单回购,3-现货贸易.
- GoodsID string `json:"goodsid"` // 商品名称/商品代码.
- Buyqty string `json:"buyqty"` // 采购量.
- BuyAmount float64 `json:"buyamount"` // 采购额.
- Sellqty string `json:"sellqty"` // 销售量.
- SellAmount float64 `json:"sellamount"` // 销售额.
- Spotqty string `json:"spotqty"` // 现货量.
- SpotMarketValue float64 `json:"spotmarketvalue"` // 现货市值.
- Hedgingqty string `json:"hedgingqty"` // 套保量.
- Spotpl float64 `json:"spotpl"` // 浮动权益.
- Futureqty string `json:"futureqty"` // 期货敞口.
- Futurepl float64 `json:"futurepl"` // 期货盈亏.
- Totalqty string `json:"totalqty"` // 总敞口.
- Totalpl float64 `json:"totalpl"` // 总盈亏.
- Status int32 `json:"statu"` // 状态,0-未结束 1-已结束.
- }
- // QueryBusinessInfo 查询业务数据
- // @Summary 查询业务表单数据
- // @Produce json
- // @Security ApiKeyAuth
- // @Param accountids query string true "资金账号ID列表,用逗号分隔"
- // @Param status query int true "状态,0为未结束 1为已结束"
- // @Success 200 {array} QueryBusinessInfoRsp
- // @Failure 500 {object} app.Response
- // @Router /Erms3/QueryBusinessInfo [get]
- // @Tags 风险管理v3
- func QueryBusinessInfo(c *gin.Context) {
- appG := app.Gin{C: c}
- // 获取请求参数
- var req QueryBusinessInfoReq
- err := appG.C.ShouldBindQuery(&req)
- if err != nil {
- logger.GetLogger().Errorf("QueryBusinessInfo failed: %s", err.Error())
- appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
- return
- }
- // 获取商品信息.
- goods, err := models.GetDeliverGoods()
- if err != nil {
- logger.GetLogger().Errorf("query deliverygoods failed: %s", err.Error())
- appG.Response(http.StatusBadRequest, e.ERROR_GET_GOODS_FAILED, nil)
- return
- }
- // 转换格式.
- id2goods := make(map[int32]models.Deliverygoods, len(goods))
- for i := range goods {
- id2goods[goods[i].Deliverygoodsid] = goods[i]
- }
- // 获取枚举信息.
- enuminfo, err := models.GetEnumDicItem("goodsunit", 0)
- if err != nil {
- logger.GetLogger().Errorf("query enumifno failed: %s", err.Error())
- appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
- return
- }
- // 转换格式.
- id2enum := make(map[int64]models.Enumdicitem)
- for i := range enuminfo {
- id2enum[enuminfo[i].Enumitemname] = enuminfo[i]
- }
- // 查询期现套利业务.
- var asa models.Erms2Arbitragestrategy
- asainfo, err := asa.GetByAccountIDSAndStatus(req.Accountids, req.Status)
- if err != nil {
- logger.GetLogger().Errorf("query asainfo failed: %s", err.Error())
- appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
- return
- }
- redisClient := rediscli.GetRedisClient()
- preKey := "Erms2_ArbitrageStrategy:"
- rsp := make([]QueryBusinessInfoRsp, 0, len(asainfo))
- for i := range asainfo {
- key := preKey + asainfo[i].Asapplyid
- redisMsg := pb.Erms2ArbitrageStrategy{}
- redisRsp, err := redisClient.Get(key).Result()
- if err != nil {
- logger.GetLogger().Errorf("redis query arbitragestrategy failed: %s, key: %s", err.Error(), key)
- } else {
- err = proto.Unmarshal([]byte(redisRsp), &redisMsg)
- if err != nil {
- logger.GetLogger().Errorf("unmarshal arbitragestrategy failed: %s, key: %s", err.Error(), key)
- }
- }
- goodsinfo := id2goods[int32(asainfo[i].Deliverygoodsid)]
- goodsunit := id2enum[int64(goodsinfo.Goodsunitid)]
- businessid, err := strconv.ParseInt(asainfo[i].Asapplyid, 10, 64)
- if err != nil {
- logger.GetLogger().Errorf("parse string[%s] to int failed: %s", asainfo[i].Asapplyid, err.Error())
- appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
- return
- }
- business := QueryBusinessInfoRsp{
- BusinessID: businessid,
- Type: 1,
- GoodsID: strings.Join([]string{goodsinfo.Deliverygoodsname, goodsinfo.Deliverygoodscode}, "/"),
- Buyqty: strconv.FormatFloat(asainfo[i].Buyqty, 'f', 2, 64) + goodsunit.Enumdicname,
- BuyAmount: asainfo[i].Buyamount,
- Sellqty: strconv.FormatFloat(asainfo[i].Sellqty, 'f', 2, 64) + goodsunit.Enumdicname,
- SellAmount: asainfo[i].Sellamount,
- Spotqty: strconv.FormatFloat(asainfo[i].Pricedspotqty, 'f', 2, 64) + goodsunit.Enumdicname,
- SpotMarketValue: 0.0,
- Hedgingqty: strconv.FormatFloat(asainfo[i].Futureqty, 'f', 2, 64) + goodsunit.Enumdicname,
- Spotpl: redisMsg.GetSpotPL(),
- Futureqty: strconv.FormatFloat(asainfo[i].Futureqty, 'f', 2, 64) + goodsunit.Enumdicname,
- Futurepl: redisMsg.GetFuturePL(),
- Totalqty: strconv.FormatFloat(asainfo[i].Pricedspotqty-asainfo[i].Futureqty, 'f', 2, 64) + goodsunit.Enumdicname,
- Totalpl: redisMsg.GetTotalPL(),
- Status: asainfo[i].Strategystatus,
- }
- rsp = append(rsp, business)
- }
- // 查询仓单回购业务.
- var wr models.Erms2Wrrcontract
- wrrcontracts, err := wr.GetByAccountIDSAndStatus(req.Accountids, req.Status)
- if err != nil {
- logger.GetLogger().Errorf("query wrrcontract failed: %s", err.Error())
- appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
- return
- }
- for i := range wrrcontracts {
- goodsinfo := id2goods[int32(wrrcontracts[i].Deliverygoodsid)]
- goodsunit := id2enum[int64(goodsinfo.Goodsunitid)]
- businessid, err := strconv.ParseInt(wrrcontracts[i].Wrrcontractid, 10, 64)
- if err != nil {
- logger.GetLogger().Errorf("parse string[%s] to int failed: %s", asainfo[i].Asapplyid, err.Error())
- appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
- return
- }
- business := QueryBusinessInfoRsp{
- BusinessID: businessid,
- Type: 2,
- GoodsID: strings.Join([]string{goodsinfo.Deliverygoodsname, goodsinfo.Deliverygoodscode}, "/"),
- Buyqty: strconv.FormatFloat(wrrcontracts[i].Buyqty, 'f', 2, 64) + goodsunit.Enumdicname,
- BuyAmount: wrrcontracts[i].Buyamount,
- Sellqty: strconv.FormatFloat(wrrcontracts[i].Sellqty, 'f', 2, 64) + goodsunit.Enumdicname,
- SellAmount: wrrcontracts[i].Sellamount,
- Spotqty: strconv.FormatFloat(wrrcontracts[i].Contractqty, 'f', 2, 64) + goodsunit.Enumdicname,
- SpotMarketValue: 0,
- Hedgingqty: "-",
- Spotpl: 0,
- Futureqty: "-",
- Futurepl: 0,
- Totalqty: "-",
- Totalpl: 0,
- Status: wrrcontracts[i].Contractstatus,
- }
- rsp = append(rsp, business)
- }
- // 查询现货贸易业务.
- var sbt models.Erms2Spottradebiz
- spotTradeBiz, err := sbt.GetByAccountIDSAndStatus(req.Accountids, req.Status)
- if err != nil {
- logger.GetLogger().Errorf("query spottradebiz failed: %s", err.Error())
- appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
- return
- }
- for i := range spotTradeBiz {
- goodsinfo := id2goods[int32(spotTradeBiz[i].Deliverygoodsid)]
- goodsunit := id2enum[int64(goodsinfo.Goodsunitid)]
- businessid, err := strconv.ParseInt(spotTradeBiz[i].Spottradeid, 10, 64)
- if err != nil {
- logger.GetLogger().Errorf("parse string[%s] to int failed: %s", asainfo[i].Asapplyid, err.Error())
- appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
- return
- }
- business := QueryBusinessInfoRsp{
- BusinessID: businessid,
- Type: 3,
- GoodsID: strings.Join([]string{goodsinfo.Deliverygoodsname, goodsinfo.Deliverygoodscode}, "/"),
- Buyqty: strconv.FormatFloat(spotTradeBiz[i].TradeBuyqty, 'f', 2, 64) + goodsunit.Enumdicname,
- BuyAmount: spotTradeBiz[i].TradeBuyamount,
- Sellqty: strconv.FormatFloat(spotTradeBiz[i].TradeSellqty, 'f', 2, 64) + goodsunit.Enumdicname,
- SellAmount: spotTradeBiz[i].TradeSellamount,
- Spotqty: strconv.FormatFloat(spotTradeBiz[i].Buyqty+spotTradeBiz[i].Sellqty, 'f', 2, 64) + goodsunit.Enumdicname,
- SpotMarketValue: 0,
- Hedgingqty: "-",
- Spotpl: 0,
- Futureqty: "-",
- Futurepl: 0,
- Totalqty: "-",
- Totalpl: 0,
- Status: spotTradeBiz[i].Closestatus,
- }
- rsp = append(rsp, business)
- }
- // 查询成功
- logger.GetLogger().Debugf("QuerySpotContractDetail successed: %v", rsp)
- appG.Response(http.StatusOK, e.SUCCESS, rsp)
- }
|