|
|
@@ -2819,3 +2819,214 @@ func (r *Ermcp3ExposureParamChLog) GetDataEx() (interface{}, error) {
|
|
|
}
|
|
|
return sData, err
|
|
|
}
|
|
|
+
|
|
|
+// Ermcp3SCMiddleGoodsReport 定价报表
|
|
|
+type Ermcp3SCMiddleGoodsReport struct {
|
|
|
+ RECKONDATE string `json:"reckondate" xorm:"RECKONDATE" form:"reckondate"` // 日照时期(yyyyMMdd)
|
|
|
+ CYCLETYPE int32 `json:"cycletype" xorm:"CYCLETYPE" form:"cycletype"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
|
|
|
+ CYCLETIME string `json:"cycletime" xorm:"CYCLETIME" form:"cycletime"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
|
|
|
+ SPOTCONTRACTID string `json:"spotcontractid" xorm:"SPOTCONTRACTID" form:"spotcontractid"` // 现货合同ID(602+Unix秒时间戳(10位)+xxxxxx)
|
|
|
+ MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"MIDDLEGOODSID" form:"middlegoodsid"` // 套保品种ID
|
|
|
+ DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"DELIVERYGOODSID" form:"deliverygoodsid"` // 现货品种ID
|
|
|
+ WRSTANDARDID int64 `json:"wrstandardid" xorm:"WRSTANDARDID" form:"wrstandardid"` // 现货商品ID
|
|
|
+ PRICEDQTY SFLOAT64 `json:"pricedqty" xorm:"PRICEDQTY"` // 已定价量(现货)
|
|
|
+ MIDDLEGOODSPRICEDQTY SFLOAT64 `json:"middlegoodspricedqty" xorm:"MIDDLEGOODSPRICEDQTY"` // 已定价量(套保品种 - 税前) = PricedQty * 折算系数
|
|
|
+ MIDDLEGOODSPRICEDQTY2 SFLOAT64 `json:"middlegoodspricedqty2" xorm:"MIDDLEGOODSPRICEDQTY2"` // 已定价量(套保品种- 税后) = MiddleGoodsPricedQty * (1/(1+增值税率))
|
|
|
+ MIDDLEGOODSPRICEDQTY3 SFLOAT64 `json:"middlegoodspricedqty3" xorm:"MIDDLEGOODSPRICEDQTY3"` // 已定价量(套保品种应套保量) = MiddleGoodsPricedQty2 * 套保比率
|
|
|
+ RELATEDMIDDLEGOODSQTY SFLOAT64 `json:"relatedmiddlegoodsqty" xorm:"RELATEDMIDDLEGOODSQTY"` // 已关联量(套保品种)(期货)
|
|
|
+ UPDATETIME string `json:"updatetime" xorm:"UPDATETIME"` // 更新时间
|
|
|
+ TODAYRELATEDMIDDLEGOODSQTY SFLOAT64 `json:"todayrelatedmiddlegoodsqty" xorm:"TODAYRELATEDMIDDLEGOODSQTY"` // 今日关联量(期货)
|
|
|
+ TODAYRELATEDMIDDLEGOODSAMOUNT SFLOAT64 `json:"todayrelatedmiddlegoodsamount" xorm:"TODAYRELATEDMIDDLEGOODSAMOUNT"` // 今日关联额(期货)
|
|
|
+ RELATEDMIDDLEGOODSAMOUNT SFLOAT64 `json:"relatedmiddlegoodsamount" xorm:"RELATEDMIDDLEGOODSAMOUNT"` // 已关联额(期货)
|
|
|
+ TODAYPRICEDQTY SFLOAT64 `json:"todaypricedqty" xorm:"TODAYPRICEDQTY"` // 今日定价量(现货)
|
|
|
+ TODAYPRICEDAMOUNT SFLOAT64 `json:"todaypricedamount" xorm:"TODAYPRICEDAMOUNT"` // 今日定价额(现货)
|
|
|
+ PRICEDAMOUNT SFLOAT64 `json:"pricedamount" xorm:"PRICEDAMOUNT"` // 已定价额(现货)
|
|
|
+ TODAYPRICEDAMOUNT2 SFLOAT64 `json:"todaypricedamount2" xorm:"TODAYPRICEDAMOUNT2"` // 今日定价额(现货-基价额)
|
|
|
+ PRICEDAMOUNT2 SFLOAT64 `json:"pricedamount2" xorm:"PRICEDAMOUNT2"` // 已定价额(现货-基价额)
|
|
|
+
|
|
|
+ USERID int64 `json:"userid" xorm:"'USERID'" form:"userid"` // 合同所属用户id
|
|
|
+ CONTRACTNO string `json:"contractno" xorm:"'CONTRACTNO'"` // 合同编号
|
|
|
+ CONTRACTTYPE int32 `json:"contracttype" xorm:"'CONTRACTTYPE'"` // 合同类型 1:采购 -1:销售
|
|
|
+ MATHNAME string `json:"mathname" xorm:"'MATHNAME'"` // 交易对手方
|
|
|
+ DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 品种代码
|
|
|
+ DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 品种名称
|
|
|
+ WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 商品(品类) 代码
|
|
|
+ WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 商品(品类) 名称
|
|
|
+ VATRATE SFLOAT64 `json:"vatrate" xorm:"'VATRATE'"` // 增值税率
|
|
|
+ MIDDLEGOODSCODE string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保品种代码
|
|
|
+ MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保品种名称
|
|
|
+ NEEDHEDGERATIO SFLOAT64 `json:"needhedgeratio" xorm:"'NEEDHEDGERATIO'"` // 套保系数
|
|
|
+ CONVERTRATIO SFLOAT64 `json:"convertratio" xorm:"'CONVERTRATIO'"` // 折算系数
|
|
|
+
|
|
|
+ TODAYAVGPRICE SFLOAT64 `json:"todayavgprice" xorm:"'TODAYAVGPRICE'"` // 今日定价均价 = TodayPricedAmount / TodayPricedQty
|
|
|
+ TODAYAVGPRICE2 SFLOAT64 `json:"todayavgprice2" xorm:"'TODAYAVGPRICE2'"` // 今日点价登记均价(基价) = TodayPricedAmount2 / TodayPricedQty
|
|
|
+ HEDGEPLANQTY SFLOAT64 `json:"hedgeplanqty" xorm:"'HEDGEPLANQTY'"` // 套保计划量 = TodayPricedQty * 折算系数 * (1/(1+增值税率)) * 套保比例
|
|
|
+ TODAYAVGFUTUPRICE SFLOAT64 `json:"todayavgfutuprice" xorm:"'TODAYAVGFUTUPRICE'"` // 今日期货成交均价 = TodayRelatedMiddleGoodsAmount /TodayRelatedMiddleGoodsQty
|
|
|
+ DIFFPRICE SFLOAT64 `json:"diffprice" xorm:"'DIFFPRICE'"` // 现期价格差 = 今日点价登记均价(基价) - 今日期货成交均价
|
|
|
+ DIFFQTY SFLOAT64 `json:"diffqty" xorm:"'DIFFQTY'"` // 期现数量差 = 套保计划量 - 今日期货关联成交量
|
|
|
+
|
|
|
+ QueryType int32 `json:"-"` // 查询类型 1-报表 2-报表明细
|
|
|
+ BeginDate string `json:"begindate"` // 开始交易日
|
|
|
+ EndDate string `json:"enddate"` // 结束交易日
|
|
|
+}
|
|
|
+
|
|
|
+func (r *Ermcp3SCMiddleGoodsReport) calc() {
|
|
|
+
|
|
|
+ if r.TODAYPRICEDQTY > 0 {
|
|
|
+ r.TODAYAVGPRICE = r.TODAYPRICEDAMOUNT / r.TODAYPRICEDQTY
|
|
|
+ r.TODAYAVGPRICE.Round(2)
|
|
|
+
|
|
|
+ r.TODAYAVGPRICE2 = r.TODAYPRICEDAMOUNT2 / r.TODAYPRICEDQTY
|
|
|
+ r.TODAYAVGPRICE2.Round(2)
|
|
|
+ }
|
|
|
+
|
|
|
+ r.HEDGEPLANQTY = r.TODAYPRICEDQTY * r.CONVERTRATIO * (1 / (1 + r.VATRATE)) * r.NEEDHEDGERATIO
|
|
|
+ if r.TODAYRELATEDMIDDLEGOODSQTY > 0 {
|
|
|
+ r.TODAYAVGFUTUPRICE = r.TODAYRELATEDMIDDLEGOODSAMOUNT / r.TODAYRELATEDMIDDLEGOODSQTY
|
|
|
+ r.TODAYAVGFUTUPRICE.Round(2)
|
|
|
+
|
|
|
+ r.DIFFPRICE = r.TODAYAVGPRICE2 - r.TODAYAVGFUTUPRICE
|
|
|
+ r.DIFFPRICE.Round(2)
|
|
|
+
|
|
|
+ r.DIFFQTY = r.HEDGEPLANQTY - r.TODAYRELATEDMIDDLEGOODSQTY
|
|
|
+ r.DIFFQTY.Round(8)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (r *Ermcp3SCMiddleGoodsReport) buildSql() string {
|
|
|
+ if r.CYCLETYPE == 0 {
|
|
|
+ return r.buildSqlDay()
|
|
|
+ } else {
|
|
|
+ return r.buildSqlCycle()
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (r *Ermcp3SCMiddleGoodsReport) buildSqlDay() string {
|
|
|
+ var sqlId utils.SQLVal = `
|
|
|
+select t.reckondate,
|
|
|
+ to_char(t.spotcontractid) spotcontractid,
|
|
|
+ t.middlegoodsid,
|
|
|
+ t.deliverygoodsid,
|
|
|
+ t.wrstandardid,
|
|
|
+ t.pricedqty,
|
|
|
+ t.middlegoodspricedqty,
|
|
|
+ t.middlegoodspricedqty2,
|
|
|
+ t.middlegoodspricedqty3,
|
|
|
+ t.relatedmiddlegoodsqty,
|
|
|
+ t.todayrelatedmiddlegoodsqty,
|
|
|
+ t.todayrelatedmiddlegoodsamount,
|
|
|
+ t.relatedmiddlegoodsamount,
|
|
|
+ t.todaypricedqty,
|
|
|
+ t.todaypricedamount,
|
|
|
+ t.pricedamount,
|
|
|
+ t.todaypricedamount2,
|
|
|
+ t.pricedamount2,
|
|
|
+ s.userid,
|
|
|
+ s.contractno,
|
|
|
+ s.contracttype,
|
|
|
+ u.accountname mathname,
|
|
|
+ g.deliverygoodscode,
|
|
|
+ g.deliverygoodsname,
|
|
|
+ w.wrstandardcode,
|
|
|
+ w.wrstandardname,
|
|
|
+ w.vatrate,
|
|
|
+ m.middlegoodscode,
|
|
|
+ m.middlegoodsname,
|
|
|
+ m.needhedgeratio,
|
|
|
+ c.convertratio
|
|
|
+ from Reckon_ERMCP_SCMiddleGoods t
|
|
|
+ inner join ermcp_spotcontract s
|
|
|
+ on t.spotcontractid = s.spotcontractid
|
|
|
+ left join useraccount u
|
|
|
+ on u.userid = (decode(s.contracttype, 1, s.selluserid, s.buyuserid))
|
|
|
+ left join deliverygoods g
|
|
|
+ on t.deliverygoodsid = g.deliverygoodsid
|
|
|
+ left join wrstandard w
|
|
|
+ on t.wrstandardid = w.wrstandardid
|
|
|
+ left join erms_middlegoods m
|
|
|
+ on t.middlegoodsid = m.middlegoodsid
|
|
|
+ left join erms2_wrsconvertdetail c
|
|
|
+ on t.middlegoodsid = c.middlegoodsid
|
|
|
+ and t.wrstandardid = c.wrstandardid
|
|
|
+ where 1 = 1
|
|
|
+`
|
|
|
+ sqlId.JoinFormat(" and %v in (s.userid, s.tradeuserid, s.saleuserid, s.tradeuserid)", r.USERID)
|
|
|
+ sqlId.And("t.RECKONDATE", r.RECKONDATE)
|
|
|
+ sqlId.AndEx("t.middlegoodsid", r.MIDDLEGOODSID, r.MIDDLEGOODSID > 0)
|
|
|
+ sqlId.AndEx("t.deliverygoodsid", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
|
|
|
+ sqlId.AndEx("t.wrstandardid", r.WRSTANDARDID, r.WRSTANDARDID > 0)
|
|
|
+ sqlId.AndInterEx("t.spotcontractid", r.SPOTCONTRACTID, r.SPOTCONTRACTID != "")
|
|
|
+
|
|
|
+ return sqlId.String()
|
|
|
+}
|
|
|
+
|
|
|
+func (r *Ermcp3SCMiddleGoodsReport) buildSqlCycle() string {
|
|
|
+ var sqlId utils.SQLVal = `
|
|
|
+select t.cycletype,
|
|
|
+ t.cycletime,
|
|
|
+ to_char(t.spotcontractid) spotcontractid,
|
|
|
+ t.middlegoodsid,
|
|
|
+ t.deliverygoodsid,
|
|
|
+ t.wrstandardid,
|
|
|
+ t.pricedqty,
|
|
|
+ t.middlegoodspricedqty,
|
|
|
+ t.middlegoodspricedqty2,
|
|
|
+ t.middlegoodspricedqty3,
|
|
|
+ t.relatedmiddlegoodsqty,
|
|
|
+ t.todayrelatedmiddlegoodsqty,
|
|
|
+ t.todayrelatedmiddlegoodsamount,
|
|
|
+ t.relatedmiddlegoodsamount,
|
|
|
+ t.todaypricedqty,
|
|
|
+ t.todaypricedamount,
|
|
|
+ t.pricedamount,
|
|
|
+ t.todaypricedamount2,
|
|
|
+ t.pricedamount2,
|
|
|
+ s.userid,
|
|
|
+ s.contractno,
|
|
|
+ s.contracttype,
|
|
|
+ u.accountname mathname,
|
|
|
+ g.deliverygoodscode,
|
|
|
+ g.deliverygoodsname,
|
|
|
+ w.wrstandardcode,
|
|
|
+ w.wrstandardname,
|
|
|
+ w.vatrate,
|
|
|
+ m.middlegoodscode,
|
|
|
+ m.middlegoodsname,
|
|
|
+ m.needhedgeratio,
|
|
|
+ c.convertratio
|
|
|
+ from Report_ERMCP_SCMiddleGoods t
|
|
|
+ inner join ermcp_spotcontract s
|
|
|
+ on t.spotcontractid = s.spotcontractid
|
|
|
+ left join useraccount u
|
|
|
+ on u.userid = (decode(s.contracttype, 1, s.selluserid, s.buyuserid))
|
|
|
+ left join deliverygoods g
|
|
|
+ on t.deliverygoodsid = g.deliverygoodsid
|
|
|
+ left join wrstandard w
|
|
|
+ on t.wrstandardid = w.wrstandardid
|
|
|
+ left join erms_middlegoods m
|
|
|
+ on t.middlegoodsid = m.middlegoodsid
|
|
|
+ left join erms2_wrsconvertdetail c
|
|
|
+ on t.middlegoodsid = c.middlegoodsid
|
|
|
+ and t.wrstandardid = c.wrstandardid
|
|
|
+ where 1 = 1
|
|
|
+`
|
|
|
+ sqlId.JoinFormat(" and %v in (s.userid, s.tradeuserid, s.saleuserid, s.tradeuserid)", r.USERID)
|
|
|
+ sqlId.And("t.CYCLETYPE", r.CYCLETYPE)
|
|
|
+ sqlId.And("t.CYCLETIME", r.CYCLETIME)
|
|
|
+ sqlId.AndEx("t.middlegoodsid", r.MIDDLEGOODSID, r.MIDDLEGOODSID > 0)
|
|
|
+ sqlId.AndEx("t.deliverygoodsid", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
|
|
|
+ sqlId.AndEx("t.wrstandardid", r.WRSTANDARDID, r.WRSTANDARDID > 0)
|
|
|
+ sqlId.AndInterEx("t.spotcontractid", r.SPOTCONTRACTID, r.SPOTCONTRACTID != "")
|
|
|
+
|
|
|
+ return sqlId.String()
|
|
|
+}
|
|
|
+
|
|
|
+// GetDataEx 获取定价报表
|
|
|
+func (r *Ermcp3SCMiddleGoodsReport) GetDataEx() (interface{}, error) {
|
|
|
+ sData := make([]Ermcp3SCMiddleGoodsReport, 0)
|
|
|
+ err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
|
|
|
+ for i := range sData {
|
|
|
+ sData[i].calc()
|
|
|
+ }
|
|
|
+ return sData, err
|
|
|
+}
|