ermcp3Report.go 82 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585
  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. // Ermcp3ReckonAreaSpotSub 现货日报表(作废)
  153. type Ermcp3ReckonAreaSpotSub struct {
  154. RECKONDATE string `json:"reckondate" xorm:"'RECKONDATE'" form:"reckondate" binding:"required"` // 日照时期(yyyyMMdd)
  155. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'" form:"userid" binding:"required"` // 账户所属机构
  156. ACCOUNTID int64 `json:"accountid" xorm:"'ACCOUNTID'" form:"accountid"` // 期货账户ID
  157. WRFACTORTYPEID int64 `json:"wrfactortypeid" xorm:"'WRFACTORTYPEID'"` // 仓单要素类型ID(212+Unix秒时间戳(10位)+xxxxxx)
  158. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'" form:"deliverygoodsid"` // 现货品种ID
  159. WRSTANDARDID int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'" form:"wrstandardid"` // 现货品类ID
  160. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'" form:"spotgoodsbrandid"` // 现货品牌ID
  161. ORIBUYPRICEDQTY float64 `json:"oribuypricedqty" xorm:"'ORIBUYPRICEDQTY'"` // 期初采购合同已定价数量
  162. ORISELLPRICEDQTY float64 `json:"orisellpricedqty" xorm:"'ORISELLPRICEDQTY'"` // 期初销售合同已定价数量
  163. BUYPRICEDQTY float64 `json:"buypricedqty" xorm:"'BUYPRICEDQTY'"` // 采购合同已定价数量
  164. SELLPRICEDQTY float64 `json:"sellpricedqty" xorm:"'SELLPRICEDQTY'"` // 销售合同已定价数量
  165. TOTALSPOTQTY float64 `json:"totalspotqty" xorm:"'TOTALSPOTQTY'"` // 现货头寸总量 = 采购合同已定价数量 - 销售合同已定价数量
  166. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  167. TODAYBUYRECKONQTY float64 `json:"todaybuyreckonqty" xorm:"'TODAYBUYRECKONQTY'"` // 今日采购合同已确定数量
  168. TODAYSELLRECKONQTY float64 `json:"todaysellreckonqty" xorm:"'TODAYSELLRECKONQTY'"` // 今日销售合同已确定数量
  169. ORIBUYPRICEDAMOUNT float64 `json:"oribuypricedamount" xorm:"'ORIBUYPRICEDAMOUNT'"` // 期初采购合同已定价金额
  170. ORISELLPRICEDAMOUNT float64 `json:"orisellpricedamount" xorm:"'ORISELLPRICEDAMOUNT'"` // 期初销售合同已定价金额
  171. BUYPRICEDAMOUNT float64 `json:"buypricedamount" xorm:"'BUYPRICEDAMOUNT'"` // 采购合同已定价金额
  172. SELLPRICEDAMOUNT float64 `json:"sellpricedamount" xorm:"'SELLPRICEDAMOUNT'"` // 销售合同已定价金额
  173. ORIBUYRECKONQTY float64 `json:"oribuyreckonqty" xorm:"'ORIBUYRECKONQTY'"` // 期初采购合同交收量
  174. ORISELLRECKONQTY float64 `json:"orisellreckonqty" xorm:"'ORISELLRECKONQTY'"` // 期初销售合同交收量
  175. ORIBUYCONTRACTINQTY float64 `json:"oribuycontractinqty" xorm:"'ORIBUYCONTRACTINQTY'"` // 期初采购合同入库量
  176. ORISELLCONTRACTOUTQTY float64 `json:"orisellcontractoutqty" xorm:"'ORISELLCONTRACTOUTQTY'"` // 期初销售合同出库量
  177. ORIPRODUCEINQTY float64 `json:"oriproduceinqty" xorm:"'ORIPRODUCEINQTY'"` // 期初生产入库量
  178. ORIPRODUCEOUTQTY float64 `json:"oriproduceoutqty" xorm:"'ORIPRODUCEOUTQTY'"` // 期初生产出库量
  179. BUYRECKONQTY float64 `json:"buyreckonqty" xorm:"'BUYRECKONQTY'"` // 采购合同交收量
  180. SELLRECKONQTY float64 `json:"sellreckonqty" xorm:"'SELLRECKONQTY'"` // 销售合同交收量
  181. BUYCONTRACTINQTY float64 `json:"buycontractinqty" xorm:"'BUYCONTRACTINQTY'"` // 采购合同入库量
  182. SELLCONTRACTOUTQTY float64 `json:"sellcontractoutqty" xorm:"'SELLCONTRACTOUTQTY'"` // 销售合同出库量
  183. PRODUCEINQTY float64 `json:"produceinqty" xorm:"'PRODUCEINQTY'"` // 生产入库量
  184. PRODUCEOUTQTY float64 `json:"produceoutqty" xorm:"'PRODUCEOUTQTY'"` // 生产出库量
  185. ENUMDICNAME string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 现货商品单位名称
  186. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'wrstandardname'"` // 品类名称
  187. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'wrstandardcode'"` // 品类代码
  188. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'deliverygoodscode'"` // 现货商品代码
  189. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'deliverygoodsname'"` // 现货商品名称
  190. GOODSUNITID int32 `json:"goodsunitid" xorm:"'goodsunitid'"` // 现货商品单位id
  191. BRANDNAME string `json:"brandname" xorm:"'brandname'"` // 品牌名称
  192. ACCOUNTNAME string `json:"accountname" xorm:"'accountname'"` // 所属机构名称
  193. BIZTYPE int32 `json:"biztype" xorm:"'BIZTYPE'"` // 业务类型 1-套保 2-套利
  194. CURRENCYID int32 `json:"currencyid" xorm:"'CURRENCYID'"` // 币种id
  195. CURRENCYNAME string `json:"currencyname"` // 币种名称
  196. TOTALBUYPRICEDQTY float64 `json:"totalbuypricedqty"` // 采购定价量 = 期末 - 期初
  197. TOTALSELLPRICEDQTY float64 `json:"totalsellpricedqty"` // 销售定价量 = 期末 - 期初
  198. BeginDate string `json:"-"` // 开始日期
  199. EndDate string `json:"-"` // 结束日期
  200. }
  201. func (r *Ermcp3ReckonAreaSpotSub) calc() {
  202. r.TOTALBUYPRICEDQTY = r.BUYPRICEDQTY - r.ORIBUYPRICEDQTY
  203. r.TOTALSELLPRICEDQTY = r.SELLPRICEDQTY - r.ORISELLPRICEDQTY
  204. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  205. }
  206. func (r *Ermcp3ReckonAreaSpotSub) buildSql() string {
  207. var sqlId utils.SQLVal = "SELECT t.ORIBUYRECKONQTY," +
  208. " t.ORISELLRECKONQTY," +
  209. " t.ORIBUYCONTRACTINQTY," +
  210. " t.ORISELLCONTRACTOUTQTY," +
  211. " t.ORIPRODUCEINQTY," +
  212. " t.ORIPRODUCEOUTQTY," +
  213. " t.BUYRECKONQTY," +
  214. " t.SELLRECKONQTY," +
  215. " t.BUYCONTRACTINQTY," +
  216. " t.SELLCONTRACTOUTQTY," +
  217. " t.PRODUCEINQTY," +
  218. " t.PRODUCEOUTQTY," +
  219. " t.Reckondate," +
  220. " t.AREAUSERID," +
  221. " t.ACCOUNTID," +
  222. " t.WRFACTORTYPEID," +
  223. " t.DELIVERYGOODSID," +
  224. " t.WRSTANDARDID," +
  225. " t.SPOTGOODSBRANDID," +
  226. " t.ORIBUYPRICEDQTY," +
  227. " t.ORISELLPRICEDQTY," +
  228. " t.BUYPRICEDQTY," +
  229. " t.SELLPRICEDQTY," +
  230. " t.TOTALSPOTQTY," +
  231. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  232. " t.TODAYBUYRECKONQTY," +
  233. " t.TODAYSELLRECKONQTY," +
  234. " t.ORIBUYPRICEDAMOUNT," +
  235. " t.ORISELLPRICEDAMOUNT," +
  236. " t.BUYPRICEDAMOUNT," +
  237. " t.SELLPRICEDAMOUNT," +
  238. " t.currencyid," +
  239. " t.biztype," +
  240. " w.wrstandardname," +
  241. " w.wrstandardcode," +
  242. " g.deliverygoodscode," +
  243. " g.deliverygoodsname," +
  244. " g.goodsunitid," +
  245. " d.dgfactoryitemvalue brandname," +
  246. " u.accountname," +
  247. " e.enumdicname" +
  248. " FROM RECKON_ERMCP_AREASPOTSUB t" +
  249. " LEFT JOIN WRSTANDARD w" +
  250. " on t.wrstandardid = w.wrstandardid" +
  251. " LEFT JOIN DELIVERYGOODS g" +
  252. " on t.deliverygoodsid = g.deliverygoodsid" +
  253. " LEFT JOIN DGFACTORYITEM d" +
  254. " on t.spotgoodsbrandid = d.dgfactoryitemid" +
  255. " LEFT JOIN USERACCOUNT u" +
  256. " on t.areauserid = u.userid" +
  257. " LEFT JOIN ENUMDICITEM e" +
  258. " on g.goodsunitid = e.enumitemname" +
  259. " and e.enumdiccode = 'goodsunit'" +
  260. " and e.enumitemstatus = 1" +
  261. " WHERE 1 = 1"
  262. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  263. sqlId.AndEx("t.ACCOUNTID", r.ACCOUNTID, r.ACCOUNTID > 0)
  264. sqlId.AndEx("t.deliverygoodsid", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  265. sqlId.AndEx("t.WRSTANDARDID", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  266. sqlId.AndEx("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  267. if r.RECKONDATE != "" {
  268. sqlId.And("t.RECKONDATE", r.RECKONDATE)
  269. } else if r.BeginDate != "" && r.BeginDate == r.EndDate {
  270. sqlId.And("t.RECKONDATE", r.BeginDate)
  271. } else {
  272. if r.BeginDate != "" {
  273. sqlId.BiggerOrEq("t.RECKONDATE", r.BeginDate)
  274. }
  275. if r.EndDate != "" {
  276. sqlId.LessOrEq("t.RECKONDATE", r.EndDate)
  277. }
  278. }
  279. sqlId.Join(" order by t.RECKONDATE")
  280. return sqlId.String()
  281. }
  282. // GetDataEx 获取现货日报表
  283. func (r *Ermcp3ReckonAreaSpotSub) GetDataEx() (interface{}, error) {
  284. sData := make([]Ermcp3ReckonAreaSpotSub, 0)
  285. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  286. for i := range sData {
  287. sData[i].calc()
  288. }
  289. return sData, err
  290. }
  291. // Ermcp3ReportAreaSpotSub 现货分类月报表(作废)
  292. type Ermcp3ReportAreaSpotSub struct {
  293. ORIBUYRECKONQTY float64 `json:"oribuyreckonqty" xorm:"'ORIBUYRECKONQTY'"` // 期初采购合同交收量【期初】
  294. ORISELLRECKONQTY float64 `json:"orisellreckonqty" xorm:"'ORISELLRECKONQTY'"` // 期初销售合同交收量【期初】
  295. ORIBUYCONTRACTINQTY float64 `json:"oribuycontractinqty" xorm:"'ORIBUYCONTRACTINQTY'"` // 期初采购合同入库量【期初】
  296. ORISELLCONTRACTOUTQTY float64 `json:"orisellcontractoutqty" xorm:"'ORISELLCONTRACTOUTQTY'"` // 期初销售合同出库量【期初】
  297. ORIPRODUCEINQTY float64 `json:"oriproduceinqty" xorm:"'ORIPRODUCEINQTY'"` // 期初生产入库量【期初】
  298. ORIPRODUCEOUTQTY float64 `json:"oriproduceoutqty" xorm:"'ORIPRODUCEOUTQTY'"` // 期初生产出库量【期初】
  299. BUYRECKONQTY float64 `json:"buyreckonqty" xorm:"'BUYRECKONQTY'"` // 采购合同交收量【期末】
  300. SELLRECKONQTY float64 `json:"sellreckonqty" xorm:"'SELLRECKONQTY'"` // 销售合同交收量【期末】
  301. BUYCONTRACTINQTY float64 `json:"buycontractinqty" xorm:"'BUYCONTRACTINQTY'"` // 采购合同入库量【期末】
  302. SELLCONTRACTOUTQTY float64 `json:"sellcontractoutqty" xorm:"'SELLCONTRACTOUTQTY'"` // 销售合同出库量【期末】
  303. PRODUCEINQTY float64 `json:"produceinqty" xorm:"'PRODUCEINQTY'"` // 生产入库量【期末】
  304. PRODUCEOUTQTY float64 `json:"produceoutqty" xorm:"'PRODUCEOUTQTY'"` // 生产出库量【期末】
  305. CYCLETIME string `json:"cycletime" xorm:"'CYCLETIME'" form:"cycletime"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  306. CYCLETYPE int32 `json:"cycletype" xorm:"'CYCLETYPE'" form:"cycletype"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  307. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'" form:"userid" binding:"required"` // 账户所属机构
  308. ACCOUNTID int64 `json:"accountid" xorm:"'ACCOUNTID'" form:"accountid"` // 期货账户ID
  309. WRFACTORTYPEID int64 `json:"wrfactortypeid" xorm:"'WRFACTORTYPEID'"` // 仓单要素类型ID(212+Unix秒时间戳(10位)+xxxxxx)
  310. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'" form:"deliverygoodsid"` // 现货品种ID
  311. WRSTANDARDID int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'" form:"wrstandardid"` // 品类ID
  312. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'" form:"spotgoodsbrandid"` // 现货品牌ID
  313. ORIBUYPRICEDQTY float64 `json:"oribuypricedqty" xorm:"'ORIBUYPRICEDQTY'"` // 期初采购合同已定价数量【期初】
  314. ORISELLPRICEDQTY float64 `json:"orisellpricedqty" xorm:"'ORISELLPRICEDQTY'"` // 期初销售合同已定价数量【期初】
  315. BUYPRICEDQTY float64 `json:"buypricedqty" xorm:"'BUYPRICEDQTY'"` // 采购合同已定价数量【期末】
  316. SELLPRICEDQTY float64 `json:"sellpricedqty" xorm:"'SELLPRICEDQTY'"` // 销售合同已定价数量【期末】
  317. TOTALSPOTQTY float64 `json:"totalspotqty" xorm:"'TOTALSPOTQTY'"` // 现货头寸总量 = 采购合同已定价数量 - 销售合同已定价数量【期末】
  318. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  319. TODAYBUYRECKONQTY float64 `json:"todaybuyreckonqty" xorm:"'TODAYBUYRECKONQTY'"` // 今日采购合同已确定数量【汇总】
  320. TODAYSELLRECKONQTY float64 `json:"todaysellreckonqty" xorm:"'TODAYSELLRECKONQTY'"` // 今日销售合同已确定数量【汇总】
  321. ORIBUYPRICEDAMOUNT float64 `json:"oribuypricedamount" xorm:"'ORIBUYPRICEDAMOUNT'"` // 期初采购合同已定价金额【期初】
  322. ORISELLPRICEDAMOUNT float64 `json:"orisellpricedamount" xorm:"'ORISELLPRICEDAMOUNT'"` // 期初销售合同已定价金额【期初】
  323. BUYPRICEDAMOUNT float64 `json:"buypricedamount" xorm:"'BUYPRICEDAMOUNT'"` // 采购合同已定价金额【期末】
  324. SELLPRICEDAMOUNT float64 `json:"sellpricedamount" xorm:"'SELLPRICEDAMOUNT'"` // 销售合同已定价金额【期末】
  325. ENUMDICNAME string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 现货商品单位名称
  326. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'wrstandardname'"` // 品类名称
  327. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'wrstandardcode'"` // 品类代码
  328. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'deliverygoodscode'"` // 现货商品代码
  329. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'deliverygoodsname'"` // 现货商品名称
  330. GOODSUNITID int32 `json:"goodsunitid" xorm:"'goodsunitid'"` // 现货商品单位id
  331. BRANDNAME string `json:"brandname" xorm:"'brandname'"` // 品牌名称
  332. ACCOUNTNAME string `json:"accountname" xorm:"'accountname'"` // 所属机构名称
  333. BIZTYPE int32 `json:"biztype" xorm:"'BIZTYPE'"` // 业务类型 1-套保 2-套利
  334. CURRENCYID int32 `json:"currencyid" xorm:"'CURRENCYID'"` // 币种id
  335. CURRENCYNAME string `json:"currencyname"` // 币种名称
  336. TOTALBUYPRICEDQTY float64 `json:"totalbuypricedqty"` // 采购定价量 = 期末 - 期初
  337. TOTALSELLPRICEDQTY float64 `json:"totalsellpricedqty"` // 销售定价量 = 期末 - 期初
  338. }
  339. func (r *Ermcp3ReportAreaSpotSub) calc() {
  340. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  341. r.TOTALBUYPRICEDQTY = r.BUYPRICEDQTY - r.ORIBUYPRICEDQTY
  342. r.TOTALSELLPRICEDQTY = r.SELLPRICEDQTY - r.ORISELLPRICEDQTY
  343. }
  344. func (r *Ermcp3ReportAreaSpotSub) buildSql() string {
  345. var sqlId utils.SQLVal = "SELECT t.ORIBUYRECKONQTY," +
  346. " t.ORISELLRECKONQTY," +
  347. " t.ORIBUYCONTRACTINQTY," +
  348. " t.ORISELLCONTRACTOUTQTY," +
  349. " t.ORIPRODUCEINQTY," +
  350. " t.ORIPRODUCEOUTQTY," +
  351. " t.BUYRECKONQTY," +
  352. " t.SELLRECKONQTY," +
  353. " t.BUYCONTRACTINQTY," +
  354. " t.SELLCONTRACTOUTQTY," +
  355. " t.PRODUCEINQTY," +
  356. " t.PRODUCEOUTQTY," +
  357. " t.CYCLETIME," +
  358. " t.CYCLETYPE," +
  359. " t.AREAUSERID," +
  360. " t.ACCOUNTID," +
  361. " t.WRFACTORTYPEID," +
  362. " t.DELIVERYGOODSID," +
  363. " t.WRSTANDARDID," +
  364. " t.SPOTGOODSBRANDID," +
  365. " t.ORIBUYPRICEDQTY," +
  366. " t.ORISELLPRICEDQTY," +
  367. " t.BUYPRICEDQTY," +
  368. " t.SELLPRICEDQTY," +
  369. " t.TOTALSPOTQTY," +
  370. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  371. " t.TODAYBUYRECKONQTY," +
  372. " t.TODAYSELLRECKONQTY," +
  373. " t.ORIBUYPRICEDAMOUNT," +
  374. " t.ORISELLPRICEDAMOUNT," +
  375. " t.BUYPRICEDAMOUNT," +
  376. " t.SELLPRICEDAMOUNT," +
  377. " t.currencyid," +
  378. " t.biztype," +
  379. " w.wrstandardname," +
  380. " w.wrstandardcode," +
  381. " g.deliverygoodscode," +
  382. " g.deliverygoodsname," +
  383. " g.goodsunitid," +
  384. " d.dgfactoryitemvalue brandname," +
  385. " u.accountname," +
  386. " e.enumdicname" +
  387. " FROM REPORT_ERMCP_AREASPOTSUB t" +
  388. " LEFT JOIN WRSTANDARD w on t.wrstandardid=w.wrstandardid" +
  389. " LEFT JOIN DELIVERYGOODS g on t.deliverygoodsid=g.deliverygoodsid" +
  390. " LEFT JOIN DGFACTORYITEM d on t.spotgoodsbrandid=d.dgfactoryitemid" +
  391. " LEFT JOIN USERACCOUNT u on t.areauserid=u.userid" +
  392. " LEFT JOIN ENUMDICITEM e on g.goodsunitid=e.enumitemname and e.enumdiccode='goodsunit' and e.enumitemstatus=1" +
  393. " WHERE 1 = 1"
  394. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  395. sqlId.And("t.cycletype", r.CYCLETYPE)
  396. sqlId.And("t.cycletime", r.CYCLETIME)
  397. sqlId.AndEx("t.ACCOUNTID", r.ACCOUNTID, r.ACCOUNTID > 0)
  398. sqlId.AndEx("t.deliverygoodsid", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  399. sqlId.AndEx("t.WRSTANDARDID", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  400. sqlId.AndEx("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  401. return sqlId.String()
  402. }
  403. // GetDataEx 获取现货分类报表
  404. func (r *Ermcp3ReportAreaSpotSub) GetDataEx() (interface{}, error) {
  405. sData := make([]Ermcp3ReportAreaSpotSub, 0)
  406. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  407. for i := range sData {
  408. sData[i].calc()
  409. }
  410. return sData, err
  411. }
  412. // Ermcp3ExpourseReport 敞口报表
  413. type Ermcp3ExpourseReport struct {
  414. RECKONDATE string `json:"reckondate" xorm:"'RECKONDATE'"` // 日照时期(yyyyMMdd)
  415. CYCLETIME string `json:"cycletime" xorm:"'CYCLETIME'"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  416. CYCLETYPE int32 `json:"cycletype" xorm:"'CYCLETYPE'"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  417. ORITOTALSPOTQTY float64 `json:"oritotalspotqty" xorm:"'ORITOTALSPOTQTY'"` // 期初现货头寸总量
  418. ORITOTALFUTUREQTY float64 `json:"oritotalfutureqty" xorm:"'ORITOTALFUTUREQTY'"` // 期初期货头寸总量
  419. ORITOTALEXPOSURE float64 `json:"oritotalexposure" xorm:"'ORITOTALEXPOSURE'"` // 期初实时总敞口
  420. ORINEEDHEDGEEXPOSOURE float64 `json:"orineedhedgeexposoure" xorm:"'ORINEEDHEDGEEXPOSOURE'"` // 期初应套保敞口
  421. ORIHEDGEQTY float64 `json:"orihedgeqty" xorm:"'ORIHEDGEQTY'"` // 期初套保量
  422. ORIARBITRAGEQTY float64 `json:"oriarbitrageqty" xorm:"'ORIARBITRAGEQTY'"` // 期初套利量
  423. ORINEEDHEDGEQTY float64 `json:"orineedhedgeqty" xorm:"'ORINEEDHEDGEQTY'"` // 期初应套保量
  424. ORINEEDARBITRAGEQTY float64 `json:"orineedarbitrageqty" xorm:"'ORINEEDARBITRAGEQTY'"` // 期初应套利量
  425. ORITOTALNEEDHEDGEQTY float64 `json:"oritotalneedhedgeqty" xorm:"'ORITOTALNEEDHEDGEQTY'"` // 期初应套保总量
  426. MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"'MIDDLEGOODSID'"` // 套保品种ID
  427. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构\交易用户ID
  428. ACCOUNTID int64 `json:"accountid" xorm:"'ACCOUNTID'"` // 期货账户ID (作废, 默认为0)
  429. ORIBUYPLANQTY float64 `json:"oribuyplanqty" xorm:"'ORIBUYPLANQTY'"` // 期初采购计划数量
  430. ORIBUYPRICEDQTY float64 `json:"oribuypricedqty" xorm:"'ORIBUYPRICEDQTY'"` // 期初采购合同已定价数量
  431. ORISELLPLANQTY float64 `json:"orisellplanqty" xorm:"'ORISELLPLANQTY'"` // 期初销售计划数量
  432. ORISELLPRICEDQTY float64 `json:"orisellpricedqty" xorm:"'ORISELLPRICEDQTY'"` // 期初销售合同已定价数量
  433. ORIBUYFUTUREQTY float64 `json:"oribuyfutureqty" xorm:"'ORIBUYFUTUREQTY'"` // 期初买入期货数量
  434. ORISELLFUTUREQTY float64 `json:"orisellfutureqty" xorm:"'ORISELLFUTUREQTY'"` // 期初卖出期货数量
  435. BUYPLANQTY float64 `json:"buyplanqty" xorm:"'BUYPLANQTY'"` // 采购计划数量
  436. BUYPRICEDQTY float64 `json:"buypricedqty" xorm:"'BUYPRICEDQTY'"` // 采购合同已定价数量
  437. SELLPLANQTY float64 `json:"sellplanqty" xorm:"'SELLPLANQTY'"` // 销售计划数量
  438. SELLPRICEDQTY float64 `json:"sellpricedqty" xorm:"'SELLPRICEDQTY'"` // 销售合同已定价数量
  439. BUYFUTUREQTY float64 `json:"buyfutureqty" xorm:"'BUYFUTUREQTY'"` // 买入期货数量
  440. SELLFUTUREQTY float64 `json:"sellfutureqty" xorm:"'SELLFUTUREQTY'"` // 卖出期货数量
  441. TOTALSPOTQTY float64 `json:"totalspotqty" xorm:"'TOTALSPOTQTY'"` // 现货头寸总量
  442. TOTALFUTUREQTY float64 `json:"totalfutureqty" xorm:"'TOTALFUTUREQTY'"` // 期货头寸总量(期货总量)
  443. TOTALEXPOSURE float64 `json:"totalexposure" xorm:"'TOTALEXPOSURE'"` // 实时总敞口(总敞口)
  444. TOTALHEDGERATIO float64 `json:"totalhedgeratio" xorm:"'TOTALHEDGERATIO'"` // 敞口比例
  445. TOTALNEEDHEDGEQTY float64 `json:"totalneedhedgeqty" xorm:"'TOTALNEEDHEDGEQTY'"` // 应套保总量(现货应套保总量)
  446. NEEDHEDGEEXPOSOURE float64 `json:"needhedgeexposoure" xorm:"'NEEDHEDGEEXPOSOURE'"` // 应套保敞口(套保敞口)
  447. NEEDHEDGERATIO float64 `json:"needhedgeratio" xorm:"'NEEDHEDGERATIO'"` // 应套保敞口比例
  448. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  449. HEDGEQTY float64 `json:"hedgeqty" xorm:"'HEDGEQTY'"` // 套保量
  450. ARBITRAGEQTY float64 `json:"arbitrageqty" xorm:"'ARBITRAGEQTY'"` // 套利量
  451. NEEDHEDGEQTY float64 `json:"needhedgeqty" xorm:"'NEEDHEDGEQTY'"` // 应套保量
  452. NEEDARBITRAGEQTY float64 `json:"needarbitrageqty" xorm:"'NEEDARBITRAGEQTY'"` // 应套利量
  453. MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保商品名称
  454. MIDDLEGOODSCODE string `json:"middlgoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保商品代码
  455. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 单位id
  456. MGNEEDHEDGERATIO float64 `json:"mgneedhedgeratio" xorm:"'MGNEEDHEDGERATIO'"` // 套保比例(套保品的)
  457. NEEDARBITRAGERATIO float64 `json:"needarbitrageratio" xorm:"'NEEDARBITRAGERATIO'"` // 套利比例(套保品的)
  458. ENUMDICNAME string `json:"enumdicname"` // 单位名称
  459. ACCOUNTNAME string `json:"accountname"` // 机构名称
  460. DiffSpotQty float64 `json:"diffspotqty"` // 变动量(现货)
  461. DiffMgQtyA float64 `json:"diffmgqtya"` // 套保变动量
  462. DiffMgQtyB float64 `json:"diffmgqtyb"` // 套利变动量
  463. DiffFutuQty float64 `json:"difffutuqty"` // 变动量(期货)
  464. DiffQty float64 `json:"diffqty"` // 变动量(总敞口)
  465. DiffHedgeQty float64 `json:"diffhedgeqty"` // 变动量(现货应套保总量)
  466. DiffExposure float64 `json:"diffexposure"` // 变动量(套保敞口)
  467. QueryType int32 `json:"-"` // 查询类型 1-日报表 2-周期报表 3-日报表(范围,[开始日期,结束日期])
  468. BeginDate string `json:"-"` // 开始交易日
  469. EndDate string `json:"-"` // 结束交易日
  470. }
  471. func (r *Ermcp3ExpourseReport) calc() {
  472. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  473. r.ACCOUNTNAME = mtpcache.GetUserNameByUserId(r.AREAUSERID)
  474. // 变动量(现货) = 现货头寸总量 - 期初现货头寸总量
  475. r.DiffSpotQty = r.TOTALSPOTQTY - r.ORITOTALSPOTQTY
  476. // 套保变动量 = 套保量 - 期初套保量
  477. r.DiffMgQtyA = r.HEDGEQTY - r.ORIHEDGEQTY
  478. // 套利变动量 = 套利量 - 期初套利量
  479. r.DiffMgQtyB = r.ARBITRAGEQTY - r.ORIARBITRAGEQTY
  480. // 变动量(期货) = (买入 - 买入期初) - (卖出 - 卖出期初)
  481. r.DiffFutuQty = (r.BUYFUTUREQTY - r.ORIBUYFUTUREQTY) - (r.SELLFUTUREQTY - r.ORISELLFUTUREQTY)
  482. // 变动量(敞口) = 实时敞口 - 期初实时敞口
  483. r.DiffQty = r.TOTALEXPOSURE - r.ORITOTALEXPOSURE
  484. // 变动量(现货应套保总量)
  485. r.DiffHedgeQty = r.TOTALNEEDHEDGEQTY - r.ORITOTALNEEDHEDGEQTY
  486. // 变动量(套保敞口)
  487. r.DiffExposure = r.NEEDHEDGEEXPOSOURE - r.ORINEEDHEDGEEXPOSOURE
  488. }
  489. func (r *Ermcp3ExpourseReport) buildSql() string {
  490. if r.QueryType == 1 || r.QueryType == 3 {
  491. return r.buildSqlDay()
  492. }
  493. return r.buildSqlCycle()
  494. }
  495. func (r *Ermcp3ExpourseReport) buildSqlDay() string {
  496. var sqlId utils.SQLVal = "SELECT t.ORITOTALSPOTQTY," +
  497. " t.ORITOTALFUTUREQTY," +
  498. " t.ORITOTALEXPOSURE," +
  499. " t.ORINEEDHEDGEEXPOSOURE," +
  500. " t.ORIHEDGEQTY," +
  501. " t.ORIARBITRAGEQTY," +
  502. " t.ORINEEDHEDGEQTY," +
  503. " t.ORINEEDARBITRAGEQTY," +
  504. " t.ORITOTALNEEDHEDGEQTY," +
  505. " t.RECKONDATE," +
  506. " t.MIDDLEGOODSID," +
  507. " t.AREAUSERID," +
  508. " t.ACCOUNTID," +
  509. " t.ORIBUYPLANQTY," +
  510. " t.ORIBUYPRICEDQTY," +
  511. " t.ORISELLPLANQTY," +
  512. " t.ORISELLPRICEDQTY," +
  513. " t.ORIBUYFUTUREQTY," +
  514. " t.ORISELLFUTUREQTY," +
  515. " t.BUYPLANQTY," +
  516. " t.BUYPRICEDQTY," +
  517. " t.SELLPLANQTY," +
  518. " t.SELLPRICEDQTY," +
  519. " t.BUYFUTUREQTY," +
  520. " t.SELLFUTUREQTY," +
  521. " t.TOTALSPOTQTY," +
  522. " t.TOTALFUTUREQTY," +
  523. " t.TOTALEXPOSURE," +
  524. " t.TOTALHEDGERATIO," +
  525. " t.TOTALNEEDHEDGEQTY," +
  526. " t.NEEDHEDGEEXPOSOURE," +
  527. " t.NEEDHEDGERATIO," +
  528. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  529. " t.HEDGEQTY," +
  530. " t.ARBITRAGEQTY," +
  531. " t.NEEDHEDGEQTY," +
  532. " t.NEEDARBITRAGEQTY," +
  533. " g.middlegoodsname," +
  534. " g.middlegoodscode," +
  535. " g.goodsunitid unitid" +
  536. " FROM RECKON_ERMCP_AREAEXPOSURE t" +
  537. " LEFT JOIN ERMS_MIDDLEGOODS g" +
  538. " on t.middlegoodsid = g.middlegoodsid" +
  539. " WHERE 1 = 1"
  540. sqlId.AndEx("t.AREAUSERID", r.AREAUSERID, r.AREAUSERID > 0)
  541. if r.QueryType == 1 {
  542. sqlId.And("t.RECKONDATE", r.RECKONDATE)
  543. } else if r.QueryType == 3 {
  544. sqlId.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  545. }
  546. return sqlId.String()
  547. }
  548. func (r *Ermcp3ExpourseReport) buildSqlCycle() string {
  549. var sqlId utils.SQLVal = "SELECT t.cycletime," +
  550. " t.cycletype," +
  551. " t.ORITOTALSPOTQTY," +
  552. " t.ORITOTALFUTUREQTY," +
  553. " t.ORITOTALEXPOSURE," +
  554. " t.ORINEEDHEDGEEXPOSOURE," +
  555. " t.ORIHEDGEQTY," +
  556. " t.ORIARBITRAGEQTY," +
  557. " t.ORINEEDHEDGEQTY," +
  558. " t.ORINEEDARBITRAGEQTY," +
  559. " t.ORITOTALNEEDHEDGEQTY," +
  560. " t.MIDDLEGOODSID," +
  561. " t.AREAUSERID," +
  562. " t.ACCOUNTID," +
  563. " t.ORIBUYPLANQTY," +
  564. " t.ORIBUYPRICEDQTY," +
  565. " t.ORISELLPLANQTY," +
  566. " t.ORISELLPRICEDQTY," +
  567. " t.ORIBUYFUTUREQTY," +
  568. " t.ORISELLFUTUREQTY," +
  569. " t.BUYPLANQTY," +
  570. " t.BUYPRICEDQTY," +
  571. " t.SELLPLANQTY," +
  572. " t.SELLPRICEDQTY," +
  573. " t.BUYFUTUREQTY," +
  574. " t.SELLFUTUREQTY," +
  575. " t.TOTALSPOTQTY," +
  576. " t.TOTALFUTUREQTY," +
  577. " t.TOTALEXPOSURE," +
  578. " t.TOTALHEDGERATIO," +
  579. " t.TOTALNEEDHEDGEQTY," +
  580. " t.NEEDHEDGEEXPOSOURE," +
  581. " t.NEEDHEDGERATIO," +
  582. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  583. " t.HEDGEQTY," +
  584. " t.ARBITRAGEQTY," +
  585. " t.NEEDHEDGEQTY," +
  586. " t.NEEDARBITRAGEQTY," +
  587. " g.middlegoodsname," +
  588. " g.middlegoodscode," +
  589. " g.goodsunitid unitid," +
  590. " g.needhedgeratio," +
  591. " g.needarbitrageratio" +
  592. " FROM REPORT_ERMCP_AREAEXPOSURE t" +
  593. " LEFT JOIN ERMS_MIDDLEGOODS g" +
  594. " on t.middlegoodsid = g.middlegoodsid" +
  595. " WHERE 1 = 1"
  596. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  597. sqlId.And("t.CYCLETYPE", r.CYCLETYPE)
  598. sqlId.And("t.CYCLETIME", r.CYCLETIME)
  599. return sqlId.String()
  600. }
  601. // GetDataEx 获取敞报表
  602. func (r *Ermcp3ExpourseReport) GetDataEx() (interface{}, error) {
  603. sData := make([]Ermcp3ExpourseReport, 0)
  604. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  605. for i := range sData {
  606. sData[i].calc()
  607. }
  608. return sData, err
  609. }
  610. // Ermcp3ExposureContractDetail 敞口合同明细
  611. type Ermcp3ExposureContractDetail struct {
  612. MIDDLEGOODSID int32 `json:"middlegoodsid" xorm:"'MIDDLEGOODSID'"` // 套保品种id
  613. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` //现货商品id
  614. CONVERTRATIO float64 `json:"convertratio" xorm:"'CONVERTRATIO'"` // 折算系数(套保品种)
  615. USERID int64 `json:"userid" xorm:"'USERID'"` // 机构id
  616. SPOTCONTRACTID string `json:"spotcontractid" xorm:"'SPOTCONTRACTID'"` // 合同id
  617. CONTRACTNO string `json:"contractno" xorm:"'CONTRACTNO'"` // 合同编号
  618. CONTRACTTYPE int32 `json:"contracttype" xorm:"'CONTRACTTYPE'"` // 现货合同类型 - 1:采购 -1:销售
  619. BIZTYPE int32 `json:"biztype" xorm:"'BIZTYPE'"` // 业务类型 1-套保 2-套利
  620. BUYUSERID int64 `json:"buyuserid" xorm:"'BUYUSERID'"` // 采购方id
  621. SELLUSERID int64 `json:"selluserid" xorm:"'SELLUSERID'"` // 销售方id
  622. QTY float64 `json:"qty" xorm:"'QTY'"` // 合同量
  623. PRICEDQTY float64 `json:"pricedqty" xorm:"'PRICEDQTY'"` // 已定价量
  624. WRSTANDARDID int32 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 品类id
  625. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  626. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  627. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 品类单位id
  628. MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保品种名称
  629. MIDDLEGOODSCODE string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保品种代码
  630. GOODSUNITID int32 `json:"-" xorm:"'GOODSUNITID'"` // 套保品种单位id
  631. TRADEDATE string `json:"tradedate" xorm:"'tradedate'"` // 交易日
  632. NEEDHEDGERATIO float64 `json:"needhedgeratio" xorm:"'NEEDHEDGERATIO'"` // 应套保比例
  633. NEEDARBITRAGERATIO float64 `json:"needarbitrageratio" xorm:"'NEEDARBITRAGERATIO'"` // 应套利比例
  634. BRANDNAME string `json:"brandname" xorm:"'BRANDNAME'"` // 品牌名称
  635. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货商品代码
  636. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货商品名称
  637. EnumdicName string `json:"enumdicname"` // 单位名称
  638. BUYUSERNAME string `json:"buyusername"` // 采购方名称
  639. SELLUSERNAME string `json:"sellusername"` // 销售方名称
  640. CurQty float64 `json:"curqty"` // 今定价量
  641. DiffQty float64 `json:"diffqty"` // 套保品种今变动量
  642. }
  643. func (r *Ermcp3ExposureContractDetail) calc() {
  644. r.CurQty = r.QTY
  645. r.DiffQty = r.QTY * r.CONVERTRATIO
  646. r.EnumdicName = mtpcache.GetEnumDicitemName(r.UNITID)
  647. r.BUYUSERNAME = mtpcache.GetUserNameByUserId(r.BUYUSERID)
  648. r.SELLUSERNAME = mtpcache.GetUserNameByUserId(r.SELLUSERID)
  649. }
  650. func (r *Ermcp3ExposureContractDetail) buildSql() string {
  651. var sqlId utils.SQLVal = "select t.middlegoodsid," +
  652. " t.deliverygoodsid," +
  653. " t.convertratio," +
  654. " s.userid," +
  655. " to_char(s.spotcontractid) spotcontractid," +
  656. " s.contractno," +
  657. " s.contracttype," +
  658. " s.biztype," +
  659. " s.buyuserid," +
  660. " s.selluserid," +
  661. " s.qty," +
  662. " s.pricedqty," +
  663. " s.wrstandardid," +
  664. " s.audittradedate tradedate," +
  665. " w.wrstandardname," +
  666. " w.wrstandardcode," +
  667. " w.unitid," +
  668. " mg.middlegoodsname," +
  669. " mg.middlegoodscode," +
  670. " mg.goodsunitid," +
  671. " mg.needhedgeratio," +
  672. " mg.needarbitrageratio," +
  673. " dg.dgfactoryitemid brandid," +
  674. " dg.dgfactoryitemvalue brandName," +
  675. " g.deliverygoodscode," +
  676. " g.deliverygoodsname" +
  677. " from erms2_wrsconvertdetail t" +
  678. " inner join ermcp_spotcontract s" +
  679. " on t.deliverygoodsid = s.deliverygoodsid" +
  680. " left join erms_middlegoods mg" +
  681. " on t.middlegoodsid = mg.middlegoodsid" +
  682. " left join wrstandard w" +
  683. " on s.wrstandardid = w.wrstandardid" +
  684. " left join dgfactoryitem dg" +
  685. " on s.spotgoodsbrandid = dg.dgfactoryitemid" +
  686. " left join deliverygoods g on s.deliverygoodsid=g.deliverygoodsid" +
  687. " where t.wrstandardid = 0" +
  688. " and s.contractstatus in (2, 3)"
  689. sqlId.And("s.audittradedate", r.TRADEDATE)
  690. sqlId.And("t.middlegoodsid", r.MIDDLEGOODSID)
  691. sqlId.Join(fmt.Sprintf(" and %v in(s.userid, s.tradeuserid)", r.USERID))
  692. return sqlId.String()
  693. }
  694. // GetDataEx 获取敞口合同明细
  695. func (r *Ermcp3ExposureContractDetail) GetDataEx() (interface{}, error) {
  696. sData := make([]Ermcp3ExposureContractDetail, 0)
  697. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  698. for i := range sData {
  699. sData[i].calc()
  700. }
  701. return sData, err
  702. }
  703. // Ermcp3ExposureHedgeplanDetail 敞口套保计划明细
  704. type Ermcp3ExposureHedgeplanDetail struct {
  705. MIDDLEGOODSID int32 `json:"middlegoodsid" xorm:"'MIDDLEGOODSID'"` // 套保品种id
  706. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` //现货商品id
  707. CONVERTRATIO float64 `json:"convertratio" xorm:"'CONVERTRATIO'"` // 折算系数(套保品种)
  708. USERID int64 `json:"userid" xorm:"'USERID'"` // 机构id
  709. HEDGEPLANID string `json:"hedgeplanid" xorm:"'HEDGEPLANID'"` // 套保计划id
  710. HEDGEPLANNO string `json:"hedgeplanno" xorm:"'HEDGEPLANNO'"` // 套保计划编号
  711. BIZTYPE int32 `json:"biztype" xorm:"'BIZTYPE'"` // 业务类型 1-套保 2-套利
  712. QTY float64 `json:"qty" xorm:"'QTY'"` // 合同量
  713. PRICEDQTY float64 `json:"pricedqty" xorm:"'PRICEDQTY'"` // 已定价量
  714. WRSTANDARDID int32 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 品类id
  715. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  716. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  717. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 品类单位id
  718. MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保品种名称
  719. MIDDLEGOODSCODE string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保品种代码
  720. GOODSUNITID int32 `json:"-" xorm:"'GOODSUNITID'"` // 套保品种单位id
  721. TRADEDATE string `json:"tradedate" xorm:"'tradedate'"` // 交易日(登记日)
  722. NEEDHEDGERATIO float64 `json:"needhedgeratio" xorm:"'NEEDHEDGERATIO'"` // 应套保比例
  723. NEEDARBITRAGERATIO float64 `json:"needarbitrageratio" xorm:"'NEEDARBITRAGERATIO'"` // 应套利比例
  724. CONTRACTTYPE int32 `json:"contracttype" xorm:"'CONTRACTTYPE'"` // 计划类型 - 1:采购 -1:销售
  725. HEDGEPLANSTATUS int32 `json:"hedgeplanstatus" xorm:"'HEDGEPLANSTATUS'"` // 套保计划状态 - 0:未提交 1:待审核 2:执行中 3:正常完结 4:审核拒绝 5:异常完结 6:已撤回
  726. EnumdicName string `json:"enumdicname"` // 单位名称(品类)
  727. MGUNITIDNAME string `json:"mgunitidname"` // 单位名称(套保商品)
  728. CurQty float64 `json:"-"` // 今定价量
  729. DiffQty float64 `json:"diffqty"` // 套保品种今变动量
  730. ChangQty float64 `json:"changqty"` // 应套保总量变化量
  731. }
  732. func (r *Ermcp3ExposureHedgeplanDetail) calc() {
  733. r.EnumdicName = mtpcache.GetEnumDicitemName(r.UNITID)
  734. r.MGUNITIDNAME = mtpcache.GetEnumDicitemName(r.GOODSUNITID)
  735. r.CurQty = r.QTY
  736. r.DiffQty = r.QTY * r.CONVERTRATIO
  737. r.ChangQty = r.QTY * r.NEEDHEDGERATIO * r.CONVERTRATIO
  738. }
  739. func (r *Ermcp3ExposureHedgeplanDetail) buildSql() string {
  740. var sqlId utils.SQLVal = "select t.middlegoodsid," +
  741. " t.deliverygoodsid," +
  742. " t.convertratio," +
  743. " s.areauserid userid," +
  744. " to_char(s.hedgeplanid) hedgeplanid," +
  745. " s.hedgeplanno," +
  746. " s.contracttype," +
  747. " s.biztype," +
  748. " s.planqty qty," +
  749. " s.wrstandardid," +
  750. " s.audittradedate tradedate," +
  751. " s.hedgeplanstatus," +
  752. " w.wrstandardname," +
  753. " w.wrstandardcode," +
  754. " w.unitid," +
  755. " mg.middlegoodsname," +
  756. " mg.middlegoodscode," +
  757. " mg.goodsunitid," +
  758. " mg.needhedgeratio," +
  759. " mg.needarbitrageratio" +
  760. " from erms2_wrsconvertdetail t" +
  761. " inner join ermcp_hedgeplan s" +
  762. " on t.deliverygoodsid = s.deliverygoodsid" +
  763. " left join erms_middlegoods mg" +
  764. " on t.middlegoodsid = mg.middlegoodsid" +
  765. " left join wrstandard w" +
  766. " on s.wrstandardid = w.wrstandardid" +
  767. " where t.wrstandardid = 0 and s.hedgeplanstatus in(2,3)"
  768. sqlId.And("s.audittradedate", r.TRADEDATE)
  769. sqlId.And("t.middlegoodsid", r.MIDDLEGOODSID)
  770. sqlId.Join(fmt.Sprintf(" and %v in(s.areauserid, s.tradeuserid)", r.USERID))
  771. return sqlId.String()
  772. }
  773. // GetDataEx 获取敞口套保计划明细
  774. func (r *Ermcp3ExposureHedgeplanDetail) GetDataEx() (interface{}, error) {
  775. sData := make([]Ermcp3ExposureHedgeplanDetail, 0)
  776. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  777. for i := range sData {
  778. sData[i].calc()
  779. }
  780. return sData, err
  781. }
  782. // Ermcp3AreaSpotPLReport 现货报表(日/月/周/季/年)
  783. type Ermcp3AreaSpotPLReport struct {
  784. RECKONDATE string `json:"reckondate" xorm:"RECKONDATE"` // 日照时期(yyyyMMdd)
  785. CYCLETIME string `json:"cycletime" xorm:"'CYCLETIME'"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  786. CYCLETYPE int32 `json:"cycletype" xorm:"'CYCLETYPE'"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  787. AREAUSERID int64 `json:"areauserid" xorm:"AREAUSERID"` // 所属机构\交易用户ID
  788. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 期货账户ID (作废, 默认为0)
  789. WRFACTORTYPEID int64 `json:"wrfactortypeid" xorm:"WRFACTORTYPEID"` // 仓单要素类型ID(212+Unix秒时间戳(10位)+xxxxxx)
  790. CURRENCYID int32 `json:"currencyid" xorm:"CURRENCYID"` // 结算币种ID【原值】
  791. BIZTYPE int32 `json:"biztype" xorm:"BIZTYPE"` // 业务类型 - 1:套保 2:套利
  792. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"DELIVERYGOODSID"` // 现货品种ID
  793. WRSTANDARDID int64 `json:"wrstandardid" xorm:"WRSTANDARDID"` // 现货品类ID
  794. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"SPOTGOODSBRANDID"` // 现货品牌ID
  795. ORIBUYQTY float64 `json:"oribuyqty" xorm:"ORIBUYQTY"` // 期初采购总量
  796. ORIBUYAMOUNT float64 `json:"oribuyamount" xorm:"ORIBUYAMOUNT"` // 期初采购总额
  797. ORISELLQTY float64 `json:"orisellqty" xorm:"ORISELLQTY"` // 期初销售总量
  798. ORISELLAMOUNT float64 `json:"orisellamount" xorm:"ORISELLAMOUNT"` // 期初销售总额
  799. ORIQTY float64 `json:"oriqty" xorm:"ORIQTY"` // 期初量
  800. ORIAVERAGEPRICE float64 `json:"oriaverageprice" xorm:"ORIAVERAGEPRICE"` // 期初均价
  801. ORIAMOUNT float64 `json:"oriamount" xorm:"ORIAMOUNT"` // 期初额
  802. TODAYBUYQTY float64 `json:"todaybuyqty" xorm:"TODAYBUYQTY"` // 今日采购量(今采购量)
  803. TODAYBUYAMOUNT float64 `json:"todaybuyamount" xorm:"TODAYBUYAMOUNT"` // 今日采购额(今采购额)
  804. TODAYBUYAVERAGEPRICE float64 `json:"todaybuyaverageprice" xorm:"TODAYBUYAVERAGEPRICE"` // 今日采购均价
  805. TODAYSELLQTY float64 `json:"todaysellqty" xorm:"TODAYSELLQTY"` // 今日销售量(今销售量)
  806. TODAYSELLAMOUNT float64 `json:"todaysellamount" xorm:"TODAYSELLAMOUNT"` // 今日销售额(今销售额)
  807. TODAYSELLAVERAGEPRICE float64 `json:"todaysellaverageprice" xorm:"TODAYSELLAVERAGEPRICE"` // 今日销售均价
  808. CURBUYQTY float64 `json:"curbuyqty" xorm:"CURBUYQTY"` // 期末采购总量
  809. CURBUYAMOUNT float64 `json:"curbuyamount" xorm:"CURBUYAMOUNT"` // 期末采购总额
  810. CURSELLQTY float64 `json:"cursellqty" xorm:"CURSELLQTY"` // 期末销售总量
  811. CURSELLAMOUNT float64 `json:"cursellamount" xorm:"CURSELLAMOUNT"` // 期末销售总额
  812. CURQTY float64 `json:"curqty" xorm:"CURQTY"` // 期末量
  813. CURAVERAGEPRICE float64 `json:"curaverageprice" xorm:"CURAVERAGEPRICE"` // 期末均价
  814. CURAMOUNT float64 `json:"curamount" xorm:"CURAMOUNT"` // 期末额
  815. CURSPOTPRICE float64 `json:"curspotprice" xorm:"CURSPOTPRICE"` // 参考市价(最新价)
  816. CURMARKETVALUE float64 `json:"curmarketvalue" xorm:"CURMARKETVALUE"` // 参考市值(期末市值)
  817. ACTUALPL float64 `json:"actualpl" xorm:"ACTUALPL"` // 现货损益
  818. FLOATPL float64 `json:"floatpl" xorm:"FLOATPL"` // 浮动损益
  819. UPDATETIME string `json:"updatetime" xorm:"UPDATETIME"` // 更新时间
  820. TODAYINQTY float64 `json:"todayinqty" xorm:"TODAYINQTY"` // 今日入库量(今入库量)
  821. TODAYOUTQTY float64 `json:"todayoutqty" xorm:"TODAYOUTQTY"` // 今日出库量(今出库量)
  822. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货商品代码
  823. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货商品名称
  824. GOODSUNITID int32 `json:"goodsunitid" xorm:"'GOODSUNITID'"` // 现货商品单位id
  825. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  826. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  827. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 品类单位id
  828. BRANDNAME string `json:"brandname" xorm:"'BRANDNAME'"` // 品牌名称
  829. EnumdicName string `json:"enumdicname"` // 现货商品单位名称
  830. UNITIDNAME string `json:"unitidname"` // 品类单位名称
  831. ACCOUNTNAME string `json:"accountname"` // 机构名称
  832. CURRENCYNAME string `json:"currencyname"` // 币种名称
  833. QueryType int32 `json:"-"` // 查询类型 1-日报表 2-周期报表 3-日报表(范围,[开始日期,结束日期])
  834. BeginDate string `json:"-"` // 开始交易日
  835. EndDate string `json:"-"` // 结束交易日
  836. }
  837. func (r *Ermcp3AreaSpotPLReport) calc() {
  838. r.EnumdicName = mtpcache.GetEnumDicitemName(r.GOODSUNITID)
  839. r.UNITIDNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  840. r.ACCOUNTNAME = mtpcache.GetUserNameByUserId(r.AREAUSERID)
  841. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  842. }
  843. func (r *Ermcp3AreaSpotPLReport) buildSql() string {
  844. if r.QueryType == 1 || r.QueryType == 3 {
  845. return r.buildSqlDay()
  846. } else if r.QueryType == 4 {
  847. return r.buildSqlDayDetail()
  848. }
  849. return r.buildSqlCycle()
  850. }
  851. // buildSqlDay 现货日报表查询语句
  852. func (r *Ermcp3AreaSpotPLReport) buildSqlDay() string {
  853. var sqlId utils.SQLVal = "select a.*," +
  854. " g.deliverygoodscode," +
  855. " g.deliverygoodsname," +
  856. " g.goodsunitid," +
  857. " w.wrstandardcode," +
  858. " w.wrstandardname," +
  859. " w.unitid" +
  860. " from (SELECT t.RECKONDATE," +
  861. " t.AREAUSERID," +
  862. " t.CURRENCYID," +
  863. " t.DELIVERYGOODSID," +
  864. " t.WRSTANDARDID," +
  865. " sum(t.ORIBUYQTY) ORIBUYQTY," +
  866. " sum(t.ORIBUYAMOUNT) ORIBUYAMOUNT," +
  867. " sum(t.ORISELLQTY) ORISELLQTY," +
  868. " sum(t.ORISELLAMOUNT) ORISELLAMOUNT," +
  869. " sum(t.ORIQTY) ORIQTY," +
  870. " sum(t.ORIAVERAGEPRICE) ORIAVERAGEPRICE," +
  871. " sum(t.ORIAMOUNT) ORIAMOUNT," +
  872. " sum(t.TODAYBUYQTY) TODAYBUYQTY," +
  873. " sum(t.TODAYBUYAMOUNT) TODAYBUYAMOUNT," +
  874. " sum(t.TODAYBUYAVERAGEPRICE) TODAYBUYAVERAGEPRICE," +
  875. " sum(t.TODAYSELLQTY) TODAYSELLQTY," +
  876. " sum(t.TODAYSELLAMOUNT) TODAYSELLAMOUNT," +
  877. " sum(t.TODAYSELLAVERAGEPRICE) TODAYSELLAVERAGEPRICE," +
  878. " sum(t.CURBUYQTY) CURBUYQTY," +
  879. " sum(t.CURBUYAMOUNT) CURBUYAMOUNT," +
  880. " sum(t.CURSELLQTY) CURSELLQTY," +
  881. " sum(t.CURSELLAMOUNT) CURSELLAMOUNT," +
  882. " sum(t.CURQTY) CURQTY," +
  883. " sum(t.CURAVERAGEPRICE) CURAVERAGEPRICE," +
  884. " sum(t.CURAMOUNT) CURAMOUNT," +
  885. " sum(t.CURSPOTPRICE) CURSPOTPRICE," +
  886. " sum(t.CURMARKETVALUE) CURMARKETVALUE," +
  887. " sum(t.ACTUALPL) ACTUALPL," +
  888. " sum(t.FLOATPL) FLOATPL," +
  889. " sum(t.TODAYINQTY) TODAYINQTY," +
  890. " sum(t.TODAYOUTQTY) TODAYOUTQTY" +
  891. " FROM RECKON_ERMCP_AREASPOTPL t" +
  892. " WHERE 1=1 %v" +
  893. " GROUP BY t.RECKONDATE," +
  894. " t.AREAUSERID," +
  895. " t.CURRENCYID," +
  896. " t.DELIVERYGOODSID," +
  897. " t.WRSTANDARDID) a" +
  898. " LEFT JOIN DELIVERYGOODS g" +
  899. " on a.deliverygoodsid = g.deliverygoodsid" +
  900. " LEFT JOIN WRSTANDARD w" +
  901. " on a.wrstandardid = w.wrstandardid"
  902. var sqlParam utils.SQLVal
  903. sqlParam.And("t.AREAUSERID", r.AREAUSERID)
  904. if r.QueryType == 1 {
  905. sqlParam.And("t.RECKONDATE", r.RECKONDATE)
  906. } else if r.QueryType == 3 {
  907. sqlParam.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  908. }
  909. sqlId.FormatParam(sqlParam.String())
  910. return sqlId.String()
  911. }
  912. func (r *Ermcp3AreaSpotPLReport) buildSqlDayDetail() string {
  913. var sqlId utils.SQLVal = "SELECT t.RECKONDATE," +
  914. " t.AREAUSERID," +
  915. " t.ACCOUNTID," +
  916. " t.WRFACTORTYPEID," +
  917. " t.CURRENCYID," +
  918. " t.BIZTYPE," +
  919. " t.DELIVERYGOODSID," +
  920. " t.WRSTANDARDID," +
  921. " t.SPOTGOODSBRANDID," +
  922. " t.ORIBUYQTY," +
  923. " t.ORIBUYAMOUNT," +
  924. " t.ORISELLQTY," +
  925. " t.ORISELLAMOUNT," +
  926. " t.ORIQTY," +
  927. " t.ORIAVERAGEPRICE," +
  928. " t.ORIAMOUNT," +
  929. " t.TODAYBUYQTY," +
  930. " t.TODAYBUYAMOUNT," +
  931. " t.TODAYBUYAVERAGEPRICE," +
  932. " t.TODAYSELLQTY," +
  933. " t.TODAYSELLAMOUNT," +
  934. " t.TODAYSELLAVERAGEPRICE," +
  935. " t.CURBUYQTY," +
  936. " t.CURBUYAMOUNT," +
  937. " t.CURSELLQTY," +
  938. " t.CURSELLAMOUNT," +
  939. " t.CURQTY," +
  940. " t.CURAVERAGEPRICE," +
  941. " t.CURAMOUNT," +
  942. " t.CURSPOTPRICE," +
  943. " t.CURMARKETVALUE," +
  944. " t.ACTUALPL," +
  945. " t.FLOATPL," +
  946. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  947. " t.TODAYINQTY," +
  948. " t.TODAYOUTQTY," +
  949. " g.deliverygoodscode," +
  950. " g.deliverygoodsname," +
  951. " g.goodsunitid," +
  952. " w.wrstandardcode," +
  953. " w.wrstandardname," +
  954. " w.unitid," +
  955. " dg.dgfactoryitemvalue brandName" +
  956. " FROM RECKON_ERMCP_AREASPOTPL t" +
  957. " LEFT JOIN DELIVERYGOODS g on t.deliverygoodsid=g.deliverygoodsid" +
  958. " LEFT JOIN WRSTANDARD w on t.wrstandardid = w.wrstandardid" +
  959. " LEFT JOIN DGFACTORYITEM dg on t.spotgoodsbrandid=dg.dgfactoryitemid" +
  960. " WHERE 1 = 1"
  961. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  962. sqlId.And("t.RECKONDATE", r.RECKONDATE)
  963. sqlId.And("t.CURRENCYID", r.CURRENCYID)
  964. sqlId.And("t.DELIVERYGOODSID", r.DELIVERYGOODSID)
  965. sqlId.And("t.WRSTANDARDID", r.WRSTANDARDID)
  966. return sqlId.String()
  967. }
  968. // buildSqlCycle 周期报表查询语句
  969. func (r *Ermcp3AreaSpotPLReport) buildSqlCycle() string {
  970. var sqlId utils.SQLVal = "select a.*," +
  971. " g.deliverygoodscode," +
  972. " g.deliverygoodsname," +
  973. " g.goodsunitid," +
  974. " w.wrstandardcode," +
  975. " w.wrstandardname," +
  976. " w.unitid" +
  977. " from (SELECT t.cycletype," +
  978. " t.cycletime," +
  979. " t.AREAUSERID," +
  980. " t.CURRENCYID," +
  981. " t.DELIVERYGOODSID," +
  982. " t.WRSTANDARDID," +
  983. " sum(t.ORIBUYQTY) ORIBUYQTY," +
  984. " sum(t.ORIBUYAMOUNT) ORIBUYAMOUNT," +
  985. " sum(t.ORISELLQTY) ORISELLQTY," +
  986. " sum(t.ORISELLAMOUNT) ORISELLAMOUNT," +
  987. " sum(t.ORIQTY) ORIQTY," +
  988. " sum(t.ORIAVERAGEPRICE) ORIAVERAGEPRICE," +
  989. " sum(t.ORIAMOUNT) ORIAMOUNT," +
  990. " sum(t.TODAYBUYQTY) TODAYBUYQTY," +
  991. " sum(t.TODAYBUYAMOUNT) TODAYBUYAMOUNT," +
  992. " sum(t.TODAYBUYAVERAGEPRICE) TODAYBUYAVERAGEPRICE," +
  993. " sum(t.TODAYSELLQTY) TODAYSELLQTY," +
  994. " sum(t.TODAYSELLAMOUNT) TODAYSELLAMOUNT," +
  995. " sum(t.TODAYSELLAVERAGEPRICE) TODAYSELLAVERAGEPRICE," +
  996. " sum(t.CURBUYQTY) CURBUYQTY," +
  997. " sum(t.CURBUYAMOUNT) CURBUYAMOUNT," +
  998. " sum(t.CURSELLQTY) CURSELLQTY," +
  999. " sum(t.CURSELLAMOUNT) CURSELLAMOUNT," +
  1000. " sum(t.CURQTY) CURQTY," +
  1001. " sum(t.CURAVERAGEPRICE) CURAVERAGEPRICE," +
  1002. " sum(t.CURAMOUNT) CURAMOUNT," +
  1003. " sum(t.CURSPOTPRICE) CURSPOTPRICE," +
  1004. " sum(t.CURMARKETVALUE) CURMARKETVALUE," +
  1005. " sum(t.ACTUALPL) ACTUALPL," +
  1006. " sum(t.FLOATPL) FLOATPL," +
  1007. " sum(t.TODAYINQTY) TODAYINQTY," +
  1008. " sum(t.TODAYOUTQTY) TODAYOUTQTY" +
  1009. " FROM REPORT_ERMCP_AREASPOTPL t" +
  1010. " WHERE 1=1 %v" +
  1011. " GROUP BY t.AREAUSERID," +
  1012. " t.cycletype," +
  1013. " t.cycletime," +
  1014. " t.CURRENCYID," +
  1015. " t.DELIVERYGOODSID," +
  1016. " t.WRSTANDARDID) a" +
  1017. " LEFT JOIN DELIVERYGOODS g" +
  1018. " on a.deliverygoodsid = g.deliverygoodsid" +
  1019. " LEFT JOIN WRSTANDARD w" +
  1020. " on a.wrstandardid = w.wrstandardid"
  1021. var sqlParam utils.SQLVal
  1022. sqlParam.And("t.AREAUSERID", r.AREAUSERID)
  1023. sqlParam.And("t.Cycletype", r.CYCLETYPE)
  1024. sqlParam.And("t.CYCLETIME", r.CYCLETIME)
  1025. sqlId.FormatParam(sqlParam.String())
  1026. return sqlId.String()
  1027. }
  1028. // GetDataEx 获取现货报表(日/月/周/季/年)
  1029. func (r *Ermcp3AreaSpotPLReport) GetDataEx() (interface{}, error) {
  1030. sData := make([]Ermcp3AreaSpotPLReport, 0)
  1031. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1032. for i := range sData {
  1033. sData[i].calc()
  1034. }
  1035. return sData, err
  1036. }
  1037. // Ermcp3FinanceReport 财务报表
  1038. type Ermcp3FinanceReport struct {
  1039. RECKONDATE string `json:"reckondate" xorm:"RECKONDATE"` // 日照时期(yyyyMMdd)
  1040. CYCLETIME string `json:"cycletime" xorm:"CYCLETIME"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  1041. CYCLETYPE int32 `json:"cycletype" xorm:"CYCLETYPE"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  1042. SELLPREINVOICEDAMOUNT float64 `json:"sellpreinvoicedamount" xorm:"SELLPREINVOICEDAMOUNT"` // 销售预开票额(预开票额)
  1043. SELLUNINVOICEDAMOUNT float64 `json:"selluninvoicedamount" xorm:"SELLUNINVOICEDAMOUNT"` // 销售应开票额(应开票额)
  1044. TODAYRECEIVESUM float64 `json:"todayreceivesum" xorm:"TODAYRECEIVESUM"` // 今收款合计
  1045. TODAYPAYSUM float64 `json:"todaypaysum" xorm:"TODAYPAYSUM"` // 今付款合计
  1046. UPDATETIME string `json:"updatetime" xorm:"UPDATETIME"` // 更新时间
  1047. AREAUSERID int64 `json:"areauserid" xorm:"AREAUSERID"` // 所属机构\交易用户ID
  1048. CURRENCYID int32 `json:"currencyid" xorm:"CURRENCYID"` // 结算币种ID
  1049. BIZTYPE int32 `json:"biztype" xorm:"BIZTYPE"` // 业务类型 - 1:套保 2:套利
  1050. BUYTODAYSETTLEAMOUNT float64 `json:"buytodaysettleamount" xorm:"BUYTODAYSETTLEAMOUNT"` // 采购今付款额(今付货款额)
  1051. SELLTODAYSETTLEAMOUNT float64 `json:"selltodaysettleamount" xorm:"SELLTODAYSETTLEAMOUNT"` // 销售今收款额(今收货款额)
  1052. BUYTODAYREFUNDAMOUNT float64 `json:"buytodayrefundamount" xorm:"BUYTODAYREFUNDAMOUNT"` // 采购今收退款额(今收退款额)
  1053. SELLTODAYREFUNDAMOUNT float64 `json:"selltodayrefundamount" xorm:"SELLTODAYREFUNDAMOUNT"` // 销售今付退款额(今付退款额)
  1054. SELLTODAYINVOICEAMOUNT float64 `json:"selltodayinvoiceamount" xorm:"SELLTODAYINVOICEAMOUNT"` // 销售今开票额(今开票额)
  1055. BUYTODAYINVOICEAMOUNT float64 `json:"buytodayinvoiceamount" xorm:"BUYTODAYINVOICEAMOUNT"` // 采购今收票额(今收票额)
  1056. BUYPREPAIDAMOUNT float64 `json:"buyprepaidamount" xorm:"BUYPREPAIDAMOUNT"` // 采购预付款额(预付货款额)
  1057. BUYUNPAIDAMOUNT float64 `json:"buyunpaidamount" xorm:"BUYUNPAIDAMOUNT"` // 采购应付款额(应付货款额)
  1058. BUYPREINVOICEDAMOUNT float64 `json:"buypreinvoicedamount" xorm:"BUYPREINVOICEDAMOUNT"` // 采购预收票额(预收票额)
  1059. BUYUNINVOICEDAMOUNT float64 `json:"buyuninvoicedamount" xorm:"BUYUNINVOICEDAMOUNT"` // 采购应收票额(应收票额)
  1060. SELLPREPAIDAMOUNT float64 `json:"sellprepaidamount" xorm:"SELLPREPAIDAMOUNT"` // 销售预收款额(预收货款额)
  1061. SELLUNPAIDAMOUNT float64 `json:"sellunpaidamount" xorm:"SELLUNPAIDAMOUNT"` // 销售应收款额(应收货款额)
  1062. WRFACTORTYPEID int64 `json:"wrfactortypeid" xorm:"WRFACTORTYPEID"` // 仓单要素类型ID(212+Unix秒时间戳(10位)+xxxxxx)
  1063. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"DELIVERYGOODSID"` // 现货品种ID
  1064. WRSTANDARDID int64 `json:"wrstandardid" xorm:"WRSTANDARDID"` // 现货商品ID
  1065. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"SPOTGOODSBRANDID"` // 现货品牌ID
  1066. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  1067. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  1068. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  1069. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  1070. BRANDNAME string `json:"brandname" xorm:"'BRANDNAME'"` // 品牌名称
  1071. CURRENCYNAME string `json:"currencyname"` // 币种名称
  1072. QueryType int32 `json:"-"` // 查询类型 1-日报表 2-周期报表 3-日报表(范围,[开始日期,结束日期])
  1073. BeginDate string `json:"-"` // 开始交易日
  1074. EndDate string `json:"-"` // 结束交易日
  1075. }
  1076. func (r *Ermcp3FinanceReport) calc() {
  1077. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  1078. }
  1079. func (r *Ermcp3FinanceReport) buildSql() string {
  1080. if r.QueryType == 1 || r.QueryType == 3 {
  1081. return r.buildSqlDay()
  1082. } else if r.QueryType == 4 {
  1083. return r.buildSqlDayDetail()
  1084. }
  1085. return r.buildSqlCycle()
  1086. }
  1087. // buildSqlDay 财务日报表查询语句
  1088. func (r *Ermcp3FinanceReport) buildSqlDay() string {
  1089. var sqlId utils.SQLVal = "SELECT t.SELLPREINVOICEDAMOUNT," +
  1090. " t.SELLUNINVOICEDAMOUNT," +
  1091. " t.TODAYRECEIVESUM," +
  1092. " t.TODAYPAYSUM," +
  1093. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  1094. " t.RECKONDATE," +
  1095. " t.AREAUSERID," +
  1096. " t.CURRENCYID," +
  1097. " t.BIZTYPE," +
  1098. " t.BUYTODAYSETTLEAMOUNT," +
  1099. " t.BUYTODAYREFUNDAMOUNT," +
  1100. " t.BUYPREPAIDAMOUNT," +
  1101. " t.BUYUNPAIDAMOUNT," +
  1102. " t.BUYTODAYINVOICEAMOUNT," +
  1103. " t.BUYPREINVOICEDAMOUNT," +
  1104. " t.BUYUNINVOICEDAMOUNT," +
  1105. " t.SELLTODAYSETTLEAMOUNT," +
  1106. " t.SELLTODAYREFUNDAMOUNT," +
  1107. " t.SELLPREPAIDAMOUNT," +
  1108. " t.SELLUNPAIDAMOUNT," +
  1109. " t.SELLTODAYINVOICEAMOUNT" +
  1110. " FROM RECKON_ERMCP_AREAFINANCE t" +
  1111. " WHERE 1 = 1"
  1112. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  1113. if r.QueryType == 1 {
  1114. sqlId.And("t.RECKONDATE", r.RECKONDATE)
  1115. } else if r.QueryType == 3 {
  1116. sqlId.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  1117. }
  1118. return sqlId.String()
  1119. }
  1120. // buildSqlDayDetail 财务日报表明细查询语句
  1121. func (r *Ermcp3FinanceReport) buildSqlDayDetail() string {
  1122. var sqlId utils.SQLVal = "SELECT t.RECKONDATE," +
  1123. " t.AREAUSERID," +
  1124. " t.CURRENCYID," +
  1125. " t.BIZTYPE," +
  1126. " t.WRFACTORTYPEID," +
  1127. " t.DELIVERYGOODSID," +
  1128. " t.WRSTANDARDID," +
  1129. " t.SPOTGOODSBRANDID," +
  1130. " t.BUYTODAYSETTLEAMOUNT," +
  1131. " t.BUYTODAYREFUNDAMOUNT," +
  1132. " t.BUYPREPAIDAMOUNT," +
  1133. " t.BUYUNPAIDAMOUNT," +
  1134. " t.BUYTODAYINVOICEAMOUNT," +
  1135. " t.BUYPREINVOICEDAMOUNT," +
  1136. " t.BUYUNINVOICEDAMOUNT," +
  1137. " t.SELLTODAYSETTLEAMOUNT," +
  1138. " t.SELLTODAYREFUNDAMOUNT," +
  1139. " t.SELLPREPAIDAMOUNT," +
  1140. " t.SELLUNPAIDAMOUNT," +
  1141. " t.SELLTODAYINVOICEAMOUNT," +
  1142. " t.SELLPREINVOICEDAMOUNT," +
  1143. " t.SELLUNINVOICEDAMOUNT," +
  1144. " t.TODAYRECEIVESUM," +
  1145. " t.TODAYPAYSUM," +
  1146. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  1147. " g.deliverygoodscode," +
  1148. " g.deliverygoodsname," +
  1149. " w.wrstandardcode," +
  1150. " w.wrstandardname," +
  1151. " dg.dgfactoryitemvalue brandName" +
  1152. " FROM RECKON_ERMCP_AFINANCESUB t" +
  1153. " LEFT JOIN DELIVERYGOODS g on t.deliverygoodsid=g.deliverygoodsid" +
  1154. " LEFT JOIN WRSTANDARD w on t.wrstandardid=w.wrstandardid" +
  1155. " LEFT JOIN DGFACTORYITEM dg on t.spotgoodsbrandid=dg.dgfactoryitemid" +
  1156. " WHERE 1 = 1"
  1157. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  1158. sqlId.And("t.RECKONDATE", r.RECKONDATE)
  1159. sqlId.And("t.CURRENCYID", r.CURRENCYID)
  1160. return sqlId.String()
  1161. }
  1162. // buildSqlCycle 财务周期报表查询语句
  1163. func (r *Ermcp3FinanceReport) buildSqlCycle() string {
  1164. var sqlId utils.SQLVal = "SELECT t.SELLPREINVOICEDAMOUNT," +
  1165. " t.SELLUNINVOICEDAMOUNT," +
  1166. " t.TODAYRECEIVESUM," +
  1167. " t.TODAYPAYSUM," +
  1168. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  1169. " t.CYCLETIME," +
  1170. " t.CYCLETYPE," +
  1171. " t.AREAUSERID," +
  1172. " t.CURRENCYID," +
  1173. " t.BIZTYPE," +
  1174. " t.BUYTODAYSETTLEAMOUNT," +
  1175. " t.BUYTODAYREFUNDAMOUNT," +
  1176. " t.BUYPREPAIDAMOUNT," +
  1177. " t.BUYUNPAIDAMOUNT," +
  1178. " t.BUYTODAYINVOICEAMOUNT," +
  1179. " t.BUYPREINVOICEDAMOUNT," +
  1180. " t.BUYUNINVOICEDAMOUNT," +
  1181. " t.SELLTODAYSETTLEAMOUNT," +
  1182. " t.SELLTODAYREFUNDAMOUNT," +
  1183. " t.SELLPREPAIDAMOUNT," +
  1184. " t.SELLUNPAIDAMOUNT," +
  1185. " t.SELLTODAYINVOICEAMOUNT" +
  1186. " FROM REPORT_ERMCP_AREAFINANCE t" +
  1187. " WHERE 1 = 1"
  1188. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  1189. sqlId.And("t.CYCLETYPE", r.CYCLETYPE)
  1190. sqlId.And("t.CYCLETIME", r.CYCLETIME)
  1191. return sqlId.String()
  1192. }
  1193. // GetDataEx 获取财务报表
  1194. func (r *Ermcp3FinanceReport) GetDataEx() (interface{}, error) {
  1195. sData := make([]Ermcp3FinanceReport, 0)
  1196. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1197. for i := range sData {
  1198. sData[i].calc()
  1199. }
  1200. return sData, err
  1201. }
  1202. // Ermcp3AreaStockReport 库存报表
  1203. type Ermcp3AreaStockReport struct {
  1204. RECKONDATE string `json:"reckondate" xorm:"RECKONDATE"` // 日照时期(yyyyMMdd)
  1205. CYCLETIME string `json:"cycletime" xorm:"CYCLETIME"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  1206. CYCLETYPE int32 `json:"cycletype" xorm:"CYCLETYPE"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  1207. USERID int64 `json:"userid" xorm:"'USERID'"` // 机构ID
  1208. WRSTANDARDID int32 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 品类ID
  1209. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'"` // 现货品牌ID
  1210. WAREHOUSEINFOID string `json:"warehouseinfoid" xorm:"'WAREHOUSEINFOID'"` // 仓库ID
  1211. ORISTOCK float64 `json:"oristock" xorm:"'ORISTOCK'"` // 期初库存量
  1212. CURSTOCK float64 `json:"curstock" xorm:"'CURSTOCK'"` // 期末库存量
  1213. TODAYBUYINQTY float64 `json:"todaybuyinqty" xorm:"'TODAYBUYINQTY'"` // 今采购入库量
  1214. TODAYPRODUCEINQTY float64 `json:"todayproduceinqty" xorm:"'TODAYPRODUCEINQTY'"` // 今内部入库量
  1215. TODAYSELLOUTQTY float64 `json:"todayselloutqty" xorm:"'TODAYSELLOUTQTY'"` // 今销售出库量
  1216. TODAYPRODUCEOUTQTY float64 `json:"todayproduceoutqty" xorm:"'TODAYPRODUCEOUTQTY'"` // 今内部出库量
  1217. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  1218. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  1219. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  1220. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 品类单位id
  1221. BRANDNAME string `json:"brandname" xorm:"'BRANDNAME'"` // 品牌名称
  1222. WAREHOUSENAME string `json:"warehousename" xorm:"'WAREHOUSENAME'"` // 仓库名称
  1223. WAREHOUSECODE string `json:"warehousecode" xorm:"'WAREHOUSECODE'"` // 仓库代码
  1224. WAREHOUSETYPE int32 `json:"warehousetype" xorm:"'WAREHOUSETYPE'"` // 仓库类型 - 1 厂库 2 自有库 3 合作库
  1225. USERNAME string `json:"username"` // 机构名称
  1226. ENUMDICNAME string `json:"enumdicname"` // 单位名称
  1227. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货品种id
  1228. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  1229. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  1230. GOODSUNITID int32 `json:"goodsunitid" xorm:"'GOODSUNITID'"` // 现货单位id
  1231. UNBUYINQTY float64 `json:"unbuyinqty"` // 采购未入库量(数据库未找到相关字段?)
  1232. UNSELLOUTQTY float64 `json:"unselloutqty"` // 销售未出库量(数据库未找到相关字段?)
  1233. DiffQty float64 `json:"diffqty"` // 库存变化量 = 期末 - 期初
  1234. QueryType int32 `json:"-"` // 查询类型 1-日报表 2-周期报表 3-日报表(范围,[开始日期,结束日期])
  1235. BeginDate string `json:"-"` // 开始交易日
  1236. EndDate string `json:"-"` // 结束交易日
  1237. }
  1238. func (r *Ermcp3AreaStockReport) calc() {
  1239. r.USERNAME = mtpcache.GetUserNameByUserId(r.USERID)
  1240. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  1241. r.DiffQty = r.CURSTOCK - r.ORISTOCK
  1242. }
  1243. func (r *Ermcp3AreaStockReport) buildSql() string {
  1244. if r.QueryType == 1 || r.QueryType == 3 {
  1245. return r.buildSqlDay()
  1246. }
  1247. return r.buildSqlCycle()
  1248. }
  1249. func (r *Ermcp3AreaStockReport) buildSqlDay() string {
  1250. var sqlId utils.SQLVal = "SELECT a.*," +
  1251. " w.wrstandardname," +
  1252. " w.wrstandardcode," +
  1253. " w.unitid," +
  1254. " gb.dgfactoryitemvalue brandname," +
  1255. " g.deliverygoodsid," +
  1256. " g.deliverygoodscode," +
  1257. " g.deliverygoodsname," +
  1258. " g.goodsunitid" +
  1259. " from (SELECT t.RECKONDATE," +
  1260. " t.USERID," +
  1261. " t.DELIVERYGOODSID," +
  1262. " t.WRSTANDARDID," +
  1263. " t.SPOTGOODSBRANDID," +
  1264. " sum(t.ORISTOCK) ORISTOCK," +
  1265. " sum(t.CURSTOCK) CURSTOCK," +
  1266. " sum(t.TODAYBUYINQTY) TODAYBUYINQTY," +
  1267. " sum(t.TODAYPRODUCEINQTY) TODAYPRODUCEINQTY," +
  1268. " sum(t.TODAYSELLOUTQTY) TODAYSELLOUTQTY," +
  1269. " sum(t.TODAYPRODUCEOUTQTY) TODAYPRODUCEOUTQTY" +
  1270. " FROM RECKON_ERMCP_AREASTOCK t" +
  1271. " WHERE 1 = 1 %v" +
  1272. " GROUP BY t.RECKONDATE," +
  1273. " t.USERID," +
  1274. " t.DELIVERYGOODSID," +
  1275. " t.WRSTANDARDID," +
  1276. " t.SPOTGOODSBRANDID) a" +
  1277. " LEFT JOIN WRSTANDARD w" +
  1278. " on a.wrstandardid = w.wrstandardid" +
  1279. " LEFT JOIN dgfactoryitem gb" +
  1280. " on a.spotgoodsbrandid = gb.dgfactoryitemid" +
  1281. " LEFT JOIN deliverygoods g" +
  1282. " on a.deliverygoodsid = g.deliverygoodsid"
  1283. var sqlParam utils.SQLVal
  1284. sqlParam.And("t.USERID", r.USERID)
  1285. if r.QueryType == 1 {
  1286. sqlParam.And("t.RECKONDATE", r.RECKONDATE)
  1287. } else if r.QueryType == 3 {
  1288. sqlParam.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  1289. }
  1290. // 现货商品id
  1291. sqlParam.AndEx("t.DELIVERYGOODSID", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  1292. // 品类id
  1293. sqlParam.AndEx("t.WRSTANDARDID", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  1294. // 品牌id
  1295. sqlParam.AndEx("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  1296. sqlId.FormatParam(sqlParam.String())
  1297. return sqlId.String()
  1298. }
  1299. func (r *Ermcp3AreaStockReport) buildSqlDayDetail() string {
  1300. var sqlId utils.SQLVal = "SELECT t.TODAYBUYINQTY," +
  1301. " t.TODAYPRODUCEINQTY," +
  1302. " t.reckondate," +
  1303. " t.TODAYSELLOUTQTY," +
  1304. " t.TODAYPRODUCEOUTQTY," +
  1305. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  1306. " t.USERID," +
  1307. " t.WRSTANDARDID," +
  1308. " t.SPOTGOODSBRANDID," +
  1309. " t.WAREHOUSEINFOID," +
  1310. " t.ORISTOCK," +
  1311. " t.CURSTOCK," +
  1312. " w.wrstandardname," +
  1313. " w.wrstandardcode," +
  1314. " w.unitid," +
  1315. " gb.dgfactoryitemvalue brandname," +
  1316. " h.warehousename," +
  1317. " h.warehousecode," +
  1318. " h.warehousetype," +
  1319. " g.deliverygoodsid," +
  1320. " g.deliverygoodscode," +
  1321. " g.deliverygoodsname," +
  1322. " g.goodsunitid" +
  1323. " FROM RECKON_ERMCP_AREASTOCK t" +
  1324. " LEFT JOIN WRSTANDARD w" +
  1325. " on t.wrstandardid = w.wrstandardid" +
  1326. " LEFT JOIN dgfactoryitem gb" +
  1327. " on t.spotgoodsbrandid = gb.dgfactoryitemid" +
  1328. " LEFT JOIN deliverygoods g" +
  1329. " on t.deliverygoodsid = g.deliverygoodsid" +
  1330. " LEFT JOIN WAREHOUSEINFO h" +
  1331. " on t.warehouseinfoid = h.autoid" +
  1332. " WHERE 1 = 1"
  1333. sqlId.And("t.USERID", r.USERID)
  1334. if r.QueryType == 1 {
  1335. sqlId.And("t.RECKONDATE", r.RECKONDATE)
  1336. } else if r.QueryType == 3 {
  1337. sqlId.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  1338. }
  1339. // 现货商品id
  1340. sqlId.AndEx("t.DELIVERYGOODSID", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  1341. // 品类id
  1342. sqlId.AndEx("t.WRSTANDARDID", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  1343. // 品牌id
  1344. sqlId.AndEx("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  1345. return sqlId.String()
  1346. }
  1347. func (r *Ermcp3AreaStockReport) buildSqlCycle() string {
  1348. var sqlId utils.SQLVal = "SELECT a.*," +
  1349. " w.wrstandardname," +
  1350. " w.wrstandardcode," +
  1351. " w.unitid," +
  1352. " gb.dgfactoryitemvalue brandname," +
  1353. " g.deliverygoodsid," +
  1354. " g.deliverygoodscode," +
  1355. " g.deliverygoodsname," +
  1356. " g.goodsunitid" +
  1357. " from (SELECT t.cycletype," +
  1358. " t.cycletime," +
  1359. " t.USERID," +
  1360. " t.DELIVERYGOODSID," +
  1361. " t.WRSTANDARDID," +
  1362. " t.SPOTGOODSBRANDID," +
  1363. " sum(t.ORISTOCK) ORISTOCK," +
  1364. " sum(t.CURSTOCK) CURSTOCK," +
  1365. " sum(t.TODAYBUYINQTY) TODAYBUYINQTY," +
  1366. " sum(t.TODAYPRODUCEINQTY) TODAYPRODUCEINQTY," +
  1367. " sum(t.TODAYSELLOUTQTY) TODAYSELLOUTQTY," +
  1368. " sum(t.TODAYPRODUCEOUTQTY) TODAYPRODUCEOUTQTY" +
  1369. " FROM REPORT_ERMCP_AREASTOCK t" +
  1370. " WHERE 1 = 1 %v" +
  1371. " GROUP BY t.cycletype," +
  1372. " t.cycletime," +
  1373. " t.USERID," +
  1374. " t.DELIVERYGOODSID," +
  1375. " t.WRSTANDARDID," +
  1376. " t.SPOTGOODSBRANDID) a" +
  1377. " LEFT JOIN WRSTANDARD w" +
  1378. " on a.wrstandardid = w.wrstandardid" +
  1379. " LEFT JOIN dgfactoryitem gb" +
  1380. " on a.spotgoodsbrandid = gb.dgfactoryitemid" +
  1381. " LEFT JOIN deliverygoods g" +
  1382. " on a.deliverygoodsid = g.deliverygoodsid"
  1383. var sqlParam utils.SQLVal
  1384. sqlParam.And("t.USERID", r.USERID)
  1385. sqlParam.And("t.cycletype", r.CYCLETYPE)
  1386. sqlParam.And("t.cycletime", r.CYCLETIME)
  1387. // 现货商品id
  1388. sqlParam.AndEx("t.DELIVERYGOODSID", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  1389. // 品类id
  1390. sqlParam.AndEx("t.WRSTANDARDID", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  1391. // 品牌id
  1392. sqlParam.AndEx("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  1393. sqlId.FormatParam(sqlParam.String())
  1394. return sqlId.String()
  1395. }
  1396. // GetDataEx 查询库存报表
  1397. func (r *Ermcp3AreaStockReport) GetDataEx() (interface{}, error) {
  1398. sData := make([]ErmcpAreaStockReport, 0)
  1399. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1400. if err == nil {
  1401. for i := range sData {
  1402. sData[i].calc()
  1403. }
  1404. }
  1405. return sData, err
  1406. }
  1407. // Ermcp3ArealSumPL 损益汇总表
  1408. type Ermcp3ArealSumPL struct {
  1409. RECKONDATE string `json:"reckondate" xorm:"RECKONDATE"` // 日照时期(yyyyMMdd)
  1410. CYCLETIME string `json:"cycletime" xorm:"'CYCLETIME'"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  1411. CYCLETYPE int32 `json:"cycletype" xorm:"'CYCLETYPE'"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  1412. AREAUSERID int64 `json:"areauserid" xorm:"AREAUSERID"` // 所属机构\交易用户ID
  1413. MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"MIDDLEGOODSID"` // 套保品种ID(SEQ_ERMS_MIDDLEGOODS)
  1414. CURRENCYID int32 `json:"currencyid" xorm:"CURRENCYID"` // 结算币种ID
  1415. SPOTACTUALPL float64 `json:"spotactualpl" xorm:"SPOTACTUALPL"` // 现货损益
  1416. SPOTFLOATPL float64 `json:"spotfloatpl" xorm:"SPOTFLOATPL"` // 现货浮动损益
  1417. FUTUREACTUALPL float64 `json:"futureactualpl" xorm:"FUTUREACTUALPL"` // 期货损益
  1418. FUTUREFLOATPL float64 `json:"futurefloatpl" xorm:"FUTUREFLOATPL"` // 期货浮动损益
  1419. SUMACTUALPL float64 `json:"sumactualpl" xorm:"SUMACTUALPL"` // 实际损益 = (ActualPL + FutureActualPL)
  1420. SUMPL float64 `json:"sumpl" xorm:"'SUMPL'"` // 汇总损益
  1421. UPDATETIME string `json:"updatetime" xorm:"UPDATETIME"` // 更新时间
  1422. CURRENCYNAME string `json:"currencyname"` // 币种名称
  1423. QueryType int32 `json:"-"` // 查询类型 1-日报表 2-周期报表 3-日报表(范围,[开始日期,结束日期])
  1424. BeginDate string `json:"-"` // 开始交易日
  1425. EndDate string `json:"-"` // 结束交易日
  1426. }
  1427. func (r *Ermcp3ArealSumPL) calc() {
  1428. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  1429. }
  1430. func (r *Ermcp3ArealSumPL) buildSql() string {
  1431. if r.QueryType == 1 || r.QueryType == 3 {
  1432. return r.buildSqlDay()
  1433. } else if r.QueryType == 4 {
  1434. return r.buildSqlDayDetail()
  1435. }
  1436. return r.buildSqlCycle()
  1437. }
  1438. // buildSqlDay 损益汇总日报表(需要汇总维度)
  1439. func (r *Ermcp3ArealSumPL) buildSqlDay() string {
  1440. var sqlId utils.SQLVal = "SELECT t.RECKONDATE," +
  1441. " t.AREAUSERID," +
  1442. " t.CURRENCYID," +
  1443. " sum(t.SPOTACTUALPL) SPOTACTUALPL," +
  1444. " sum(t.SPOTFLOATPL) SPOTFLOATPL," +
  1445. " sum(t.FUTUREACTUALPL) FUTUREACTUALPL," +
  1446. " sum(t.FUTUREFLOATPL) FUTUREFLOATPL," +
  1447. " sum(t.SUMACTUALPL) SUMACTUALPL," +
  1448. " sum(t.SUMPL) SUMPL" +
  1449. " FROM RECKON_ERMCP_AREASUMPL t" +
  1450. " WHERE 1 = 1"
  1451. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  1452. if r.QueryType == 1 {
  1453. sqlId.And("t.RECKONDATE", r.RECKONDATE)
  1454. } else if r.QueryType == 3 {
  1455. sqlId.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  1456. }
  1457. sqlId.Join(" GROUP BY t.RECKONDATE, t.AREAUSERID, t.CURRENCYID")
  1458. return sqlId.String()
  1459. }
  1460. func (r *Ermcp3ArealSumPL) buildSqlDayDetail() string {
  1461. var sqlId utils.SQLVal = "SELECT t.RECKONDATE," +
  1462. " t.AREAUSERID," +
  1463. " t.MIDDLEGOODSID," +
  1464. " t.CURRENCYID," +
  1465. " t.SPOTACTUALPL," +
  1466. " t.SPOTFLOATPL," +
  1467. " t.FUTUREACTUALPL," +
  1468. " t.FUTUREFLOATPL," +
  1469. " t.SUMACTUALPL," +
  1470. " t.SUMPL," +
  1471. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME" +
  1472. " FROM RECKON_ERMCP_AREASUMPL t" +
  1473. " WHERE 1 = 1"
  1474. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  1475. sqlId.And("t.RECKONDATE", r.RECKONDATE)
  1476. sqlId.And("t.CURRENCYID", r.CURRENCYID)
  1477. return sqlId.String()
  1478. }
  1479. func (r *Ermcp3ArealSumPL) buildSqlCycle() string {
  1480. var sqlId utils.SQLVal = "SELECT t.AREAUSERID," +
  1481. " t.CYCLETIME," +
  1482. " t.CYCLETYPE," +
  1483. " t.CURRENCYID," +
  1484. " sum(t.SPOTACTUALPL) SPOTACTUALPL," +
  1485. " sum(t.SPOTFLOATPL) SPOTFLOATPL," +
  1486. " sum(t.FUTUREACTUALPL) FUTUREACTUALPL," +
  1487. " sum(t.FUTUREFLOATPL) FUTUREFLOATPL," +
  1488. " sum(t.SUMACTUALPL) SUMACTUALPL," +
  1489. " sum(t.SUMPL) SUMPL" +
  1490. " FROM REPORT_ERMCP_AREASUMPL t" +
  1491. " WHERE 1 = 1"
  1492. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  1493. sqlId.And("t.cycletype", r.CYCLETYPE)
  1494. sqlId.And("t.cycletime", r.CYCLETIME)
  1495. sqlId.Join(" GROUP BY t.AREAUSERID, t.CURRENCYID, t.CYCLETIME, t.CYCLETYPE")
  1496. return sqlId.String()
  1497. }
  1498. // GetDataEx 获取损益汇总表
  1499. func (r *Ermcp3ArealSumPL) GetDataEx() (interface{}, error) {
  1500. sData := make([]Ermcp3ArealSumPL, 0)
  1501. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1502. for i := range sData {
  1503. sData[i].calc()
  1504. }
  1505. return sData, err
  1506. }