ermcp8.go 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811
  1. package models
  2. import (
  3. "mtp2_if/db"
  4. "mtp2_if/utils"
  5. "time"
  6. )
  7. // Ermcp2himiddlegoodsOrc 项目套保品种明细
  8. type Ermcp2himiddlegoodsOrc struct {
  9. HEDGEDITEMID int64 `json:"hedgeditemid" xorm:"HEDGEDITEMID"` // 被套期项目ID(624+Unix秒时间戳(10位)+xxxxxx)
  10. MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"MIDDLEGOODSID"` // 套保品种ID
  11. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"DELIVERYGOODSID"` // 现货品种ID
  12. WRSTANDARDID int64 `json:"wrstandardid" xorm:"WRSTANDARDID"` // 现货商品ID
  13. VATRATE float64 `json:"vatrate" xorm:"VATRATE"` // 增值税
  14. SPOTCONVERTRATIO float64 `json:"spotconvertratio" xorm:"SPOTCONVERTRATIO"` // 折算系数 [现货]
  15. UNEXESPOTQTY float64 `json:"unexespotqty" xorm:"UNEXESPOTQTY"` // 未执行现货量
  16. UNEXEHEDGEQTY float64 `json:"unexehedgeqty" xorm:"UNEXEHEDGEQTY"` // 未执行套期量 = 未执行现货量*折算系数* (1/(1+增值税)) * 套期比例(项目上)
  17. FUTUREHEDGEQTY float64 `json:"futurehedgeqty" xorm:"FUTUREHEDGEQTY"` // 期货持仓套期量
  18. HIEXPSOURE float64 `json:"hiexpsoure" xorm:"HIEXPSOURE"` // 期现敞口量 = 未执行套期量 + 期货持仓套期量
  19. TRADEUSERID int64 `json:"tradeuserid" xorm:"TRADEUSERID"` // 交易用户ID
  20. AREAUSERID int64 `json:"areauserid" xorm:"AREAUSERID"` // 企业ID
  21. CREATETIME time.Time `json:"createtime" xorm:"CREATETIME"` // 创建时间
  22. UPDATETIME time.Time `json:"updatetime" xorm:"UPDATETIME"` // 更新时间
  23. }
  24. // TableName is ERMCP2_HIMIDDLEGOODS
  25. func (r *Ermcp2himiddlegoodsOrc) TableName() string {
  26. return "ERMCP2_HIMIDDLEGOODS"
  27. }
  28. // Ermcp2hedgeditem 被套期项目表
  29. type Ermcp2hedgeditemOrc struct {
  30. HEDGEDITEMID int64 `json:"hedgeditemid" xorm:"HEDGEDITEMID"` // 被套期项目ID(624+Unix秒时间戳(10位)+xxxxxx)
  31. HEDGEDITEMNUM string `json:"hedgeditemnum" xorm:"HEDGEDITEMNUM"` // 项目编号
  32. HEDGEDITEMNAME string `json:"hedgeditemname" xorm:"HEDGEDITEMNAME"` // 项目名称
  33. HEDGEDTYPE int32 `json:"hedgedtype" xorm:"HEDGEDTYPE"` // 套期类型 - 1:采购计划项目 2:销售计划项目 3:现货贸易项目 4:库存存货项目 5:定价采购合同项目
  34. PLANSTARTDATE time.Time `json:"planstartdate" xorm:"PLANSTARTDATE"` // 计划开始日期
  35. PLANENDDATE time.Time `json:"planenddate" xorm:"PLANENDDATE"` // 计划结束日期
  36. HEDGERATE float64 `json:"hedgerate" xorm:"HEDGERATE"` // 套期比率
  37. TRADEUSERID int64 `json:"tradeuserid" xorm:"TRADEUSERID"` // 交易用户ID
  38. AREAUSERID int64 `json:"areauserid" xorm:"AREAUSERID"` // 企业ID
  39. HEDGEDITEMSTATUS int32 `json:"hedgeditemstatus" xorm:"HEDGEDITEMSTATUS"` // 项目状态 - 0:未提交 1:待审核 2:执行中 3:正常完结 4:审核拒绝 5:异常完结 6:已撤回
  40. APPLYSRC int32 `json:"applysrc" xorm:"APPLYSRC"` // 申请来源 - 1:管理端 2:终端
  41. APPLYID int64 `json:"applyid" xorm:"APPLYID"` // 申请人
  42. REMARK string `json:"remark" xorm:"REMARK"` // 备注
  43. CREATETIME time.Time `json:"createtime" xorm:"CREATETIME"` // 申请时间
  44. AUDITTRADEDATE string `json:"audittradedate" xorm:"AUDITTRADEDATE"` // 审核交易日(yyyyMMdd)
  45. AUDITID int64 `json:"auditid" xorm:"AUDITID"` // 审核人
  46. AUDITSRC int32 `json:"auditsrc" xorm:"AUDITSRC"` // 审核来源 - 1:管理端 2:终端
  47. AUDITTIME time.Time `json:"audittime" xorm:"AUDITTIME"` // 审核时间
  48. AUDITREMARK string `json:"auditremark" xorm:"AUDITREMARK"` // 审核备注
  49. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"DELIVERYGOODSID"` // 现货品种ID
  50. WRSTANDARDID int64 `json:"wrstandardid" xorm:"WRSTANDARDID"` // 现货商品ID
  51. VATRATE float64 `json:"vatrate" xorm:"VATRATE"` // 增值税
  52. HEDGEQTY float64 `json:"hedgeqty" xorm:"HEDGEQTY"` // 套期现货量
  53. HEDGEAMOUNT float64 `json:"hedgeamount" xorm:"HEDGEAMOUNT"` // 套期市价总额
  54. HEDGERESTAMOUNT float64 `json:"hedgerestamount" xorm:"HEDGERESTAMOUNT"` // 套期剩余市价总额【现货贸易】
  55. HEDGECONTRACTAMOUNT float64 `json:"hedgecontractamount" xorm:"HEDGECONTRACTAMOUNT"` // 套期定价总额 【定价采购合同】【现货贸易】
  56. ORIAVGPRICE float64 `json:"oriavgprice" xorm:"ORIAVGPRICE"` // 期初市场均价 = 套期市价总额 / 套期现货量
  57. EXEQTY float64 `json:"exeqty" xorm:"EXEQTY"` // 执行现货量
  58. EXEAMOUNT float64 `json:"exeamount" xorm:"EXEAMOUNT"` // 执行市价总额
  59. EXERESTAMOUNT float64 `json:"exerestamount" xorm:"EXERESTAMOUNT"` // 执行剩余市价总额【现货贸易】
  60. EXEAVGPRICE float64 `json:"exeavgprice" xorm:"EXEAVGPRICE"` // 执行市场均价= 执行市价总额 / 执行现货量
  61. EXECONTRACTAMOUNT float64 `json:"execontractamount" xorm:"EXECONTRACTAMOUNT"` // 执行定价总额
  62. CURPRICE float64 `json:"curprice" xorm:"CURPRICE"` // 当前市场价
  63. UNEXEQTY float64 `json:"unexeqty" xorm:"UNEXEQTY"` // 未执行现货量 = 套期现货量 - 执行现货量
  64. SPOTHEDGEPL float64 `json:"spothedgepl" xorm:"SPOTHEDGEPL"` // 现货套期损益 =(执行市场均价-期初市场均价)*执行现货量 * 方向(销售计划 为 -1, 其它为1)
  65. SPOTPL float64 `json:"spotpl" xorm:"SPOTPL"` // 现货套期损益 = 现货实际损益 + 现货浮动损益
  66. FUTUREHEDGEPL float64 `json:"futurehedgepl" xorm:"FUTUREHEDGEPL"` // 期货实际损益
  67. FUTUREPL float64 `json:"futurepl" xorm:"FUTUREPL"` // 期货套期损益
  68. HEDGESUMPL float64 `json:"hedgesumpl" xorm:"HEDGESUMPL"` // 套期汇总损益 = 期货汇总损益 + 现货汇总损益
  69. SPOTTRADEPL float64 `json:"spottradepl" xorm:"SPOTTRADEPL"` // 现货贸易损益【现货贸易】= 执行合同定价总额 - 套期合同定价总额
  70. VATPL float64 `json:"vatpl" xorm:"VATPL"` // 增值税损益【现货贸易】= 现货贸易损益 * (增值税率 /(1+增值税率))
  71. SUMOBSPL float64 `json:"sumobspl" xorm:"SUMOBSPL"` // 汇总绝对损益【现货贸易】=现货贸易损益+增值税损益+期货套期损益
  72. SPOTBOOKAMOUNT float64 `json:"spotbookamount" xorm:"SPOTBOOKAMOUNT"` // 现货账面总额
  73. CURSTOCK float64 `json:"curstock" xorm:"CURSTOCK"` // 期末库存量 = 采购总量 - 销售总量
  74. ENDDATE time.Time `json:"enddate" xorm:"ENDDATE"` // 完成日期
  75. ENDTRADEDATE string `json:"endtradedate" xorm:"ENDTRADEDATE"` // 完成交易日
  76. UPDATETIME time.Time `json:"updatetime" xorm:"UPDATETIME"` // 更新时间
  77. ORISPOTHEDGEPL float64 `json:"orispothedgepl" xorm:"ORISPOTHEDGEPL"` // 期初现货实际损益
  78. ORIFUTUREHEDGEPL float64 `json:"orifuturehedgepl" xorm:"ORIFUTUREHEDGEPL"` // 期初期货实际损益
  79. ORISPOTPL float64 `json:"orispotpl" xorm:"ORISPOTPL"` // 期初现货套期损益
  80. ORIFUTUREPL float64 `json:"orifuturepl" xorm:"ORIFUTUREPL"` // 期初期货套期损益
  81. SPOTFLOATPL float64 `json:"spotfloatpl" xorm:"SPOTFLOATPL"` // 现货浮动损益 =(当前市场价 - 期初市场价)*未执行现货量 * 方向(销售计划 为 -1, 其它为1)
  82. FUTUREFLOATPL float64 `json:"futurefloatpl" xorm:"FUTUREFLOATPL"` // 期货浮动损益
  83. }
  84. // TableName is ERMCP2_HEDGEDITEM
  85. func (r *Ermcp2hedgeditemOrc) TableName() string {
  86. return "ERMCP2_HEDGEDITEM"
  87. }
  88. // Ermcp2hedgeditem 被套期项目表
  89. type Ermcp2hedgeditem struct {
  90. Hedgeditemid string `json:"hedgeditemid" xorm:"HEDGEDITEMID"` // 被套期项目ID(624+Unix秒时间戳(10位)+xxxxxx)
  91. Hedgeditemnum string `json:"hedgeditemnum" xorm:"HEDGEDITEMNUM"` // 项目编号
  92. Hedgeditemname string `json:"hedgeditemname" xorm:"HEDGEDITEMNAME"` // 项目名称
  93. Hedgedtype int32 `json:"hedgedtype" xorm:"HEDGEDTYPE" form:"hedgedtype"` // 套期类型 - 1:采购计划项目 2:销售计划项目 3:现货贸易项目 4:库存存货项目 5:定价采购合同项目
  94. Planstartdate time.Time `json:"planstartdate" xorm:"PLANSTARTDATE"` // 计划开始日期
  95. Planenddate time.Time `json:"planenddate" xorm:"PLANENDDATE"` // 计划结束日期
  96. Hedgerate float64 `json:"hedgerate" xorm:"HEDGERATE"` // 套保比率
  97. Tradeuserid int64 `json:"tradeuserid" xorm:"TRADEUSERID"` // 交易用户ID
  98. Areauserid int64 `json:"areauserid" xorm:"AREAUSERID"` // 企业ID
  99. Hedgeditemstatus int32 `json:"hedgeditemstatus" xorm:"HEDGEDITEMSTATUS" form:"hedgeditemstatus"` // 项目状态 - 0:未提交 1:待审核 2:执行中 3:正常完结 4:审核拒绝 5:异常完结 6:已撤回
  100. Applysrc int32 `json:"applysrc" xorm:"APPLYSRC"` // 申请来源 - 1:管理端 2:终端
  101. Applyid int64 `json:"applyid" xorm:"APPLYID"` // 申请人
  102. Remark string `json:"remark" xorm:"REMARK"` // 备注
  103. Createtime time.Time `json:"createtime" xorm:"CREATETIME"` // 申请时间
  104. Audittradedate string `json:"audittradedate" xorm:"AUDITTRADEDATE"` // 审核交易日(yyyyMMdd)
  105. Auditid int64 `json:"auditid" xorm:"AUDITID"` // 审核人
  106. Auditsrc int32 `json:"auditsrc" xorm:"AUDITSRC"` // 审核来源 - 1:管理端 2:终端
  107. Audittime time.Time `json:"audittime" xorm:"AUDITTIME"` // 审核时间
  108. Auditremark string `json:"auditremark" xorm:"AUDITREMARK"` // 审核备注
  109. Deliverygoodsid int64 `json:"deliverygoodsid" xorm:"DELIVERYGOODSID"` // 现货品种ID
  110. Wrstandardid int64 `json:"wrstandardid" xorm:"WRSTANDARDID"` // 现货商品ID
  111. Vatrate float64 `json:"vatrate" xorm:"VATRATE"` // 增值税
  112. Hedgeqty float64 `json:"hedgeqty" xorm:"HEDGEQTY"` // 套期现货量
  113. Hedgeamount float64 `json:"hedgeamount" xorm:"HEDGEAMOUNT"` // 套期市价总额
  114. Hedgerestamount float64 `json:"hedgerestamount" xorm:"HEDGERESTAMOUNT"` // 套期剩余市价总额【现货贸易】
  115. Hedgecontractamount float64 `json:"hedgecontractamount" xorm:"HEDGECONTRACTAMOUNT"` // 套期定价总额 【定价采购合同】【现货贸易】
  116. Oriavgprice float64 `json:"oriavgprice" xorm:"ORIAVGPRICE"` // 期初市场均价 = 套期市价总额 / 套期现货量
  117. Exeqty float64 `json:"exeqty" xorm:"EXEQTY"` // 执行现货量
  118. Exeamount float64 `json:"exeamount" xorm:"EXEAMOUNT"` // 执行市价总额
  119. Exerestamount float64 `json:"exerestamount" xorm:"EXERESTAMOUNT"` // 执行剩余市价总额【现货贸易】
  120. Exeavgprice float64 `json:"exeavgprice" xorm:"EXEAVGPRICE"` // 执行市场均价= 执行市价总额 / 执行现货量
  121. Execontractamount float64 `json:"execontractamount" xorm:"EXECONTRACTAMOUNT"` // 执行定价总额
  122. Curprice float64 `json:"curprice" xorm:"CURPRICE"` // 当前市场价
  123. Unexeqty float64 `json:"unexeqty" xorm:"UNEXEQTY"` // 未执行现货量 = 套期现货量 - 执行现货量
  124. Spothedgepl float64 `json:"spothedgepl" xorm:"SPOTHEDGEPL"` // 现货套期损益 =(执行市场均价-期初市场均价)*执行现货量 * 方向(销售计划 为 -1, 其它为1)
  125. Spotpl float64 `json:"spotpl" xorm:"SPOTPL"` // 现货套期损益 = 现货实际损益 + 现货浮动损益
  126. Futurehedgepl float64 `json:"futurehedgepl" xorm:"FUTUREHEDGEPL"` // 期货实际损益
  127. Futurepl float64 `json:"futurepl" xorm:"FUTUREPL"` // 期货套期损益
  128. Hedgesumpl float64 `json:"hedgesumpl" xorm:"HEDGESUMPL"` // 套期汇总损益 = 期货汇总损益 + 现货汇总损益
  129. Spottradepl float64 `json:"spottradepl" xorm:"SPOTTRADEPL"` // 现货贸易损益【现货贸易】= 执行合同定价总额 - 套期合同定价总额
  130. Vatpl float64 `json:"vatpl" xorm:"VATPL"` // 增值税损益【现货贸易】= 现货贸易损益 * (增值税率 /(1+增值税率))
  131. Sumobspl float64 `json:"sumobspl" xorm:"SUMOBSPL"` // 汇总绝对损益【现货贸易】=现货贸易损益+增值税损益+期货套期损益
  132. Spotbookamount float64 `json:"spotbookamount" xorm:"SPOTBOOKAMOUNT"` // 现货账面总额
  133. Curstock float64 `json:"curstock" xorm:"CURSTOCK"` // 期末库存量 = 采购总量 - 销售总量
  134. Enddate time.Time `json:"enddate" xorm:"ENDDATE"` // 完成日期
  135. Endtradedate string `json:"endtradedate" xorm:"ENDTRADEDATE"` // 完成交易日
  136. Updatetime time.Time `json:"updatetime" xorm:"UPDATETIME"` // 更新时间
  137. Orispothedgepl float64 `json:"orispothedgepl" xorm:"ORISPOTHEDGEPL"` // 期初现货实际损益
  138. Orifuturehedgepl float64 `json:"orifuturehedgepl" xorm:"ORIFUTUREHEDGEPL"` // 期初期货实际损益
  139. Orispotpl float64 `json:"orispotpl" xorm:"ORISPOTPL"` // 期初现货套期损益
  140. Orifuturepl float64 `json:"orifuturepl" xorm:"ORIFUTUREPL"` // 期初期货套期损益
  141. Spotfloatpl float64 `json:"spotfloatpl" xorm:"SPOTFLOATPL"` // 现货浮动损益 =(当前市场价 - 期初市场价)*未执行现货量 * 方向(销售计划 为 -1, 其它为1)
  142. Futurefloatpl float64 `json:"futurefloatpl" xorm:"FUTUREFLOATPL"` // 期货浮动损益
  143. SpotHedgePLChange float64 `json:"spothedgeplchange" xorm:"SPOTHEDGEPLCHANGE"` // 现货实际损益变动
  144. SpotPLChange float64 `json:"spotplchange" xorm:"SPOTPLCHANGE"` // 现货套期损益变动
  145. FutureHedgePLChange float64 `json:"futurehedgeplchange" xorm:"FUTUREHEDGEPLCHANGE"` // 期货实际损益变动
  146. FuturePLChange float64 `json:"futureplchange" xorm:"FUTUREPLCHANGE"` // 期货套期损益变动
  147. Wrstandardname string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 商品名称
  148. EnumdicName string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 单位
  149. AccountName string `json:"accountName" xorm:"ACCOUNTNAME"` // 套期主体
  150. MiddleGoodsList []Ermcp2himiddlegoods `json:"middlegoodslist"` // 套期商品列表
  151. USERID int64 `json:"-" form:"userid" binding:"required"` // 用户id, 用于过滤
  152. }
  153. // TableName is ERMCP2_HEDGEDITEM
  154. func (r *Ermcp2hedgeditem) TableName() string {
  155. return "ERMCP2_HEDGEDITEM"
  156. }
  157. func (r *Ermcp2hedgeditem) calc() {
  158. }
  159. func (r *Ermcp2hedgeditem) buildSql() string {
  160. var sqlId utils.SQLVal = `
  161. SELECT
  162. to_char(t.HEDGEDITEMID) HEDGEDITEMID,
  163. t.HEDGEDITEMNUM ,
  164. t.HEDGEDITEMNAME ,
  165. t.HEDGEDTYPE ,
  166. t.PLANSTARTDATE ,
  167. t.PLANENDDATE ,
  168. t.HEDGERATE ,
  169. t.TRADEUSERID ,
  170. t.AREAUSERID ,
  171. t.HEDGEDITEMSTATUS ,
  172. t.APPLYSRC ,
  173. t.APPLYID ,
  174. t.REMARK ,
  175. t.CREATETIME ,
  176. t.AUDITTRADEDATE ,
  177. t.AUDITID ,
  178. t.AUDITSRC ,
  179. t.AUDITTIME ,
  180. t.AUDITREMARK ,
  181. t.DELIVERYGOODSID ,
  182. t.WRSTANDARDID ,
  183. t.VATRATE ,
  184. t.HEDGEQTY ,
  185. t.HEDGEAMOUNT ,
  186. t.HEDGERESTAMOUNT ,
  187. t.HEDGECONTRACTAMOUNT,
  188. t.ORIAVGPRICE ,
  189. t.EXEQTY ,
  190. t.EXEAMOUNT ,
  191. t.EXERESTAMOUNT ,
  192. t.EXEAVGPRICE ,
  193. t.EXECONTRACTAMOUNT ,
  194. t.CURPRICE ,
  195. t.UNEXEQTY ,
  196. t.SPOTHEDGEPL ,
  197. t.SPOTPL ,
  198. t.FUTUREHEDGEPL ,
  199. t.FUTUREPL ,
  200. t.HEDGESUMPL ,
  201. t.SPOTTRADEPL ,
  202. t.VATPL ,
  203. t.SUMOBSPL ,
  204. t.SPOTBOOKAMOUNT ,
  205. t.CURSTOCK ,
  206. t.ENDDATE ,
  207. t.ENDTRADEDATE ,
  208. t.UPDATETIME ,
  209. t.ORISPOTHEDGEPL ,
  210. t.ORIFUTUREHEDGEPL ,
  211. t.ORISPOTPL ,
  212. t.ORIFUTUREPL ,
  213. t.SPOTFLOATPL ,
  214. t.FUTUREFLOATPL ,
  215. (t.SpotHedgePL - t.OriSpotHedgePL) SPOTHEDGEPLCHANGE,
  216. (t.SpotPL - t.OriSpotPL) SPOTPLCHANGE,
  217. (t.FutureHedgePL - t.OriFutureHedgePL) FUTUREHEDGEPLCHANGE,
  218. (t.FuturePL - t.OriFuturePL) FUTUREPLCHANGE,
  219. wr.WRSTANDARDNAME,
  220. e.ENUMDICNAME,
  221. u.ACCOUNTNAME
  222. FROM ERMCP2_HedgedItem t
  223. LEFT JOIN WRStandard wr ON wr.wrstandardid = t.wrstandardid
  224. LEFT JOIN enumdicitem e on wr.unitid=e.enumitemname and e.enumdiccode='goodsunit'
  225. LEFT JOIN useraccount u ON u.userid = t.tradeuserid
  226. WHERE 1 = 1
  227. AND %v in (t.AreaUserID, t.TradeUserID)
  228. `
  229. sqlId.FormatParam(r.USERID)
  230. sqlId.AndEx("t.Hedgedtype", r.Hedgedtype, r.Hedgedtype > 0)
  231. sqlId.AndEx("t.hedgeditemstatus", r.Hedgeditemstatus, r.Hedgeditemstatus > 0)
  232. return sqlId.String()
  233. }
  234. // GetDataEx 从数据库中查询数据
  235. func (r *Ermcp2hedgeditem) GetDataEx() (interface{}, error) {
  236. e := db.GetEngine()
  237. s := e.SQL(r.buildSql())
  238. sData := make([]Ermcp2hedgeditem, 0)
  239. if err := s.Find(&sData); err != nil {
  240. return nil, err
  241. }
  242. for i := range sData {
  243. sData[i].calc()
  244. }
  245. if len(sData) > 0 {
  246. // 获取关联期货品种
  247. m1 := Ermcp2himiddlegoods{}
  248. if d1, err := m1.GetDataEx(); err == nil {
  249. gpLst := d1.([]Ermcp2himiddlegoods)
  250. for i := range sData {
  251. sData[i].MiddleGoodsList = append(sData[i].MiddleGoodsList, gpLst...)
  252. }
  253. }
  254. }
  255. return sData, nil
  256. }
  257. // Ermcp2himiddlegoods 项目套保品种明细
  258. type Ermcp2himiddlegoods struct {
  259. HEDGEDITEMID int64 `json:"hedgeditemid" xorm:"HEDGEDITEMID" binding:"required"` // 被套期项目ID(624+Unix秒时间戳(10位)+xxxxxx)
  260. MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"MIDDLEGOODSID" binding:"required"` // 套保品种ID
  261. DELIVERYGOODSID int64 `json:"-" xorm:"DELIVERYGOODSID"` // 现货品种ID
  262. WRSTANDARDID int64 `json:"-" xorm:"WRSTANDARDID"` // 现货商品ID
  263. VATRATE float64 `json:"-" xorm:"VATRATE"` // 增值税
  264. SPOTCONVERTRATIO float64 `json:"-" xorm:"SPOTCONVERTRATIO"` // 折算系数 [现货]
  265. UNEXESPOTQTY float64 `json:"-" xorm:"UNEXESPOTQTY"` // 未执行现货量
  266. UNEXEHEDGEQTY float64 `json:"unexehedgeqty" xorm:"UNEXEHEDGEQTY"` // 未执行套期量 = 未执行现货量*折算系数* (1/(1+增值税)) * 套期比例(项目上)
  267. FUTUREHEDGEQTY float64 `json:"futurehedgeqty" xorm:"FUTUREHEDGEQTY"` // 期货持仓套期量
  268. HIEXPSOURE float64 `json:"hiexpsoure" xorm:"HIEXPSOURE"` // 期现敞口量 = 未执行套期量 + 期货持仓套期量
  269. TRADEUSERID int64 `json:"-" xorm:"TRADEUSERID"` // 交易用户ID
  270. AREAUSERID int64 `json:"-" xorm:"AREAUSERID"` // 企业ID
  271. CREATETIME time.Time `json:"-" xorm:"CREATETIME"` // 创建时间
  272. UPDATETIME time.Time `json:"-" xorm:"UPDATETIME"` // 更新时间
  273. Middlegoodsname string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保商品名称
  274. Middlegoodscode string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保商品代码
  275. }
  276. // TableName is ERMCP2_HIMIDDLEGOODS
  277. func (r *Ermcp2himiddlegoods) TableName() string {
  278. return "ERMCP2_HIMIDDLEGOODS"
  279. }
  280. func (r *Ermcp2himiddlegoods) calc() {
  281. }
  282. func (r *Ermcp2himiddlegoods) buildSql() string {
  283. var sqlId utils.SQLVal = `
  284. SELECT
  285. t.MIDDLEGOODSID,
  286. t.UNEXEHEDGEQTY,
  287. t.FUTUREHEDGEQTY,
  288. t.HIEXPSOURE,
  289. m.MIDDLEGOODSNAME,
  290. m.MIDDLEGOODSCODE
  291. FROM ERMCP2_HIMIDDLEGOODS t
  292. LEFT JOIN erms_middlegoods m ON m.middlegoodsid = t.middlegoodsid
  293. WHERE t.HEDGEDITEMID = %v
  294. `
  295. sqlId.FormatParam(r.HEDGEDITEMID)
  296. return sqlId.String()
  297. }
  298. // GetDataEx 从数据库中查询数据
  299. func (r *Ermcp2himiddlegoods) GetDataEx() (interface{}, error) {
  300. e := db.GetEngine()
  301. s := e.SQL(r.buildSql())
  302. sData := make([]Ermcp2himiddlegoods, 0)
  303. if err := s.Find(&sData); err != nil {
  304. return nil, err
  305. }
  306. for i := range sData {
  307. sData[i].calc()
  308. }
  309. return sData, nil
  310. }
  311. // Ermcpjrlinkpos 项目期货关联头寸
  312. type Ermcpjrlinkpos struct {
  313. SPOTCONTRACTID string `json:"spotcontractid" xorm:"SPOTCONTRACTID" form:"hedgeditemid" binding:"required"` // 现货ID [套期项目ID - 金瑞:合同\虚拟合同ID
  314. GOODSID int32 `json:"goodsid" xorm:"GOODSID"` // 期货合约
  315. ORDERTYPE int32 `json:"ordertype" xorm:"ORDERTYPE"` // 单据类型[套期工具] - 1:期货单 2:看涨期权单 3:看跌期权单
  316. EXECUTEPRICE int64 `json:"executeprice" xorm:"EXECUTEPRICE"` // 执行价 - 1:期货单 为 0
  317. OPTIONCODE string `json:"optioncode" xorm:"OPTIONCODE"` // 期权代码
  318. AREAUSERID int64 `json:"areauserid" xorm:"AREAUSERID"` // 所属企业
  319. TOTALBUYAMOUNT float64 `json:"totalbuyamount" xorm:"TOTALBUYAMOUNT"` // 买金额 [期货]
  320. TOTALBUYQTY float64 `json:"totalbuyqty" xorm:"TOTALBUYQTY"` // 买数量
  321. TOTALSELLAMOUNT float64 `json:"totalsellamount" xorm:"TOTALSELLAMOUNT"` // 卖金额 [期货]
  322. TOTALSELLQTY float64 `json:"totalsellqty" xorm:"TOTALSELLQTY"` // 卖数量
  323. NETQTY float64 `json:"netqty" xorm:"NETQTY"` // 净头寸
  324. TOTALCHARGE float64 `json:"totalcharge" xorm:"TOTALCHARGE"` // 手续费
  325. TOTALPREMIUM float64 `json:"totalpremium" xorm:"TOTALPREMIUM"` // 权利金 [期权]
  326. CLOSEPL float64 `json:"closepl" xorm:"CLOSEPL"` // 总平仓盈亏 [期货损益]
  327. UPDATETIME time.Time `json:"updatetime" xorm:"UPDATETIME"` // 更新时间
  328. TOTALBUYHOLDAMOUNT float64 `json:"totalbuyholdamount" xorm:"TOTALBUYHOLDAMOUNT"` // 买持仓总金额[期货]
  329. TOTALSELLHOLDAMOUNT float64 `json:"totalsellholdamount" xorm:"TOTALSELLHOLDAMOUNT"` // 卖持仓总金额[期货]
  330. TODAYFUTURECLOSEPL float64 `json:"todayfutureclosepl" xorm:"TODAYFUTURECLOSEPL"` // 今日平仓盈亏
  331. RECKONPL float64 `json:"reckonpl" xorm:"RECKONPL"` // 总盈亏(平仓盈亏 + 结算盈亏 - 手续费)
  332. Middlegoodsname string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保商品名称
  333. Middlegoodscode string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保商品代码
  334. FUTUREHEDGEQTY float64 `json:"futurehedgeqty" xorm:"FUTUREHEDGEQTY"` // 期货套期量
  335. AVERAGEPRICE float64 `json:"averageprice" xorm:"AVERAGEPRICE"` // 持仓均价 (TotalBuyHoldAmount - TotalSellHoldAmount) / NetQty
  336. }
  337. // TableName is ERMCP_JR_LINKPOS
  338. func (r *Ermcpjrlinkpos) TableName() string {
  339. return "ERMCP_JR_LINKPOS"
  340. }
  341. func (r *Ermcpjrlinkpos) calc() {
  342. }
  343. func (r *Ermcpjrlinkpos) buildSql() string {
  344. var sqlId utils.SQLVal = `
  345. SELECT
  346. to_char(t.SPOTCONTRACTID) SPOTCONTRACTID,
  347. t.ORDERTYPE,
  348. t.OPTIONCODE,
  349. t.CLOSEPL,
  350. t.NETQTY,
  351. ((t.TotalBuyHoldAmount - t.TotalSellHoldAmount) / NetQty) AVERAGEPRICE,
  352. mg.middlegoodsname,
  353. mg.middlegoodscode
  354. FROM ERMCP_JR_LinkPos t
  355. LEFT JOIN Goods g ON g.goodsid = t.goodsid
  356. LEFT JOIN ERMCP_GGConvertConfig gc on gc.srcgoodsgroupid = g.goodsgroupid
  357. LEFT JOIN ERMS_MiddleGoods mg ON mg.goodsgroupid = gc.destgoodsgroupid
  358. WHERE mg.areauserid = t.areauserid AND t.SPOTCONTRACTID = %v
  359. ORDER BY t.OPTIONCODE
  360. `
  361. // 只有期货合约ID(GoodsID)的情况下获取套保商品名称,需要以上的关联
  362. sqlId.FormatParam(r.SPOTCONTRACTID)
  363. return sqlId.String()
  364. }
  365. // GetDataEx 从数据库中查询数据
  366. func (r *Ermcpjrlinkpos) GetDataEx() (interface{}, error) {
  367. e := db.GetEngine()
  368. s := e.SQL(r.buildSql())
  369. sData := make([]Ermcpjrlinkpos, 0)
  370. if err := s.Find(&sData); err != nil {
  371. return nil, err
  372. }
  373. for i := range sData {
  374. sData[i].calc()
  375. }
  376. return sData, nil
  377. }
  378. // Ermcp2hedgeditemspot 项目现货明细
  379. type Ermcp2hedgeditemspot struct {
  380. HEDGEDITEMSPOTID string `json:"hedgeditemspotid" xorm:"HEDGEDITEMSPOTID"` // 现货明细ID(625+Unix秒时间戳(10位)+xxxxxx)
  381. HEDGEDITEMID string `json:"hedgeditemid" xorm:"HEDGEDITEMID" form:"hedgeditemid" binding:"required"` // 被套期项目ID
  382. HEDGEDTYPE int32 `json:"hedgedtype" xorm:"HEDGEDTYPE"` // 套期类型[计划类型] - 1:采购计划项目 2:销售计划项目 3:现货贸易项目 4:库存存货项目 5:定价采购合同项目
  383. SPOTTYPE int32 `json:"spottype" xorm:"SPOTTYPE"` // 现货类型 - 1:采购计划 2:销售计划 3:采购合同 4:销售合同 5:库存存货
  384. RELATEDTYPE int32 `json:"relatedtype" xorm:"RELATEDTYPE"` // 关联类型 - 1:套期关联 2:执行关联
  385. RELATEDHEDGEPLANID int64 `json:"relatedhedgeplanid" xorm:"RELATEDHEDGEPLANID"` // 关联计划ID 【1:采购计划 2:销售计划】
  386. RELATEDSPOTCONTRACTID int64 `json:"relatedspotcontractid" xorm:"RELATEDSPOTCONTRACTID"` // 关联合同ID 【3:采购合同 4:销售合同】
  387. CUSTOMERUSERID int64 `json:"customeruserid" xorm:"CUSTOMERUSERID"` // 对手方 【3:采购合同 4:销售合同】
  388. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"DELIVERYGOODSID"` // 现货品种ID
  389. WRSTANDARDID int64 `json:"wrstandardid" xorm:"WRSTANDARDID"` // 现货商品ID
  390. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"SPOTGOODSBRANDID"` // 现货品牌ID - 存“DGFactoryItem”表"DGFactoryItemID" = 2
  391. RELATEDQTY float64 `json:"relatedqty" xorm:"RELATEDQTY"` // 关联数量[数量]
  392. ORIAVGPRICE float64 `json:"oriavgprice" xorm:"ORIAVGPRICE"` // 期初市场价[当初市场价]
  393. RELATEDAMOUNT float64 `json:"relatedamount" xorm:"RELATEDAMOUNT"` // 市价总额 = 关联数量 * 期初市场价
  394. SPOTPRICEDAMOUNT float64 `json:"spotpricedamount" xorm:"SPOTPRICEDAMOUNT"` // 定价总额
  395. SPOTPRICEDAVGPRICE float64 `json:"spotpricedavgprice" xorm:"SPOTPRICEDAVGPRICE"` // 现货均价 = 定价总额 / 关联数量
  396. CREATETIME time.Time `json:"createtime" xorm:"CREATETIME"` // 创建时间
  397. TRADEUSERID int64 `json:"tradeuserid" xorm:"TRADEUSERID"` // 交易用户ID
  398. AREAUSERID int64 `json:"areauserid" xorm:"AREAUSERID"` // 企业ID
  399. Wrstandardname string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 现货商品
  400. EnumdicName string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 单位
  401. Hedgeplanno string `json:"hedgeplanno" xorm:"'HEDGEPLANNO'"` // 计划编号
  402. }
  403. // TableName is ERMCP2_HEDGEDITEMSPOT
  404. func (r *Ermcp2hedgeditemspot) TableName() string {
  405. return "ERMCP2_HEDGEDITEMSPOT"
  406. }
  407. func (r *Ermcp2hedgeditemspot) calc() {
  408. }
  409. func (r *Ermcp2hedgeditemspot) buildSql() string {
  410. var sqlId utils.SQLVal = `
  411. SELECT
  412. to_char(t.hedgeditemspotid) HEDGEDITEMSPOTID,
  413. to_char(t.hedgeditemid) HEDGEDITEMID,
  414. t.HEDGEDTYPE,
  415. wr.WRSTANDARDNAME,
  416. e.ENUMDICNAME,
  417. t.RELATEDQTY,
  418. t.ORIAVGPRICE,
  419. s.HEDGEPLANNO
  420. FROM ERMCP2_HEDGEDITEMSPOT t
  421. LEFT JOIN WRStandard wr ON wr.wrstandardid = t.wrstandardid
  422. LEFT JOIN enumdicitem e on wr.unitid=e.enumitemname and e.enumdiccode='goodsunit'
  423. LEFT JOIN ermcp_hedgeplan s ON s.HedgePlanID = t.RELATEDHEDGEPLANID
  424. WHERE t.HedgedType IN (1,2) AND t.hedgeditemid = %v
  425. ORDER BY t.createtime
  426. `
  427. sqlId.FormatParam(r.HEDGEDITEMID)
  428. return sqlId.String()
  429. }
  430. // GetDataEx 从数据库中查询数据
  431. func (r *Ermcp2hedgeditemspot) GetDataEx() (interface{}, error) {
  432. e := db.GetEngine()
  433. s := e.SQL(r.buildSql())
  434. sData := make([]Ermcp2hedgeditemspot, 0)
  435. if err := s.Find(&sData); err != nil {
  436. return nil, err
  437. }
  438. for i := range sData {
  439. sData[i].calc()
  440. }
  441. return sData, nil
  442. }
  443. // Ermcp2hedgeditemspotDetail 现货成交明细
  444. type Ermcp2hedgeditemspotDetail struct {
  445. HEDGEDITEMSPOTID string `json:"hedgeditemspotid" xorm:"HEDGEDITEMSPOTID"` // 现货明细ID(625+Unix秒时间戳(10位)+xxxxxx)
  446. HEDGEDITEMID string `json:"hedgeditemid" xorm:"HEDGEDITEMID" form:"hedgeditemid" binding:"required"` // 被套期项目ID
  447. HEDGEDTYPE int32 `json:"hedgedtype" xorm:"HEDGEDTYPE"` // 套期类型[计划类型] - 1:采购计划项目 2:销售计划项目 3:现货贸易项目 4:库存存货项目 5:定价采购合同项目
  448. SPOTTYPE int32 `json:"spottype" xorm:"SPOTTYPE"` // 现货类型[合同类型] - 1:采购计划 2:销售计划 3:采购合同 4:销售合同 5:库存存货
  449. RELATEDTYPE int32 `json:"relatedtype" xorm:"RELATEDTYPE"` // 关联类型 - 1:套期关联 2:执行关联
  450. RELATEDHEDGEPLANID int64 `json:"relatedhedgeplanid" xorm:"RELATEDHEDGEPLANID"` // 关联计划ID 【1:采购计划 2:销售计划】
  451. RELATEDSPOTCONTRACTID int64 `json:"relatedspotcontractid" xorm:"RELATEDSPOTCONTRACTID"` // 关联合同ID 【3:采购合同 4:销售合同】
  452. CUSTOMERUSERID int64 `json:"customeruserid" xorm:"CUSTOMERUSERID"` // 对手方 【3:采购合同 4:销售合同】
  453. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"DELIVERYGOODSID"` // 现货品种ID
  454. WRSTANDARDID int64 `json:"wrstandardid" xorm:"WRSTANDARDID"` // 现货商品ID
  455. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"SPOTGOODSBRANDID"` // 现货品牌ID - 存“DGFactoryItem”表"DGFactoryItemID" = 2
  456. RELATEDQTY float64 `json:"relatedqty" xorm:"RELATEDQTY"` // 关联数量[数量]
  457. ORIAVGPRICE float64 `json:"oriavgprice" xorm:"ORIAVGPRICE"` // 期初市场价[当初市场价]
  458. RELATEDAMOUNT float64 `json:"relatedamount" xorm:"RELATEDAMOUNT"` // 市价总额 = 关联数量 * 期初市场价
  459. SPOTPRICEDAMOUNT float64 `json:"spotpricedamount" xorm:"SPOTPRICEDAMOUNT"` // 定价总额[金额]
  460. SPOTPRICEDAVGPRICE float64 `json:"spotpricedavgprice" xorm:"SPOTPRICEDAVGPRICE"` // 现货均价 = 定价总额 / 关联数量
  461. CREATETIME time.Time `json:"createtime" xorm:"CREATETIME"` // 创建时间
  462. TRADEUSERID int64 `json:"tradeuserid" xorm:"TRADEUSERID"` // 交易用户ID
  463. AREAUSERID int64 `json:"areauserid" xorm:"AREAUSERID"` // 企业ID
  464. Wrstandardname string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 现货商品
  465. EnumdicName string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 单位
  466. AccountName string `json:"accountName" xorm:"ACCOUNTNAME"` // 对手方
  467. BRANDNAME string `json:"brandname" xorm:"'BRANDNAME'"` // 品牌
  468. CONTRACTNO string `json:"contractno" xorm:"'CONTRACTNO'"` // 合同编号
  469. }
  470. func (r *Ermcp2hedgeditemspotDetail) calc() {
  471. }
  472. func (r *Ermcp2hedgeditemspotDetail) buildSql() string {
  473. var sqlId utils.SQLVal = `
  474. SELECT
  475. to_char(t.hedgeditemspotid) HEDGEDITEMSPOTID,
  476. to_char(t.hedgeditemid) HEDGEDITEMID,
  477. t.CREATETIME,
  478. t.SPOTTYPE,
  479. u.ACCOUNTNAME,
  480. wr.WRSTANDARDNAME,
  481. e.ENUMDICNAME,
  482. gb.dgfactoryitemvalue BRANDNAME,
  483. t.RELATEDQTY,
  484. t.SPOTPRICEDAVGPRICE,
  485. t.SPOTPRICEDAMOUNT,
  486. t.ORIAVGPRICE,
  487. s.CONTRACTNO
  488. FROM ERMCP2_HEDGEDITEMSPOT t
  489. LEFT JOIN useraccount u ON u.userid = t.CUSTOMERUSERID
  490. LEFT JOIN WRStandard wr ON wr.wrstandardid = t.wrstandardid
  491. LEFT JOIN enumdicitem e on wr.unitid=e.enumitemname and e.enumdiccode='goodsunit'
  492. LEFT JOIN dgfactoryitem gb ON gb.dgfactoryitemid = t.SPOTGOODSBRANDID
  493. LEFT JOIN ermcp_spotcontract s on s.spotcontractid = t.RELATEDSPOTCONTRACTID
  494. WHERE t.HedgedType IN (3,4,5) AND t.hedgeditemid = %v
  495. ORDER BY t.createtime
  496. `
  497. sqlId.FormatParam(r.HEDGEDITEMID)
  498. return sqlId.String()
  499. }
  500. // GetDataEx 从数据库中查询数据
  501. func (r *Ermcp2hedgeditemspotDetail) GetDataEx() (interface{}, error) {
  502. e := db.GetEngine()
  503. s := e.SQL(r.buildSql())
  504. sData := make([]Ermcp2hedgeditemspotDetail, 0)
  505. if err := s.Find(&sData); err != nil {
  506. return nil, err
  507. }
  508. for i := range sData {
  509. sData[i].calc()
  510. }
  511. return sData, nil
  512. }
  513. // Ermcppatradelinkdetail 期货成交单关联明细表
  514. type Ermcppatradelinkdetail struct {
  515. LINKDETAILID string `json:"linkdetailid" xorm:"LINKDETAILID"` // 期货明细ID(614+Unix秒时间戳(10位)+xxxxxx)
  516. TRADEID string `json:"tradeid" xorm:"TRADEID"` // [成交单号]内部成交单ID
  517. BUYORSELL int32 `json:"buyorsell" xorm:"BUYORSELL"` // 方向 - 0:买 1:卖
  518. HEDGEFLAG int32 `json:"hedgeflag" xorm:"HEDGEFLAG"` // 投机套保标志 - 0:无 1:投机 2:套保 3:套利 4:套期保值(平安\合同) 5:单边(平安) 6:移仓(平安) 7:错单处理(平安) 8:跨期套利(平安) 9:套期保值(计划) 10:套利(合同) 11:换月(合同) 12:交割(金瑞) 13:被套期项目
  519. SPOTCONTRACTID int64 `json:"hedgeditemid" xorm:"SPOTCONTRACTID" form:"hedgeditemid" binding:"required"` // 现货ID[套期项目ID] [13 - 被套期项目ID] [4,10,11 - 现货合同ID] [9 - 套保计划ID]
  520. RELATEDLOT float64 `json:"relatedlot" xorm:"RELATEDLOT"` // [数量]关联手数
  521. GOODSID int32 `json:"goodsid" xorm:"GOODSID"` // 商品ID
  522. GOODSGROUPID int32 `json:"goodsgroupid" xorm:"GOODSGROUPID"` // 对冲品种ID[期货合约商品组ID]
  523. MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"MIDDLEGOODSID"` // 套保品种ID
  524. RELATEDQTY float64 `json:"relatedqty" xorm:"RELATEDQTY"` // 关联数量 = RelatedLot * AgreeUnit * ConvertRatio
  525. TRADEDATE string `json:"tradedate" xorm:"TRADEDATE"` // 关联交易日(yyyyMMdd)
  526. RELATEDMODE int32 `json:"relatedmode" xorm:"RELATEDMODE"` // 关联方式 - 1:自动关联 2:手动关联 3:解绑关联
  527. TRADETRADEDATE string `json:"tradetradedate" xorm:"TRADETRADEDATE"` // 成交交易日(yyyyMMdd)
  528. TRADEPRICE float64 `json:"tradeprice" xorm:"TRADEPRICE"` // [价格]成交价格
  529. TRADELOT int64 `json:"tradelot" xorm:"TRADELOT"` // 成交手数
  530. SALEUSERID int64 `json:"saleuserid" xorm:"SALEUSERID"` // 业务员ID
  531. BIZSUBJECTID int64 `json:"bizsubjectid" xorm:"BIZSUBJECTID"` // 归属业务部门ID - SubjectID
  532. AGREEUNIT float64 `json:"agreeunit" xorm:"AGREEUNIT"` // 合约乘数
  533. CONVERTRATIO float64 `json:"convertratio" xorm:"CONVERTRATIO"` // 品种系数
  534. AREAUSERID int64 `json:"areauserid" xorm:"AREAUSERID"` // 所属机构
  535. CREATORSRC int32 `json:"creatorsrc" xorm:"CREATORSRC"` // 创建人来源 - 1:管理端 2:终端 3:交易
  536. CREATORID int64 `json:"creatorid" xorm:"CREATORID"` // 创建人ID
  537. CREATETIME time.Time `json:"createtime" xorm:"CREATETIME"` // 创建时间
  538. LINKSTATUS int32 `json:"linkstatus" xorm:"LINKSTATUS"` // 关联状态 - 1:成功 2:失败 3:解绑
  539. RETCODE int32 `json:"retcode" xorm:"RETCODE"` // 返回码
  540. TRADETIME time.Time `json:"tradetime" xorm:"TRADETIME"` // 日期时间
  541. ORDERTYPE int32 `json:"ordertype" xorm:"ORDERTYPE"` // 单据类型[套期工具] - 1:期货单 2:看涨期权单 3:看跌期权单
  542. OPTIONCODE string `json:"optioncode" xorm:"OPTIONCODE"` // [期货合约]期权代码 [期权]
  543. AMOUNT float64 `json:"amount" xorm:"AMOUNT"` // 金额 = RelatedLot * TradePrice * AgreeUnit
  544. NAME string `json:"name" xorm:"NAME"` // 账户名/子账户
  545. }
  546. func (r *Ermcppatradelinkdetail) calc() {
  547. }
  548. func (r *Ermcppatradelinkdetail) buildSql() string {
  549. var sqlId utils.SQLVal = `
  550. SELECT
  551. p.TRADETIME,
  552. p.ORDERTYPE,
  553. p.OPTIONCODE,
  554. t.BUYORSELL,
  555. t.TRADEPRICE,
  556. t.RELATEDLOT,
  557. (t.RelatedLot * t.TradePrice * t.AgreeUnit) AMOUNT,
  558. to_char(t.TRADEID) TRADEID,
  559. (u.ACCOUNTNAME || '/' || to_char(t.ACCOUNTID)) NAME
  560. FROM ERMCP_PA_TradeLinkDetail t
  561. LEFT JOIN ERMCP_PA_TradeLink p ON p.TradeID = t.TradeID AND p.BuyorSell = t.BuyorSell
  562. LEFT JOIN TAACCOUNT ta ON ta.ACCOUNTID = t.ACCOUNTID
  563. LEFT JOIN USERACCOUNT u on u.userid = ta.relateduserid
  564. WHERE t.HedgeFlag = 13 AND t.SpotContractID = %v
  565. ORDER BY p.TradeTime
  566. `
  567. sqlId.FormatParam(r.SPOTCONTRACTID)
  568. return sqlId.String()
  569. }
  570. // GetDataEx 从数据库中查询数据
  571. func (r *Ermcppatradelinkdetail) GetDataEx() (interface{}, error) {
  572. e := db.GetEngine()
  573. s := e.SQL(r.buildSql())
  574. sData := make([]Ermcppatradelinkdetail, 0)
  575. if err := s.Find(&sData); err != nil {
  576. return nil, err
  577. }
  578. for i := range sData {
  579. sData[i].calc()
  580. }
  581. return sData, nil
  582. }
  583. // InternalUncorrelatedTradeDetail 内部未关联成交单
  584. type InternalUncorrelatedTradeDetail struct {
  585. LINKDETAILID string `json:"linkdetailid" xorm:"LINKDETAILID"` // 期货明细ID(614+Unix秒时间戳(10位)+xxxxxx)
  586. TRADEID string `json:"tradeid" xorm:"TRADEID" form:"tradeid"` // 成交单号
  587. BUYORSELL int32 `json:"buyorsell" xorm:"BUYORSELL" form:"buyorsell"` // 方向 - 0:买 1:卖
  588. HEDGEFLAG int32 `json:"hedgeflag" xorm:"HEDGEFLAG"` // 投机套保标志 - 0:无 1:投机 2:套保 3:套利 4:套期保值(平安\合同) 5:单边(平安) 6:移仓(平安) 7:错单处理(平安) 8:跨期套利(平安) 9:套期保值(计划) 10:套利(合同) 11:换月(合同) 12:交割(金瑞) 13:被套期项目
  589. SPOTCONTRACTID int64 `json:"hedgeditemid" xorm:"SPOTCONTRACTID"` // 现货ID[套期项目ID] [13 - 被套期项目ID] [4,10,11 - 现货合同ID] [9 - 套保计划ID]
  590. RELATEDLOT float64 `json:"relatedlot" xorm:"RELATEDLOT"` // [数量]关联手数
  591. GOODSID int32 `json:"goodsid" xorm:"GOODSID"` // 商品ID
  592. GOODSGROUPID int32 `json:"goodsgroupid" xorm:"GOODSGROUPID"` // 对冲品种ID[期货合约商品组ID]
  593. MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"MIDDLEGOODSID"` // 套保品种ID
  594. RELATEDQTY float64 `json:"relatedqty" xorm:"RELATEDQTY"` // [套期商品数量]关联数量 = RelatedLot * AgreeUnit * ConvertRatio
  595. TRADEDATE string `json:"tradedate" xorm:"TRADEDATE"` // 关联交易日(yyyyMMdd)
  596. RELATEDMODE int32 `json:"relatedmode" xorm:"RELATEDMODE"` // 关联方式 - 1:自动关联 2:手动关联 3:解绑关联
  597. TRADETRADEDATE string `json:"tradetradedate" xorm:"TRADETRADEDATE"` // 成交交易日(yyyyMMdd)
  598. TRADEPRICE float64 `json:"tradeprice" xorm:"TRADEPRICE"` // 成交价
  599. TRADELOT int64 `json:"tradelot" xorm:"TRADELOT"` // 成交手数
  600. SALEUSERID int64 `json:"saleuserid" xorm:"SALEUSERID"` // 业务员ID
  601. BIZSUBJECTID int64 `json:"bizsubjectid" xorm:"BIZSUBJECTID"` // 归属业务部门ID - SubjectID
  602. AGREEUNIT float64 `json:"agreeunit" xorm:"AGREEUNIT"` // 合约乘数
  603. CONVERTRATIO float64 `json:"convertratio" xorm:"CONVERTRATIO"` // 品种系数
  604. AREAUSERID int64 `json:"areauserid" xorm:"AREAUSERID"` // 所属机构
  605. CREATORSRC int32 `json:"creatorsrc" xorm:"CREATORSRC"` // 创建人来源 - 1:管理端 2:终端 3:交易
  606. CREATORID int64 `json:"creatorid" xorm:"CREATORID"` // 创建人ID
  607. CREATETIME time.Time `json:"createtime" xorm:"CREATETIME"` // 创建时间
  608. LINKSTATUS int32 `json:"linkstatus" xorm:"LINKSTATUS"` // 关联状态 - 1:成功 2:失败 3:解绑
  609. RETCODE int32 `json:"retcode" xorm:"RETCODE"` // 返回码
  610. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 账号ID
  611. CHANNELBUILDTYPE int32 `json:"channelbuildtype" xorm:"CHANNELBUILDTYPE"` // 委托单据类型 0:无 1:建仓 2:平仓
  612. TRADETIME string `json:"tradetime" xorm:"TRADETIME"` // 成交时间
  613. ACCOUNTNAME string `json:"accountname" xorm:"ACCOUNTNAME" form:"accountname"` // 套期主体
  614. ENABLEQTY float64 `json:"enableqty" xorm:"ENABLEQTY"` // 项目可关联手数 = 成交手数 - 关联数量
  615. USERID int64 `json:"-" form:"userid" binding:"required"` // 用户编号
  616. BEGINDATE string `json:"-" form:"begindate"` // 起始日期, 格式:yyyymmdd
  617. ENDDATE string `json:"-" form:"enddate"` // 终止日期, 格式:yyyymmdd
  618. GOODSCODE string `json:"goodscode" xorm:"GOODSCODE" form:"goodscode"` // 合约代码
  619. GOODSNAME string `json:"goodsname" xorm:"GOODSNAME" form:"goodsname"` // 合约名称
  620. }
  621. func (r *InternalUncorrelatedTradeDetail) calc() {
  622. }
  623. func (r *InternalUncorrelatedTradeDetail) buildSql() string {
  624. var sqlId utils.SQLVal = `
  625. SELECT
  626. to_char(ept.TRADETIME, 'yyyy-mm-dd hh24:mi:ss') TRADETIME,
  627. ept.GOODSID,
  628. g.GOODSCODE,
  629. g.GOODSNAME,
  630. ept.BUYORSELL,
  631. ept.TRADEPRICE,
  632. ept.TRADELOT,
  633. ept.RELATEDQTY,
  634. ept.RELATEDLOT,
  635. ept.MIDDLEGOODSQTY,
  636. e.ENUMDICNAME,
  637. to_char(ept.TRADEID) TRADEID,
  638. ua.ACCOUNTNAME,
  639. ta.accountname TAACCOUNTNAME,
  640. ept.ACCOUNTID,
  641. ept.CHANNELBUILDTYPE,
  642. (ept.TRADELOT - ept.RELATEDQTY) ENABLEQTY
  643. FROM ERMCP_PA_TRADELINK ept
  644. LEFT JOIN goods g ON ept.goodsid = g.goodsid
  645. LEFT JOIN taaccount ta ON ta.accountid = ept.accountid
  646. LEFT JOIN useraccount ua ON ta.RELATEDUSERID = ua.userid
  647. LEFT JOIN enumdicitem e ON e.enumitemname = g.goodunitid AND e.enumdiccode = 'goodsunit'
  648. WHERE ept.tradelot > ept.relatedlot
  649. and ept.areauserid in
  650. (select u1.userid
  651. FROM useraccount u1
  652. start with u1.userid = %v
  653. connect by prior u1.userid = u1.parentuserid)
  654. `
  655. sqlId.FormatParam(r.USERID)
  656. if r.BEGINDATE != "" {
  657. sqlId.JoinFormat(" and to_char(ept.tradetime, 'yyyymmdd') >= '%v'", r.BEGINDATE)
  658. }
  659. if r.ENDDATE != "" {
  660. sqlId.JoinFormat(" and to_char(ept.tradetime, 'yyyymmdd') <= '%v'", r.ENDDATE)
  661. }
  662. sqlId.AndLike("g.goodscode", r.GOODSCODE)
  663. sqlId.AndLike("g.goodsname", r.GOODSNAME)
  664. sqlId.AndEx("ept.TRADEID", r.TRADEID, r.TRADEID != "")
  665. sqlId.AndEx("ept.BUYORSELL", r.BUYORSELL, r.BUYORSELL != -1)
  666. sqlId.AndLikes2("ta.accountname", "ta.accountid", r.ACCOUNTNAME)
  667. sqlId.OrderByDesc("ept.tradetime")
  668. return sqlId.String()
  669. }
  670. // GetDataEx 从数据库中查询数据
  671. func (r *InternalUncorrelatedTradeDetail) GetDataEx() (interface{}, error) {
  672. e := db.GetEngine()
  673. s := e.SQL(r.buildSql())
  674. sData := make([]InternalUncorrelatedTradeDetail, 0)
  675. if err := s.Find(&sData); err != nil {
  676. return nil, err
  677. }
  678. for i := range sData {
  679. sData[i].calc()
  680. }
  681. return sData, nil
  682. }
  683. // InternalEnableTradeDetail 内部成交单可关联项目
  684. type InternalEnableTradeDetail struct {
  685. HEDGEDITEMNUM string `json:"hedgeditemnum" xorm:"HEDGEDITEMNUM"` // 项目编号
  686. Deliverygoodsid int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货品种ID(SEQ_DELIVERYGOODS)
  687. Deliverygoodscode string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  688. Deliverygoodsname string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  689. Wrstandardid int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 现货品类ID(SEQ_WRSTANDARD)
  690. Wrstandardcode string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 现货品类代码
  691. Wrstandardname string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 现货品类名称
  692. UNEXESPOTQTY float64 `json:"unexespotqty" xorm:"UNEXESPOTQTY"` // 未执行现货量
  693. UNEXEHEDGEQTY float64 `json:"unexehedgeqty" xorm:"UNEXEHEDGEQTY"` // 未执行套期量 = 未执行现货量*折算系数* (1/(1+增值税)) * 套期比例(项目上)
  694. FUTUREHEDGEQTY float64 `json:"futurehedgeqty" xorm:"FUTUREHEDGEQTY"` // [已关联数量]期货持仓套期量
  695. AREAUSERID int64 `json:"areauserid" xorm:"AREAUSERID" form:"areauserid" binding:"required"` // 企业ID
  696. GOODSID int64 `form:"goodsid" binding:"required"` // 期货合约ID
  697. }
  698. func (r *InternalEnableTradeDetail) calc() {
  699. }
  700. func (r *InternalEnableTradeDetail) buildSql() string {
  701. var sqlId utils.SQLVal = `
  702. SELECT
  703. hi.HEDGEDITEMNUM,
  704. dg.DELIVERYGOODSID,
  705. dg.DELIVERYGOODSCODE,
  706. dg.DELIVERYGOODSNAME,
  707. wr.WRSTANDARDID,
  708. wr.WRSTANDARDCODE,
  709. wr.WRSTANDARDNAME,
  710. t.UNEXESPOTQTY,
  711. t.UNEXEHEDGEQTY,
  712. t.FUTUREHEDGEQTY
  713. FROM ERMCP2_HIMiddleGoods t
  714. LEFT JOIN ERMCP2_HedgedItem hi ON hi.HEDGEDITEMID = t.HEDGEDITEMID
  715. LEFT JOIN DeliveryGoods dg ON dg.DELIVERYGOODSID = t.DELIVERYGOODSID
  716. LEFT JOIN WRStandard wr ON wr.WRStandardID = t.WRStandardID
  717. LEFT JOIN ERMS_MiddleGoods ON mg.MIDDLEGOODSID = t.MIDDLEGOODSID
  718. LEFT JOIN ERMCP_GGConvertConfig gc ON gc.destgoodsgroupid = mg.goodsgroupid
  719. LEFT JOIN Goods g ON g.GOODSGROUPID = gc.SRCGOODSGROUPID
  720. WHERE 1 = 1
  721. `
  722. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  723. sqlId.And("g.GOODSID", r.GOODSID)
  724. return sqlId.String()
  725. }
  726. // GetDataEx 从数据库中查询数据
  727. func (r *InternalEnableTradeDetail) GetDataEx() (interface{}, error) {
  728. e := db.GetEngine()
  729. s := e.SQL(r.buildSql())
  730. sData := make([]InternalEnableTradeDetail, 0)
  731. if err := s.Find(&sData); err != nil {
  732. return nil, err
  733. }
  734. for i := range sData {
  735. sData[i].calc()
  736. }
  737. return sData, nil
  738. }