ermcp3Report.go 108 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185
  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. "strings"
  13. )
  14. // Ermcp3ReportOPLog 报表合同操作记录通用查询
  15. type Ermcp3ReportOPLog struct {
  16. LOGID string `json:"logid" xorm:"'lOGID'"` // 流水ID(604+Unix秒时间戳(10位)+xxxxxx)
  17. BIZTYPE int32 `json:"biztype" xorm:"'BIZTYPE'"` // 业务类型 - 1:套保计划 2:现货合同
  18. OPERATELOGTYPE int32 `json:"operatelogtype" xorm:"'OPERATELOGTYPE'"` // 操作流水类型 -
  19. RELATEDID string `json:"relatedid" xorm:"'RELATEDID'"` // 现货合同ID\套保计划
  20. LOGVALUE string `json:"logvalue" xorm:"'LOGVALUE'"` // 数值
  21. LOGDATETIME string `json:"logdatetime" xorm:"'LOGDATETIME'"` // 流水日期(时间)
  22. TRADEDATE string `json:"tradedate" xorm:"'TRADEDATE'"` // 交易日(yyyyMMdd)
  23. APPLYID int64 `json:"applyid" xorm:"'APPLYID'"` // 操作人
  24. CONTRACTTYPE int32 `json:"contracttype" xorm:"'CONTRACTTYPE'"` // 现货合同类型 - 1:采购 -1:销售
  25. USERID int64 `json:"userid" xorm:"'USERID'"` // 机构ID
  26. RELATEDNO string `json:"relatedno" xorm:"'RELATEDNO'"` // 合同编号
  27. UNITID int32 `json:"-" xorm:"'UNITID'"` // 现货商品单位id
  28. ENUMDICNAME string `json:"enumdicName"` // 单位名称
  29. OPTYPENAME string `json:"optypename"` // 流水类型名称
  30. LOGTYPENAME string `json:"logtypename"` // 合同类型(名称)
  31. APPLYNAME string `json:"applyname"` // 操作人名称
  32. BRANDNAME string `json:"brandname" xorm:"'brandname'"` // 品牌名称
  33. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货品种id
  34. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  35. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  36. WRSTANDARDID int32 `json:"wrstandardid" xorm:"'wrstandardid'"` // 品类id
  37. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'wrstandardcode'"` // 品类代码
  38. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'wrstandardname'"` // 品类名称
  39. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'"` // 品牌id
  40. LogTypeFilter string `json:"-"` // 查询日志类型, 逗号隔开(如 1,2,4)
  41. }
  42. // Calc 处理数据
  43. func (r *Ermcp3ReportOPLog) Calc() {
  44. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  45. r.APPLYNAME = mtpcache.GetUserNameByUserId(r.APPLYID)
  46. if r.APPLYNAME == "" {
  47. // APPLYID 可能存的是loginId
  48. r.APPLYNAME = mtpcache.GetLoginCodeByLoginId(r.APPLYID)
  49. }
  50. //1:点价价格 2:点价数量 3:结算量 4:其它费用 5:追加保证金 6溢短金额 7:调整金额 8:付款金额 9:收款金额 10:退款金额
  51. //11:收票金额 12:开票金额 13:提交审核(合同) 14:审核通过(合同) 15:审核拒绝(合同) 16:合同撤回 17:提交审核(计划)
  52. //18:审核通过(计划) 19:审核拒绝(计划) 20:计划撤回 21:正常完结(合同) 22:异常终止(合同) 23:退还保证金
  53. //24:采购入库 25:销售出库 26:生产入库 27:生产出库
  54. // 数据库注释与返回值映身关系: 结算量->确定量, 收款->收款金额, 退款->退款金额, 付款->付款金额, 收票->收票金额, 开票->开票金额
  55. sDes := []string{"点价价格", "点价数量", "确定量", "其它费用", "追加保证金", "溢短金额", "调整金额", "付款", "收款", "退款",
  56. "收票", "开票", "提交审核(合同)", "审核通过(合同)", "审核拒绝(合同)", "合同撤回", "提交审核(计划)",
  57. "审核通过(计划)", "审核拒绝(计划)", "计划撤回", "正常完结(合同)", "异常终止(合同)", "退还保证金",
  58. "采购入库", "销售出库", "生产入库", "生产出库"}
  59. if r.OPERATELOGTYPE >= 1 && r.OPERATELOGTYPE <= 27 {
  60. r.OPTYPENAME = sDes[r.OPERATELOGTYPE-1]
  61. }
  62. // 收款款项:采购合同的退款、销售合同的收款应用正数显示,付款款项:采购合同的付款、销售合同的退款应用负数显示
  63. if r.CONTRACTTYPE == 1 {
  64. r.LOGTYPENAME = "采购"
  65. // 采购合同/退款 正数
  66. if r.OPERATELOGTYPE == 10 && len(r.LOGVALUE) > 0 {
  67. if r.LOGVALUE[0] == '-' {
  68. r.LOGVALUE = r.LOGVALUE[1:]
  69. }
  70. }
  71. // 采购合同/付款 负数
  72. if r.OPERATELOGTYPE == 8 && len(r.LOGVALUE) > 0 {
  73. if r.LOGVALUE[0] != '-' {
  74. r.LOGVALUE = "-" + r.LOGVALUE
  75. }
  76. }
  77. } else if r.CONTRACTTYPE == -1 {
  78. r.LOGTYPENAME = "销售"
  79. // 销售合同/收款 正数
  80. if r.OPERATELOGTYPE == 9 && len(r.LOGVALUE) > 0 {
  81. if r.LOGVALUE[0] == '-' {
  82. r.LOGVALUE = r.LOGVALUE[1:]
  83. }
  84. }
  85. // 销售合同/退款 负数
  86. if r.OPERATELOGTYPE == 10 && len(r.LOGVALUE) > 0 {
  87. if r.LOGVALUE[0] != '-' {
  88. r.LOGVALUE = "-" + r.LOGVALUE
  89. }
  90. }
  91. }
  92. // 去除多余的0,最后4个0
  93. if r.LOGVALUE[len(r.LOGVALUE)-4:] == "0000" {
  94. r.LOGVALUE = r.LOGVALUE[:len(r.LOGVALUE)-4]
  95. }
  96. if r.BIZTYPE == 1 {
  97. r.LOGTYPENAME += "计划"
  98. } else if r.BIZTYPE == 2 {
  99. r.LOGTYPENAME += "合同"
  100. }
  101. }
  102. func (r *Ermcp3ReportOPLog) buildSql() string {
  103. var sqlId utils.SQLVal = "SELECT to_char(t.LOGID) LOGID," +
  104. " t.BIZTYPE," +
  105. " t.OPERATELOGTYPE," +
  106. " to_char(t.RELATEDID) RELATEDID," +
  107. " t.LOGVALUE," +
  108. " to_char(t.LOGDATETIME, 'yyyy-mm-dd hh24:mi:ss') LOGDATETIME," +
  109. " t.TRADEDATE," +
  110. " t.APPLYID," +
  111. " t.CONTRACTTYPE," +
  112. " t.USERID," +
  113. " t.wrstandardid," +
  114. " s.contractno relatedno," +
  115. " s.spotgoodsbrandid," +
  116. " g.deliverygoodsid," +
  117. " g.deliverygoodscode," +
  118. " g.deliverygoodsname," +
  119. " g.goodsunitid unitid," +
  120. " gb.dgfactoryitemvalue brandname," +
  121. " s.accountid," +
  122. " w.wrstandardcode," +
  123. " w.wrstandardname" +
  124. " FROM ERMCP_CONTRACTOPERATELOG t" +
  125. " inner join ermcp_spotcontract s" +
  126. " on t.RELATEDID = s.spotcontractid" +
  127. " left join deliverygoods g" +
  128. " on t.deliverygoodsid = g.deliverygoodsid" +
  129. " left join wrstandard w on t.wrstandardid=w.wrstandardid" +
  130. " left join dgfactoryitem gb" +
  131. " on s.spotgoodsbrandid = gb.dgfactoryitemid" +
  132. " WHERE t.biztype = 2"
  133. // 筛选条件
  134. sqlId.And("t.userid", r.USERID)
  135. sqlId.And("t.TRADEDATE", r.TRADEDATE)
  136. sqlId.AndEx("t.deliverygoodsid", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  137. sqlId.AndEx("t.wrstandardid", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  138. sqlId.AndEx("s.spotgoodsbrandid", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  139. if r.LogTypeFilter != "" {
  140. sqlId.Join(fmt.Sprintf(" and t.OPERATELOGTYPE in(%v)", r.LogTypeFilter))
  141. }
  142. return sqlId.String()
  143. }
  144. // GetDataEx 获取日志记录
  145. func (r *Ermcp3ReportOPLog) GetDataEx() (interface{}, error) {
  146. sData := make([]Ermcp3ReportOPLog, 0)
  147. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  148. for i := range sData {
  149. sData[i].Calc()
  150. }
  151. return sData, err
  152. }
  153. // Ermcp3ReckonAreaSpotSub 现货日报表(作废)
  154. type Ermcp3ReckonAreaSpotSub struct {
  155. RECKONDATE string `json:"reckondate" xorm:"'RECKONDATE'" form:"reckondate" binding:"required"` // 日照时期(yyyyMMdd)
  156. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'" form:"userid" binding:"required"` // 账户所属机构
  157. ACCOUNTID int64 `json:"accountid" xorm:"'ACCOUNTID'" form:"accountid"` // 期货账户ID
  158. WRFACTORTYPEID int64 `json:"wrfactortypeid" xorm:"'WRFACTORTYPEID'"` // 仓单要素类型ID(212+Unix秒时间戳(10位)+xxxxxx)
  159. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'" form:"deliverygoodsid"` // 现货品种ID
  160. WRSTANDARDID int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'" form:"wrstandardid"` // 现货品类ID
  161. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'" form:"spotgoodsbrandid"` // 现货品牌ID
  162. ORIBUYPRICEDQTY float64 `json:"oribuypricedqty" xorm:"'ORIBUYPRICEDQTY'"` // 期初采购合同已定价数量
  163. ORISELLPRICEDQTY float64 `json:"orisellpricedqty" xorm:"'ORISELLPRICEDQTY'"` // 期初销售合同已定价数量
  164. BUYPRICEDQTY float64 `json:"buypricedqty" xorm:"'BUYPRICEDQTY'"` // 采购合同已定价数量
  165. SELLPRICEDQTY float64 `json:"sellpricedqty" xorm:"'SELLPRICEDQTY'"` // 销售合同已定价数量
  166. TOTALSPOTQTY float64 `json:"totalspotqty" xorm:"'TOTALSPOTQTY'"` // 现货头寸总量 = 采购合同已定价数量 - 销售合同已定价数量
  167. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  168. TODAYBUYRECKONQTY float64 `json:"todaybuyreckonqty" xorm:"'TODAYBUYRECKONQTY'"` // 今日采购合同已确定数量
  169. TODAYSELLRECKONQTY float64 `json:"todaysellreckonqty" xorm:"'TODAYSELLRECKONQTY'"` // 今日销售合同已确定数量
  170. ORIBUYPRICEDAMOUNT float64 `json:"oribuypricedamount" xorm:"'ORIBUYPRICEDAMOUNT'"` // 期初采购合同已定价金额
  171. ORISELLPRICEDAMOUNT float64 `json:"orisellpricedamount" xorm:"'ORISELLPRICEDAMOUNT'"` // 期初销售合同已定价金额
  172. BUYPRICEDAMOUNT float64 `json:"buypricedamount" xorm:"'BUYPRICEDAMOUNT'"` // 采购合同已定价金额
  173. SELLPRICEDAMOUNT float64 `json:"sellpricedamount" xorm:"'SELLPRICEDAMOUNT'"` // 销售合同已定价金额
  174. ORIBUYRECKONQTY float64 `json:"oribuyreckonqty" xorm:"'ORIBUYRECKONQTY'"` // 期初采购合同交收量
  175. ORISELLRECKONQTY float64 `json:"orisellreckonqty" xorm:"'ORISELLRECKONQTY'"` // 期初销售合同交收量
  176. ORIBUYCONTRACTINQTY float64 `json:"oribuycontractinqty" xorm:"'ORIBUYCONTRACTINQTY'"` // 期初采购合同入库量
  177. ORISELLCONTRACTOUTQTY float64 `json:"orisellcontractoutqty" xorm:"'ORISELLCONTRACTOUTQTY'"` // 期初销售合同出库量
  178. ORIPRODUCEINQTY float64 `json:"oriproduceinqty" xorm:"'ORIPRODUCEINQTY'"` // 期初生产入库量
  179. ORIPRODUCEOUTQTY float64 `json:"oriproduceoutqty" xorm:"'ORIPRODUCEOUTQTY'"` // 期初生产出库量
  180. BUYRECKONQTY float64 `json:"buyreckonqty" xorm:"'BUYRECKONQTY'"` // 采购合同交收量
  181. SELLRECKONQTY float64 `json:"sellreckonqty" xorm:"'SELLRECKONQTY'"` // 销售合同交收量
  182. BUYCONTRACTINQTY float64 `json:"buycontractinqty" xorm:"'BUYCONTRACTINQTY'"` // 采购合同入库量
  183. SELLCONTRACTOUTQTY float64 `json:"sellcontractoutqty" xorm:"'SELLCONTRACTOUTQTY'"` // 销售合同出库量
  184. PRODUCEINQTY float64 `json:"produceinqty" xorm:"'PRODUCEINQTY'"` // 生产入库量
  185. PRODUCEOUTQTY float64 `json:"produceoutqty" xorm:"'PRODUCEOUTQTY'"` // 生产出库量
  186. ENUMDICNAME string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 现货商品单位名称
  187. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'wrstandardname'"` // 品类名称
  188. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'wrstandardcode'"` // 品类代码
  189. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'deliverygoodscode'"` // 现货商品代码
  190. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'deliverygoodsname'"` // 现货商品名称
  191. GOODSUNITID int32 `json:"goodsunitid" xorm:"'goodsunitid'"` // 现货商品单位id
  192. BRANDNAME string `json:"brandname" xorm:"'brandname'"` // 品牌名称
  193. ACCOUNTNAME string `json:"accountname" xorm:"'accountname'"` // 所属机构名称
  194. BIZTYPE int32 `json:"biztype" xorm:"'BIZTYPE'"` // 业务类型 1-套保 2-套利
  195. CURRENCYID int32 `json:"currencyid" xorm:"'CURRENCYID'"` // 币种id
  196. CURRENCYNAME string `json:"currencyname"` // 币种名称
  197. TOTALBUYPRICEDQTY float64 `json:"totalbuypricedqty"` // 采购定价量 = 期末 - 期初
  198. TOTALSELLPRICEDQTY float64 `json:"totalsellpricedqty"` // 销售定价量 = 期末 - 期初
  199. BeginDate string `json:"-"` // 开始日期
  200. EndDate string `json:"-"` // 结束日期
  201. }
  202. func (r *Ermcp3ReckonAreaSpotSub) calc() {
  203. r.TOTALBUYPRICEDQTY = r.BUYPRICEDQTY - r.ORIBUYPRICEDQTY
  204. r.TOTALSELLPRICEDQTY = r.SELLPRICEDQTY - r.ORISELLPRICEDQTY
  205. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  206. }
  207. func (r *Ermcp3ReckonAreaSpotSub) buildSql() string {
  208. var sqlId utils.SQLVal = "SELECT t.ORIBUYRECKONQTY," +
  209. " t.ORISELLRECKONQTY," +
  210. " t.ORIBUYCONTRACTINQTY," +
  211. " t.ORISELLCONTRACTOUTQTY," +
  212. " t.ORIPRODUCEINQTY," +
  213. " t.ORIPRODUCEOUTQTY," +
  214. " t.BUYRECKONQTY," +
  215. " t.SELLRECKONQTY," +
  216. " t.BUYCONTRACTINQTY," +
  217. " t.SELLCONTRACTOUTQTY," +
  218. " t.PRODUCEINQTY," +
  219. " t.PRODUCEOUTQTY," +
  220. " t.Reckondate," +
  221. " t.AREAUSERID," +
  222. " t.ACCOUNTID," +
  223. " t.WRFACTORTYPEID," +
  224. " t.DELIVERYGOODSID," +
  225. " t.WRSTANDARDID," +
  226. " t.SPOTGOODSBRANDID," +
  227. " t.ORIBUYPRICEDQTY," +
  228. " t.ORISELLPRICEDQTY," +
  229. " t.BUYPRICEDQTY," +
  230. " t.SELLPRICEDQTY," +
  231. " t.TOTALSPOTQTY," +
  232. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  233. " t.TODAYBUYRECKONQTY," +
  234. " t.TODAYSELLRECKONQTY," +
  235. " t.ORIBUYPRICEDAMOUNT," +
  236. " t.ORISELLPRICEDAMOUNT," +
  237. " t.BUYPRICEDAMOUNT," +
  238. " t.SELLPRICEDAMOUNT," +
  239. " t.currencyid," +
  240. " t.biztype," +
  241. " w.wrstandardname," +
  242. " w.wrstandardcode," +
  243. " g.deliverygoodscode," +
  244. " g.deliverygoodsname," +
  245. " g.goodsunitid," +
  246. " d.dgfactoryitemvalue brandname," +
  247. " u.accountname," +
  248. " e.enumdicname" +
  249. " FROM RECKON_ERMCP_AREASPOTSUB t" +
  250. " LEFT JOIN WRSTANDARD w" +
  251. " on t.wrstandardid = w.wrstandardid" +
  252. " LEFT JOIN DELIVERYGOODS g" +
  253. " on t.deliverygoodsid = g.deliverygoodsid" +
  254. " LEFT JOIN DGFACTORYITEM d" +
  255. " on t.spotgoodsbrandid = d.dgfactoryitemid" +
  256. " LEFT JOIN USERACCOUNT u" +
  257. " on t.areauserid = u.userid" +
  258. " LEFT JOIN ENUMDICITEM e" +
  259. " on g.goodsunitid = e.enumitemname" +
  260. " and e.enumdiccode = 'goodsunit'" +
  261. " and e.enumitemstatus = 1" +
  262. " WHERE 1 = 1"
  263. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  264. sqlId.AndEx("t.ACCOUNTID", r.ACCOUNTID, r.ACCOUNTID > 0)
  265. sqlId.AndEx("t.deliverygoodsid", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  266. sqlId.AndEx("t.WRSTANDARDID", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  267. sqlId.AndEx("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  268. if r.RECKONDATE != "" {
  269. sqlId.And("t.RECKONDATE", r.RECKONDATE)
  270. } else if r.BeginDate != "" && r.BeginDate == r.EndDate {
  271. sqlId.And("t.RECKONDATE", r.BeginDate)
  272. } else {
  273. if r.BeginDate != "" {
  274. sqlId.BiggerOrEq("t.RECKONDATE", r.BeginDate)
  275. }
  276. if r.EndDate != "" {
  277. sqlId.LessOrEq("t.RECKONDATE", r.EndDate)
  278. }
  279. }
  280. sqlId.Join(" order by t.RECKONDATE")
  281. return sqlId.String()
  282. }
  283. // GetDataEx 获取现货日报表
  284. func (r *Ermcp3ReckonAreaSpotSub) GetDataEx() (interface{}, error) {
  285. sData := make([]Ermcp3ReckonAreaSpotSub, 0)
  286. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  287. for i := range sData {
  288. sData[i].calc()
  289. }
  290. return sData, err
  291. }
  292. // Ermcp3ReportAreaSpotSub 现货分类月报表(作废)
  293. type Ermcp3ReportAreaSpotSub struct {
  294. ORIBUYRECKONQTY float64 `json:"oribuyreckonqty" xorm:"'ORIBUYRECKONQTY'"` // 期初采购合同交收量【期初】
  295. ORISELLRECKONQTY float64 `json:"orisellreckonqty" xorm:"'ORISELLRECKONQTY'"` // 期初销售合同交收量【期初】
  296. ORIBUYCONTRACTINQTY float64 `json:"oribuycontractinqty" xorm:"'ORIBUYCONTRACTINQTY'"` // 期初采购合同入库量【期初】
  297. ORISELLCONTRACTOUTQTY float64 `json:"orisellcontractoutqty" xorm:"'ORISELLCONTRACTOUTQTY'"` // 期初销售合同出库量【期初】
  298. ORIPRODUCEINQTY float64 `json:"oriproduceinqty" xorm:"'ORIPRODUCEINQTY'"` // 期初生产入库量【期初】
  299. ORIPRODUCEOUTQTY float64 `json:"oriproduceoutqty" xorm:"'ORIPRODUCEOUTQTY'"` // 期初生产出库量【期初】
  300. BUYRECKONQTY float64 `json:"buyreckonqty" xorm:"'BUYRECKONQTY'"` // 采购合同交收量【期末】
  301. SELLRECKONQTY float64 `json:"sellreckonqty" xorm:"'SELLRECKONQTY'"` // 销售合同交收量【期末】
  302. BUYCONTRACTINQTY float64 `json:"buycontractinqty" xorm:"'BUYCONTRACTINQTY'"` // 采购合同入库量【期末】
  303. SELLCONTRACTOUTQTY float64 `json:"sellcontractoutqty" xorm:"'SELLCONTRACTOUTQTY'"` // 销售合同出库量【期末】
  304. PRODUCEINQTY float64 `json:"produceinqty" xorm:"'PRODUCEINQTY'"` // 生产入库量【期末】
  305. PRODUCEOUTQTY float64 `json:"produceoutqty" xorm:"'PRODUCEOUTQTY'"` // 生产出库量【期末】
  306. CYCLETIME string `json:"cycletime" xorm:"'CYCLETIME'" form:"cycletime"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  307. CYCLETYPE int32 `json:"cycletype" xorm:"'CYCLETYPE'" form:"cycletype"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  308. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'" form:"userid" binding:"required"` // 账户所属机构
  309. ACCOUNTID int64 `json:"accountid" xorm:"'ACCOUNTID'" form:"accountid"` // 期货账户ID
  310. WRFACTORTYPEID int64 `json:"wrfactortypeid" xorm:"'WRFACTORTYPEID'"` // 仓单要素类型ID(212+Unix秒时间戳(10位)+xxxxxx)
  311. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'" form:"deliverygoodsid"` // 现货品种ID
  312. WRSTANDARDID int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'" form:"wrstandardid"` // 品类ID
  313. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'" form:"spotgoodsbrandid"` // 现货品牌ID
  314. ORIBUYPRICEDQTY float64 `json:"oribuypricedqty" xorm:"'ORIBUYPRICEDQTY'"` // 期初采购合同已定价数量【期初】
  315. ORISELLPRICEDQTY float64 `json:"orisellpricedqty" xorm:"'ORISELLPRICEDQTY'"` // 期初销售合同已定价数量【期初】
  316. BUYPRICEDQTY float64 `json:"buypricedqty" xorm:"'BUYPRICEDQTY'"` // 采购合同已定价数量【期末】
  317. SELLPRICEDQTY float64 `json:"sellpricedqty" xorm:"'SELLPRICEDQTY'"` // 销售合同已定价数量【期末】
  318. TOTALSPOTQTY float64 `json:"totalspotqty" xorm:"'TOTALSPOTQTY'"` // 现货头寸总量 = 采购合同已定价数量 - 销售合同已定价数量【期末】
  319. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  320. TODAYBUYRECKONQTY float64 `json:"todaybuyreckonqty" xorm:"'TODAYBUYRECKONQTY'"` // 今日采购合同已确定数量【汇总】
  321. TODAYSELLRECKONQTY float64 `json:"todaysellreckonqty" xorm:"'TODAYSELLRECKONQTY'"` // 今日销售合同已确定数量【汇总】
  322. ORIBUYPRICEDAMOUNT float64 `json:"oribuypricedamount" xorm:"'ORIBUYPRICEDAMOUNT'"` // 期初采购合同已定价金额【期初】
  323. ORISELLPRICEDAMOUNT float64 `json:"orisellpricedamount" xorm:"'ORISELLPRICEDAMOUNT'"` // 期初销售合同已定价金额【期初】
  324. BUYPRICEDAMOUNT float64 `json:"buypricedamount" xorm:"'BUYPRICEDAMOUNT'"` // 采购合同已定价金额【期末】
  325. SELLPRICEDAMOUNT float64 `json:"sellpricedamount" xorm:"'SELLPRICEDAMOUNT'"` // 销售合同已定价金额【期末】
  326. ENUMDICNAME string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 现货商品单位名称
  327. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'wrstandardname'"` // 品类名称
  328. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'wrstandardcode'"` // 品类代码
  329. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'deliverygoodscode'"` // 现货商品代码
  330. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'deliverygoodsname'"` // 现货商品名称
  331. GOODSUNITID int32 `json:"goodsunitid" xorm:"'goodsunitid'"` // 现货商品单位id
  332. BRANDNAME string `json:"brandname" xorm:"'brandname'"` // 品牌名称
  333. ACCOUNTNAME string `json:"accountname" xorm:"'accountname'"` // 所属机构名称
  334. BIZTYPE int32 `json:"biztype" xorm:"'BIZTYPE'"` // 业务类型 1-套保 2-套利
  335. CURRENCYID int32 `json:"currencyid" xorm:"'CURRENCYID'"` // 币种id
  336. CURRENCYNAME string `json:"currencyname"` // 币种名称
  337. TOTALBUYPRICEDQTY float64 `json:"totalbuypricedqty"` // 采购定价量 = 期末 - 期初
  338. TOTALSELLPRICEDQTY float64 `json:"totalsellpricedqty"` // 销售定价量 = 期末 - 期初
  339. }
  340. func (r *Ermcp3ReportAreaSpotSub) calc() {
  341. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  342. r.TOTALBUYPRICEDQTY = r.BUYPRICEDQTY - r.ORIBUYPRICEDQTY
  343. r.TOTALSELLPRICEDQTY = r.SELLPRICEDQTY - r.ORISELLPRICEDQTY
  344. }
  345. func (r *Ermcp3ReportAreaSpotSub) buildSql() string {
  346. var sqlId utils.SQLVal = "SELECT t.ORIBUYRECKONQTY," +
  347. " t.ORISELLRECKONQTY," +
  348. " t.ORIBUYCONTRACTINQTY," +
  349. " t.ORISELLCONTRACTOUTQTY," +
  350. " t.ORIPRODUCEINQTY," +
  351. " t.ORIPRODUCEOUTQTY," +
  352. " t.BUYRECKONQTY," +
  353. " t.SELLRECKONQTY," +
  354. " t.BUYCONTRACTINQTY," +
  355. " t.SELLCONTRACTOUTQTY," +
  356. " t.PRODUCEINQTY," +
  357. " t.PRODUCEOUTQTY," +
  358. " t.CYCLETIME," +
  359. " t.CYCLETYPE," +
  360. " t.AREAUSERID," +
  361. " t.ACCOUNTID," +
  362. " t.WRFACTORTYPEID," +
  363. " t.DELIVERYGOODSID," +
  364. " t.WRSTANDARDID," +
  365. " t.SPOTGOODSBRANDID," +
  366. " t.ORIBUYPRICEDQTY," +
  367. " t.ORISELLPRICEDQTY," +
  368. " t.BUYPRICEDQTY," +
  369. " t.SELLPRICEDQTY," +
  370. " t.TOTALSPOTQTY," +
  371. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  372. " t.TODAYBUYRECKONQTY," +
  373. " t.TODAYSELLRECKONQTY," +
  374. " t.ORIBUYPRICEDAMOUNT," +
  375. " t.ORISELLPRICEDAMOUNT," +
  376. " t.BUYPRICEDAMOUNT," +
  377. " t.SELLPRICEDAMOUNT," +
  378. " t.currencyid," +
  379. " t.biztype," +
  380. " w.wrstandardname," +
  381. " w.wrstandardcode," +
  382. " g.deliverygoodscode," +
  383. " g.deliverygoodsname," +
  384. " g.goodsunitid," +
  385. " d.dgfactoryitemvalue brandname," +
  386. " u.accountname," +
  387. " e.enumdicname" +
  388. " FROM REPORT_ERMCP_AREASPOTSUB t" +
  389. " LEFT JOIN WRSTANDARD w on t.wrstandardid=w.wrstandardid" +
  390. " LEFT JOIN DELIVERYGOODS g on t.deliverygoodsid=g.deliverygoodsid" +
  391. " LEFT JOIN DGFACTORYITEM d on t.spotgoodsbrandid=d.dgfactoryitemid" +
  392. " LEFT JOIN USERACCOUNT u on t.areauserid=u.userid" +
  393. " LEFT JOIN ENUMDICITEM e on g.goodsunitid=e.enumitemname and e.enumdiccode='goodsunit' and e.enumitemstatus=1" +
  394. " WHERE 1 = 1"
  395. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  396. sqlId.And("t.cycletype", r.CYCLETYPE)
  397. sqlId.And("t.cycletime", r.CYCLETIME)
  398. sqlId.AndEx("t.ACCOUNTID", r.ACCOUNTID, r.ACCOUNTID > 0)
  399. sqlId.AndEx("t.deliverygoodsid", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  400. sqlId.AndEx("t.WRSTANDARDID", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  401. sqlId.AndEx("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  402. return sqlId.String()
  403. }
  404. // GetDataEx 获取现货分类报表
  405. func (r *Ermcp3ReportAreaSpotSub) GetDataEx() (interface{}, error) {
  406. sData := make([]Ermcp3ReportAreaSpotSub, 0)
  407. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  408. for i := range sData {
  409. sData[i].calc()
  410. }
  411. return sData, err
  412. }
  413. // Ermcp3ExpourseReport 敞口报表
  414. type Ermcp3ExpourseReport struct {
  415. RECKONDATE string `json:"reckondate" xorm:"'RECKONDATE'"` // 日照时期(yyyyMMdd)
  416. CYCLETIME string `json:"cycletime" xorm:"'CYCLETIME'"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  417. CYCLETYPE int32 `json:"cycletype" xorm:"'CYCLETYPE'"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  418. ORITOTALSPOTQTY float64 `json:"oritotalspotqty" xorm:"'ORITOTALSPOTQTY'"` // 期初现货头寸总量
  419. ORITOTALFUTUREQTY float64 `json:"oritotalfutureqty" xorm:"'ORITOTALFUTUREQTY'"` // 期初期货头寸总量
  420. ORITOTALEXPOSURE float64 `json:"oritotalexposure" xorm:"'ORITOTALEXPOSURE'"` // 期初实时总敞口
  421. ORINEEDHEDGEEXPOSOURE float64 `json:"orineedhedgeexposoure" xorm:"'ORINEEDHEDGEEXPOSOURE'"` // 期初应套保敞口
  422. ORIHEDGEQTY float64 `json:"orihedgeqty" xorm:"'ORIHEDGEQTY'"` // 期初套保量
  423. ORIARBITRAGEQTY float64 `json:"oriarbitrageqty" xorm:"'ORIARBITRAGEQTY'"` // 期初套利量
  424. ORINEEDHEDGEQTY float64 `json:"orineedhedgeqty" xorm:"'ORINEEDHEDGEQTY'"` // 期初应套保量
  425. ORINEEDARBITRAGEQTY float64 `json:"orineedarbitrageqty" xorm:"'ORINEEDARBITRAGEQTY'"` // 期初应套利量
  426. ORITOTALNEEDHEDGEQTY float64 `json:"oritotalneedhedgeqty" xorm:"'ORITOTALNEEDHEDGEQTY'"` // 期初应套保总量
  427. MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"'MIDDLEGOODSID'"` // 套保品种ID
  428. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构\交易用户ID
  429. ACCOUNTID int64 `json:"accountid" xorm:"'ACCOUNTID'"` // 期货账户ID (作废, 默认为0)
  430. ORIBUYPLANQTY float64 `json:"oribuyplanqty" xorm:"'ORIBUYPLANQTY'"` // 期初采购计划数量
  431. ORIBUYPRICEDQTY float64 `json:"oribuypricedqty" xorm:"'ORIBUYPRICEDQTY'"` // 期初采购合同已定价数量
  432. ORISELLPLANQTY float64 `json:"orisellplanqty" xorm:"'ORISELLPLANQTY'"` // 期初销售计划数量
  433. ORISELLPRICEDQTY float64 `json:"orisellpricedqty" xorm:"'ORISELLPRICEDQTY'"` // 期初销售合同已定价数量
  434. ORIBUYFUTUREQTY float64 `json:"oribuyfutureqty" xorm:"'ORIBUYFUTUREQTY'"` // 期初买入期货数量
  435. ORISELLFUTUREQTY float64 `json:"orisellfutureqty" xorm:"'ORISELLFUTUREQTY'"` // 期初卖出期货数量
  436. BUYPLANQTY float64 `json:"buyplanqty" xorm:"'BUYPLANQTY'"` // 采购计划数量
  437. BUYPRICEDQTY float64 `json:"buypricedqty" xorm:"'BUYPRICEDQTY'"` // 采购合同已定价数量
  438. SELLPLANQTY float64 `json:"sellplanqty" xorm:"'SELLPLANQTY'"` // 销售计划数量
  439. SELLPRICEDQTY float64 `json:"sellpricedqty" xorm:"'SELLPRICEDQTY'"` // 销售合同已定价数量
  440. BUYFUTUREQTY float64 `json:"buyfutureqty" xorm:"'BUYFUTUREQTY'"` // 买入期货数量
  441. SELLFUTUREQTY float64 `json:"sellfutureqty" xorm:"'SELLFUTUREQTY'"` // 卖出期货数量
  442. TOTALSPOTQTY float64 `json:"totalspotqty" xorm:"'TOTALSPOTQTY'"` // 现货头寸总量
  443. TOTALFUTUREQTY float64 `json:"totalfutureqty" xorm:"'TOTALFUTUREQTY'"` // 期货头寸总量(期货总量)
  444. TOTALEXPOSURE float64 `json:"totalexposure" xorm:"'TOTALEXPOSURE'"` // 实时总敞口(总敞口)
  445. TOTALHEDGERATIO float64 `json:"totalhedgeratio" xorm:"'TOTALHEDGERATIO'"` // 敞口比例
  446. TOTALNEEDHEDGEQTY float64 `json:"totalneedhedgeqty" xorm:"'TOTALNEEDHEDGEQTY'"` // 应套保总量(现货应套保总量)
  447. NEEDHEDGEEXPOSOURE float64 `json:"needhedgeexposoure" xorm:"'NEEDHEDGEEXPOSOURE'"` // 应套保敞口(套保敞口)
  448. NEEDHEDGERATIO float64 `json:"needhedgeratio" xorm:"'NEEDHEDGERATIO'"` // 应套保敞口比例
  449. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  450. HEDGEQTY float64 `json:"hedgeqty" xorm:"'HEDGEQTY'"` // 套保量
  451. ARBITRAGEQTY float64 `json:"arbitrageqty" xorm:"'ARBITRAGEQTY'"` // 套利量
  452. NEEDHEDGEQTY float64 `json:"needhedgeqty" xorm:"'NEEDHEDGEQTY'"` // 应套保量
  453. NEEDARBITRAGEQTY float64 `json:"needarbitrageqty" xorm:"'NEEDARBITRAGEQTY'"` // 应套利量
  454. MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保商品名称
  455. MIDDLEGOODSCODE string `json:"middlgoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保商品代码
  456. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 单位id
  457. MGNEEDHEDGERATIO float64 `json:"mgneedhedgeratio" xorm:"'MGNEEDHEDGERATIO'"` // 套保比例(套保品的)
  458. NEEDARBITRAGERATIO float64 `json:"needarbitrageratio" xorm:"'NEEDARBITRAGERATIO'"` // 套利比例(套保品的)
  459. ENUMDICNAME string `json:"enumdicname"` // 单位名称
  460. ACCOUNTNAME string `json:"accountname"` // 机构名称
  461. DiffSpotQty float64 `json:"diffspotqty"` // 变动量(现货)
  462. DiffMgQtyA float64 `json:"diffmgqtya"` // 套保变动量
  463. DiffMgQtyB float64 `json:"diffmgqtyb"` // 套利变动量
  464. DiffFutuQty float64 `json:"difffutuqty"` // 变动量(期货)
  465. DiffQty float64 `json:"diffqty"` // 变动量(总敞口)
  466. DiffHedgeQty float64 `json:"diffhedgeqty"` // 变动量(现货应套保总量)
  467. DiffExposure float64 `json:"diffexposure"` // 变动量(套保敞口)
  468. QueryType int32 `json:"-"` // 查询类型 1-报表
  469. BeginDate string `json:"begindate"` // 开始交易日
  470. EndDate string `json:"enddate"` // 结束交易日
  471. }
  472. func (r *Ermcp3ExpourseReport) calc() {
  473. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  474. r.ACCOUNTNAME = mtpcache.GetUserNameByUserId(r.AREAUSERID)
  475. // 变动量(现货) = 现货头寸总量 - 期初现货头寸总量
  476. r.DiffSpotQty = r.TOTALSPOTQTY - r.ORITOTALSPOTQTY
  477. // 套保变动量 = 套保量 - 期初套保量
  478. r.DiffMgQtyA = r.HEDGEQTY - r.ORIHEDGEQTY
  479. // 套利变动量 = 套利量 - 期初套利量
  480. r.DiffMgQtyB = r.ARBITRAGEQTY - r.ORIARBITRAGEQTY
  481. // 变动量(期货) = (买入 - 买入期初) - (卖出 - 卖出期初)
  482. r.DiffFutuQty = (r.BUYFUTUREQTY - r.ORIBUYFUTUREQTY) - (r.SELLFUTUREQTY - r.ORISELLFUTUREQTY)
  483. // 变动量(敞口) = 实时敞口 - 期初实时敞口
  484. r.DiffQty = r.TOTALEXPOSURE - r.ORITOTALEXPOSURE
  485. // 变动量(现货应套保总量)
  486. r.DiffHedgeQty = r.TOTALNEEDHEDGEQTY - r.ORITOTALNEEDHEDGEQTY
  487. // 变动量(套保敞口)
  488. r.DiffExposure = r.NEEDHEDGEEXPOSOURE - r.ORINEEDHEDGEEXPOSOURE
  489. }
  490. func (r *Ermcp3ExpourseReport) buildSql() string {
  491. if r.CYCLETYPE == 0 {
  492. return r.buildSqlDay()
  493. }
  494. return r.buildSqlCycle()
  495. }
  496. func (r *Ermcp3ExpourseReport) buildSqlDay() string {
  497. var sqlId utils.SQLVal = "SELECT t.ORITOTALSPOTQTY," +
  498. " t.ORITOTALFUTUREQTY," +
  499. " t.ORITOTALEXPOSURE," +
  500. " t.ORINEEDHEDGEEXPOSOURE," +
  501. " t.ORIHEDGEQTY," +
  502. " t.ORIARBITRAGEQTY," +
  503. " t.ORINEEDHEDGEQTY," +
  504. " t.ORINEEDARBITRAGEQTY," +
  505. " t.ORITOTALNEEDHEDGEQTY," +
  506. " t.RECKONDATE," +
  507. " t.MIDDLEGOODSID," +
  508. " t.AREAUSERID," +
  509. " t.ACCOUNTID," +
  510. " t.ORIBUYPLANQTY," +
  511. " t.ORIBUYPRICEDQTY," +
  512. " t.ORISELLPLANQTY," +
  513. " t.ORISELLPRICEDQTY," +
  514. " t.ORIBUYFUTUREQTY," +
  515. " t.ORISELLFUTUREQTY," +
  516. " t.BUYPLANQTY," +
  517. " t.BUYPRICEDQTY," +
  518. " t.SELLPLANQTY," +
  519. " t.SELLPRICEDQTY," +
  520. " t.BUYFUTUREQTY," +
  521. " t.SELLFUTUREQTY," +
  522. " t.TOTALSPOTQTY," +
  523. " t.TOTALFUTUREQTY," +
  524. " t.TOTALEXPOSURE," +
  525. " t.TOTALHEDGERATIO," +
  526. " t.TOTALNEEDHEDGEQTY," +
  527. " t.NEEDHEDGEEXPOSOURE," +
  528. " t.NEEDHEDGERATIO," +
  529. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  530. " t.HEDGEQTY," +
  531. " t.ARBITRAGEQTY," +
  532. " t.NEEDHEDGEQTY," +
  533. " t.NEEDARBITRAGEQTY," +
  534. " g.middlegoodsname," +
  535. " g.middlegoodscode," +
  536. " g.goodsunitid unitid," +
  537. " g.needhedgeratio MGNEEDHEDGERATIO," +
  538. " g.needarbitrageratio" +
  539. " FROM RECKON_ERMCP_AREAEXPOSURE t" +
  540. " LEFT JOIN ERMS_MIDDLEGOODS g" +
  541. " on t.middlegoodsid = g.middlegoodsid" +
  542. " WHERE 1 = 1"
  543. sqlId.AndEx("t.AREAUSERID", r.AREAUSERID, r.AREAUSERID > 0)
  544. if r.QueryType == 1 {
  545. sqlId.And("t.RECKONDATE", r.RECKONDATE)
  546. } else if r.QueryType == 2 {
  547. sqlId.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  548. }
  549. return sqlId.String()
  550. }
  551. func (r *Ermcp3ExpourseReport) buildSqlCycle() string {
  552. var sqlId utils.SQLVal = "SELECT t.cycletime," +
  553. " t.cycletype," +
  554. " t.ORITOTALSPOTQTY," +
  555. " t.ORITOTALFUTUREQTY," +
  556. " t.ORITOTALEXPOSURE," +
  557. " t.ORINEEDHEDGEEXPOSOURE," +
  558. " t.ORIHEDGEQTY," +
  559. " t.ORIARBITRAGEQTY," +
  560. " t.ORINEEDHEDGEQTY," +
  561. " t.ORINEEDARBITRAGEQTY," +
  562. " t.ORITOTALNEEDHEDGEQTY," +
  563. " t.MIDDLEGOODSID," +
  564. " t.AREAUSERID," +
  565. " t.ACCOUNTID," +
  566. " t.ORIBUYPLANQTY," +
  567. " t.ORIBUYPRICEDQTY," +
  568. " t.ORISELLPLANQTY," +
  569. " t.ORISELLPRICEDQTY," +
  570. " t.ORIBUYFUTUREQTY," +
  571. " t.ORISELLFUTUREQTY," +
  572. " t.BUYPLANQTY," +
  573. " t.BUYPRICEDQTY," +
  574. " t.SELLPLANQTY," +
  575. " t.SELLPRICEDQTY," +
  576. " t.BUYFUTUREQTY," +
  577. " t.SELLFUTUREQTY," +
  578. " t.TOTALSPOTQTY," +
  579. " t.TOTALFUTUREQTY," +
  580. " t.TOTALEXPOSURE," +
  581. " t.TOTALHEDGERATIO," +
  582. " t.TOTALNEEDHEDGEQTY," +
  583. " t.NEEDHEDGEEXPOSOURE," +
  584. " t.NEEDHEDGERATIO," +
  585. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  586. " t.HEDGEQTY," +
  587. " t.ARBITRAGEQTY," +
  588. " t.NEEDHEDGEQTY," +
  589. " t.NEEDARBITRAGEQTY," +
  590. " g.middlegoodsname," +
  591. " g.middlegoodscode," +
  592. " g.goodsunitid unitid," +
  593. " g.needhedgeratio MGNEEDHEDGERATIO," +
  594. " g.needarbitrageratio" +
  595. " FROM REPORT_ERMCP_AREAEXPOSURE t" +
  596. " LEFT JOIN ERMS_MIDDLEGOODS g" +
  597. " on t.middlegoodsid = g.middlegoodsid" +
  598. " WHERE 1 = 1"
  599. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  600. sqlId.And("t.CYCLETYPE", r.CYCLETYPE)
  601. sqlId.And("t.CYCLETIME", r.CYCLETIME)
  602. return sqlId.String()
  603. }
  604. // GetDataEx 获取敞报表
  605. func (r *Ermcp3ExpourseReport) GetDataEx() (interface{}, error) {
  606. sData := make([]Ermcp3ExpourseReport, 0)
  607. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  608. for i := range sData {
  609. sData[i].calc()
  610. sData[i].BeginDate = r.BeginDate
  611. sData[i].EndDate = r.EndDate
  612. }
  613. return sData, err
  614. }
  615. // Ermcp3ExposureContractDetail 敞口合同明细
  616. type Ermcp3ExposureContractDetail struct {
  617. MIDDLEGOODSID int32 `json:"middlegoodsid" xorm:"'MIDDLEGOODSID'"` // 套保品种id
  618. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货商品id
  619. CONVERTRATIO float64 `json:"convertratio" xorm:"'CONVERTRATIO'"` // 折算系数(套保品种)
  620. USERID int64 `json:"userid" xorm:"'USERID'"` // 机构id
  621. SPOTCONTRACTID string `json:"spotcontractid" xorm:"'SPOTCONTRACTID'"` // 合同id
  622. CONTRACTNO string `json:"contractno" xorm:"'CONTRACTNO'"` // 合同编号
  623. CONTRACTTYPE int32 `json:"contracttype" xorm:"'CONTRACTTYPE'"` // 现货合同类型 - 1:采购 -1:销售
  624. BIZTYPE int32 `json:"biztype" xorm:"'BIZTYPE'"` // 业务类型 1-套保 2-套利
  625. BUYUSERID int64 `json:"buyuserid" xorm:"'BUYUSERID'"` // 采购方id
  626. SELLUSERID int64 `json:"selluserid" xorm:"'SELLUSERID'"` // 销售方id
  627. QTY float64 `json:"qty" xorm:"'QTY'"` // 合同量
  628. PRICEDQTY float64 `json:"pricedqty" xorm:"'PRICEDQTY'"` // 已定价量
  629. WRSTANDARDID int32 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 品类id
  630. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  631. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  632. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 品类单位id
  633. MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保品种名称
  634. MIDDLEGOODSCODE string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保品种代码
  635. GOODSUNITID int32 `json:"-" xorm:"'GOODSUNITID'"` // 套保品种单位id
  636. TRADEDATE string `json:"tradedate" xorm:"'tradedate'"` // 交易日
  637. NEEDHEDGERATIO float64 `json:"needhedgeratio" xorm:"'NEEDHEDGERATIO'"` // 应套保比例
  638. NEEDARBITRAGERATIO float64 `json:"needarbitrageratio" xorm:"'NEEDARBITRAGERATIO'"` // 应套利比例
  639. BRANDNAME string `json:"brandname" xorm:"'BRANDNAME'"` // 品牌名称
  640. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货商品代码
  641. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货商品名称
  642. EnumdicName string `json:"enumdicname"` // 单位名称
  643. BUYUSERNAME string `json:"buyusername"` // 采购方名称
  644. SELLUSERNAME string `json:"sellusername"` // 销售方名称
  645. CurQty float64 `json:"curqty"` // 今定价量
  646. DiffQty float64 `json:"diffqty"` // 套保品种今变动量
  647. BeginDate string `json:"-"` // 开始交易日
  648. EndDate string `json:"-"` // 结束交易日
  649. }
  650. func (r *Ermcp3ExposureContractDetail) calc() {
  651. r.CurQty = r.QTY
  652. r.DiffQty = r.QTY * r.CONVERTRATIO
  653. r.EnumdicName = mtpcache.GetEnumDicitemName(r.UNITID)
  654. r.BUYUSERNAME = mtpcache.GetUserNameByUserId(r.BUYUSERID)
  655. r.SELLUSERNAME = mtpcache.GetUserNameByUserId(r.SELLUSERID)
  656. }
  657. func (r *Ermcp3ExposureContractDetail) buildSql() string {
  658. var sqlId utils.SQLVal = "select t.middlegoodsid," +
  659. " t.deliverygoodsid," +
  660. " t.convertratio," +
  661. " s.userid," +
  662. " to_char(s.spotcontractid) spotcontractid," +
  663. " s.contractno," +
  664. " s.contracttype," +
  665. " s.biztype," +
  666. " s.buyuserid," +
  667. " s.selluserid," +
  668. " s.qty," +
  669. " s.pricedqty," +
  670. " s.wrstandardid," +
  671. " s.audittradedate tradedate," +
  672. " w.wrstandardname," +
  673. " w.wrstandardcode," +
  674. " w.unitid," +
  675. " mg.middlegoodsname," +
  676. " mg.middlegoodscode," +
  677. " mg.goodsunitid," +
  678. " mg.needhedgeratio," +
  679. " mg.needarbitrageratio," +
  680. " dg.dgfactoryitemid brandid," +
  681. " dg.dgfactoryitemvalue brandName," +
  682. " g.deliverygoodscode," +
  683. " g.deliverygoodsname" +
  684. " from erms2_wrsconvertdetail t" +
  685. " inner join ermcp_spotcontract s" +
  686. " on t.deliverygoodsid = s.deliverygoodsid" +
  687. " left join erms_middlegoods mg" +
  688. " on t.middlegoodsid = mg.middlegoodsid" +
  689. " left join wrstandard w" +
  690. " on s.wrstandardid = w.wrstandardid" +
  691. " left join dgfactoryitem dg" +
  692. " on s.spotgoodsbrandid = dg.dgfactoryitemid" +
  693. " left join deliverygoods g on s.deliverygoodsid=g.deliverygoodsid" +
  694. " where t.wrstandardid = 0" +
  695. " and s.contractstatus in (2, 3)"
  696. sqlId.AndEx("s.audittradedate", r.TRADEDATE, len(r.TRADEDATE) > 0)
  697. if len(r.BeginDate) > 0 && len(r.EndDate) > 0 {
  698. sqlId.Join(fmt.Sprintf(" and s.audittradedate >= '%v' and s.audittradedate <= '%v'", r.BeginDate, r.EndDate))
  699. }
  700. sqlId.And("t.middlegoodsid", r.MIDDLEGOODSID)
  701. sqlId.Join(fmt.Sprintf(" and %v in(s.userid, s.tradeuserid)", r.USERID))
  702. return sqlId.String()
  703. }
  704. // GetDataEx 获取敞口合同明细
  705. func (r *Ermcp3ExposureContractDetail) GetDataEx() (interface{}, error) {
  706. sData := make([]Ermcp3ExposureContractDetail, 0)
  707. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  708. for i := range sData {
  709. sData[i].calc()
  710. }
  711. return sData, err
  712. }
  713. // Ermcp3ExposureHedgeplanDetail 敞口套保计划明细
  714. type Ermcp3ExposureHedgeplanDetail struct {
  715. MIDDLEGOODSID int32 `json:"middlegoodsid" xorm:"'MIDDLEGOODSID'"` // 套保品种id
  716. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货商品id
  717. CONVERTRATIO float64 `json:"convertratio" xorm:"'CONVERTRATIO'"` // 折算系数(套保品种)
  718. USERID int64 `json:"userid" xorm:"'USERID'"` // 机构id
  719. HEDGEPLANID string `json:"hedgeplanid" xorm:"'HEDGEPLANID'"` // 套保计划id
  720. HEDGEPLANNO string `json:"hedgeplanno" xorm:"'HEDGEPLANNO'"` // 套保计划编号
  721. BIZTYPE int32 `json:"biztype" xorm:"'BIZTYPE'"` // 业务类型(期现用途,业务类型就是期现用途) 1-套保 2-套利
  722. QTY float64 `json:"qty" xorm:"'QTY'"` // 合同量
  723. PRICEDQTY float64 `json:"pricedqty" xorm:"'PRICEDQTY'"` // 已定价量
  724. WRSTANDARDID int32 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 品类id
  725. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  726. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  727. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 品类单位id
  728. MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保品种名称
  729. MIDDLEGOODSCODE string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保品种代码
  730. GOODSUNITID int32 `json:"-" xorm:"'GOODSUNITID'"` // 套保品种单位id
  731. TRADEDATE string `json:"tradedate" xorm:"'tradedate'"` // 交易日(登记日)
  732. NEEDHEDGERATIO float64 `json:"needhedgeratio" xorm:"'NEEDHEDGERATIO'"` // 应套保比例
  733. NEEDARBITRAGERATIO float64 `json:"needarbitrageratio" xorm:"'NEEDARBITRAGERATIO'"` // 应套利比例
  734. CONTRACTTYPE int32 `json:"contracttype" xorm:"'CONTRACTTYPE'"` // 计划类型 - 1:采购 -1:销售
  735. HEDGEPLANSTATUS int32 `json:"hedgeplanstatus" xorm:"'HEDGEPLANSTATUS'"` // 套保计划状态 - 0:未提交 1:待审核 2:执行中 3:正常完结 4:审核拒绝 5:异常完结 6:已撤回
  736. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货商品代码
  737. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货商吕名称
  738. DGUNITID int32 `json:"dgunitid" xorm:"'DGUNITID'"` // 现货商品单位id
  739. EnumdicName string `json:"enumdicname"` // 单位名称(品类)
  740. MGUNITIDNAME string `json:"mgunitidname"` // 单位名称(套保商品)
  741. DGUNITIDNAME string `json:"dgunitidname"` // 单位名称(现货商品)
  742. CurQty float64 `json:"-"` // 今定价量
  743. DiffQty float64 `json:"diffqty"` // 套保品种今变动量
  744. ChangQty float64 `json:"changqty"` // 应套保总量变化量
  745. BeginDate string `json:"-"`
  746. EndDate string `json:"-"`
  747. }
  748. func (r *Ermcp3ExposureHedgeplanDetail) calc() {
  749. r.EnumdicName = mtpcache.GetEnumDicitemName(r.UNITID)
  750. r.MGUNITIDNAME = mtpcache.GetEnumDicitemName(r.GOODSUNITID)
  751. r.DGUNITIDNAME = mtpcache.GetEnumDicitemName(r.DGUNITID)
  752. r.CurQty = r.QTY
  753. r.DiffQty = r.QTY * r.CONVERTRATIO
  754. r.ChangQty = r.QTY * r.NEEDHEDGERATIO * r.CONVERTRATIO
  755. }
  756. func (r *Ermcp3ExposureHedgeplanDetail) buildSql() string {
  757. var sqlId utils.SQLVal = "select t.middlegoodsid," +
  758. " t.deliverygoodsid," +
  759. " t.convertratio," +
  760. " s.areauserid userid," +
  761. " to_char(s.hedgeplanid) hedgeplanid," +
  762. " s.hedgeplanno," +
  763. " s.contracttype," +
  764. " s.biztype," +
  765. " s.planqty qty," +
  766. " s.wrstandardid," +
  767. " s.audittradedate tradedate," +
  768. " s.hedgeplanstatus," +
  769. " w.wrstandardname," +
  770. " w.wrstandardcode," +
  771. " w.unitid," +
  772. " g.deliverygoodscode," +
  773. " g.deliverygoodsname," +
  774. " g.goodsunitid," +
  775. " mg.middlegoodsname," +
  776. " mg.middlegoodscode," +
  777. " mg.goodsunitid," +
  778. " mg.needhedgeratio," +
  779. " mg.needarbitrageratio" +
  780. " from erms2_wrsconvertdetail t" +
  781. " inner join ermcp_hedgeplan s" +
  782. " on t.deliverygoodsid = s.deliverygoodsid" +
  783. " left join erms_middlegoods mg" +
  784. " on t.middlegoodsid = mg.middlegoodsid" +
  785. " left join wrstandard w" +
  786. " on s.wrstandardid = w.wrstandardid" +
  787. " left join deliverygoods g on s.deliverygoodsid=g.deliverygoodsid" +
  788. " where t.wrstandardid = 0" +
  789. " and s.hedgeplanstatus in (2, 3)"
  790. sqlId.AndEx("s.audittradedate", r.TRADEDATE, len(r.TRADEDATE) > 0)
  791. if len(r.BeginDate) > 0 && len(r.EndDate) > 0 {
  792. sqlId.Join(fmt.Sprintf(" and s.audittradedate >= '%v' and s.audittradedate <= '%v'", r.BeginDate, r.EndDate))
  793. }
  794. sqlId.And("t.middlegoodsid", r.MIDDLEGOODSID)
  795. sqlId.Join(fmt.Sprintf(" and %v in(s.areauserid, s.tradeuserid)", r.USERID))
  796. return sqlId.String()
  797. }
  798. // GetDataEx 获取敞口套保计划明细
  799. func (r *Ermcp3ExposureHedgeplanDetail) GetDataEx() (interface{}, error) {
  800. sData := make([]Ermcp3ExposureHedgeplanDetail, 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. }
  807. // Ermcp3AreaSpotPLReport 现货报表(日/月/周/季/年)
  808. type Ermcp3AreaSpotPLReport struct {
  809. RECKONDATE string `json:"reckondate" xorm:"RECKONDATE"` // 日照时期(yyyyMMdd)
  810. CYCLETIME string `json:"cycletime" xorm:"'CYCLETIME'"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  811. CYCLETYPE int32 `json:"cycletype" xorm:"'CYCLETYPE'"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  812. AREAUSERID int64 `json:"areauserid" xorm:"AREAUSERID"` // 所属机构\交易用户ID
  813. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 期货账户ID (作废, 默认为0)
  814. WRFACTORTYPEID int64 `json:"wrfactortypeid" xorm:"WRFACTORTYPEID"` // 仓单要素类型ID(212+Unix秒时间戳(10位)+xxxxxx)
  815. CURRENCYID int32 `json:"currencyid" xorm:"CURRENCYID"` // 结算币种ID【原值】
  816. BIZTYPE int32 `json:"biztype" xorm:"BIZTYPE"` // 业务类型 - 1:套保 2:套利
  817. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"DELIVERYGOODSID"` // 现货品种ID
  818. WRSTANDARDID int64 `json:"wrstandardid" xorm:"WRSTANDARDID"` // 现货品类ID
  819. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"SPOTGOODSBRANDID"` // 现货品牌ID
  820. ORIBUYQTY float64 `json:"oribuyqty" xorm:"ORIBUYQTY"` // 期初采购总量
  821. ORIBUYAMOUNT float64 `json:"oribuyamount" xorm:"ORIBUYAMOUNT"` // 期初采购总额
  822. ORISELLQTY float64 `json:"orisellqty" xorm:"ORISELLQTY"` // 期初销售总量
  823. ORISELLAMOUNT float64 `json:"orisellamount" xorm:"ORISELLAMOUNT"` // 期初销售总额
  824. ORIQTY float64 `json:"oriqty" xorm:"ORIQTY"` // 期初量
  825. ORIAVERAGEPRICE float64 `json:"oriaverageprice" xorm:"ORIAVERAGEPRICE"` // 期初均价
  826. ORIAMOUNT float64 `json:"oriamount" xorm:"ORIAMOUNT"` // 期初额
  827. TODAYBUYQTY float64 `json:"todaybuyqty" xorm:"TODAYBUYQTY"` // 今日采购量(今采购量)
  828. TODAYBUYAMOUNT float64 `json:"todaybuyamount" xorm:"TODAYBUYAMOUNT"` // 今日采购额(今采购额)
  829. TODAYBUYAVERAGEPRICE float64 `json:"todaybuyaverageprice" xorm:"TODAYBUYAVERAGEPRICE"` // 今日采购均价
  830. TODAYSELLQTY float64 `json:"todaysellqty" xorm:"TODAYSELLQTY"` // 今日销售量(今销售量)
  831. TODAYSELLAMOUNT float64 `json:"todaysellamount" xorm:"TODAYSELLAMOUNT"` // 今日销售额(今销售额)
  832. TODAYSELLAVERAGEPRICE float64 `json:"todaysellaverageprice" xorm:"TODAYSELLAVERAGEPRICE"` // 今日销售均价
  833. CURBUYQTY float64 `json:"curbuyqty" xorm:"CURBUYQTY"` // 期末采购总量
  834. CURBUYAMOUNT float64 `json:"curbuyamount" xorm:"CURBUYAMOUNT"` // 期末采购总额
  835. CURSELLQTY float64 `json:"cursellqty" xorm:"CURSELLQTY"` // 期末销售总量
  836. CURSELLAMOUNT float64 `json:"cursellamount" xorm:"CURSELLAMOUNT"` // 期末销售总额
  837. CURQTY float64 `json:"curqty" xorm:"CURQTY"` // 期末量
  838. CURAVERAGEPRICE float64 `json:"curaverageprice" xorm:"CURAVERAGEPRICE"` // 期末均价
  839. CURAMOUNT float64 `json:"curamount" xorm:"CURAMOUNT"` // 期末额
  840. CURSPOTPRICE float64 `json:"curspotprice" xorm:"CURSPOTPRICE"` // 参考市价(最新价)
  841. CURMARKETVALUE float64 `json:"curmarketvalue" xorm:"CURMARKETVALUE"` // 参考市值(期末市值)
  842. ACTUALPL float64 `json:"actualpl" xorm:"ACTUALPL"` // 现货损益
  843. FLOATPL float64 `json:"floatpl" xorm:"FLOATPL"` // 浮动损益
  844. UPDATETIME string `json:"updatetime" xorm:"UPDATETIME"` // 更新时间
  845. TODAYINQTY float64 `json:"todayinqty" xorm:"TODAYINQTY"` // 今日入库量(今入库量)
  846. TODAYOUTQTY float64 `json:"todayoutqty" xorm:"TODAYOUTQTY"` // 今日出库量(今出库量)
  847. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货商品代码
  848. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货商品名称
  849. GOODSUNITID int32 `json:"goodsunitid" xorm:"'GOODSUNITID'"` // 现货商品单位id
  850. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  851. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  852. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 品类单位id
  853. BRANDNAME string `json:"brandname" xorm:"'BRANDNAME'"` // 品牌名称
  854. EnumdicName string `json:"enumdicname"` // 现货商品单位名称
  855. UNITIDNAME string `json:"unitidname"` // 品类单位名称
  856. ACCOUNTNAME string `json:"accountname"` // 机构名称
  857. CURRENCYNAME string `json:"currencyname"` // 币种名称
  858. QueryType int32 `json:"-"` // 查询类型 1-报表 2-报表明细
  859. BeginDate string `json:"begindate"` // 开始交易日
  860. EndDate string `json:"enddate"` // 结束交易日
  861. }
  862. func (r *Ermcp3AreaSpotPLReport) calc() {
  863. r.EnumdicName = mtpcache.GetEnumDicitemName(r.GOODSUNITID)
  864. r.UNITIDNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  865. r.ACCOUNTNAME = mtpcache.GetUserNameByUserId(r.AREAUSERID)
  866. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  867. }
  868. func (r *Ermcp3AreaSpotPLReport) buildSql() string {
  869. // 日报表
  870. if r.QueryType == 1 && r.CYCLETYPE == 0 {
  871. return r.buildSqlDay()
  872. }
  873. // 日报表明细
  874. if r.QueryType == 2 && r.CYCLETYPE == 0 {
  875. return r.buildSqlDayDetail()
  876. }
  877. return r.buildSqlCycle()
  878. }
  879. // buildSqlDay 现货日报表查询语句
  880. func (r *Ermcp3AreaSpotPLReport) buildSqlDay() string {
  881. var sqlId utils.SQLVal = "select a.*," +
  882. " g.deliverygoodscode," +
  883. " g.deliverygoodsname," +
  884. " g.goodsunitid" +
  885. " from (SELECT t.RECKONDATE," +
  886. " t.AREAUSERID," +
  887. " t.CURRENCYID," +
  888. " t.DELIVERYGOODSID," +
  889. " sum(t.ORIBUYQTY) ORIBUYQTY," +
  890. " sum(t.ORIBUYAMOUNT) ORIBUYAMOUNT," +
  891. " sum(t.ORISELLQTY) ORISELLQTY," +
  892. " sum(t.ORISELLAMOUNT) ORISELLAMOUNT," +
  893. " sum(t.ORIQTY) ORIQTY," +
  894. " sum(t.ORIAVERAGEPRICE) ORIAVERAGEPRICE," +
  895. " sum(t.ORIAMOUNT) ORIAMOUNT," +
  896. " sum(t.TODAYBUYQTY) TODAYBUYQTY," +
  897. " sum(t.TODAYBUYAMOUNT) TODAYBUYAMOUNT," +
  898. " sum(t.TODAYBUYAVERAGEPRICE) TODAYBUYAVERAGEPRICE," +
  899. " sum(t.TODAYSELLQTY) TODAYSELLQTY," +
  900. " sum(t.TODAYSELLAMOUNT) TODAYSELLAMOUNT," +
  901. " sum(t.TODAYSELLAVERAGEPRICE) TODAYSELLAVERAGEPRICE," +
  902. " sum(t.CURBUYQTY) CURBUYQTY," +
  903. " sum(t.CURBUYAMOUNT) CURBUYAMOUNT," +
  904. " sum(t.CURSELLQTY) CURSELLQTY," +
  905. " sum(t.CURSELLAMOUNT) CURSELLAMOUNT," +
  906. " sum(t.CURQTY) CURQTY," +
  907. " sum(t.CURAVERAGEPRICE) CURAVERAGEPRICE," +
  908. " sum(t.CURAMOUNT) CURAMOUNT," +
  909. " sum(t.CURSPOTPRICE) CURSPOTPRICE," +
  910. " sum(t.CURMARKETVALUE) CURMARKETVALUE," +
  911. " sum(t.ACTUALPL) ACTUALPL," +
  912. " sum(t.FLOATPL) FLOATPL," +
  913. " sum(t.TODAYINQTY) TODAYINQTY," +
  914. " sum(t.TODAYOUTQTY) TODAYOUTQTY" +
  915. " FROM RECKON_ERMCP_AREASPOTPL t" +
  916. " WHERE 1=1 %v" +
  917. " GROUP BY t.RECKONDATE," +
  918. " t.AREAUSERID," +
  919. " t.CURRENCYID," +
  920. " t.DELIVERYGOODSID) a" +
  921. " LEFT JOIN DELIVERYGOODS g" +
  922. " on a.deliverygoodsid = g.deliverygoodsid"
  923. var sqlParam utils.SQLVal
  924. sqlParam.And("t.AREAUSERID", r.AREAUSERID)
  925. if r.QueryType == 1 {
  926. sqlParam.And("t.RECKONDATE", r.RECKONDATE)
  927. } else if r.QueryType == 2 {
  928. sqlParam.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  929. }
  930. sqlId.FormatParam(sqlParam.String())
  931. return sqlId.String()
  932. }
  933. func (r *Ermcp3AreaSpotPLReport) buildSqlDayDetail() string {
  934. var sqlId utils.SQLVal = "select a.*," +
  935. " g.deliverygoodscode," +
  936. " g.deliverygoodsname," +
  937. " g.goodsunitid," +
  938. " w.wrstandardcode," +
  939. " w.wrstandardname," +
  940. " w.unitid," +
  941. " dg.dgfactoryitemvalue brandName" +
  942. " from (SELECT t.RECKONDATE," +
  943. " t.AREAUSERID," +
  944. " t.CURRENCYID," +
  945. " t.DELIVERYGOODSID," +
  946. " t.WRSTANDARDID," +
  947. " t.SPOTGOODSBRANDID," +
  948. " sum(t.ORIBUYQTY) ORIBUYQTY," +
  949. " sum(t.ORIBUYAMOUNT) ORIBUYAMOUNT," +
  950. " sum(t.ORISELLQTY) ORISELLQTY," +
  951. " sum(t.ORISELLAMOUNT) ORISELLAMOUNT," +
  952. " sum(t.ORIQTY) ORIQTY," +
  953. " sum(t.ORIAVERAGEPRICE) ORIAVERAGEPRICE," +
  954. " sum(t.ORIAMOUNT) ORIAMOUNT," +
  955. " sum(t.TODAYBUYQTY) TODAYBUYQTY," +
  956. " sum(t.TODAYBUYAMOUNT) TODAYBUYAMOUNT," +
  957. " sum(t.TODAYBUYAVERAGEPRICE) TODAYBUYAVERAGEPRICE," +
  958. " sum(t.TODAYSELLQTY) TODAYSELLQTY," +
  959. " sum(t.TODAYSELLAMOUNT) TODAYSELLAMOUNT," +
  960. " sum(t.TODAYSELLAVERAGEPRICE) TODAYSELLAVERAGEPRICE," +
  961. " sum(t.CURBUYQTY) CURBUYQTY," +
  962. " sum(t.CURBUYAMOUNT) CURBUYAMOUNT," +
  963. " sum(t.CURSELLQTY) CURSELLQTY," +
  964. " sum(t.CURSELLAMOUNT) CURSELLAMOUNT," +
  965. " sum(t.CURQTY) CURQTY," +
  966. " sum(t.CURAVERAGEPRICE) CURAVERAGEPRICE," +
  967. " sum(t.CURAMOUNT) CURAMOUNT," +
  968. " sum(t.CURSPOTPRICE) CURSPOTPRICE," +
  969. " sum(t.CURMARKETVALUE) CURMARKETVALUE," +
  970. " sum(t.ACTUALPL) ACTUALPL," +
  971. " sum(t.FLOATPL) FLOATPL," +
  972. " sum(t.TODAYINQTY) TODAYINQTY," +
  973. " sum(t.TODAYOUTQTY) TODAYOUTQTY" +
  974. " FROM RECKON_ERMCP_AREASPOTPL t" +
  975. " WHERE 1 = 1 %v" +
  976. " GROUP BY t.RECKONDATE," +
  977. " t.AREAUSERID," +
  978. " t.CURRENCYID," +
  979. " t.DELIVERYGOODSID," +
  980. " t.WRSTANDARDID," +
  981. " t.SPOTGOODSBRANDID) a" +
  982. " LEFT JOIN DELIVERYGOODS g" +
  983. " on a.deliverygoodsid = g.deliverygoodsid" +
  984. " LEFT JOIN WRSTANDARD w" +
  985. " on a.wrstandardid = w.wrstandardid" +
  986. " LEFT JOIN DGFACTORYITEM dg" +
  987. " on a.spotgoodsbrandid = dg.dgfactoryitemid"
  988. var sqlParam utils.SQLVal
  989. sqlParam.And("t.AREAUSERID", r.AREAUSERID)
  990. sqlParam.AndEx("t.RECKONDATE", r.RECKONDATE, len(r.RECKONDATE) > 0)
  991. if len(r.BeginDate) > 0 && len(r.EndDate) > 0 {
  992. sqlParam.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  993. }
  994. sqlParam.And("t.CURRENCYID", r.CURRENCYID)
  995. sqlParam.And("t.DELIVERYGOODSID", r.DELIVERYGOODSID)
  996. sqlId.FormatParam(sqlParam.String())
  997. return sqlId.String()
  998. }
  999. // buildSqlCycle 周期报表查询语句
  1000. func (r *Ermcp3AreaSpotPLReport) buildSqlCycle() string {
  1001. var sqlId utils.SQLVal = "select a.*," +
  1002. " g.deliverygoodscode," +
  1003. " g.deliverygoodsname," +
  1004. " g.goodsunitid" +
  1005. " from (SELECT t.cycletype," +
  1006. " t.cycletime," +
  1007. " t.AREAUSERID," +
  1008. " t.CURRENCYID," +
  1009. " t.DELIVERYGOODSID," +
  1010. " sum(t.ORIBUYQTY) ORIBUYQTY," +
  1011. " sum(t.ORIBUYAMOUNT) ORIBUYAMOUNT," +
  1012. " sum(t.ORISELLQTY) ORISELLQTY," +
  1013. " sum(t.ORISELLAMOUNT) ORISELLAMOUNT," +
  1014. " sum(t.ORIQTY) ORIQTY," +
  1015. " sum(t.ORIAVERAGEPRICE) ORIAVERAGEPRICE," +
  1016. " sum(t.ORIAMOUNT) ORIAMOUNT," +
  1017. " sum(t.TODAYBUYQTY) TODAYBUYQTY," +
  1018. " sum(t.TODAYBUYAMOUNT) TODAYBUYAMOUNT," +
  1019. " sum(t.TODAYBUYAVERAGEPRICE) TODAYBUYAVERAGEPRICE," +
  1020. " sum(t.TODAYSELLQTY) TODAYSELLQTY," +
  1021. " sum(t.TODAYSELLAMOUNT) TODAYSELLAMOUNT," +
  1022. " sum(t.TODAYSELLAVERAGEPRICE) TODAYSELLAVERAGEPRICE," +
  1023. " sum(t.CURBUYQTY) CURBUYQTY," +
  1024. " sum(t.CURBUYAMOUNT) CURBUYAMOUNT," +
  1025. " sum(t.CURSELLQTY) CURSELLQTY," +
  1026. " sum(t.CURSELLAMOUNT) CURSELLAMOUNT," +
  1027. " sum(t.CURQTY) CURQTY," +
  1028. " sum(t.CURAVERAGEPRICE) CURAVERAGEPRICE," +
  1029. " sum(t.CURAMOUNT) CURAMOUNT," +
  1030. " sum(t.CURSPOTPRICE) CURSPOTPRICE," +
  1031. " sum(t.CURMARKETVALUE) CURMARKETVALUE," +
  1032. " sum(t.ACTUALPL) ACTUALPL," +
  1033. " sum(t.FLOATPL) FLOATPL," +
  1034. " sum(t.TODAYINQTY) TODAYINQTY," +
  1035. " sum(t.TODAYOUTQTY) TODAYOUTQTY" +
  1036. " FROM REPORT_ERMCP_AREASPOTPL t" +
  1037. " WHERE 1=1 %v" +
  1038. " GROUP BY t.AREAUSERID," +
  1039. " t.cycletype," +
  1040. " t.cycletime," +
  1041. " t.CURRENCYID," +
  1042. " t.DELIVERYGOODSID) a" +
  1043. " LEFT JOIN DELIVERYGOODS g" +
  1044. " on a.deliverygoodsid = g.deliverygoodsid"
  1045. var sqlParam utils.SQLVal
  1046. sqlParam.And("t.AREAUSERID", r.AREAUSERID)
  1047. sqlParam.And("t.Cycletype", r.CYCLETYPE)
  1048. sqlParam.And("t.CYCLETIME", r.CYCLETIME)
  1049. sqlId.FormatParam(sqlParam.String())
  1050. return sqlId.String()
  1051. }
  1052. // GetDataEx 获取现货报表(日/月/周/季/年)
  1053. func (r *Ermcp3AreaSpotPLReport) GetDataEx() (interface{}, error) {
  1054. sData := make([]Ermcp3AreaSpotPLReport, 0)
  1055. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1056. for i := range sData {
  1057. sData[i].calc()
  1058. sData[i].BeginDate = r.BeginDate
  1059. sData[i].EndDate = r.EndDate
  1060. }
  1061. return sData, err
  1062. }
  1063. // Ermcp3FinanceReport 财务报表
  1064. type Ermcp3FinanceReport struct {
  1065. RECKONDATE string `json:"reckondate" xorm:"RECKONDATE"` // 日照时期(yyyyMMdd)
  1066. CYCLETIME string `json:"cycletime" xorm:"CYCLETIME"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  1067. CYCLETYPE int32 `json:"cycletype" xorm:"CYCLETYPE"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  1068. SELLPREINVOICEDAMOUNT float64 `json:"sellpreinvoicedamount" xorm:"SELLPREINVOICEDAMOUNT"` // 销售预开票额(预开票额)
  1069. SELLUNINVOICEDAMOUNT float64 `json:"selluninvoicedamount" xorm:"SELLUNINVOICEDAMOUNT"` // 销售应开票额(应开票额)
  1070. TODAYRECEIVESUM float64 `json:"todayreceivesum" xorm:"TODAYRECEIVESUM"` // 今收款合计
  1071. TODAYPAYSUM float64 `json:"todaypaysum" xorm:"TODAYPAYSUM"` // 今付款合计
  1072. UPDATETIME string `json:"updatetime" xorm:"UPDATETIME"` // 更新时间
  1073. AREAUSERID int64 `json:"areauserid" xorm:"AREAUSERID"` // 所属机构\交易用户ID
  1074. CURRENCYID int32 `json:"currencyid" xorm:"CURRENCYID"` // 结算币种ID
  1075. BIZTYPE int32 `json:"biztype" xorm:"BIZTYPE"` // 业务类型 - 1:套保 2:套利
  1076. BUYTODAYSETTLEAMOUNT float64 `json:"buytodaysettleamount" xorm:"BUYTODAYSETTLEAMOUNT"` // 采购今付款额(今付货款额)
  1077. SELLTODAYSETTLEAMOUNT float64 `json:"selltodaysettleamount" xorm:"SELLTODAYSETTLEAMOUNT"` // 销售今收款额(今收货款额)
  1078. BUYTODAYREFUNDAMOUNT float64 `json:"buytodayrefundamount" xorm:"BUYTODAYREFUNDAMOUNT"` // 采购今收退款额(今收退款额)
  1079. SELLTODAYREFUNDAMOUNT float64 `json:"selltodayrefundamount" xorm:"SELLTODAYREFUNDAMOUNT"` // 销售今付退款额(今付退款额)
  1080. SELLTODAYINVOICEAMOUNT float64 `json:"selltodayinvoiceamount" xorm:"SELLTODAYINVOICEAMOUNT"` // 销售今开票额(今开票额)
  1081. BUYTODAYINVOICEAMOUNT float64 `json:"buytodayinvoiceamount" xorm:"BUYTODAYINVOICEAMOUNT"` // 采购今收票额(今收票额)
  1082. BUYPREPAIDAMOUNT float64 `json:"buyprepaidamount" xorm:"BUYPREPAIDAMOUNT"` // 采购预付款额(预付货款额)
  1083. BUYUNPAIDAMOUNT float64 `json:"buyunpaidamount" xorm:"BUYUNPAIDAMOUNT"` // 采购应付款额(应付货款额)
  1084. BUYPREINVOICEDAMOUNT float64 `json:"buypreinvoicedamount" xorm:"BUYPREINVOICEDAMOUNT"` // 采购预收票额(预收票额)
  1085. BUYUNINVOICEDAMOUNT float64 `json:"buyuninvoicedamount" xorm:"BUYUNINVOICEDAMOUNT"` // 采购应收票额(应收票额)
  1086. SELLPREPAIDAMOUNT float64 `json:"sellprepaidamount" xorm:"SELLPREPAIDAMOUNT"` // 销售预收款额(预收货款额)
  1087. SELLUNPAIDAMOUNT float64 `json:"sellunpaidamount" xorm:"SELLUNPAIDAMOUNT"` // 销售应收款额(应收货款额)
  1088. WRFACTORTYPEID int64 `json:"wrfactortypeid" xorm:"WRFACTORTYPEID"` // 仓单要素类型ID(212+Unix秒时间戳(10位)+xxxxxx)
  1089. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"DELIVERYGOODSID"` // 现货品种ID
  1090. WRSTANDARDID int64 `json:"wrstandardid" xorm:"WRSTANDARDID"` // 现货商品ID
  1091. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"SPOTGOODSBRANDID"` // 现货品牌ID
  1092. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  1093. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  1094. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  1095. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  1096. BRANDNAME string `json:"brandname" xorm:"'BRANDNAME'"` // 品牌名称
  1097. ACCOUNTNAME string `json:"accountname"` // 机构名称
  1098. CURRENCYNAME string `json:"currencyname"` // 币种名称
  1099. QueryType int32 `json:"-"` // 查询类型 1-报表 2-报表明细
  1100. BeginDate string `json:"begindate"` // 开始交易日
  1101. EndDate string `json:"enddate"` // 结束交易日
  1102. SumFields string `json:"-"` // 维度字段
  1103. }
  1104. func (r *Ermcp3FinanceReport) calc() {
  1105. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  1106. r.ACCOUNTNAME = mtpcache.GetUserNameByUserId(r.AREAUSERID)
  1107. f := func(v *float64) {
  1108. if *v < 0 {
  1109. *v = 0
  1110. }
  1111. }
  1112. f(&r.BUYPREPAIDAMOUNT)
  1113. f(&r.SELLPREINVOICEDAMOUNT)
  1114. f(&r.BUYUNINVOICEDAMOUNT)
  1115. f(&r.SELLPREPAIDAMOUNT)
  1116. f(&r.BUYPREINVOICEDAMOUNT)
  1117. }
  1118. // getSumField 获取汇总维度字段
  1119. func (r *Ermcp3FinanceReport) getSumField() (fields []string) {
  1120. fields = append(fields, "areauserid")
  1121. fields = append(fields, "currencyid")
  1122. if r.CYCLETYPE == 0 {
  1123. // 日报表
  1124. fields = append(fields, "reckondate")
  1125. } else {
  1126. // 周期报表
  1127. fields = append(fields, "cycletype")
  1128. fields = append(fields, "cycletime")
  1129. }
  1130. baseField := map[string]string{
  1131. "1": "deliverygoodsid",
  1132. "2": "wrstandardid",
  1133. "3": "spotgoodsbrandid",
  1134. }
  1135. param := []string{}
  1136. if len(r.SumFields) > 0 {
  1137. param = strings.Split(r.SumFields, ",")
  1138. }
  1139. for k, v := range baseField {
  1140. for _, p := range param {
  1141. if k == p {
  1142. fields = append(fields, v)
  1143. }
  1144. }
  1145. }
  1146. return
  1147. }
  1148. func (r *Ermcp3FinanceReport) getExFieldInfo() (strFiled string, strleftJoin string) {
  1149. if len(r.SumFields) > 0 {
  1150. param := strings.Split(r.SumFields, ",")
  1151. fHas := func(v string) bool {
  1152. for i := range param {
  1153. if param[i] == v {
  1154. return true
  1155. }
  1156. }
  1157. return false
  1158. }
  1159. if fHas("1") {
  1160. if len(strFiled) > 0 {
  1161. strFiled += ","
  1162. }
  1163. strFiled += "g.deliverygoodscode, g.deliverygoodsname, g.goodsunitid"
  1164. strleftJoin += " LEFT JOIN deliverygoods g on a.deliverygoodsid = g.deliverygoodsid"
  1165. }
  1166. if fHas("2") {
  1167. if len(strFiled) > 0 {
  1168. strFiled += ","
  1169. }
  1170. strFiled += "w.wrstandardname, w.wrstandardcode, w.unitid"
  1171. strleftJoin += " LEFT JOIN WRSTANDARD w on a.wrstandardid = w.wrstandardid"
  1172. }
  1173. if fHas("3") {
  1174. if len(strFiled) > 0 {
  1175. strFiled += ","
  1176. }
  1177. strFiled += "gb.dgfactoryitemvalue brandname"
  1178. strleftJoin += " LEFT JOIN dgfactoryitem gb on a.spotgoodsbrandid = gb.dgfactoryitemid"
  1179. }
  1180. }
  1181. return
  1182. }
  1183. func (r *Ermcp3FinanceReport) buildSql() string {
  1184. fields := r.getSumField()
  1185. if r.CYCLETYPE == 0 {
  1186. // 查日照报
  1187. return r.buildSqlReckon(fields)
  1188. } else {
  1189. // 查报表表
  1190. return r.buildSqlReport(fields)
  1191. }
  1192. }
  1193. func (r *Ermcp3FinanceReport) buildSqlReckon(fields []string) string {
  1194. var sqlId, sqlParam utils.SQLVal
  1195. var strFileds string
  1196. for _, v := range fields {
  1197. if len(strFileds) > 0 {
  1198. strFileds += ","
  1199. }
  1200. strFileds += "t." + v
  1201. }
  1202. sqlParam.And("t.AREAUSERID", r.AREAUSERID)
  1203. sqlParam.AndEx("t.RECKONDATE", r.RECKONDATE, len(r.RECKONDATE) > 0)
  1204. if len(r.BeginDate) > 0 && len(r.EndDate) > 0 {
  1205. sqlParam.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  1206. }
  1207. sqlParam.AndEx("t.CURRENCYID", r.CURRENCYID, r.CURRENCYID > 0)
  1208. exFileds, strleftJoin := r.getExFieldInfo()
  1209. if len(exFileds) > 0 {
  1210. // 有左联查额外信息(RECKON_ERMCP_AFINANCESUB明细表, 注意是不同的表)
  1211. sqlId = "select a.*, %v" +
  1212. " from (SELECT %v," +
  1213. " sum(t.BUYTODAYSETTLEAMOUNT) BUYTODAYSETTLEAMOUNT," +
  1214. " sum(t.BUYTODAYREFUNDAMOUNT) BUYTODAYREFUNDAMOUNT," +
  1215. " sum(t.BUYPREPAIDAMOUNT) BUYPREPAIDAMOUNT," +
  1216. " sum(t.BUYUNPAIDAMOUNT) BUYUNPAIDAMOUNT," +
  1217. " sum(t.BUYTODAYINVOICEAMOUNT) BUYTODAYINVOICEAMOUNT," +
  1218. " sum(t.BUYPREINVOICEDAMOUNT) BUYPREINVOICEDAMOUNT," +
  1219. " sum(t.BUYUNINVOICEDAMOUNT) BUYUNINVOICEDAMOUNT," +
  1220. " sum(t.SELLTODAYSETTLEAMOUNT) SELLTODAYSETTLEAMOUNT," +
  1221. " sum(t.SELLTODAYREFUNDAMOUNT) SELLTODAYREFUNDAMOUNT," +
  1222. " sum(t.SELLPREPAIDAMOUNT) SELLPREPAIDAMOUNT," +
  1223. " sum(t.SELLUNPAIDAMOUNT) SELLUNPAIDAMOUNT," +
  1224. " sum(t.SELLTODAYINVOICEAMOUNT) SELLTODAYINVOICEAMOUNT," +
  1225. " sum(t.SELLPREINVOICEDAMOUNT) SELLPREINVOICEDAMOUNT," +
  1226. " sum(t.SELLUNINVOICEDAMOUNT) SELLUNINVOICEDAMOUNT," +
  1227. " sum(t.TODAYRECEIVESUM) TODAYRECEIVESUM," +
  1228. " sum(t.TODAYPAYSUM) TODAYPAYSUM" +
  1229. " FROM RECKON_ERMCP_AFINANCESUB t" +
  1230. " WHERE 1 = 1 %v" +
  1231. " GROUP BY %v) a %v"
  1232. sqlId.FormatParam(exFileds, strFileds, sqlParam.String(), strFileds, strleftJoin)
  1233. } else {
  1234. sqlId = "SELECT %v," +
  1235. " sum(t.BUYTODAYSETTLEAMOUNT) BUYTODAYSETTLEAMOUNT," +
  1236. " sum(t.BUYTODAYREFUNDAMOUNT) BUYTODAYREFUNDAMOUNT," +
  1237. " sum(t.BUYPREPAIDAMOUNT) BUYPREPAIDAMOUNT," +
  1238. " sum(t.BUYUNPAIDAMOUNT) BUYUNPAIDAMOUNT," +
  1239. " sum(t.BUYTODAYINVOICEAMOUNT) BUYTODAYINVOICEAMOUNT," +
  1240. " sum(t.BUYPREINVOICEDAMOUNT) BUYPREINVOICEDAMOUNT," +
  1241. " sum(t.BUYUNINVOICEDAMOUNT) BUYUNINVOICEDAMOUNT," +
  1242. " sum(t.SELLTODAYSETTLEAMOUNT) SELLTODAYSETTLEAMOUNT," +
  1243. " sum(t.SELLTODAYREFUNDAMOUNT) SELLTODAYREFUNDAMOUNT," +
  1244. " sum(t.SELLPREPAIDAMOUNT) SELLPREPAIDAMOUNT," +
  1245. " sum(t.SELLUNPAIDAMOUNT) SELLUNPAIDAMOUNT," +
  1246. " sum(t.SELLTODAYINVOICEAMOUNT) SELLTODAYINVOICEAMOUNT," +
  1247. " sum(t.SELLPREINVOICEDAMOUNT) SELLPREINVOICEDAMOUNT," +
  1248. " sum(t.SELLUNINVOICEDAMOUNT) SELLUNINVOICEDAMOUNT," +
  1249. " sum(t.TODAYRECEIVESUM) TODAYRECEIVESUM," +
  1250. " sum(t.TODAYPAYSUM) TODAYPAYSUM" +
  1251. " FROM RECKON_ERMCP_AREAFINANCE t" +
  1252. " WHERE 1 = 1 %v" +
  1253. " GROUP BY %v"
  1254. sqlId.FormatParam(strFileds, sqlParam.String(), strFileds)
  1255. }
  1256. return sqlId.String()
  1257. }
  1258. func (r *Ermcp3FinanceReport) buildSqlReport(fields []string) string {
  1259. var sqlId, sqlParam utils.SQLVal
  1260. var strFileds string
  1261. for _, v := range fields {
  1262. if len(strFileds) > 0 {
  1263. strFileds += ","
  1264. }
  1265. strFileds += "t." + v
  1266. }
  1267. sqlParam.And("t.AREAUSERID", r.AREAUSERID)
  1268. sqlParam.And("t.CYCLETYPE", r.CYCLETYPE)
  1269. sqlParam.And("t.CYCLETIME", r.CYCLETIME)
  1270. sqlParam.AndEx("t.CURRENCYID", r.CURRENCYID, r.CURRENCYID > 0)
  1271. exFileds, strleftJoin := r.getExFieldInfo()
  1272. if len(exFileds) > 0 {
  1273. // 有左联查额外信息(REPORT_ERMCP_AFINANCESUB注意表名不同)
  1274. sqlId = "select a.*, %v" +
  1275. " from (SELECT %v," +
  1276. " sum(t.BUYTODAYSETTLEAMOUNT) BUYTODAYSETTLEAMOUNT," +
  1277. " sum(t.BUYTODAYREFUNDAMOUNT) BUYTODAYREFUNDAMOUNT," +
  1278. " sum(t.BUYPREPAIDAMOUNT) BUYPREPAIDAMOUNT," +
  1279. " sum(t.BUYUNPAIDAMOUNT) BUYUNPAIDAMOUNT," +
  1280. " sum(t.BUYTODAYINVOICEAMOUNT) BUYTODAYINVOICEAMOUNT," +
  1281. " sum(t.BUYPREINVOICEDAMOUNT) BUYPREINVOICEDAMOUNT," +
  1282. " sum(t.BUYUNINVOICEDAMOUNT) BUYUNINVOICEDAMOUNT," +
  1283. " sum(t.SELLTODAYSETTLEAMOUNT) SELLTODAYSETTLEAMOUNT," +
  1284. " sum(t.SELLTODAYREFUNDAMOUNT) SELLTODAYREFUNDAMOUNT," +
  1285. " sum(t.SELLPREPAIDAMOUNT) SELLPREPAIDAMOUNT," +
  1286. " sum(t.SELLUNPAIDAMOUNT) SELLUNPAIDAMOUNT," +
  1287. " sum(t.SELLTODAYINVOICEAMOUNT) SELLTODAYINVOICEAMOUNT," +
  1288. " sum(t.SELLPREINVOICEDAMOUNT) SELLPREINVOICEDAMOUNT," +
  1289. " sum(t.SELLUNINVOICEDAMOUNT) SELLUNINVOICEDAMOUNT," +
  1290. " sum(t.TODAYRECEIVESUM) TODAYRECEIVESUM," +
  1291. " sum(t.TODAYPAYSUM) TODAYPAYSUM" +
  1292. " FROM REPORT_ERMCP_AFINANCESUB t" +
  1293. " WHERE 1 = 1 %v" +
  1294. " GROUP BY %v) a %v"
  1295. sqlId.FormatParam(exFileds, strFileds, sqlParam.String(), strFileds, strleftJoin)
  1296. } else {
  1297. sqlId = "SELECT %v," +
  1298. " sum(t.BUYTODAYSETTLEAMOUNT) BUYTODAYSETTLEAMOUNT," +
  1299. " sum(t.BUYTODAYREFUNDAMOUNT) BUYTODAYREFUNDAMOUNT," +
  1300. " sum(t.BUYPREPAIDAMOUNT) BUYPREPAIDAMOUNT," +
  1301. " sum(t.BUYUNPAIDAMOUNT) BUYUNPAIDAMOUNT," +
  1302. " sum(t.BUYTODAYINVOICEAMOUNT) BUYTODAYINVOICEAMOUNT," +
  1303. " sum(t.BUYPREINVOICEDAMOUNT) BUYPREINVOICEDAMOUNT," +
  1304. " sum(t.BUYUNINVOICEDAMOUNT) BUYUNINVOICEDAMOUNT," +
  1305. " sum(t.SELLTODAYSETTLEAMOUNT) SELLTODAYSETTLEAMOUNT," +
  1306. " sum(t.SELLTODAYREFUNDAMOUNT) SELLTODAYREFUNDAMOUNT," +
  1307. " sum(t.SELLPREPAIDAMOUNT) SELLPREPAIDAMOUNT," +
  1308. " sum(t.SELLUNPAIDAMOUNT) SELLUNPAIDAMOUNT," +
  1309. " sum(t.SELLTODAYINVOICEAMOUNT) SELLTODAYINVOICEAMOUNT," +
  1310. " sum(t.SELLPREINVOICEDAMOUNT) SELLPREINVOICEDAMOUNT," +
  1311. " sum(t.SELLUNINVOICEDAMOUNT) SELLUNINVOICEDAMOUNT," +
  1312. " sum(t.TODAYRECEIVESUM) TODAYRECEIVESUM," +
  1313. " sum(t.TODAYPAYSUM) TODAYPAYSUM" +
  1314. " FROM REPORT_ERMCP_AREAFINANCE t" +
  1315. " WHERE 1 = 1 %v" +
  1316. " GROUP BY %v"
  1317. sqlId.FormatParam(strFileds, sqlParam.String(), strFileds)
  1318. }
  1319. return sqlId.String()
  1320. }
  1321. // GetDataEx 获取财务报表
  1322. func (r *Ermcp3FinanceReport) GetDataEx() (interface{}, error) {
  1323. sData := make([]Ermcp3FinanceReport, 0)
  1324. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1325. for i := range sData {
  1326. sData[i].calc()
  1327. sData[i].BeginDate = r.BeginDate
  1328. sData[i].EndDate = r.EndDate
  1329. }
  1330. return sData, err
  1331. }
  1332. // Ermcp3AreaStockReportEx 库存报表
  1333. type Ermcp3AreaStockReportEx struct {
  1334. RECKONDATE string `json:"reckondate" xorm:"RECKONDATE"` // 日照时期(yyyyMMdd)
  1335. CYCLETIME string `json:"cycletime" xorm:"CYCLETIME"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  1336. CYCLETYPE int32 `json:"cycletype" xorm:"CYCLETYPE"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  1337. USERID int64 `json:"userid" xorm:"'USERID'"` // 机构ID
  1338. WRSTANDARDID int32 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 品类ID
  1339. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'"` // 现货品牌ID
  1340. WAREHOUSEINFOID string `json:"warehouseinfoid" xorm:"'WAREHOUSEINFOID'"` // 仓库ID
  1341. ORISTOCK float64 `json:"oristock" xorm:"'ORISTOCK'"` // 期初库存量
  1342. CURSTOCK float64 `json:"curstock" xorm:"'CURSTOCK'"` // 期末库存量
  1343. TODAYBUYINQTY float64 `json:"todaybuyinqty" xorm:"'TODAYBUYINQTY'"` // 今采购入库量
  1344. TODAYPRODUCEINQTY float64 `json:"todayproduceinqty" xorm:"'TODAYPRODUCEINQTY'"` // 今内部入库量
  1345. TODAYSELLOUTQTY float64 `json:"todayselloutqty" xorm:"'TODAYSELLOUTQTY'"` // 今销售出库量
  1346. TODAYPRODUCEOUTQTY float64 `json:"todayproduceoutqty" xorm:"'TODAYPRODUCEOUTQTY'"` // 今内部出库量
  1347. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  1348. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  1349. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  1350. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 品类单位id
  1351. BRANDNAME string `json:"brandname" xorm:"'BRANDNAME'"` // 品牌名称
  1352. WAREHOUSENAME string `json:"warehousename" xorm:"'WAREHOUSENAME'"` // 仓库名称
  1353. WAREHOUSECODE string `json:"warehousecode" xorm:"'WAREHOUSECODE'"` // 仓库代码
  1354. WAREHOUSETYPE int32 `json:"warehousetype" xorm:"'WAREHOUSETYPE'"` // 仓库类型 - 1 厂库 2 自有库 3 合作库
  1355. USERNAME string `json:"username"` // 机构名称
  1356. ENUMDICNAME string `json:"enumdicname"` // 单位名称
  1357. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货品种id
  1358. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  1359. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  1360. GOODSUNITID int32 `json:"goodsunitid" xorm:"'GOODSUNITID'"` // 现货单位id
  1361. UNBUYINQTY float64 `json:"unbuyinqty"` // 采购未入库量(数据库未找到相关字段?)
  1362. UNSELLOUTQTY float64 `json:"unselloutqty"` // 销售未出库量(数据库未找到相关字段?)
  1363. DiffQty float64 `json:"diffqty"` // 库存变化量 = 期末 - 期初
  1364. BeginDate string `json:"begindate"` // 开始交易日
  1365. EndDate string `json:"enddate"` // 结束交易日
  1366. SumFields string `json:"-"` // 汇总维度(逗号隔开) 1-品种 2-品类 3-品牌 4-仓库
  1367. }
  1368. func (r *Ermcp3AreaStockReportEx) calc() {
  1369. r.USERNAME = mtpcache.GetUserNameByUserId(r.USERID)
  1370. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  1371. r.DiffQty = r.CURSTOCK - r.ORISTOCK
  1372. }
  1373. // getSumField 获取汇总维度字段
  1374. func (r *Ermcp3AreaStockReportEx) getSumField() (fields []string, bSum bool) {
  1375. fields = append(fields, "userid")
  1376. if r.CYCLETYPE == 0 {
  1377. // 日报表
  1378. fields = append(fields, "reckondate")
  1379. } else {
  1380. // 周期报表
  1381. fields = append(fields, "cycletype")
  1382. fields = append(fields, "cycletime")
  1383. }
  1384. baseField := map[string]string{
  1385. "1": "deliverygoodsid",
  1386. "2": "wrstandardid",
  1387. "3": "spotgoodsbrandid",
  1388. "4": "warehouseinfoid",
  1389. }
  1390. bSum = false
  1391. param := []string{}
  1392. if len(r.SumFields) > 0 {
  1393. param = strings.Split(r.SumFields, ",")
  1394. }
  1395. if len(param) == 0 {
  1396. // 全字段, 不需要汇总
  1397. for _, v := range baseField {
  1398. fields = append(fields, v)
  1399. }
  1400. bSum = false
  1401. } else {
  1402. bIncludeAll := true
  1403. // 判断是否包含所有维度
  1404. for k := range baseField {
  1405. bExist := false
  1406. for _, p := range param {
  1407. if k == p {
  1408. bExist = true
  1409. break
  1410. }
  1411. }
  1412. if !bExist {
  1413. bIncludeAll = false
  1414. break
  1415. }
  1416. }
  1417. if bIncludeAll {
  1418. // 包含了所有维度, 不需要汇总
  1419. for _, v := range baseField {
  1420. fields = append(fields, v)
  1421. }
  1422. bSum = false
  1423. } else {
  1424. tmp := map[string]string{}
  1425. for _, p := range param {
  1426. if v, ok := baseField[p]; ok {
  1427. // 利用map特性去重, 先保存在一个临时map中
  1428. tmp[p] = v
  1429. bSum = true
  1430. }
  1431. }
  1432. if bSum {
  1433. for _, v := range tmp {
  1434. fields = append(fields, v)
  1435. }
  1436. }
  1437. }
  1438. }
  1439. return
  1440. }
  1441. func (r *Ermcp3AreaStockReportEx) getExFieldInfo() (strFiled string, strleftJoin string) {
  1442. if len(r.SumFields) > 0 {
  1443. param := strings.Split(r.SumFields, ",")
  1444. fHas := func(v string) bool {
  1445. for i := range param {
  1446. if param[i] == v {
  1447. return true
  1448. }
  1449. }
  1450. return false
  1451. }
  1452. if fHas("1") {
  1453. if len(strFiled) > 0 {
  1454. strFiled += ","
  1455. }
  1456. strFiled += "g.deliverygoodscode, g.deliverygoodsname, g.goodsunitid"
  1457. strleftJoin += " LEFT JOIN deliverygoods g on a.deliverygoodsid = g.deliverygoodsid"
  1458. }
  1459. if fHas("2") {
  1460. if len(strFiled) > 0 {
  1461. strFiled += ","
  1462. }
  1463. strFiled += "w.wrstandardname, w.wrstandardcode, w.unitid"
  1464. strleftJoin += " LEFT JOIN WRSTANDARD w on a.wrstandardid = w.wrstandardid"
  1465. }
  1466. if fHas("3") {
  1467. if len(strFiled) > 0 {
  1468. strFiled += ","
  1469. }
  1470. strFiled += "gb.dgfactoryitemvalue brandname"
  1471. strleftJoin += " LEFT JOIN dgfactoryitem gb on a.spotgoodsbrandid = gb.dgfactoryitemid"
  1472. }
  1473. if fHas("4") {
  1474. if len(strFiled) > 0 {
  1475. strFiled += ","
  1476. }
  1477. strFiled += "h.warehousecode, h.warehousename, h.warehousetype"
  1478. strleftJoin += " LEFT JOIN WAREHOUSEINFO h on a.warehouseinfoid=h.autoid"
  1479. }
  1480. }
  1481. return
  1482. }
  1483. func (r *Ermcp3AreaStockReportEx) buildSql() (sqlId string) {
  1484. fields, bSum := r.getSumField()
  1485. if r.CYCLETYPE == 0 {
  1486. // 日报表
  1487. if bSum {
  1488. sqlId = r.buildSqlReckonSum(fields)
  1489. } else {
  1490. sqlId = r.buildSqlReckon()
  1491. }
  1492. } else {
  1493. // 周期报表
  1494. if bSum {
  1495. sqlId = r.buildSqlReportSum(fields)
  1496. } else {
  1497. sqlId = r.buildSqlReport()
  1498. }
  1499. }
  1500. return
  1501. }
  1502. // GetDataEx 获取库存报表
  1503. func (r *Ermcp3AreaStockReportEx) GetDataEx() (interface{}, error) {
  1504. sData := make([]Ermcp3AreaStockReportEx, 0)
  1505. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1506. for i := range sData {
  1507. sData[i].calc()
  1508. sData[i].BeginDate = r.BeginDate
  1509. sData[i].EndDate = r.EndDate
  1510. }
  1511. return sData, err
  1512. }
  1513. // buildSqlReckon 日照表
  1514. func (r *Ermcp3AreaStockReportEx) buildSqlReckon() string {
  1515. var sqlId utils.SQLVal = "SELECT t.TODAYBUYINQTY," +
  1516. " t.TODAYPRODUCEINQTY," +
  1517. " t.reckondate," +
  1518. " t.TODAYSELLOUTQTY," +
  1519. " t.TODAYPRODUCEOUTQTY," +
  1520. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  1521. " t.USERID," +
  1522. " t.WRSTANDARDID," +
  1523. " t.SPOTGOODSBRANDID," +
  1524. " t.WAREHOUSEINFOID," +
  1525. " t.deliverygoodsid," +
  1526. " t.ORISTOCK," +
  1527. " t.CURSTOCK," +
  1528. " w.wrstandardname," +
  1529. " w.wrstandardcode," +
  1530. " w.unitid," +
  1531. " gb.dgfactoryitemvalue brandname," +
  1532. " h.warehousename," +
  1533. " h.warehousecode," +
  1534. " h.warehousetype," +
  1535. " g.deliverygoodscode," +
  1536. " g.deliverygoodsname," +
  1537. " g.goodsunitid" +
  1538. " FROM RECKON_ERMCP_AREASTOCK t" +
  1539. " LEFT JOIN WRSTANDARD w" +
  1540. " on t.wrstandardid = w.wrstandardid" +
  1541. " LEFT JOIN dgfactoryitem gb" +
  1542. " on t.spotgoodsbrandid = gb.dgfactoryitemid" +
  1543. " LEFT JOIN deliverygoods g" +
  1544. " on t.deliverygoodsid = g.deliverygoodsid" +
  1545. " LEFT JOIN WAREHOUSEINFO h" +
  1546. " on t.warehouseinfoid = h.autoid" +
  1547. " WHERE 1 = 1"
  1548. sqlId.And("t.USERID", r.USERID)
  1549. sqlId.AndEx("t.RECKONDATE", r.RECKONDATE, len(r.RECKONDATE) > 0)
  1550. if len(r.BeginDate) > 0 && len(r.EndDate) > 0 {
  1551. sqlId.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  1552. }
  1553. // 现货商品id
  1554. sqlId.AndEx("t.DELIVERYGOODSID", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  1555. // 品类id
  1556. sqlId.AndEx("t.WRSTANDARDID", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  1557. // 品牌id
  1558. sqlId.AndEx("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  1559. // 仓库id
  1560. sqlId.AndEx("t.WAREHOUSEINFOID", r.WAREHOUSEINFOID, len(r.WAREHOUSEINFOID) > 0)
  1561. sqlId.Join(" order by t.reckondate")
  1562. return sqlId.String()
  1563. }
  1564. // buildSqlReckonSum 日照表(汇总维度)
  1565. func (r *Ermcp3AreaStockReportEx) buildSqlReckonSum(fields []string) string {
  1566. var sqlId utils.SQLVal = "SELECT a.*, %v" +
  1567. " from (SELECT %v," +
  1568. " sum(t.ORISTOCK) ORISTOCK," +
  1569. " sum(t.CURSTOCK) CURSTOCK," +
  1570. " sum(t.TODAYBUYINQTY) TODAYBUYINQTY," +
  1571. " sum(t.TODAYPRODUCEINQTY) TODAYPRODUCEINQTY," +
  1572. " sum(t.TODAYSELLOUTQTY) TODAYSELLOUTQTY," +
  1573. " sum(t.TODAYPRODUCEOUTQTY) TODAYPRODUCEOUTQTY" +
  1574. " FROM RECKON_ERMCP_AREASTOCK t" +
  1575. " WHERE 1 = 1 %v" +
  1576. " GROUP BY %v) a %v"
  1577. var sqlParam utils.SQLVal
  1578. sqlParam.And("t.USERID", r.USERID)
  1579. sqlParam.AndEx("t.RECKONDATE", r.RECKONDATE, len(r.RECKONDATE) > 0)
  1580. if len(r.BeginDate) > 0 && len(r.EndDate) > 0 {
  1581. sqlParam.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  1582. }
  1583. // 现货商品id
  1584. sqlParam.AndEx("t.DELIVERYGOODSID", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  1585. // 品类id
  1586. sqlParam.AndEx("t.WRSTANDARDID", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  1587. // 品牌id
  1588. sqlParam.AndEx("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  1589. // 仓库id
  1590. sqlParam.AndEx("t.WAREHOUSEINFOID", r.WAREHOUSEINFOID, len(r.WAREHOUSEINFOID) > 0)
  1591. var strFileds string
  1592. for _, v := range fields {
  1593. if len(strFileds) > 0 {
  1594. strFileds += ","
  1595. }
  1596. strFileds += "t." + v
  1597. }
  1598. exFields, exLeftJoinTable := r.getExFieldInfo()
  1599. sqlId.FormatParam(exFields, strFileds, sqlParam.String(), strFileds, exLeftJoinTable)
  1600. sqlId.Join(" order by a.reckondate")
  1601. return sqlId.String()
  1602. }
  1603. // buildSqlReport 报表表
  1604. func (r *Ermcp3AreaStockReportEx) buildSqlReport() string {
  1605. var sqlId utils.SQLVal = "SELECT t.TODAYBUYINQTY," +
  1606. " t.TODAYPRODUCEINQTY," +
  1607. " t.cycletype," +
  1608. " t.cycletime," +
  1609. " t.USERID," +
  1610. " t.WRSTANDARDID," +
  1611. " t.SPOTGOODSBRANDID," +
  1612. " t.WAREHOUSEINFOID," +
  1613. " t.deliverygoodsid," +
  1614. " t.TODAYSELLOUTQTY," +
  1615. " t.TODAYPRODUCEOUTQTY," +
  1616. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  1617. " t.ORISTOCK," +
  1618. " t.CURSTOCK," +
  1619. " w.wrstandardname," +
  1620. " w.wrstandardcode," +
  1621. " w.unitid," +
  1622. " gb.dgfactoryitemvalue brandname," +
  1623. " h.warehousename," +
  1624. " h.warehousecode," +
  1625. " h.warehousetype," +
  1626. " g.deliverygoodscode," +
  1627. " g.deliverygoodsname," +
  1628. " g.goodsunitid" +
  1629. " FROM REPORT_ERMCP_AREASTOCK t" +
  1630. " LEFT JOIN WRSTANDARD w" +
  1631. " on t.wrstandardid = w.wrstandardid" +
  1632. " LEFT JOIN dgfactoryitem gb" +
  1633. " on t.spotgoodsbrandid = gb.dgfactoryitemid" +
  1634. " LEFT JOIN deliverygoods g" +
  1635. " on t.deliverygoodsid = g.deliverygoodsid" +
  1636. " LEFT JOIN WAREHOUSEINFO h" +
  1637. " on t.warehouseinfoid = h.autoid" +
  1638. " WHERE 1 = 1"
  1639. sqlId.And("t.USERID", r.USERID)
  1640. sqlId.And("t.cycletype", r.CYCLETYPE)
  1641. sqlId.And("t.cycletime", r.CYCLETIME)
  1642. // 现货商品id
  1643. sqlId.AndEx("t.DELIVERYGOODSID", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  1644. // 品类id
  1645. sqlId.AndEx("t.WRSTANDARDID", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  1646. // 品牌id
  1647. sqlId.AndEx("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  1648. // 仓库id
  1649. sqlId.AndEx("t.WAREHOUSEINFOID", r.WAREHOUSEINFOID, len(r.WAREHOUSEINFOID) > 0)
  1650. return sqlId.String()
  1651. }
  1652. // buildSqlReport 报表表(汇总维度)
  1653. func (r *Ermcp3AreaStockReportEx) buildSqlReportSum(fields []string) string {
  1654. var sqlId utils.SQLVal = "SELECT a.*, %v" +
  1655. " from (SELECT %v," +
  1656. " sum(t.ORISTOCK) ORISTOCK," +
  1657. " sum(t.CURSTOCK) CURSTOCK," +
  1658. " sum(t.TODAYBUYINQTY) TODAYBUYINQTY," +
  1659. " sum(t.TODAYPRODUCEINQTY) TODAYPRODUCEINQTY," +
  1660. " sum(t.TODAYSELLOUTQTY) TODAYSELLOUTQTY," +
  1661. " sum(t.TODAYPRODUCEOUTQTY) TODAYPRODUCEOUTQTY" +
  1662. " FROM REPORT_ERMCP_AREASTOCK t" +
  1663. " WHERE 1 = 1 %v" +
  1664. " GROUP BY %v) a %v"
  1665. var sqlParam utils.SQLVal
  1666. sqlParam.And("t.USERID", r.USERID)
  1667. sqlParam.And("t.cycletype", r.CYCLETYPE)
  1668. sqlParam.And("t.cycletime", r.CYCLETIME)
  1669. // 现货商品id
  1670. sqlParam.AndEx("t.DELIVERYGOODSID", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  1671. // 品类id
  1672. sqlParam.AndEx("t.WRSTANDARDID", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  1673. // 品牌id
  1674. sqlParam.AndEx("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  1675. // 仓库id
  1676. sqlParam.AndEx("t.WAREHOUSEINFOID", r.WAREHOUSEINFOID, len(r.WAREHOUSEINFOID) > 0)
  1677. var strFileds string
  1678. for _, v := range fields {
  1679. if len(strFileds) > 0 {
  1680. strFileds += ","
  1681. }
  1682. strFileds += "t." + v
  1683. }
  1684. exFields, exLeftJoinTable := r.getExFieldInfo()
  1685. sqlId.FormatParam(exFields, strFileds, sqlParam.String(), strFileds, exLeftJoinTable)
  1686. return sqlId.String()
  1687. }
  1688. // Ermcp3ArealSumPL 损益汇总表
  1689. type Ermcp3ArealSumPL struct {
  1690. RECKONDATE string `json:"reckondate" xorm:"RECKONDATE"` // 日照时期(yyyyMMdd)
  1691. CYCLETIME string `json:"cycletime" xorm:"'CYCLETIME'"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  1692. CYCLETYPE int32 `json:"cycletype" xorm:"'CYCLETYPE'"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  1693. AREAUSERID int64 `json:"areauserid" xorm:"AREAUSERID"` // 所属机构\交易用户ID
  1694. MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"MIDDLEGOODSID"` // 套保品种ID(SEQ_ERMS_MIDDLEGOODS)
  1695. CURRENCYID int32 `json:"currencyid" xorm:"CURRENCYID"` // 结算币种ID
  1696. SPOTACTUALPL float64 `json:"spotactualpl" xorm:"SPOTACTUALPL"` // 现货损益
  1697. SPOTFLOATPL float64 `json:"spotfloatpl" xorm:"SPOTFLOATPL"` // 现货浮动损益
  1698. FUTUREACTUALPL float64 `json:"futureactualpl" xorm:"FUTUREACTUALPL"` // 期货损益
  1699. FUTUREFLOATPL float64 `json:"futurefloatpl" xorm:"FUTUREFLOATPL"` // 期货浮动损益
  1700. SUMACTUALPL float64 `json:"sumactualpl" xorm:"SUMACTUALPL"` // 实际损益 = (ActualPL + FutureActualPL)
  1701. SUMPL float64 `json:"sumpl" xorm:"'SUMPL'"` // 汇总损益
  1702. UPDATETIME string `json:"updatetime" xorm:"UPDATETIME"` // 更新时间
  1703. MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保品种名称
  1704. MIDDLEGOODSCODE string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保品种代码
  1705. GOODSUNITID int32 `json:"goodsunitid" xorm:"'GOODSUNITID'"` // 套保品种单位id
  1706. ACCOUNTNAME string `json:"accountname"` // 机构名称
  1707. ENUMDICNAME string `json:"enumdicname"` // 单位名称(套保品种)
  1708. CURRENCYNAME string `json:"currencyname"` // 币种名称
  1709. QueryType int32 `json:"-"` // 查询类型 1-报表 2-报表明细
  1710. BeginDate string `json:"begindate"` // 开始交易日
  1711. EndDate string `json:"enddate"` // 结束交易日
  1712. }
  1713. func (r *Ermcp3ArealSumPL) calc() {
  1714. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  1715. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.GOODSUNITID)
  1716. r.ACCOUNTNAME = mtpcache.GetUserNameByUserId(r.AREAUSERID)
  1717. }
  1718. func (r *Ermcp3ArealSumPL) buildSql() string {
  1719. // 日报表
  1720. if r.QueryType == 1 && r.CYCLETYPE == 0 {
  1721. return r.buildSqlDay()
  1722. }
  1723. // 日报表明细
  1724. if r.QueryType == 2 && r.CYCLETYPE == 0 {
  1725. return r.buildSqlDayDetail()
  1726. }
  1727. return r.buildSqlCycle()
  1728. }
  1729. // buildSqlDay 损益汇总日报表(需要汇总维度)
  1730. func (r *Ermcp3ArealSumPL) buildSqlDay() string {
  1731. var sqlId utils.SQLVal = "SELECT t.RECKONDATE," +
  1732. " t.AREAUSERID," +
  1733. " t.CURRENCYID," +
  1734. " sum(t.SPOTACTUALPL) SPOTACTUALPL," +
  1735. " sum(t.SPOTFLOATPL) SPOTFLOATPL," +
  1736. " sum(t.FUTUREACTUALPL) FUTUREACTUALPL," +
  1737. " sum(t.FUTUREFLOATPL) FUTUREFLOATPL," +
  1738. " sum(t.SUMACTUALPL) SUMACTUALPL," +
  1739. " sum(t.SUMPL) SUMPL" +
  1740. " FROM RECKON_ERMCP_AREASUMPL t" +
  1741. " WHERE 1 = 1"
  1742. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  1743. if r.QueryType == 1 {
  1744. sqlId.And("t.RECKONDATE", r.RECKONDATE)
  1745. } else if r.QueryType == 2 {
  1746. sqlId.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  1747. }
  1748. sqlId.Join(" GROUP BY t.RECKONDATE, t.AREAUSERID, t.CURRENCYID")
  1749. return sqlId.String()
  1750. }
  1751. func (r *Ermcp3ArealSumPL) buildSqlDayDetail() string {
  1752. var sqlId utils.SQLVal = "SELECT t.RECKONDATE," +
  1753. " t.AREAUSERID," +
  1754. " t.MIDDLEGOODSID," +
  1755. " t.CURRENCYID," +
  1756. " t.SPOTACTUALPL," +
  1757. " t.SPOTFLOATPL," +
  1758. " t.FUTUREACTUALPL," +
  1759. " t.FUTUREFLOATPL," +
  1760. " t.SUMACTUALPL," +
  1761. " t.SUMPL," +
  1762. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  1763. " g.middlegoodsname," +
  1764. " g.middlegoodscode," +
  1765. " g.goodsunitid" +
  1766. " FROM RECKON_ERMCP_AREASUMPL t" +
  1767. " LEFT JOIN ERMS_MIDDLEGOODS g on t.middlegoodsid=g.middlegoodsid" +
  1768. " WHERE 1 = 1"
  1769. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  1770. sqlId.AndEx("t.RECKONDATE", r.RECKONDATE, len(r.RECKONDATE) > 0)
  1771. if len(r.BeginDate) > 0 && len(r.EndDate) > 0 {
  1772. sqlId.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  1773. }
  1774. sqlId.And("t.CURRENCYID", r.CURRENCYID)
  1775. return sqlId.String()
  1776. }
  1777. func (r *Ermcp3ArealSumPL) buildSqlCycle() string {
  1778. var sqlId utils.SQLVal = "SELECT t.AREAUSERID," +
  1779. " t.CYCLETIME," +
  1780. " t.CYCLETYPE," +
  1781. " t.CURRENCYID," +
  1782. " sum(t.SPOTACTUALPL) SPOTACTUALPL," +
  1783. " sum(t.SPOTFLOATPL) SPOTFLOATPL," +
  1784. " sum(t.FUTUREACTUALPL) FUTUREACTUALPL," +
  1785. " sum(t.FUTUREFLOATPL) FUTUREFLOATPL," +
  1786. " sum(t.SUMACTUALPL) SUMACTUALPL," +
  1787. " sum(t.SUMPL) SUMPL" +
  1788. " FROM REPORT_ERMCP_AREASUMPL t" +
  1789. " WHERE 1 = 1"
  1790. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  1791. sqlId.And("t.cycletype", r.CYCLETYPE)
  1792. sqlId.And("t.cycletime", r.CYCLETIME)
  1793. sqlId.Join(" GROUP BY t.AREAUSERID, t.CURRENCYID, t.CYCLETIME, t.CYCLETYPE")
  1794. return sqlId.String()
  1795. }
  1796. // GetDataEx 获取损益汇总表
  1797. func (r *Ermcp3ArealSumPL) GetDataEx() (interface{}, error) {
  1798. sData := make([]Ermcp3ArealSumPL, 0)
  1799. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1800. for i := range sData {
  1801. sData[i].calc()
  1802. sData[i].BeginDate = r.BeginDate
  1803. sData[i].EndDate = r.EndDate
  1804. }
  1805. return sData, err
  1806. }
  1807. // Ermcp3TaFutuReDataReport 期货报表
  1808. type Ermcp3TaFutuReDataReport struct {
  1809. RECKONDATE string `json:"reckondate" xorm:"RECKONDATE"` // 日照时期(yyyyMMdd)
  1810. CYCLETIME string `json:"cycletime" xorm:"CYCLETIME"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  1811. CYCLETYPE int32 `json:"cycletype" xorm:"CYCLETYPE"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  1812. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 交易账户
  1813. GOODSID string `json:"goodsid" xorm:"GOODSID"` // 交易合约
  1814. BUYORSELL int32 `json:"buyorsell" xorm:"BUYORSELL"` // 持仓方向
  1815. CURRENCYID string `json:"currencyid" xorm:"CURRENCYID"` // 结算币种ID
  1816. USERID int64 `json:"userid" xorm:"USERID"` // 账户所属用户ID
  1817. RELATEDUSERID string `json:"relateduserid" xorm:"RELATEDUSERID"` // 账户关联用户ID
  1818. GOODSGROUPID string `json:"goodsgroupid" xorm:"GOODSGROUPID"` // 交易品种
  1819. ORIHOLDQTY float64 `json:"oriholdqty" xorm:"ORIHOLDQTY"` // 期初持仓量
  1820. ORIOPENAMOUNT float64 `json:"oriopenamount" xorm:"ORIOPENAMOUNT"` // 期初开仓额
  1821. ORIHOLDAMOUNT float64 `json:"oriholdamount" xorm:"ORIHOLDAMOUNT"` // 期初持仓额
  1822. TODAYOPENQTY float64 `json:"todayopenqty" xorm:"TODAYOPENQTY"` // 今开仓量
  1823. TODAYOPENAMOUNT float64 `json:"todayopenamount" xorm:"TODAYOPENAMOUNT"` // 今开仓额
  1824. TODAYCLOSEQTY float64 `json:"todaycloseqty" xorm:"TODAYCLOSEQTY"` // 今平仓量
  1825. TODAYCLOSEAMOUNT float64 `json:"todaycloseamount" xorm:"TODAYCLOSEAMOUNT"` // 今平仓额
  1826. HOLDQTY float64 `json:"holdqty" xorm:"HOLDQTY"` // 期末持仓量
  1827. OPENAMOUNT float64 `json:"openamount" xorm:"OPENAMOUNT"` // 期末开仓额
  1828. HOLDAMOUNT float64 `json:"holdamount" xorm:"HOLDAMOUNT"` // 期末持仓额
  1829. RECKONPRICE float64 `json:"reckonprice" xorm:"RECKONPRICE"` // 结算价
  1830. RECKONHOLDAMOUNT float64 `json:"reckonholdamount" xorm:"RECKONHOLDAMOUNT"` // 结算持仓额
  1831. CHARGE float64 `json:"charge" xorm:"CHARGE"` // 手续费
  1832. CLOSEPL float64 `json:"closepl" xorm:"CLOSEPL"` // 平仓损益
  1833. RECKONPL float64 `json:"reckonpl" xorm:"RECKONPL"` // 结算损益
  1834. LASTPRICE float64 `json:"lastprice" xorm:"LASTPRICE"` // 最新价
  1835. LASTHOLDAMOUNT float64 `json:"lastholdamount" xorm:"LASTHOLDAMOUNT"` // 当前持仓额
  1836. FLOATPL float64 `json:"floatpl" xorm:"FLOATPL"` // 浮动损益
  1837. GOODSGROUPSPOTQTY float64 `json:"goodsgroupspotqty" xorm:"GOODSGROUPSPOTQTY"` // 交易品种期末量 (= 期末持仓量 * 合约乘数)
  1838. TODAYGOODSGROUPSPOTQTY float64 `json:"todaygoodsgroupspotqty" xorm:"TODAYGOODSGROUPSPOTQTY"` // 交易品种变化量 (=(期末持仓量 - 期初持仓量)* 合约乘数)
  1839. MIDDLEGOODSQTY float64 `json:"middlegoodsqty" xorm:"MIDDLEGOODSQTY"` // 套保品种期末量 (=交易品种期末量 * 期货品种折算系数)
  1840. TODAYMIDDLEGOODSQTY float64 `json:"todaymiddlegoodsqty" xorm:"TODAYMIDDLEGOODSQTY"` // 套保品种变化量 (= 交易品种变化量*期货品种折算系数)
  1841. RECKONPL2 float64 `json:"reckonpl2" xorm:"RECKONPL2"` // 结算逐笔盈亏
  1842. OUTERGROUPCODE string `json:"outergroupcode" xorm:"'OUTERGROUPCODE'"` // 交易品种代码
  1843. GOODSGROUPNAME string `json:"goodsgroupname" xorm:"'GOODSGROUPNAME'"` // 交易品种名称
  1844. GOODSCODE string `json:"goodscode" xorm:"'GOODSCODE'"` // 交易合约代码
  1845. GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'"` // 交易合约名称
  1846. GOODUNITID int32 `json:"goodunitid" xorm:"'GOODUNITID'"` // 交易合约单位id
  1847. ACCOUNTNAME string `json:"accountname" xorm:"'ACCOUNTNAME'"` // 交易账号名称
  1848. ENUMDICNAME string `json:"enumdicname"` // 单位名称(现货商品)
  1849. QueryType int32 `json:"-"` // 查询类型 1-报表 2-报表明细
  1850. BeginDate string `json:"begindate"` // 开始交易日
  1851. EndDate string `json:"enddate"` // 结束交易日
  1852. }
  1853. func (r *Ermcp3TaFutuReDataReport) calc() {
  1854. }
  1855. func (r *Ermcp3TaFutuReDataReport) userType() int32 {
  1856. var userType int32 = 2
  1857. areaUserId := mtpcache.GetAreaUserId(r.USERID, 0)
  1858. if areaUserId == r.USERID {
  1859. userType = 2
  1860. } else {
  1861. userType = 7
  1862. }
  1863. return userType
  1864. }
  1865. func (r *Ermcp3TaFutuReDataReport) buildSql() string {
  1866. userType := r.userType()
  1867. // 日报表
  1868. if r.QueryType == 1 && r.CYCLETYPE == 0 {
  1869. return r.buildSqlReckon(userType)
  1870. }
  1871. // 日报表明细
  1872. if r.QueryType == 2 && r.CYCLETYPE == 0 {
  1873. return r.buildSqlReckonDetail(userType)
  1874. }
  1875. return r.buildSqlReport(userType)
  1876. }
  1877. // buildSqlReckon 日照表
  1878. func (r *Ermcp3TaFutuReDataReport) buildSqlReckon(userType int32) string {
  1879. var sqlId utils.SQLVal = "select a.*," +
  1880. " gp.outergroupcode," +
  1881. " gp.goodsgroupname," +
  1882. " g.goodscode," +
  1883. " g.goodsname," +
  1884. " g.goodunitid" +
  1885. " from (SELECT t.RECKONDATE," +
  1886. " t.GOODSID," +
  1887. " t.BUYORSELL," +
  1888. " t.CURRENCYID," +
  1889. " t.%v USERID," +
  1890. " t.GOODSGROUPID," +
  1891. " sum(t.ORIHOLDQTY) ORIHOLDQTY," +
  1892. " sum(t.ORIOPENAMOUNT) ORIOPENAMOUNT," +
  1893. " sum(t.ORIHOLDAMOUNT) ORIHOLDAMOUNT," +
  1894. " sum(t.TODAYOPENQTY) TODAYOPENQTY," +
  1895. " sum(t.TODAYOPENAMOUNT) TODAYOPENAMOUNT," +
  1896. " sum(t.TODAYCLOSEQTY) TODAYCLOSEQTY," +
  1897. " sum(t.TODAYCLOSEAMOUNT) TODAYCLOSEAMOUNT," +
  1898. " sum(t.HOLDQTY) HOLDQTY," +
  1899. " sum(t.OPENAMOUNT) OPENAMOUNT," +
  1900. " sum(t.HOLDAMOUNT) HOLDAMOUNT," +
  1901. " sum(t.RECKONPRICE) RECKONPRICE," +
  1902. " sum(t.RECKONHOLDAMOUNT) RECKONHOLDAMOUNT," +
  1903. " sum(t.CHARGE) CHARGE," +
  1904. " sum(t.CLOSEPL) CLOSEPL," +
  1905. " sum(t.RECKONPL) RECKONPL," +
  1906. " sum(t.LASTPRICE) LASTPRICE," +
  1907. " sum(t.LASTHOLDAMOUNT) LASTHOLDAMOUNT," +
  1908. " sum(t.FLOATPL) FLOATPL," +
  1909. " sum(t.GOODSGROUPSPOTQTY) GOODSGROUPSPOTQTY," +
  1910. " sum(t.TODAYGOODSGROUPSPOTQTY) TODAYGOODSGROUPSPOTQTY," +
  1911. " sum(t.MIDDLEGOODSQTY) MIDDLEGOODSQTY," +
  1912. " sum(t.TODAYMIDDLEGOODSQTY) TODAYMIDDLEGOODSQTY," +
  1913. " sum(t.Reckonpl2) RECKONPL2" +
  1914. " FROM RECKON_ERMCP_TAFUTUREDATA t" +
  1915. " WHERE 1 = 1 %v" +
  1916. " GROUP BY t.RECKONDATE," +
  1917. " t.GOODSID," +
  1918. " t.BUYORSELL," +
  1919. " t.CURRENCYID," +
  1920. " t.%v," +
  1921. " t.GOODSGROUPID) a" +
  1922. " left join goodsgroup gp" +
  1923. " on a.goodsgroupid = gp.goodsgroupid" +
  1924. " left join goods g" +
  1925. " on a.goodsid = g.goodsid"
  1926. userId := "USERID"
  1927. var sqlParam utils.SQLVal
  1928. if userType == 2 {
  1929. sqlParam.AndEx("t.userid", r.USERID, userType == 2)
  1930. userId = "USERID"
  1931. } else if userType == 7 {
  1932. sqlParam.AndEx("t.relateduserid", r.USERID, userType == 7)
  1933. userId = "RELATEDUSERID"
  1934. }
  1935. sqlParam.AndEx("t.reckondate", r.RECKONDATE, len(r.RECKONDATE) > 0)
  1936. if len(r.BeginDate) > 0 && len(r.EndDate) > 0 {
  1937. sqlParam.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  1938. }
  1939. sqlId.FormatParam(userId, sqlParam.String(), userId)
  1940. return sqlId.String()
  1941. }
  1942. // buildSqlReckon 日照表明细
  1943. func (r *Ermcp3TaFutuReDataReport) buildSqlReckonDetail(userType int32) string {
  1944. var sqlId utils.SQLVal = "select a.*," +
  1945. " gp.outergroupcode," +
  1946. " gp.goodsgroupname," +
  1947. " g.goodscode," +
  1948. " g.goodsname," +
  1949. " g.goodunitid," +
  1950. " ta.accountname" +
  1951. " from (SELECT t.reckondate," +
  1952. " t.GOODSID," +
  1953. " t.BUYORSELL," +
  1954. " t.CURRENCYID," +
  1955. " t.%v USERID," +
  1956. " t.accountid," +
  1957. " t.GOODSGROUPID," +
  1958. " sum(t.ORIHOLDQTY) ORIHOLDQTY," +
  1959. " sum(t.ORIOPENAMOUNT) ORIOPENAMOUNT," +
  1960. " sum(t.ORIHOLDAMOUNT) ORIHOLDAMOUNT," +
  1961. " sum(t.TODAYOPENQTY) TODAYOPENQTY," +
  1962. " sum(t.TODAYOPENAMOUNT) TODAYOPENAMOUNT," +
  1963. " sum(t.TODAYCLOSEQTY) TODAYCLOSEQTY," +
  1964. " sum(t.TODAYCLOSEAMOUNT) TODAYCLOSEAMOUNT," +
  1965. " sum(t.HOLDQTY) HOLDQTY," +
  1966. " sum(t.OPENAMOUNT) OPENAMOUNT," +
  1967. " sum(t.HOLDAMOUNT) HOLDAMOUNT," +
  1968. " sum(t.RECKONPRICE) RECKONPRICE," +
  1969. " sum(t.RECKONHOLDAMOUNT) RECKONHOLDAMOUNT," +
  1970. " sum(t.CHARGE) CHARGE," +
  1971. " sum(t.CLOSEPL) CLOSEPL," +
  1972. " sum(t.RECKONPL) RECKONPL," +
  1973. " sum(t.LASTPRICE) LASTPRICE," +
  1974. " sum(t.LASTHOLDAMOUNT) LASTHOLDAMOUNT," +
  1975. " sum(t.FLOATPL) FLOATPL," +
  1976. " sum(t.GOODSGROUPSPOTQTY) GOODSGROUPSPOTQTY," +
  1977. " sum(t.TODAYGOODSGROUPSPOTQTY) TODAYGOODSGROUPSPOTQTY," +
  1978. " sum(t.MIDDLEGOODSQTY) MIDDLEGOODSQTY," +
  1979. " sum(t.TODAYMIDDLEGOODSQTY) TODAYMIDDLEGOODSQTY," +
  1980. " sum(t.Reckonpl2) RECKONPL2" +
  1981. " FROM RECKON_ERMCP_TAFUTUREDATA t" +
  1982. " WHERE 1 = 1 %v" +
  1983. " GROUP BY t.reckondate," +
  1984. " t.GOODSID," +
  1985. " t.BUYORSELL," +
  1986. " t.CURRENCYID," +
  1987. " t.%v," +
  1988. " t.accountid," +
  1989. " t.GOODSGROUPID) a" +
  1990. " left join goodsgroup gp" +
  1991. " on a.goodsgroupid = gp.goodsgroupid" +
  1992. " left join goods g" +
  1993. " on a.goodsid = g.goodsid" +
  1994. " left join taaccount ta on a.accountid = ta.accountid"
  1995. userId := "USERID"
  1996. var sqlParam utils.SQLVal
  1997. if userType == 2 {
  1998. sqlParam.AndEx("t.userid", r.USERID, userType == 2)
  1999. userId = "USERID"
  2000. } else if userType == 7 {
  2001. sqlParam.AndEx("t.relateduserid", r.USERID, userType == 7)
  2002. userId = "RELATEDUSERID"
  2003. }
  2004. sqlParam.AndEx("t.reckondate", r.RECKONDATE, len(r.RECKONDATE) > 0)
  2005. if len(r.BeginDate) > 0 && len(r.EndDate) > 0 {
  2006. sqlParam.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  2007. }
  2008. sqlId.FormatParam(userId, sqlParam.String(), userId)
  2009. return sqlId.String()
  2010. }
  2011. // buildSqlReckon 报表表
  2012. func (r *Ermcp3TaFutuReDataReport) buildSqlReport(userType int32) string {
  2013. var sqlId utils.SQLVal = "select a.*," +
  2014. " gp.outergroupcode," +
  2015. " gp.goodsgroupname," +
  2016. " g.goodscode," +
  2017. " g.goodsname," +
  2018. " g.goodunitid" +
  2019. " from (SELECT t.cycletype," +
  2020. " t.cycletime," +
  2021. " t.GOODSID," +
  2022. " t.BUYORSELL," +
  2023. " t.CURRENCYID," +
  2024. " t.%v USERID," +
  2025. " t.GOODSGROUPID," +
  2026. " sum(t.ORIHOLDQTY) ORIHOLDQTY," +
  2027. " sum(t.ORIOPENAMOUNT) ORIOPENAMOUNT," +
  2028. " sum(t.ORIHOLDAMOUNT) ORIHOLDAMOUNT," +
  2029. " sum(t.TODAYOPENQTY) TODAYOPENQTY," +
  2030. " sum(t.TODAYOPENAMOUNT) TODAYOPENAMOUNT," +
  2031. " sum(t.TODAYCLOSEQTY) TODAYCLOSEQTY," +
  2032. " sum(t.TODAYCLOSEAMOUNT) TODAYCLOSEAMOUNT," +
  2033. " sum(t.HOLDQTY) HOLDQTY," +
  2034. " sum(t.OPENAMOUNT) OPENAMOUNT," +
  2035. " sum(t.HOLDAMOUNT) HOLDAMOUNT," +
  2036. " sum(t.RECKONPRICE) RECKONPRICE," +
  2037. " sum(t.RECKONHOLDAMOUNT) RECKONHOLDAMOUNT," +
  2038. " sum(t.CHARGE) CHARGE," +
  2039. " sum(t.CLOSEPL) CLOSEPL," +
  2040. " sum(t.RECKONPL) RECKONPL," +
  2041. " sum(t.LASTPRICE) LASTPRICE," +
  2042. " sum(t.LASTHOLDAMOUNT) LASTHOLDAMOUNT," +
  2043. " sum(t.FLOATPL) FLOATPL," +
  2044. " sum(t.GOODSGROUPSPOTQTY) GOODSGROUPSPOTQTY," +
  2045. " sum(t.TODAYGOODSGROUPSPOTQTY) TODAYGOODSGROUPSPOTQTY," +
  2046. " sum(t.MIDDLEGOODSQTY) MIDDLEGOODSQTY," +
  2047. " sum(t.TODAYMIDDLEGOODSQTY) TODAYMIDDLEGOODSQTY," +
  2048. " sum(t.Reckonpl2) RECKONPL2" +
  2049. " FROM REPORT_ERMCP_TAFUTUREDATA t" +
  2050. " WHERE 1 = 1 %v" +
  2051. " and t.userid = 8888" +
  2052. " and t.cycletype = 1" +
  2053. " and t.cycletime = '202105'" +
  2054. " GROUP BY t.cycletype," +
  2055. " t.cycletime," +
  2056. " t.GOODSID," +
  2057. " t.BUYORSELL," +
  2058. " t.CURRENCYID," +
  2059. " t.%v," +
  2060. " t.GOODSGROUPID) a" +
  2061. " left join goodsgroup gp" +
  2062. " on a.goodsgroupid = gp.goodsgroupid" +
  2063. " left join goods g" +
  2064. " on a.goodsid = g.goodsid"
  2065. userId := "USERID"
  2066. var sqlParam utils.SQLVal
  2067. if userType == 2 {
  2068. sqlParam.AndEx("t.userid", r.USERID, userType == 2)
  2069. userId = "USERID"
  2070. } else if userType == 7 {
  2071. sqlParam.AndEx("t.relateduserid", r.USERID, userType == 7)
  2072. userId = "RELATEDUSERID"
  2073. }
  2074. sqlParam.And("t.cycletype", r.CYCLETYPE)
  2075. sqlParam.And("t.cycletime", r.CYCLETIME)
  2076. sqlId.FormatParam(userId, sqlParam.String(), userId)
  2077. return sqlId.String()
  2078. }
  2079. // GetDataEx 获取期货报表
  2080. func (r *Ermcp3TaFutuReDataReport) GetDataEx() (interface{}, error) {
  2081. sData := make([]Ermcp3TaFutuReDataReport, 0)
  2082. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  2083. for i := range sData {
  2084. sData[i].calc()
  2085. sData[i].BeginDate = r.BeginDate
  2086. sData[i].EndDate = r.EndDate
  2087. }
  2088. return sData, err
  2089. }