ermcp3Report.go 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847
  1. /**
  2. * @Author: zou.yingbin
  3. * @Create : 2021/4/16 18:22
  4. * @Modify : 2021/4/16 18:22
  5. */
  6. package models
  7. import (
  8. "fmt"
  9. "mtp2_if/db"
  10. "mtp2_if/mtpcache"
  11. "mtp2_if/utils"
  12. )
  13. // Ermcp3ReportOPLog 报表合同操作记录通用查询
  14. type Ermcp3ReportOPLog struct {
  15. LOGID string `json:"logid" xorm:"'lOGID'"` // 流水ID(604+Unix秒时间戳(10位)+xxxxxx)
  16. BIZTYPE int32 `json:"biztype" xorm:"'BIZTYPE'"` // 业务类型 - 1:套保计划 2:现货合同
  17. OPERATELOGTYPE int32 `json:"operatelogtype" xorm:"'OPERATELOGTYPE'"` // 操作流水类型 -
  18. RELATEDID string `json:"relatedid" xorm:"'RELATEDID'"` // 现货合同ID\套保计划
  19. LOGVALUE string `json:"logvalue" xorm:"'LOGVALUE'"` // 数值
  20. LOGDATETIME string `json:"logdatetime" xorm:"'LOGDATETIME'"` // 流水日期(时间)
  21. TRADEDATE string `json:"tradedate" xorm:"'TRADEDATE'"` // 交易日(yyyyMMdd)
  22. APPLYID int64 `json:"applyid" xorm:"'APPLYID'"` // 操作人
  23. CONTRACTTYPE int32 `json:"contracttype" xorm:"'CONTRACTTYPE'"` // 现货合同类型 - 1:采购 -1:销售
  24. USERID int64 `json:"userid" xorm:"'USERID'"` // 机构ID
  25. RELATEDNO string `json:"relatedno" xorm:"'RELATEDNO'"` // 合同编号
  26. UNITID int32 `json:"-" xorm:"'UNITID'"` // 现货商品单位id
  27. ENUMDICNAME string `json:"enumdicName"` // 单位名称
  28. OPTYPENAME string `json:"optypename"` // 流水类型名称
  29. LOGTYPENAME string `json:"logtypename"` // 合同类型(名称)
  30. APPLYNAME string `json:"applyname"` // 操作人名称
  31. BRANDNAME string `json:"brandname" xorm:"'brandname'"` // 品牌名称
  32. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货品种id
  33. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  34. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  35. WRSTANDARDID int32 `json:"wrstandardid" xorm:"'wrstandardid'"` // 品类id
  36. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'wrstandardcode'"` // 品类代码
  37. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'wrstandardname'"` // 品类名称
  38. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'"` // 品牌id
  39. LogTypeFilter string `json:"-"` // 查询日志类型, 逗号隔开(如 1,2,4)
  40. }
  41. // Calc 处理数据
  42. func (r *Ermcp3ReportOPLog) Calc() {
  43. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  44. r.APPLYNAME = mtpcache.GetUserNameByUserId(r.APPLYID)
  45. if r.APPLYNAME == "" {
  46. // APPLYID 可能存的是loginId
  47. r.APPLYNAME = mtpcache.GetLoginCodeByLoginId(r.APPLYID)
  48. }
  49. //1:点价价格 2:点价数量 3:结算量 4:其它费用 5:追加保证金 6溢短金额 7:调整金额 8:付款金额 9:收款金额 10:退款金额
  50. //11:收票金额 12:开票金额 13:提交审核(合同) 14:审核通过(合同) 15:审核拒绝(合同) 16:合同撤回 17:提交审核(计划)
  51. //18:审核通过(计划) 19:审核拒绝(计划) 20:计划撤回 21:正常完结(合同) 22:异常终止(合同) 23:退还保证金
  52. //24:采购入库 25:销售出库 26:生产入库 27:生产出库
  53. // 数据库注释与返回值映身关系: 结算量->确定量, 收款->收款金额, 退款->退款金额, 付款->付款金额, 收票->收票金额, 开票->开票金额
  54. sDes := []string{"点价价格", "点价数量", "确定量", "其它费用", "追加保证金", "溢短金额", "调整金额", "付款", "收款", "退款",
  55. "收票", "开票", "提交审核(合同)", "审核通过(合同)", "审核拒绝(合同)", "合同撤回", "提交审核(计划)",
  56. "审核通过(计划)", "审核拒绝(计划)", "计划撤回", "正常完结(合同)", "异常终止(合同)", "退还保证金",
  57. "采购入库", "销售出库", "生产入库", "生产出库"}
  58. if r.OPERATELOGTYPE >= 1 && r.OPERATELOGTYPE <= 27 {
  59. r.OPTYPENAME = sDes[r.OPERATELOGTYPE-1]
  60. }
  61. // 收款款项:采购合同的退款、销售合同的收款应用正数显示,付款款项:采购合同的付款、销售合同的退款应用负数显示
  62. if r.CONTRACTTYPE == 1 {
  63. r.LOGTYPENAME = "采购"
  64. // 采购合同/退款 正数
  65. if r.OPERATELOGTYPE == 10 && len(r.LOGVALUE) > 0 {
  66. if r.LOGVALUE[0] == '-' {
  67. r.LOGVALUE = r.LOGVALUE[1:]
  68. }
  69. }
  70. // 采购合同/付款 负数
  71. if r.OPERATELOGTYPE == 8 && len(r.LOGVALUE) > 0 {
  72. if r.LOGVALUE[0] != '-' {
  73. r.LOGVALUE = "-" + r.LOGVALUE
  74. }
  75. }
  76. } else if r.CONTRACTTYPE == -1 {
  77. r.LOGTYPENAME = "销售"
  78. // 销售合同/收款 正数
  79. if r.OPERATELOGTYPE == 9 && len(r.LOGVALUE) > 0 {
  80. if r.LOGVALUE[0] == '-' {
  81. r.LOGVALUE = r.LOGVALUE[1:]
  82. }
  83. }
  84. // 销售合同/退款 负数
  85. if r.OPERATELOGTYPE == 10 && len(r.LOGVALUE) > 0 {
  86. if r.LOGVALUE[0] != '-' {
  87. r.LOGVALUE = "-" + r.LOGVALUE
  88. }
  89. }
  90. }
  91. // 去除多余的0,最后4个0
  92. if r.LOGVALUE[len(r.LOGVALUE)-4:] == "0000" {
  93. r.LOGVALUE = r.LOGVALUE[:len(r.LOGVALUE)-4]
  94. }
  95. if r.BIZTYPE == 1 {
  96. r.LOGTYPENAME += "计划"
  97. } else if r.BIZTYPE == 2 {
  98. r.LOGTYPENAME += "合同"
  99. }
  100. }
  101. func (r *Ermcp3ReportOPLog) buildSql() string {
  102. var sqlId utils.SQLVal = "SELECT to_char(t.LOGID) LOGID," +
  103. " t.BIZTYPE," +
  104. " t.OPERATELOGTYPE," +
  105. " to_char(t.RELATEDID) RELATEDID," +
  106. " t.LOGVALUE," +
  107. " to_char(t.LOGDATETIME, 'yyyy-mm-dd hh24:mi:ss') LOGDATETIME," +
  108. " t.TRADEDATE," +
  109. " t.APPLYID," +
  110. " t.CONTRACTTYPE," +
  111. " t.USERID," +
  112. " t.wrstandardid," +
  113. " s.contractno relatedno," +
  114. " s.spotgoodsbrandid," +
  115. " g.deliverygoodsid," +
  116. " g.deliverygoodscode," +
  117. " g.deliverygoodsname," +
  118. " g.goodsunitid unitid," +
  119. " gb.dgfactoryitemvalue brandname," +
  120. " s.accountid," +
  121. " w.wrstandardcode," +
  122. " w.wrstandardname" +
  123. " FROM ERMCP_CONTRACTOPERATELOG t" +
  124. " inner join ermcp_spotcontract s" +
  125. " on t.RELATEDID = s.spotcontractid" +
  126. " left join deliverygoods g" +
  127. " on t.deliverygoodsid = g.deliverygoodsid" +
  128. " left join wrstandard w on t.wrstandardid=w.wrstandardid" +
  129. " left join dgfactoryitem gb" +
  130. " on s.spotgoodsbrandid = gb.dgfactoryitemid" +
  131. " WHERE t.biztype = 2"
  132. // 筛选条件
  133. sqlId.And("t.userid", r.USERID)
  134. sqlId.And("t.TRADEDATE", r.TRADEDATE)
  135. sqlId.AndEx("t.deliverygoodsid", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  136. sqlId.AndEx("t.wrstandardid", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  137. sqlId.AndEx("s.spotgoodsbrandid", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  138. if r.LogTypeFilter != "" {
  139. sqlId.Join(fmt.Sprintf(" and t.OPERATELOGTYPE in(%v)", r.LogTypeFilter))
  140. }
  141. return sqlId.String()
  142. }
  143. // GetDataEx 获取日志记录
  144. func (r *Ermcp3ReportOPLog) GetDataEx() (interface{}, error) {
  145. sData := make([]Ermcp3ReportOPLog, 0)
  146. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  147. for i := range sData {
  148. sData[i].Calc()
  149. }
  150. return sData, err
  151. }
  152. // Ermcp3ReportAreaSpotPL 现货损益日/月表
  153. type Ermcp3ReportAreaSpotPL struct {
  154. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构
  155. WRSTANDARDID int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 品类ID
  156. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'"` // 现货品牌ID
  157. ORIBUYQTY float64 `json:"oribuyqty" xorm:"'ORIBUYQTY'"` // 期初采购总量
  158. ORIBUYAMOUNT float64 `json:"oribuyamount" xorm:"'ORIBUYAMOUNT'"` // 期初采购总额
  159. ORISELLQTY float64 `json:"orisellqty" xorm:"'ORISELLQTY'"` // 期初销售总量
  160. ORISELLAMOUNT float64 `json:"orisellamount" xorm:"'ORISELLAMOUNT'"` // 期初销售总额
  161. ORIQTY float64 `json:"oriqty" xorm:"'ORIQTY'"` // 期初量
  162. ORIAVERAGEPRICE float64 `json:"oriaverageprice" xorm:"'ORIAVERAGEPRICE'"` // 期初均价
  163. ORIAMOUNT float64 `json:"oriamount" xorm:"'ORIAMOUNT'"` // 期初额
  164. TODAYBUYQTY float64 `json:"todaybuyqty" xorm:"'TODAYBUYQTY'"` // 今日采购量(采购增量)
  165. TODAYBUYAMOUNT float64 `json:"todaybuyamount" xorm:"'TODAYBUYAMOUNT'"` // 今日采购额
  166. TODAYBUYAVERAGEPRICE float64 `json:"todaybuyaverageprice" xorm:"'TODAYBUYAVERAGEPRICE'"` // 今日采购均价(采购均价)
  167. TODAYSELLQTY float64 `json:"todaysellqty" xorm:"'TODAYSELLQTY'"` // 今日销售量(销售增量)
  168. TODAYSELLAMOUNT float64 `json:"todaysellamount" xorm:"'TODAYSELLAMOUNT'"` // 今日销售额
  169. TODAYSELLAVERAGEPRICE float64 `json:"todaysellaverageprice" xorm:"'TODAYSELLAVERAGEPRICE'"` // 今日销售均价(销售均价)
  170. CURBUYQTY float64 `json:"curbuyqty" xorm:"'CURBUYQTY'"` // 期末采购总量
  171. CURBUYAMOUNT float64 `json:"curbuyamount" xorm:"'CURBUYAMOUNT'"` // 期末采购总额(采购额)
  172. CURSELLQTY float64 `json:"cursellqty" xorm:"'CURSELLQTY'"` // 期末销售总量
  173. CURSELLAMOUNT float64 `json:"cursellamount" xorm:"'CURSELLAMOUNT'"` // 期末销售总额(销售额)
  174. CURQTY float64 `json:"curqty" xorm:"'CURQTY'"` // 期末量
  175. CURAVERAGEPRICE float64 `json:"curaverageprice" xorm:"'CURAVERAGEPRICE'"` // 期末均价
  176. CURAMOUNT float64 `json:"curamount" xorm:"'CURAMOUNT'"` // 期末额
  177. CURSPOTPRICE float64 `json:"curspotprice" xorm:"'CURSPOTPRICE'"` // 参考市价
  178. CURMARKETVALUE float64 `json:"curmarketvalue" xorm:"'CURMARKETVALUE'"` // 参考市值
  179. ACTUALPL float64 `json:"actualpl" xorm:"'ACTUALPL'"` // 实际损益
  180. FLOATPL float64 `json:"floatpl" xorm:"'FLOATPL'"` // 浮动损益
  181. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  182. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  183. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  184. WRUNITID int32 `json:"unitid" xorm:"'UNITID'"` // 品类单位id
  185. BRANDNAME string `json:"brandname" xorm:"'BRANDNAME'"` // 品牌名称
  186. MODELNAME string `json:"modelname" xorm:"'MODELNAME'"` // 品类名称
  187. GBUNITID int32 `json:"gbunitid" xorm:"'GBUNITID'"` // 现货单位id
  188. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货品种id
  189. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  190. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  191. BIZTYPE int32 `json:"biztype" xorm:"'BIZTYPE'"` // 业务类型 1-套保 2-套利
  192. CURRENCYID int32 `json:"currencyid" xorm:"'CURRENCYID'"` // 币种id
  193. CURRENCYNAME string `json:"currencyname"` // 币种名称
  194. ENUMDICNAME string `json:"enumdicname"` // 现货商品单位名称
  195. WRENUMDICNAME string `json:"gbenumdicname"` // 品类单位名称
  196. ReportType int32 `json:"-"` // 报表类型 1-日报表 2-月报表
  197. ReportDate string `json:"-"` // 格式 日报表(YYYYMMDD) 月报表(YYYYMM)
  198. }
  199. func (r *Ermcp3ReportAreaSpotPL) calc() {
  200. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.GBUNITID)
  201. r.WRENUMDICNAME = mtpcache.GetEnumDicitemName(r.WRUNITID)
  202. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  203. }
  204. func (r *Ermcp3ReportAreaSpotPL) buildSql() string {
  205. var sqlId utils.SQLVal = "SELECT t.AREAUSERID," +
  206. " t.WRSTANDARDID," +
  207. " t.SPOTGOODSBRANDID," +
  208. " t.ORIBUYQTY," +
  209. " t.ORIBUYAMOUNT," +
  210. " t.ORISELLQTY," +
  211. " t.ORISELLAMOUNT," +
  212. " t.ORIQTY," +
  213. " t.ORIAVERAGEPRICE," +
  214. " t.ORIAMOUNT," +
  215. " t.TODAYBUYQTY," +
  216. " t.TODAYBUYAMOUNT," +
  217. " t.TODAYBUYAVERAGEPRICE," +
  218. " t.TODAYSELLQTY," +
  219. " t.TODAYSELLAMOUNT," +
  220. " t.TODAYSELLAVERAGEPRICE," +
  221. " t.CURBUYQTY," +
  222. " t.CURBUYAMOUNT," +
  223. " t.CURSELLQTY," +
  224. " t.CURSELLAMOUNT," +
  225. " t.CURQTY," +
  226. " t.CURAVERAGEPRICE," +
  227. " t.CURAMOUNT," +
  228. " t.CURSPOTPRICE," +
  229. " t.CURMARKETVALUE," +
  230. " t.ACTUALPL," +
  231. " t.FLOATPL," +
  232. " t.currencyid," +
  233. " t.biztype," +
  234. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  235. " w.wrstandardcode," +
  236. " w.wrstandardname," +
  237. " w.unitid WRUNITID," +
  238. " gb.dgfactoryitemvalue brandname," +
  239. " g.deliverygoodsid," +
  240. " g.deliverygoodscode," +
  241. " g.deliverygoodsname," +
  242. " g.goodsunitid GBUNITID" +
  243. " FROM %v t" +
  244. " left join deliverygoods g" +
  245. " on t.deliverygoodsid = g.deliverygoodsid" +
  246. " left join wrstandard w" +
  247. " on t.wrstandardid = w.wrstandardid" +
  248. " left join dgfactoryitem gb" +
  249. " on t.spotgoodsbrandid = gb.dgfactoryitemid" +
  250. " WHERE 1 = 1"
  251. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  252. if r.ReportType == 1 {
  253. // 日报表
  254. sqlId.FormatParam("RECKON_ERMCP_AREASPOTPL")
  255. sqlId.And("t.reckondate", r.ReportDate)
  256. } else {
  257. // 月报表
  258. sqlId.FormatParam("REPORT_ERMCP_AREASPOTPL")
  259. sqlId.And("t.cycletype", 1)
  260. sqlId.And("t.cycletime", r.ReportDate)
  261. }
  262. if r.WRSTANDARDID > 0 {
  263. sqlId.And("t.wrstandardid", r.WRSTANDARDID)
  264. }
  265. if r.SPOTGOODSBRANDID > 0 {
  266. sqlId.And("t.spotgoodsbrandid", r.SPOTGOODSBRANDID)
  267. }
  268. if r.DELIVERYGOODSID > 0 {
  269. sqlId.And("t.deliverygoodsid", r.DELIVERYGOODSID)
  270. }
  271. return sqlId.String()
  272. }
  273. // GetDataEx 获取现货损益日(月)报表
  274. func (r *Ermcp3ReportAreaSpotPL) GetDataEx() (interface{}, error) {
  275. sData := make([]Ermcp3ReportAreaSpotPL, 0)
  276. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  277. for i := range sData {
  278. sData[i].calc()
  279. }
  280. return sData, err
  281. }
  282. // Ermcp3ReckonAreaSpotSub 现货日报表
  283. type Ermcp3ReckonAreaSpotSub struct {
  284. RECKONDATE string `json:"reckondate" xorm:"'RECKONDATE'" form:"reckondate" binding:"required"` // 日照时期(yyyyMMdd)
  285. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'" form:"userid" binding:"required"` // 账户所属机构
  286. ACCOUNTID int64 `json:"accountid" xorm:"'ACCOUNTID'" form:"accountid"` // 期货账户ID
  287. WRFACTORTYPEID int64 `json:"wrfactortypeid" xorm:"'WRFACTORTYPEID'"` // 仓单要素类型ID(212+Unix秒时间戳(10位)+xxxxxx)
  288. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'" form:"deliverygoodsid"` // 现货品种ID
  289. WRSTANDARDID int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'" form:"wrstandardid"` // 现货品类ID
  290. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'" form:"spotgoodsbrandid"` // 现货品牌ID
  291. ORIBUYPRICEDQTY float64 `json:"oribuypricedqty" xorm:"'ORIBUYPRICEDQTY'"` // 期初采购合同已定价数量
  292. ORISELLPRICEDQTY float64 `json:"orisellpricedqty" xorm:"'ORISELLPRICEDQTY'"` // 期初销售合同已定价数量
  293. BUYPRICEDQTY float64 `json:"buypricedqty" xorm:"'BUYPRICEDQTY'"` // 采购合同已定价数量
  294. SELLPRICEDQTY float64 `json:"sellpricedqty" xorm:"'SELLPRICEDQTY'"` // 销售合同已定价数量
  295. TOTALSPOTQTY float64 `json:"totalspotqty" xorm:"'TOTALSPOTQTY'"` // 现货头寸总量 = 采购合同已定价数量 - 销售合同已定价数量
  296. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  297. TODAYBUYRECKONQTY float64 `json:"todaybuyreckonqty" xorm:"'TODAYBUYRECKONQTY'"` // 今日采购合同已确定数量
  298. TODAYSELLRECKONQTY float64 `json:"todaysellreckonqty" xorm:"'TODAYSELLRECKONQTY'"` // 今日销售合同已确定数量
  299. ORIBUYPRICEDAMOUNT float64 `json:"oribuypricedamount" xorm:"'ORIBUYPRICEDAMOUNT'"` // 期初采购合同已定价金额
  300. ORISELLPRICEDAMOUNT float64 `json:"orisellpricedamount" xorm:"'ORISELLPRICEDAMOUNT'"` // 期初销售合同已定价金额
  301. BUYPRICEDAMOUNT float64 `json:"buypricedamount" xorm:"'BUYPRICEDAMOUNT'"` // 采购合同已定价金额
  302. SELLPRICEDAMOUNT float64 `json:"sellpricedamount" xorm:"'SELLPRICEDAMOUNT'"` // 销售合同已定价金额
  303. ORIBUYRECKONQTY float64 `json:"oribuyreckonqty" xorm:"'ORIBUYRECKONQTY'"` // 期初采购合同交收量
  304. ORISELLRECKONQTY float64 `json:"orisellreckonqty" xorm:"'ORISELLRECKONQTY'"` // 期初销售合同交收量
  305. ORIBUYCONTRACTINQTY float64 `json:"oribuycontractinqty" xorm:"'ORIBUYCONTRACTINQTY'"` // 期初采购合同入库量
  306. ORISELLCONTRACTOUTQTY float64 `json:"orisellcontractoutqty" xorm:"'ORISELLCONTRACTOUTQTY'"` // 期初销售合同出库量
  307. ORIPRODUCEINQTY float64 `json:"oriproduceinqty" xorm:"'ORIPRODUCEINQTY'"` // 期初生产入库量
  308. ORIPRODUCEOUTQTY float64 `json:"oriproduceoutqty" xorm:"'ORIPRODUCEOUTQTY'"` // 期初生产出库量
  309. BUYRECKONQTY float64 `json:"buyreckonqty" xorm:"'BUYRECKONQTY'"` // 采购合同交收量
  310. SELLRECKONQTY float64 `json:"sellreckonqty" xorm:"'SELLRECKONQTY'"` // 销售合同交收量
  311. BUYCONTRACTINQTY float64 `json:"buycontractinqty" xorm:"'BUYCONTRACTINQTY'"` // 采购合同入库量
  312. SELLCONTRACTOUTQTY float64 `json:"sellcontractoutqty" xorm:"'SELLCONTRACTOUTQTY'"` // 销售合同出库量
  313. PRODUCEINQTY float64 `json:"produceinqty" xorm:"'PRODUCEINQTY'"` // 生产入库量
  314. PRODUCEOUTQTY float64 `json:"produceoutqty" xorm:"'PRODUCEOUTQTY'"` // 生产出库量
  315. ENUMDICNAME string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 现货商品单位名称
  316. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'wrstandardname'"` // 品类名称
  317. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'wrstandardcode'"` // 品类代码
  318. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'deliverygoodscode'"` // 现货商品代码
  319. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'deliverygoodsname'"` // 现货商品名称
  320. GOODSUNITID int32 `json:"goodsunitid" xorm:"'goodsunitid'"` // 现货商品单位id
  321. BRANDNAME string `json:"brandname" xorm:"'brandname'"` // 品牌名称
  322. ACCOUNTNAME string `json:"accountname" xorm:"'accountname'"` // 所属机构名称
  323. BIZTYPE int32 `json:"biztype" xorm:"'BIZTYPE'"` // 业务类型 1-套保 2-套利
  324. CURRENCYID int32 `json:"currencyid" xorm:"'CURRENCYID'"` // 币种id
  325. CURRENCYNAME string `json:"currencyname"` // 币种名称
  326. TOTALBUYPRICEDQTY float64 `json:"totalbuypricedqty"` // 采购定价量 = 期末 - 期初
  327. TOTALSELLPRICEDQTY float64 `json:"totalsellpricedqty"` // 销售定价量 = 期末 - 期初
  328. BeginDate string `json:"-"` // 开始日期
  329. EndDate string `json:"-"` // 结束日期
  330. }
  331. func (r *Ermcp3ReckonAreaSpotSub) calc() {
  332. r.TOTALBUYPRICEDQTY = r.BUYPRICEDQTY - r.ORIBUYPRICEDQTY
  333. r.TOTALSELLPRICEDQTY = r.SELLPRICEDQTY - r.ORISELLPRICEDQTY
  334. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  335. }
  336. func (r *Ermcp3ReckonAreaSpotSub) buildSql() string {
  337. var sqlId utils.SQLVal = "SELECT t.ORIBUYRECKONQTY," +
  338. " t.ORISELLRECKONQTY," +
  339. " t.ORIBUYCONTRACTINQTY," +
  340. " t.ORISELLCONTRACTOUTQTY," +
  341. " t.ORIPRODUCEINQTY," +
  342. " t.ORIPRODUCEOUTQTY," +
  343. " t.BUYRECKONQTY," +
  344. " t.SELLRECKONQTY," +
  345. " t.BUYCONTRACTINQTY," +
  346. " t.SELLCONTRACTOUTQTY," +
  347. " t.PRODUCEINQTY," +
  348. " t.PRODUCEOUTQTY," +
  349. " t.Reckondate," +
  350. " t.AREAUSERID," +
  351. " t.ACCOUNTID," +
  352. " t.WRFACTORTYPEID," +
  353. " t.DELIVERYGOODSID," +
  354. " t.WRSTANDARDID," +
  355. " t.SPOTGOODSBRANDID," +
  356. " t.ORIBUYPRICEDQTY," +
  357. " t.ORISELLPRICEDQTY," +
  358. " t.BUYPRICEDQTY," +
  359. " t.SELLPRICEDQTY," +
  360. " t.TOTALSPOTQTY," +
  361. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  362. " t.TODAYBUYRECKONQTY," +
  363. " t.TODAYSELLRECKONQTY," +
  364. " t.ORIBUYPRICEDAMOUNT," +
  365. " t.ORISELLPRICEDAMOUNT," +
  366. " t.BUYPRICEDAMOUNT," +
  367. " t.SELLPRICEDAMOUNT," +
  368. " t.currencyid," +
  369. " t.biztype," +
  370. " w.wrstandardname," +
  371. " w.wrstandardcode," +
  372. " g.deliverygoodscode," +
  373. " g.deliverygoodsname," +
  374. " g.goodsunitid," +
  375. " d.dgfactoryitemvalue brandname," +
  376. " u.accountname," +
  377. " e.enumdicname" +
  378. " FROM RECKON_ERMCP_AREASPOTSUB t" +
  379. " LEFT JOIN WRSTANDARD w" +
  380. " on t.wrstandardid = w.wrstandardid" +
  381. " LEFT JOIN DELIVERYGOODS g" +
  382. " on t.deliverygoodsid = g.deliverygoodsid" +
  383. " LEFT JOIN DGFACTORYITEM d" +
  384. " on t.spotgoodsbrandid = d.dgfactoryitemid" +
  385. " LEFT JOIN USERACCOUNT u" +
  386. " on t.areauserid = u.userid" +
  387. " LEFT JOIN ENUMDICITEM e" +
  388. " on g.goodsunitid = e.enumitemname" +
  389. " and e.enumdiccode = 'goodsunit'" +
  390. " and e.enumitemstatus = 1" +
  391. " WHERE 1 = 1"
  392. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  393. sqlId.AndEx("t.ACCOUNTID", r.ACCOUNTID, r.ACCOUNTID > 0)
  394. sqlId.AndEx("t.deliverygoodsid", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  395. sqlId.AndEx("t.WRSTANDARDID", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  396. sqlId.AndEx("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  397. if r.RECKONDATE != "" {
  398. sqlId.And("t.RECKONDATE", r.RECKONDATE)
  399. } else if r.BeginDate != "" && r.BeginDate == r.EndDate {
  400. sqlId.And("t.RECKONDATE", r.BeginDate)
  401. } else {
  402. if r.BeginDate != "" {
  403. sqlId.BiggerOrEq("t.RECKONDATE", r.BeginDate)
  404. }
  405. if r.EndDate != "" {
  406. sqlId.LessOrEq("t.RECKONDATE", r.EndDate)
  407. }
  408. }
  409. sqlId.Join(" order by t.RECKONDATE")
  410. return sqlId.String()
  411. }
  412. // GetDataEx 获取现货日报表
  413. func (r *Ermcp3ReckonAreaSpotSub) GetDataEx() (interface{}, error) {
  414. sData := make([]Ermcp3ReckonAreaSpotSub, 0)
  415. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  416. for i := range sData {
  417. sData[i].calc()
  418. }
  419. return sData, err
  420. }
  421. // Ermcp3ReportAreaSpotSub 现货分类月报表
  422. type Ermcp3ReportAreaSpotSub struct {
  423. ORIBUYRECKONQTY float64 `json:"oribuyreckonqty" xorm:"'ORIBUYRECKONQTY'"` // 期初采购合同交收量【期初】
  424. ORISELLRECKONQTY float64 `json:"orisellreckonqty" xorm:"'ORISELLRECKONQTY'"` // 期初销售合同交收量【期初】
  425. ORIBUYCONTRACTINQTY float64 `json:"oribuycontractinqty" xorm:"'ORIBUYCONTRACTINQTY'"` // 期初采购合同入库量【期初】
  426. ORISELLCONTRACTOUTQTY float64 `json:"orisellcontractoutqty" xorm:"'ORISELLCONTRACTOUTQTY'"` // 期初销售合同出库量【期初】
  427. ORIPRODUCEINQTY float64 `json:"oriproduceinqty" xorm:"'ORIPRODUCEINQTY'"` // 期初生产入库量【期初】
  428. ORIPRODUCEOUTQTY float64 `json:"oriproduceoutqty" xorm:"'ORIPRODUCEOUTQTY'"` // 期初生产出库量【期初】
  429. BUYRECKONQTY float64 `json:"buyreckonqty" xorm:"'BUYRECKONQTY'"` // 采购合同交收量【期末】
  430. SELLRECKONQTY float64 `json:"sellreckonqty" xorm:"'SELLRECKONQTY'"` // 销售合同交收量【期末】
  431. BUYCONTRACTINQTY float64 `json:"buycontractinqty" xorm:"'BUYCONTRACTINQTY'"` // 采购合同入库量【期末】
  432. SELLCONTRACTOUTQTY float64 `json:"sellcontractoutqty" xorm:"'SELLCONTRACTOUTQTY'"` // 销售合同出库量【期末】
  433. PRODUCEINQTY float64 `json:"produceinqty" xorm:"'PRODUCEINQTY'"` // 生产入库量【期末】
  434. PRODUCEOUTQTY float64 `json:"produceoutqty" xorm:"'PRODUCEOUTQTY'"` // 生产出库量【期末】
  435. CYCLETIME string `json:"cycletime" xorm:"'CYCLETIME'" form:"cycletime"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  436. CYCLETYPE int32 `json:"cycletype" xorm:"'CYCLETYPE'" form:"cycletype"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  437. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'" form:"userid" binding:"required"` // 账户所属机构
  438. ACCOUNTID int64 `json:"accountid" xorm:"'ACCOUNTID'" form:"accountid"` // 期货账户ID
  439. WRFACTORTYPEID int64 `json:"wrfactortypeid" xorm:"'WRFACTORTYPEID'"` // 仓单要素类型ID(212+Unix秒时间戳(10位)+xxxxxx)
  440. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'" form:"deliverygoodsid"` // 现货品种ID
  441. WRSTANDARDID int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'" form:"wrstandardid"` // 品类ID
  442. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'" form:"spotgoodsbrandid"` // 现货品牌ID
  443. ORIBUYPRICEDQTY float64 `json:"oribuypricedqty" xorm:"'ORIBUYPRICEDQTY'"` // 期初采购合同已定价数量【期初】
  444. ORISELLPRICEDQTY float64 `json:"orisellpricedqty" xorm:"'ORISELLPRICEDQTY'"` // 期初销售合同已定价数量【期初】
  445. BUYPRICEDQTY float64 `json:"buypricedqty" xorm:"'BUYPRICEDQTY'"` // 采购合同已定价数量【期末】
  446. SELLPRICEDQTY float64 `json:"sellpricedqty" xorm:"'SELLPRICEDQTY'"` // 销售合同已定价数量【期末】
  447. TOTALSPOTQTY float64 `json:"totalspotqty" xorm:"'TOTALSPOTQTY'"` // 现货头寸总量 = 采购合同已定价数量 - 销售合同已定价数量【期末】
  448. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  449. TODAYBUYRECKONQTY float64 `json:"todaybuyreckonqty" xorm:"'TODAYBUYRECKONQTY'"` // 今日采购合同已确定数量【汇总】
  450. TODAYSELLRECKONQTY float64 `json:"todaysellreckonqty" xorm:"'TODAYSELLRECKONQTY'"` // 今日销售合同已确定数量【汇总】
  451. ORIBUYPRICEDAMOUNT float64 `json:"oribuypricedamount" xorm:"'ORIBUYPRICEDAMOUNT'"` // 期初采购合同已定价金额【期初】
  452. ORISELLPRICEDAMOUNT float64 `json:"orisellpricedamount" xorm:"'ORISELLPRICEDAMOUNT'"` // 期初销售合同已定价金额【期初】
  453. BUYPRICEDAMOUNT float64 `json:"buypricedamount" xorm:"'BUYPRICEDAMOUNT'"` // 采购合同已定价金额【期末】
  454. SELLPRICEDAMOUNT float64 `json:"sellpricedamount" xorm:"'SELLPRICEDAMOUNT'"` // 销售合同已定价金额【期末】
  455. ENUMDICNAME string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 现货商品单位名称
  456. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'wrstandardname'"` // 品类名称
  457. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'wrstandardcode'"` // 品类代码
  458. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'deliverygoodscode'"` // 现货商品代码
  459. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'deliverygoodsname'"` // 现货商品名称
  460. GOODSUNITID int32 `json:"goodsunitid" xorm:"'goodsunitid'"` // 现货商品单位id
  461. BRANDNAME string `json:"brandname" xorm:"'brandname'"` // 品牌名称
  462. ACCOUNTNAME string `json:"accountname" xorm:"'accountname'"` // 所属机构名称
  463. BIZTYPE int32 `json:"biztype" xorm:"'BIZTYPE'"` // 业务类型 1-套保 2-套利
  464. CURRENCYID int32 `json:"currencyid" xorm:"'CURRENCYID'"` // 币种id
  465. CURRENCYNAME string `json:"currencyname"` // 币种名称
  466. TOTALBUYPRICEDQTY float64 `json:"totalbuypricedqty"` // 采购定价量 = 期末 - 期初
  467. TOTALSELLPRICEDQTY float64 `json:"totalsellpricedqty"` // 销售定价量 = 期末 - 期初
  468. }
  469. func (r *Ermcp3ReportAreaSpotSub) calc() {
  470. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  471. r.TOTALBUYPRICEDQTY = r.BUYPRICEDQTY - r.ORIBUYPRICEDQTY
  472. r.TOTALSELLPRICEDQTY = r.SELLPRICEDQTY - r.ORISELLPRICEDQTY
  473. }
  474. func (r *Ermcp3ReportAreaSpotSub) buildSql() string {
  475. var sqlId utils.SQLVal = "SELECT t.ORIBUYRECKONQTY," +
  476. " t.ORISELLRECKONQTY," +
  477. " t.ORIBUYCONTRACTINQTY," +
  478. " t.ORISELLCONTRACTOUTQTY," +
  479. " t.ORIPRODUCEINQTY," +
  480. " t.ORIPRODUCEOUTQTY," +
  481. " t.BUYRECKONQTY," +
  482. " t.SELLRECKONQTY," +
  483. " t.BUYCONTRACTINQTY," +
  484. " t.SELLCONTRACTOUTQTY," +
  485. " t.PRODUCEINQTY," +
  486. " t.PRODUCEOUTQTY," +
  487. " t.CYCLETIME," +
  488. " t.CYCLETYPE," +
  489. " t.AREAUSERID," +
  490. " t.ACCOUNTID," +
  491. " t.WRFACTORTYPEID," +
  492. " t.DELIVERYGOODSID," +
  493. " t.WRSTANDARDID," +
  494. " t.SPOTGOODSBRANDID," +
  495. " t.ORIBUYPRICEDQTY," +
  496. " t.ORISELLPRICEDQTY," +
  497. " t.BUYPRICEDQTY," +
  498. " t.SELLPRICEDQTY," +
  499. " t.TOTALSPOTQTY," +
  500. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  501. " t.TODAYBUYRECKONQTY," +
  502. " t.TODAYSELLRECKONQTY," +
  503. " t.ORIBUYPRICEDAMOUNT," +
  504. " t.ORISELLPRICEDAMOUNT," +
  505. " t.BUYPRICEDAMOUNT," +
  506. " t.SELLPRICEDAMOUNT," +
  507. " t.currencyid," +
  508. " t.biztype," +
  509. " w.wrstandardname," +
  510. " w.wrstandardcode," +
  511. " g.deliverygoodscode," +
  512. " g.deliverygoodsname," +
  513. " g.goodsunitid," +
  514. " d.dgfactoryitemvalue brandname," +
  515. " u.accountname," +
  516. " e.enumdicname" +
  517. " FROM REPORT_ERMCP_AREASPOTSUB t" +
  518. " LEFT JOIN WRSTANDARD w on t.wrstandardid=w.wrstandardid" +
  519. " LEFT JOIN DELIVERYGOODS g on t.deliverygoodsid=g.deliverygoodsid" +
  520. " LEFT JOIN DGFACTORYITEM d on t.spotgoodsbrandid=d.dgfactoryitemid" +
  521. " LEFT JOIN USERACCOUNT u on t.areauserid=u.userid" +
  522. " LEFT JOIN ENUMDICITEM e on g.goodsunitid=e.enumitemname and e.enumdiccode='goodsunit' and e.enumitemstatus=1" +
  523. " WHERE 1 = 1"
  524. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  525. sqlId.And("t.cycletype", r.CYCLETYPE)
  526. sqlId.And("t.cycletime", r.CYCLETIME)
  527. sqlId.AndEx("t.ACCOUNTID", r.ACCOUNTID, r.ACCOUNTID > 0)
  528. sqlId.AndEx("t.deliverygoodsid", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  529. sqlId.AndEx("t.WRSTANDARDID", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  530. sqlId.AndEx("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  531. return sqlId.String()
  532. }
  533. // GetDataEx 获取现货分类报表
  534. func (r *Ermcp3ReportAreaSpotSub) GetDataEx() (interface{}, error) {
  535. sData := make([]Ermcp3ReportAreaSpotSub, 0)
  536. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  537. for i := range sData {
  538. sData[i].calc()
  539. }
  540. return sData, err
  541. }
  542. // Ermcp3ReckonExpourse 敞口日报表
  543. type Ermcp3ReckonExpourse struct {
  544. ORITOTALSPOTQTY float64 `json:"oritotalspotqty" xorm:"'ORITOTALSPOTQTY'"` // 期初现货头寸总量
  545. ORITOTALFUTUREQTY float64 `json:"oritotalfutureqty" xorm:"'ORITOTALFUTUREQTY'"` // 期初期货头寸总量
  546. ORITOTALEXPOSURE float64 `json:"oritotalexposure" xorm:"'ORITOTALEXPOSURE'"` // 期初实时总敞口
  547. ORINEEDHEDGEEXPOSOURE float64 `json:"orineedhedgeexposoure" xorm:"'ORINEEDHEDGEEXPOSOURE'"` // 期初应套保敞口
  548. ORIHEDGEQTY float64 `json:"orihedgeqty" xorm:"'ORIHEDGEQTY'"` // 期初套保量
  549. ORIARBITRAGEQTY float64 `json:"oriarbitrageqty" xorm:"'ORIARBITRAGEQTY'"` // 期初套利量
  550. ORINEEDHEDGEQTY float64 `json:"orineedhedgeqty" xorm:"'ORINEEDHEDGEQTY'"` // 期初应套保量
  551. ORINEEDARBITRAGEQTY float64 `json:"orineedarbitrageqty" xorm:"'ORINEEDARBITRAGEQTY'"` // 期初应套利量
  552. ORITOTALNEEDHEDGEQTY float64 `json:"oritotalneedhedgeqty" xorm:"'ORITOTALNEEDHEDGEQTY'"` // 期初应套保总量
  553. RECKONDATE string `json:"reckondate" xorm:"'RECKONDATE'"` // 日照时期(yyyyMMdd)
  554. MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"'MIDDLEGOODSID'"` // 套保品种ID
  555. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构\交易用户ID
  556. ACCOUNTID int64 `json:"accountid" xorm:"'ACCOUNTID'"` // 期货账户ID (作废, 默认为0)
  557. ORIBUYPLANQTY float64 `json:"oribuyplanqty" xorm:"'ORIBUYPLANQTY'"` // 期初采购计划数量
  558. ORIBUYPRICEDQTY float64 `json:"oribuypricedqty" xorm:"'ORIBUYPRICEDQTY'"` // 期初采购合同已定价数量
  559. ORISELLPLANQTY float64 `json:"orisellplanqty" xorm:"'ORISELLPLANQTY'"` // 期初销售计划数量
  560. ORISELLPRICEDQTY float64 `json:"orisellpricedqty" xorm:"'ORISELLPRICEDQTY'"` // 期初销售合同已定价数量
  561. ORIBUYFUTUREQTY float64 `json:"oribuyfutureqty" xorm:"'ORIBUYFUTUREQTY'"` // 期初买入期货数量
  562. ORISELLFUTUREQTY float64 `json:"orisellfutureqty" xorm:"'ORISELLFUTUREQTY'"` // 期初卖出期货数量
  563. BUYPLANQTY float64 `json:"buyplanqty" xorm:"'BUYPLANQTY'"` // 采购计划数量
  564. BUYPRICEDQTY float64 `json:"buypricedqty" xorm:"'BUYPRICEDQTY'"` // 采购合同已定价数量
  565. SELLPLANQTY float64 `json:"sellplanqty" xorm:"'SELLPLANQTY'"` // 销售计划数量
  566. SELLPRICEDQTY float64 `json:"sellpricedqty" xorm:"'SELLPRICEDQTY'"` // 销售合同已定价数量
  567. BUYFUTUREQTY float64 `json:"buyfutureqty" xorm:"'BUYFUTUREQTY'"` // 买入期货数量
  568. SELLFUTUREQTY float64 `json:"sellfutureqty" xorm:"'SELLFUTUREQTY'"` // 卖出期货数量
  569. TOTALSPOTQTY float64 `json:"totalspotqty" xorm:"'TOTALSPOTQTY'"` // 现货头寸总量
  570. TOTALFUTUREQTY float64 `json:"totalfutureqty" xorm:"'TOTALFUTUREQTY'"` // 期货头寸总量(期货总量)
  571. TOTALEXPOSURE float64 `json:"totalexposure" xorm:"'TOTALEXPOSURE'"` // 实时总敞口(总敞口)
  572. TOTALHEDGERATIO float64 `json:"totalhedgeratio" xorm:"'TOTALHEDGERATIO'"` // 敞口比例
  573. TOTALNEEDHEDGEQTY float64 `json:"totalneedhedgeqty" xorm:"'TOTALNEEDHEDGEQTY'"` // 应套保总量(现货应套保总量)
  574. NEEDHEDGEEXPOSOURE float64 `json:"needhedgeexposoure" xorm:"'NEEDHEDGEEXPOSOURE'"` // 应套保敞口(套保敞口)
  575. NEEDHEDGERATIO float64 `json:"needhedgeratio" xorm:"'NEEDHEDGERATIO'"` // 应套保敞口比例
  576. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  577. HEDGEQTY float64 `json:"hedgeqty" xorm:"'HEDGEQTY'"` // 套保量
  578. ARBITRAGEQTY float64 `json:"arbitrageqty" xorm:"'ARBITRAGEQTY'"` // 套利量
  579. NEEDHEDGEQTY float64 `json:"needhedgeqty" xorm:"'NEEDHEDGEQTY'"` // 应套保量
  580. NEEDARBITRAGEQTY float64 `json:"needarbitrageqty" xorm:"'NEEDARBITRAGEQTY'"` // 应套利量
  581. MIDDLEGOODSNAME string `json:"middlegoodsnam" xorm:"'MIDDLEGOODSNAME'"` // 套保商品名称
  582. MIDDLEGOODSCODE string `json:"middlgoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保商品代码
  583. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 单位id
  584. MGNEEDHEDGERATIO float64 `json:"mgneedhedgeratio" xorm:"'MGNEEDHEDGERATIO'"` // 套保比例(套保品的)
  585. NEEDARBITRAGERATIO float64 `json:"needarbitrageratio" xorm:"'NEEDARBITRAGERATIO'"` // 套利比例(套保品的)
  586. ENUMDICNAME string `json:"enumdicname"` // 单位名称
  587. ACCOUNTNAME string `json:"accountname"` // 机构名称
  588. DiffSpotQty float64 `json:"diffspotqty"` // 变动量(现货)
  589. DiffMgQtyA float64 `json:"diffmgqtya"` // 套保变动量
  590. DiffMgQtyB float64 `json:"diffmgqtyb"` // 套利变动量
  591. DiffFutuQty float64 `json:"difffutuqty"` // 变动量(期货)
  592. DiffQty float64 `json:"diffqty"` // 变动量(总敞口)
  593. DiffHedgeQty float64 `json:"diffhedgeqty"` // 变动量(现货应套保总量)
  594. DiffExposure float64 `json:"diffexposure"` // 变动量(套保敞口)
  595. }
  596. func (r *Ermcp3ReckonExpourse) calc() {
  597. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  598. r.ACCOUNTNAME = mtpcache.GetUserNameByUserId(r.AREAUSERID)
  599. // 变动量(现货) = 现货头寸总量 - 期初现货头寸总量
  600. r.DiffSpotQty = r.TOTALSPOTQTY - r.ORITOTALSPOTQTY
  601. // 套保变动量 = 套保量 - 期初套保量
  602. r.DiffMgQtyA = r.HEDGEQTY - r.ORIHEDGEQTY
  603. // 套利变动量 = 套利量 - 期初套利量
  604. r.DiffMgQtyB = r.ARBITRAGEQTY - r.ORIARBITRAGEQTY
  605. // 变动量(期货) = (买入 - 买入期初) - (卖出 - 卖出期初)
  606. r.DiffFutuQty = (r.BUYFUTUREQTY - r.ORIBUYFUTUREQTY) - (r.SELLFUTUREQTY - r.ORISELLFUTUREQTY)
  607. // 变动量(敞口) = 实时敞口 - 期初实时敞口
  608. r.DiffQty = r.TOTALEXPOSURE - r.ORITOTALEXPOSURE
  609. // 变动量(现货应套保总量)
  610. r.DiffHedgeQty = r.TOTALNEEDHEDGEQTY - r.ORITOTALNEEDHEDGEQTY
  611. // 变动量(套保敞口)
  612. r.DiffExposure = r.NEEDHEDGEEXPOSOURE - r.ORINEEDHEDGEEXPOSOURE
  613. }
  614. func (r *Ermcp3ReckonExpourse) buildSql() string {
  615. var sqlId utils.SQLVal = "SELECT t.ORITOTALSPOTQTY," +
  616. " t.ORITOTALFUTUREQTY," +
  617. " t.ORITOTALEXPOSURE," +
  618. " t.ORINEEDHEDGEEXPOSOURE," +
  619. " t.ORIHEDGEQTY," +
  620. " t.ORIARBITRAGEQTY," +
  621. " t.ORINEEDHEDGEQTY," +
  622. " t.ORINEEDARBITRAGEQTY," +
  623. " t.ORITOTALNEEDHEDGEQTY," +
  624. " t.RECKONDATE," +
  625. " t.MIDDLEGOODSID," +
  626. " t.AREAUSERID," +
  627. " t.ACCOUNTID," +
  628. " t.ORIBUYPLANQTY," +
  629. " t.ORIBUYPRICEDQTY," +
  630. " t.ORISELLPLANQTY," +
  631. " t.ORISELLPRICEDQTY," +
  632. " t.ORIBUYFUTUREQTY," +
  633. " t.ORISELLFUTUREQTY," +
  634. " t.BUYPLANQTY," +
  635. " t.BUYPRICEDQTY," +
  636. " t.SELLPLANQTY," +
  637. " t.SELLPRICEDQTY," +
  638. " t.BUYFUTUREQTY," +
  639. " t.SELLFUTUREQTY," +
  640. " t.TOTALSPOTQTY," +
  641. " t.TOTALFUTUREQTY," +
  642. " t.TOTALEXPOSURE," +
  643. " t.TOTALHEDGERATIO," +
  644. " t.TOTALNEEDHEDGEQTY," +
  645. " t.NEEDHEDGEEXPOSOURE," +
  646. " t.NEEDHEDGERATIO," +
  647. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  648. " t.HEDGEQTY," +
  649. " t.ARBITRAGEQTY," +
  650. " t.NEEDHEDGEQTY," +
  651. " t.NEEDARBITRAGEQTY," +
  652. " g.middlegoodsname," +
  653. " g.middlegoodscode," +
  654. " g.goodsunitid unitid" +
  655. " FROM RECKON_ERMCP_AREAEXPOSURE t" +
  656. " LEFT JOIN ERMS_MIDDLEGOODS g" +
  657. " on t.middlegoodsid = g.middlegoodsid" +
  658. " WHERE 1 = 1"
  659. sqlId.AndEx("t.AREAUSERID", r.AREAUSERID, r.AREAUSERID > 0)
  660. sqlId.AndEx("t.RECKONDATE", r.RECKONDATE, len(r.RECKONDATE) > 0)
  661. return sqlId.String()
  662. }
  663. // GetDataEx 获取敞口日报表
  664. func (r *Ermcp3ReckonExpourse) GetDataEx() (interface{}, error) {
  665. sData := make([]Ermcp3ReckonExpourse, 0)
  666. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  667. for i := range sData {
  668. sData[i].calc()
  669. }
  670. return sData, err
  671. }
  672. // Ermcp3ReportExpourse 获取敞口周期报表
  673. type Ermcp3ReportExpourse struct {
  674. CYCLETIME string `json:"cycletime" xorm:"'CYCLETIME'"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  675. CYCLETYPE int32 `json:"cycletype" xorm:"'CYCLETYPE'"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  676. ORITOTALSPOTQTY float64 `json:"oritotalspotqty" xorm:"'ORITOTALSPOTQTY'"` // 期初现货头寸总量
  677. ORITOTALFUTUREQTY float64 `json:"oritotalfutureqty" xorm:"'ORITOTALFUTUREQTY'"` // 期初期货头寸总量
  678. ORITOTALEXPOSURE float64 `json:"oritotalexposure" xorm:"'ORITOTALEXPOSURE'"` // 期初实时总敞口
  679. ORINEEDHEDGEEXPOSOURE float64 `json:"orineedhedgeexposoure" xorm:"'ORINEEDHEDGEEXPOSOURE'"` // 期初应套保敞口
  680. ORIHEDGEQTY float64 `json:"orihedgeqty" xorm:"'ORIHEDGEQTY'"` // 期初套保量
  681. ORIARBITRAGEQTY float64 `json:"oriarbitrageqty" xorm:"'ORIARBITRAGEQTY'"` // 期初套利量
  682. ORINEEDHEDGEQTY float64 `json:"orineedhedgeqty" xorm:"'ORINEEDHEDGEQTY'"` // 期初应套保量
  683. ORINEEDARBITRAGEQTY float64 `json:"orineedarbitrageqty" xorm:"'ORINEEDARBITRAGEQTY'"` // 期初应套利量
  684. ORITOTALNEEDHEDGEQTY float64 `json:"oritotalneedhedgeqty" xorm:"'ORITOTALNEEDHEDGEQTY'"` // 期初应套保总量
  685. MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"'MIDDLEGOODSID'"` // 套保品种ID
  686. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构\交易用户ID
  687. ACCOUNTID int64 `json:"accountid" xorm:"'ACCOUNTID'"` // 期货账户ID (作废, 默认为0)
  688. ORIBUYPLANQTY float64 `json:"oribuyplanqty" xorm:"'ORIBUYPLANQTY'"` // 期初采购计划数量
  689. ORIBUYPRICEDQTY float64 `json:"oribuypricedqty" xorm:"'ORIBUYPRICEDQTY'"` // 期初采购合同已定价数量
  690. ORISELLPLANQTY float64 `json:"orisellplanqty" xorm:"'ORISELLPLANQTY'"` // 期初销售计划数量
  691. ORISELLPRICEDQTY float64 `json:"orisellpricedqty" xorm:"'ORISELLPRICEDQTY'"` // 期初销售合同已定价数量
  692. ORIBUYFUTUREQTY float64 `json:"oribuyfutureqty" xorm:"'ORIBUYFUTUREQTY'"` // 期初买入期货数量
  693. ORISELLFUTUREQTY float64 `json:"orisellfutureqty" xorm:"'ORISELLFUTUREQTY'"` // 期初卖出期货数量
  694. BUYPLANQTY float64 `json:"buyplanqty" xorm:"'BUYPLANQTY'"` // 采购计划数量
  695. BUYPRICEDQTY float64 `json:"buypricedqty" xorm:"'BUYPRICEDQTY'"` // 采购合同已定价数量
  696. SELLPLANQTY float64 `json:"sellplanqty" xorm:"'SELLPLANQTY'"` // 销售计划数量
  697. SELLPRICEDQTY float64 `json:"sellpricedqty" xorm:"'SELLPRICEDQTY'"` // 销售合同已定价数量
  698. BUYFUTUREQTY float64 `json:"buyfutureqty" xorm:"'BUYFUTUREQTY'"` // 买入期货数量
  699. SELLFUTUREQTY float64 `json:"sellfutureqty" xorm:"'SELLFUTUREQTY'"` // 卖出期货数量
  700. TOTALSPOTQTY float64 `json:"totalspotqty" xorm:"'TOTALSPOTQTY'"` // 现货头寸总量
  701. TOTALFUTUREQTY float64 `json:"totalfutureqty" xorm:"'TOTALFUTUREQTY'"` // 期货头寸总量(期货总量)
  702. TOTALEXPOSURE float64 `json:"totalexposure" xorm:"'TOTALEXPOSURE'"` // 实时总敞口(总敞口)
  703. TOTALHEDGERATIO float64 `json:"totalhedgeratio" xorm:"'TOTALHEDGERATIO'"` // 敞口比例
  704. TOTALNEEDHEDGEQTY float64 `json:"totalneedhedgeqty" xorm:"'TOTALNEEDHEDGEQTY'"` // 应套保总量(现货应套保总量)
  705. NEEDHEDGEEXPOSOURE float64 `json:"needhedgeexposoure" xorm:"'NEEDHEDGEEXPOSOURE'"` // 应套保敞口(套保敞口)
  706. NEEDHEDGERATIO float64 `json:"needhedgeratio" xorm:"'NEEDHEDGERATIO'"` // 应套保敞口比例
  707. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  708. HEDGEQTY float64 `json:"hedgeqty" xorm:"'HEDGEQTY'"` // 套保量
  709. ARBITRAGEQTY float64 `json:"arbitrageqty" xorm:"'ARBITRAGEQTY'"` // 套利量
  710. NEEDHEDGEQTY float64 `json:"needhedgeqty" xorm:"'NEEDHEDGEQTY'"` // 应套保量
  711. NEEDARBITRAGEQTY float64 `json:"needarbitrageqty" xorm:"'NEEDARBITRAGEQTY'"` // 应套利量
  712. MIDDLEGOODSNAME string `json:"middlegoodsnam" xorm:"'MIDDLEGOODSNAME'"` // 套保商品名称
  713. MIDDLEGOODSCODE string `json:"middlgoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保商品代码
  714. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 单位id
  715. MGNEEDHEDGERATIO float64 `json:"mgneedhedgeratio" xorm:"'MGNEEDHEDGERATIO'"` // 套保比例(套保品的)
  716. NEEDARBITRAGERATIO float64 `json:"needarbitrageratio" xorm:"'NEEDARBITRAGERATIO'"` // 套利比例(套保品的)
  717. ENUMDICNAME string `json:"enumdicname"` // 单位名称
  718. ACCOUNTNAME string `json:"accountname"` // 机构名称
  719. DiffSpotQty float64 `json:"diffspotqty"` // 变动量(现货)
  720. DiffMgQtyA float64 `json:"diffmgqtya"` // 套保变动量
  721. DiffMgQtyB float64 `json:"diffmgqtyb"` // 套利变动量
  722. DiffFutuQty float64 `json:"difffutuqty"` // 变动量(期货)
  723. DiffQty float64 `json:"diffqty"` // 变动量(总敞口)
  724. DiffHedgeQty float64 `json:"diffhedgeqty"` // 变动量(现货应套保总量)
  725. DiffExposure float64 `json:"diffexposure"` // 变动量(套保敞口)
  726. }
  727. func (r *Ermcp3ReportExpourse) calc() {
  728. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  729. r.ACCOUNTNAME = mtpcache.GetUserNameByUserId(r.AREAUSERID)
  730. // 变动量(现货) = 现货头寸总量 - 期初现货头寸总量
  731. r.DiffSpotQty = r.TOTALSPOTQTY - r.ORITOTALSPOTQTY
  732. // 套保变动量 = 套保量 - 期初套保量
  733. r.DiffMgQtyA = r.HEDGEQTY - r.ORIHEDGEQTY
  734. // 套利变动量 = 套利量 - 期初套利量
  735. r.DiffMgQtyB = r.ARBITRAGEQTY - r.ORIARBITRAGEQTY
  736. // 变动量(期货) = (买入 - 买入期初) - (卖出 - 卖出期初)
  737. r.DiffFutuQty = (r.BUYFUTUREQTY - r.ORIBUYFUTUREQTY) - (r.SELLFUTUREQTY - r.ORISELLFUTUREQTY)
  738. // 变动量(敞口) = 实时敞口 - 期初实时敞口
  739. r.DiffQty = r.TOTALEXPOSURE - r.ORITOTALEXPOSURE
  740. // 变动量(现货应套保总量)
  741. r.DiffHedgeQty = r.TOTALNEEDHEDGEQTY - r.ORITOTALNEEDHEDGEQTY
  742. // 变动量(套保敞口)
  743. r.DiffExposure = r.NEEDHEDGEEXPOSOURE - r.ORINEEDHEDGEEXPOSOURE
  744. }
  745. func (r *Ermcp3ReportExpourse) buildSql() string {
  746. var sqlId utils.SQLVal = "SELECT t.cycletime," +
  747. " t.cycletype," +
  748. " t.ORITOTALSPOTQTY," +
  749. " t.ORITOTALFUTUREQTY," +
  750. " t.ORITOTALEXPOSURE," +
  751. " t.ORINEEDHEDGEEXPOSOURE," +
  752. " t.ORIHEDGEQTY," +
  753. " t.ORIARBITRAGEQTY," +
  754. " t.ORINEEDHEDGEQTY," +
  755. " t.ORINEEDARBITRAGEQTY," +
  756. " t.ORITOTALNEEDHEDGEQTY," +
  757. " t.MIDDLEGOODSID," +
  758. " t.AREAUSERID," +
  759. " t.ACCOUNTID," +
  760. " t.ORIBUYPLANQTY," +
  761. " t.ORIBUYPRICEDQTY," +
  762. " t.ORISELLPLANQTY," +
  763. " t.ORISELLPRICEDQTY," +
  764. " t.ORIBUYFUTUREQTY," +
  765. " t.ORISELLFUTUREQTY," +
  766. " t.BUYPLANQTY," +
  767. " t.BUYPRICEDQTY," +
  768. " t.SELLPLANQTY," +
  769. " t.SELLPRICEDQTY," +
  770. " t.BUYFUTUREQTY," +
  771. " t.SELLFUTUREQTY," +
  772. " t.TOTALSPOTQTY," +
  773. " t.TOTALFUTUREQTY," +
  774. " t.TOTALEXPOSURE," +
  775. " t.TOTALHEDGERATIO," +
  776. " t.TOTALNEEDHEDGEQTY," +
  777. " t.NEEDHEDGEEXPOSOURE," +
  778. " t.NEEDHEDGERATIO," +
  779. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  780. " t.HEDGEQTY," +
  781. " t.ARBITRAGEQTY," +
  782. " t.NEEDHEDGEQTY," +
  783. " t.NEEDARBITRAGEQTY," +
  784. " g.middlegoodsname," +
  785. " g.middlegoodscode," +
  786. " g.goodsunitid unitid," +
  787. " g.needhedgeratio," +
  788. " g.needarbitrageratio" +
  789. " FROM REPORT_ERMCP_AREAEXPOSURE t" +
  790. " LEFT JOIN ERMS_MIDDLEGOODS g" +
  791. " on t.middlegoodsid = g.middlegoodsid" +
  792. " WHERE 1 = 1"
  793. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  794. sqlId.And("t.CYCLETYPE", r.CYCLETYPE)
  795. sqlId.And("t.CYCLETIME", r.CYCLETIME)
  796. return sqlId.String()
  797. }
  798. // GetDataEx 获取获取敞周期报表
  799. func (r *Ermcp3ReportExpourse) GetDataEx() (interface{}, error) {
  800. sData := make([]Ermcp3ReportExpourse, 0)
  801. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  802. for i := range sData {
  803. sData[i].calc()
  804. }
  805. return sData, err
  806. }