package models import ( "mtp2_if/db" "mtp2_if/utils" "time" ) // Ermcp2hedgeditem 被套期项目表 type Ermcp2hedgeditem struct { Hedgeditemid string `json:"hedgeditemid" xorm:"HEDGEDITEMID"` // 被套期项目ID(624+Unix秒时间戳(10位)+xxxxxx) Hedgeditemnum string `json:"hedgeditemnum" xorm:"HEDGEDITEMNUM"` // 项目编号 Hedgeditemname string `json:"hedgeditemname" xorm:"HEDGEDITEMNAME"` // 项目名称 Hedgedtype int32 `json:"hedgedtype" xorm:"HEDGEDTYPE" form:"hedgedtype"` // 套期类型 - 1:采购计划项目 2:销售计划项目 3:现货贸易项目 4:库存存货项目 5:定价采购合同项目 Planstartdate time.Time `json:"planstartdate" xorm:"PLANSTARTDATE"` // 计划开始日期 Planenddate time.Time `json:"planenddate" xorm:"PLANENDDATE"` // 计划结束日期 Hedgerate float64 `json:"hedgerate" xorm:"HEDGERATE"` // 套保比率 Tradeuserid int64 `json:"tradeuserid" xorm:"TRADEUSERID"` // 交易用户ID Areauserid int64 `json:"areauserid" xorm:"AREAUSERID"` // 企业ID Hedgeditemstatus int32 `json:"hedgeditemstatus" xorm:"HEDGEDITEMSTATUS" form:"hedgeditemstatus"` // 项目状态 - 0:未提交 1:待审核 2:执行中 3:正常完结 4:审核拒绝 5:异常完结 6:已撤回 Applysrc int32 `json:"applysrc" xorm:"APPLYSRC"` // 申请来源 - 1:管理端 2:终端 Applyid int64 `json:"applyid" xorm:"APPLYID"` // 申请人 Remark string `json:"remark" xorm:"REMARK"` // 备注 Createtime time.Time `json:"createtime" xorm:"CREATETIME"` // 申请时间 Audittradedate string `json:"audittradedate" xorm:"AUDITTRADEDATE"` // 审核交易日(yyyyMMdd) Auditid int64 `json:"auditid" xorm:"AUDITID"` // 审核人 Auditsrc int32 `json:"auditsrc" xorm:"AUDITSRC"` // 审核来源 - 1:管理端 2:终端 Audittime time.Time `json:"audittime" xorm:"AUDITTIME"` // 审核时间 Auditremark string `json:"auditremark" xorm:"AUDITREMARK"` // 审核备注 Deliverygoodsid int64 `json:"deliverygoodsid" xorm:"DELIVERYGOODSID"` // 现货品种ID Wrstandardid int64 `json:"wrstandardid" xorm:"WRSTANDARDID"` // 现货商品ID Vatrate float64 `json:"vatrate" xorm:"VATRATE"` // 增值税 Hedgeqty float64 `json:"hedgeqty" xorm:"HEDGEQTY"` // 套期现货量 Hedgeamount float64 `json:"hedgeamount" xorm:"HEDGEAMOUNT"` // 套期市价总额 Hedgerestamount float64 `json:"hedgerestamount" xorm:"HEDGERESTAMOUNT"` // 套期剩余市价总额【现货贸易】 Hedgecontractamount float64 `json:"hedgecontractamount" xorm:"HEDGECONTRACTAMOUNT"` // 套期定价总额 【定价采购合同】【现货贸易】 Oriavgprice float64 `json:"oriavgprice" xorm:"ORIAVGPRICE"` // 期初市场均价 = 套期市价总额 / 套期现货量 Exeqty float64 `json:"exeqty" xorm:"EXEQTY"` // 执行现货量 Exeamount float64 `json:"exeamount" xorm:"EXEAMOUNT"` // 执行市价总额 Exerestamount float64 `json:"exerestamount" xorm:"EXERESTAMOUNT"` // 执行剩余市价总额【现货贸易】 Exeavgprice float64 `json:"exeavgprice" xorm:"EXEAVGPRICE"` // 执行市场均价= 执行市价总额 / 执行现货量 Execontractamount float64 `json:"execontractamount" xorm:"EXECONTRACTAMOUNT"` // 执行定价总额 Curprice float64 `json:"curprice" xorm:"CURPRICE"` // 当前市场价 Unexeqty float64 `json:"unexeqty" xorm:"UNEXEQTY"` // 未执行现货量 = 套期现货量 - 执行现货量 Spothedgepl float64 `json:"spothedgepl" xorm:"SPOTHEDGEPL"` // 现货套期损益 =(执行市场均价-期初市场均价)*执行现货量 * 方向(销售计划 为 -1, 其它为1) Spotpl float64 `json:"spotpl" xorm:"SPOTPL"` // 现货套期损益 = 现货实际损益 + 现货浮动损益 Futurehedgepl float64 `json:"futurehedgepl" xorm:"FUTUREHEDGEPL"` // 期货实际损益 Futurepl float64 `json:"futurepl" xorm:"FUTUREPL"` // 期货套期损益 Hedgesumpl float64 `json:"hedgesumpl" xorm:"HEDGESUMPL"` // 套期汇总损益 = 期货汇总损益 + 现货汇总损益 Spottradepl float64 `json:"spottradepl" xorm:"SPOTTRADEPL"` // 现货贸易损益【现货贸易】= 执行合同定价总额 - 套期合同定价总额 Vatpl float64 `json:"vatpl" xorm:"VATPL"` // 增值税损益【现货贸易】= 现货贸易损益 * (增值税率 /(1+增值税率)) Sumobspl float64 `json:"sumobspl" xorm:"SUMOBSPL"` // 汇总绝对损益【现货贸易】=现货贸易损益+增值税损益+期货套期损益 Spotbookamount float64 `json:"spotbookamount" xorm:"SPOTBOOKAMOUNT"` // 现货账面总额 Curstock float64 `json:"curstock" xorm:"CURSTOCK"` // 期末库存量 = 采购总量 - 销售总量 Enddate time.Time `json:"enddate" xorm:"ENDDATE"` // 完成日期 Endtradedate string `json:"endtradedate" xorm:"ENDTRADEDATE"` // 完成交易日 Updatetime time.Time `json:"updatetime" xorm:"UPDATETIME"` // 更新时间 Orispothedgepl float64 `json:"orispothedgepl" xorm:"ORISPOTHEDGEPL"` // 期初现货实际损益 Orifuturehedgepl float64 `json:"orifuturehedgepl" xorm:"ORIFUTUREHEDGEPL"` // 期初期货实际损益 Orispotpl float64 `json:"orispotpl" xorm:"ORISPOTPL"` // 期初现货套期损益 Orifuturepl float64 `json:"orifuturepl" xorm:"ORIFUTUREPL"` // 期初期货套期损益 Spotfloatpl float64 `json:"spotfloatpl" xorm:"SPOTFLOATPL"` // 现货浮动损益 =(当前市场价 - 期初市场价)*未执行现货量 * 方向(销售计划 为 -1, 其它为1) Futurefloatpl float64 `json:"futurefloatpl" xorm:"FUTUREFLOATPL"` // 期货浮动损益 SpotHedgePLChange float64 `json:"spothedgeplchange" xorm:"SPOTHEDGEPLCHANGE"` // 现货实际损益变动 SpotPLChange float64 `json:"spotplchange" xorm:"SPOTPLCHANGE"` // 现货套期损益变动 FutureHedgePLChange float64 `json:"futurehedgeplchange" xorm:"FUTUREHEDGEPLCHANGE"` // 期货实际损益变动 FuturePLChange float64 `json:"futureplchange" xorm:"FUTUREPLCHANGE"` // 期货套期损益变动 Wrstandardname string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 商品名称 EnumdicName string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 单位 AccountName string `json:"accountName" xorm:"ACCOUNTNAME"` // 套期主体 MiddleGoodsList []Ermcp2himiddlegoods `json:"middlegoodslist"` // 套期商品列表 USERID int64 `json:"-" form:"userid" binding:"required"` // 用户id, 用于过滤 } // TableName is ERMCP2_HEDGEDITEM func (r *Ermcp2hedgeditem) TableName() string { return "ERMCP2_HEDGEDITEM" } func (r *Ermcp2hedgeditem) calc() { } func (r *Ermcp2hedgeditem) buildSql() string { var sqlId utils.SQLVal = ` SELECT to_char(t.HEDGEDITEMID) HEDGEDITEMID, t.HEDGEDITEMNUM , t.HEDGEDITEMNAME , t.HEDGEDTYPE , t.PLANSTARTDATE , t.PLANENDDATE , t.HEDGERATE , t.TRADEUSERID , t.AREAUSERID , t.HEDGEDITEMSTATUS , t.APPLYSRC , t.APPLYID , t.REMARK , t.CREATETIME , t.AUDITTRADEDATE , t.AUDITID , t.AUDITSRC , t.AUDITTIME , t.AUDITREMARK , t.DELIVERYGOODSID , t.WRSTANDARDID , t.VATRATE , t.HEDGEQTY , t.HEDGEAMOUNT , t.HEDGERESTAMOUNT , t.HEDGECONTRACTAMOUNT, t.ORIAVGPRICE , t.EXEQTY , t.EXEAMOUNT , t.EXERESTAMOUNT , t.EXEAVGPRICE , t.EXECONTRACTAMOUNT , t.CURPRICE , t.UNEXEQTY , t.SPOTHEDGEPL , t.SPOTPL , t.FUTUREHEDGEPL , t.FUTUREPL , t.HEDGESUMPL , t.SPOTTRADEPL , t.VATPL , t.SUMOBSPL , t.SPOTBOOKAMOUNT , t.CURSTOCK , t.ENDDATE , t.ENDTRADEDATE , t.UPDATETIME , t.ORISPOTHEDGEPL , t.ORIFUTUREHEDGEPL , t.ORISPOTPL , t.ORIFUTUREPL , t.SPOTFLOATPL , t.FUTUREFLOATPL , (t.SpotHedgePL - t.OriSpotHedgePL) SPOTHEDGEPLCHANGE, (t.SpotPL - t.OriSpotPL) SPOTPLCHANGE, (t.FutureHedgePL - t.OriFutureHedgePL) FUTUREHEDGEPLCHANGE, (t.FuturePL - t.OriFuturePL) FUTUREPLCHANGE, wr.WRSTANDARDNAME, e.ENUMDICNAME, u.ACCOUNTNAME FROM ERMCP2_HedgedItem t LEFT JOIN WRStandard wr ON wr.wrstandardid = t.wrstandardid LEFT JOIN enumdicitem e on wr.unitid=e.enumitemname and e.enumdiccode='goodsunit' LEFT JOIN useraccount u ON u.userid = t.tradeuserid WHERE 1 = 1 AND %v in (t.AreaUserID, t.TradeUserID) ` sqlId.FormatParam(r.USERID) sqlId.AndEx("t.Hedgedtype", r.Hedgedtype, r.Hedgedtype > 0) sqlId.AndEx("t.hedgeditemstatus", r.Hedgeditemstatus, r.Hedgeditemstatus > 0) return sqlId.String() } // GetDataEx 从数据库中查询数据 func (r *Ermcp2hedgeditem) GetDataEx() (interface{}, error) { e := db.GetEngine() s := e.SQL(r.buildSql()) sData := make([]Ermcp2hedgeditem, 0) if err := s.Find(&sData); err != nil { return nil, err } for i := range sData { sData[i].calc() } if len(sData) > 0 { // 获取关联期货品种 m1 := Ermcp2himiddlegoods{} if d1, err := m1.GetDataEx(); err == nil { gpLst := d1.([]Ermcp2himiddlegoods) for i := range sData { sData[i].MiddleGoodsList = append(sData[i].MiddleGoodsList, gpLst...) } } } return sData, nil } // Ermcp2himiddlegoods 项目套保品种明细 type Ermcp2himiddlegoods struct { HEDGEDITEMID int64 `json:"hedgeditemid" xorm:"HEDGEDITEMID" binding:"required"` // 被套期项目ID(624+Unix秒时间戳(10位)+xxxxxx) MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"MIDDLEGOODSID" binding:"required"` // 套保品种ID DELIVERYGOODSID int64 `json:"-" xorm:"DELIVERYGOODSID"` // 现货品种ID WRSTANDARDID int64 `json:"-" xorm:"WRSTANDARDID"` // 现货商品ID VATRATE float64 `json:"-" xorm:"VATRATE"` // 增值税 SPOTCONVERTRATIO float64 `json:"-" xorm:"SPOTCONVERTRATIO"` // 折算系数 [现货] UNEXESPOTQTY float64 `json:"-" xorm:"UNEXESPOTQTY"` // 未执行现货量 UNEXEHEDGEQTY float64 `json:"unexehedgeqty" xorm:"UNEXEHEDGEQTY"` // 未执行套期量 = 未执行现货量*折算系数* (1/(1+增值税)) * 套期比例(项目上) FUTUREHEDGEQTY float64 `json:"futurehedgeqty" xorm:"FUTUREHEDGEQTY"` // 期货持仓套期量 HIEXPSOURE float64 `json:"hiexpsoure" xorm:"HIEXPSOURE"` // 期现敞口量 = 未执行套期量 + 期货持仓套期量 TRADEUSERID int64 `json:"-" xorm:"TRADEUSERID"` // 交易用户ID AREAUSERID int64 `json:"-" xorm:"AREAUSERID"` // 企业ID CREATETIME time.Time `json:"-" xorm:"CREATETIME"` // 创建时间 UPDATETIME time.Time `json:"-" xorm:"UPDATETIME"` // 更新时间 Middlegoodsname string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保商品名称 Middlegoodscode string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保商品代码 } // TableName is ERMCP2_HIMIDDLEGOODS func (r *Ermcp2himiddlegoods) TableName() string { return "ERMCP2_HIMIDDLEGOODS" } func (r *Ermcp2himiddlegoods) calc() { } func (r *Ermcp2himiddlegoods) buildSql() string { var sqlId utils.SQLVal = ` SELECT t.MIDDLEGOODSID, t.UNEXEHEDGEQTY, t.FUTUREHEDGEQTY, t.HIEXPSOURE, m.MIDDLEGOODSNAME, m.MIDDLEGOODSCODE FROM ERMCP2_HIMIDDLEGOODS t LEFT JOIN erms_middlegoods m ON m.middlegoodsid = t.middlegoodsid WHERE t.HEDGEDITEMID = %v ` sqlId.FormatParam(r.HEDGEDITEMID) return sqlId.String() } // GetDataEx 从数据库中查询数据 func (r *Ermcp2himiddlegoods) GetDataEx() (interface{}, error) { e := db.GetEngine() s := e.SQL(r.buildSql()) sData := make([]Ermcp2himiddlegoods, 0) if err := s.Find(&sData); err != nil { return nil, err } for i := range sData { sData[i].calc() } return sData, nil }