ermcp3Report.go 138 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802
  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. "github.com/shopspring/decimal"
  10. "mtp2_if/db"
  11. "mtp2_if/mtpcache"
  12. "mtp2_if/utils"
  13. "strings"
  14. )
  15. // Ermcp3ReportOPLog 报表合同操作记录通用查询
  16. type Ermcp3ReportOPLog struct {
  17. LOGID string `json:"logid" xorm:"'lOGID'"` // 流水ID(604+Unix秒时间戳(10位)+xxxxxx)
  18. BIZTYPE int32 `json:"biztype" xorm:"'BIZTYPE'"` // 业务类型 - 1:套保计划 2:现货合同
  19. OPERATELOGTYPE int32 `json:"operatelogtype" xorm:"'OPERATELOGTYPE'"` // 操作流水类型 -
  20. RELATEDID string `json:"relatedid" xorm:"'RELATEDID'"` // 现货合同ID\套保计划
  21. LOGVALUE string `json:"logvalue" xorm:"'LOGVALUE'"` // 数值
  22. LOGDATETIME string `json:"logdatetime" xorm:"'LOGDATETIME'"` // 流水日期(时间)
  23. TRADEDATE string `json:"tradedate" xorm:"'TRADEDATE'"` // 交易日(yyyyMMdd)
  24. APPLYID int64 `json:"applyid" xorm:"'APPLYID'"` // 操作人
  25. CONTRACTTYPE int32 `json:"contracttype" xorm:"'CONTRACTTYPE'"` // 现货合同类型 - 1:采购 -1:销售
  26. USERID int64 `json:"userid" xorm:"'USERID'"` // 机构ID
  27. RELATEDNO string `json:"relatedno" xorm:"'RELATEDNO'"` // 合同编号
  28. UNITID int32 `json:"-" xorm:"'UNITID'"` // 现货商品单位id
  29. ENUMDICNAME string `json:"enumdicName"` // 单位名称
  30. OPTYPENAME string `json:"optypename"` // 流水类型名称
  31. LOGTYPENAME string `json:"logtypename"` // 合同类型(名称)
  32. APPLYNAME string `json:"applyname"` // 操作人名称
  33. BRANDNAME string `json:"brandname" xorm:"'brandname'"` // 品牌名称
  34. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货品种id
  35. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  36. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  37. WRSTANDARDID int32 `json:"wrstandardid" xorm:"'wrstandardid'"` // 品类id
  38. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'wrstandardcode'"` // 品类代码
  39. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'wrstandardname'"` // 品类名称
  40. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'"` // 品牌id
  41. LogTypeFilter string `json:"-"` // 查询日志类型, 逗号隔开(如 1,2,4)
  42. }
  43. // Calc 处理数据
  44. func (r *Ermcp3ReportOPLog) Calc() {
  45. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  46. r.APPLYNAME = mtpcache.GetUserNameByUserId(r.APPLYID)
  47. if r.APPLYNAME == "" {
  48. // APPLYID 可能存的是loginId
  49. r.APPLYNAME = mtpcache.GetLoginCodeByLoginId(r.APPLYID)
  50. }
  51. //1:点价价格 2:点价数量 3:结算量 4:其它费用 5:追加保证金 6溢短金额 7:调整金额 8:付款金额 9:收款金额 10:退款金额
  52. //11:收票金额 12:开票金额 13:提交审核(合同) 14:审核通过(合同) 15:审核拒绝(合同) 16:合同撤回 17:提交审核(计划)
  53. //18:审核通过(计划) 19:审核拒绝(计划) 20:计划撤回 21:正常完结(合同) 22:异常终止(合同) 23:退还保证金
  54. //24:采购入库 25:销售出库 26:生产入库 27:生产出库
  55. // 数据库注释与返回值映身关系: 结算量->确定量, 收款->收款金额, 退款->退款金额, 付款->付款金额, 收票->收票金额, 开票->开票金额
  56. sDes := []string{"点价价格", "点价数量", "确定量", "其它费用", "追加保证金", "溢短金额", "调整金额", "付款", "收款", "退款",
  57. "收票", "开票", "提交审核(合同)", "审核通过(合同)", "审核拒绝(合同)", "合同撤回", "提交审核(计划)",
  58. "审核通过(计划)", "审核拒绝(计划)", "计划撤回", "正常完结(合同)", "异常终止(合同)", "退还保证金",
  59. "采购入库", "销售出库", "生产入库", "生产出库"}
  60. if r.OPERATELOGTYPE >= 1 && r.OPERATELOGTYPE <= 27 {
  61. r.OPTYPENAME = sDes[r.OPERATELOGTYPE-1]
  62. }
  63. // 收款款项:采购合同的退款、销售合同的收款应用正数显示,付款款项:采购合同的付款、销售合同的退款应用负数显示
  64. if r.CONTRACTTYPE == 1 {
  65. r.LOGTYPENAME = "采购"
  66. // 采购合同/退款 正数
  67. if r.OPERATELOGTYPE == 10 && len(r.LOGVALUE) > 0 {
  68. if r.LOGVALUE[0] == '-' {
  69. r.LOGVALUE = r.LOGVALUE[1:]
  70. }
  71. }
  72. // 采购合同/付款 负数
  73. if r.OPERATELOGTYPE == 8 && len(r.LOGVALUE) > 0 {
  74. if r.LOGVALUE[0] != '-' {
  75. r.LOGVALUE = "-" + r.LOGVALUE
  76. }
  77. }
  78. } else if r.CONTRACTTYPE == -1 {
  79. r.LOGTYPENAME = "销售"
  80. // 销售合同/收款 正数
  81. if r.OPERATELOGTYPE == 9 && len(r.LOGVALUE) > 0 {
  82. if r.LOGVALUE[0] == '-' {
  83. r.LOGVALUE = r.LOGVALUE[1:]
  84. }
  85. }
  86. // 销售合同/退款 负数
  87. if r.OPERATELOGTYPE == 10 && len(r.LOGVALUE) > 0 {
  88. if r.LOGVALUE[0] != '-' {
  89. r.LOGVALUE = "-" + r.LOGVALUE
  90. }
  91. }
  92. }
  93. // 去除多余的0,最后4个0
  94. if r.LOGVALUE[len(r.LOGVALUE)-4:] == "0000" {
  95. r.LOGVALUE = r.LOGVALUE[:len(r.LOGVALUE)-4]
  96. }
  97. if r.BIZTYPE == 1 {
  98. r.LOGTYPENAME += "计划"
  99. } else if r.BIZTYPE == 2 {
  100. r.LOGTYPENAME += "合同"
  101. }
  102. }
  103. func (r *Ermcp3ReportOPLog) buildSql() string {
  104. var sqlId utils.SQLVal = "SELECT to_char(t.LOGID) LOGID," +
  105. " t.BIZTYPE," +
  106. " t.OPERATELOGTYPE," +
  107. " to_char(t.RELATEDID) RELATEDID," +
  108. " t.LOGVALUE," +
  109. " to_char(t.LOGDATETIME, 'yyyy-mm-dd hh24:mi:ss') LOGDATETIME," +
  110. " t.TRADEDATE," +
  111. " t.APPLYID," +
  112. " t.CONTRACTTYPE," +
  113. " t.USERID," +
  114. " t.wrstandardid," +
  115. " s.contractno relatedno," +
  116. " s.spotgoodsbrandid," +
  117. " g.deliverygoodsid," +
  118. " g.deliverygoodscode," +
  119. " g.deliverygoodsname," +
  120. " g.goodsunitid unitid," +
  121. " gb.dgfactoryitemvalue brandname," +
  122. " s.accountid," +
  123. " w.wrstandardcode," +
  124. " w.wrstandardname" +
  125. " FROM ERMCP_CONTRACTOPERATELOG t" +
  126. " inner join ermcp_spotcontract s" +
  127. " on t.RELATEDID = s.spotcontractid" +
  128. " left join deliverygoods g" +
  129. " on t.deliverygoodsid = g.deliverygoodsid" +
  130. " left join wrstandard w on t.wrstandardid=w.wrstandardid" +
  131. " left join dgfactoryitem gb" +
  132. " on s.spotgoodsbrandid = gb.dgfactoryitemid" +
  133. " WHERE t.biztype = 2"
  134. // 筛选条件
  135. sqlId.And("t.userid", r.USERID)
  136. sqlId.And("t.TRADEDATE", r.TRADEDATE)
  137. sqlId.AndEx("t.deliverygoodsid", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  138. sqlId.AndEx("t.wrstandardid", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  139. sqlId.AndEx("s.spotgoodsbrandid", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  140. if r.LogTypeFilter != "" {
  141. sqlId.Join(fmt.Sprintf(" and t.OPERATELOGTYPE in(%v)", r.LogTypeFilter))
  142. }
  143. return sqlId.String()
  144. }
  145. // GetDataEx 获取日志记录
  146. func (r *Ermcp3ReportOPLog) GetDataEx() (interface{}, error) {
  147. sData := make([]Ermcp3ReportOPLog, 0)
  148. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  149. for i := range sData {
  150. sData[i].Calc()
  151. }
  152. return sData, err
  153. }
  154. // Ermcp3ReckonAreaSpotSub 现货日报表(作废)
  155. type Ermcp3ReckonAreaSpotSub struct {
  156. RECKONDATE string `json:"reckondate" xorm:"'RECKONDATE'" form:"reckondate" binding:"required"` // 日照时期(yyyyMMdd)
  157. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'" form:"userid" binding:"required"` // 账户所属机构
  158. ACCOUNTID int64 `json:"accountid" xorm:"'ACCOUNTID'" form:"accountid"` // 期货账户ID
  159. WRFACTORTYPEID int64 `json:"wrfactortypeid" xorm:"'WRFACTORTYPEID'"` // 仓单要素类型ID(212+Unix秒时间戳(10位)+xxxxxx)
  160. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'" form:"deliverygoodsid"` // 现货品种ID
  161. WRSTANDARDID int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'" form:"wrstandardid"` // 现货品类ID
  162. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'" form:"spotgoodsbrandid"` // 现货品牌ID
  163. ORIBUYPRICEDQTY float64 `json:"oribuypricedqty" xorm:"'ORIBUYPRICEDQTY'"` // 期初采购合同已定价数量
  164. ORISELLPRICEDQTY float64 `json:"orisellpricedqty" xorm:"'ORISELLPRICEDQTY'"` // 期初销售合同已定价数量
  165. BUYPRICEDQTY float64 `json:"buypricedqty" xorm:"'BUYPRICEDQTY'"` // 采购合同已定价数量
  166. SELLPRICEDQTY float64 `json:"sellpricedqty" xorm:"'SELLPRICEDQTY'"` // 销售合同已定价数量
  167. TOTALSPOTQTY float64 `json:"totalspotqty" xorm:"'TOTALSPOTQTY'"` // 现货头寸总量 = 采购合同已定价数量 - 销售合同已定价数量
  168. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  169. TODAYBUYRECKONQTY float64 `json:"todaybuyreckonqty" xorm:"'TODAYBUYRECKONQTY'"` // 今日采购合同已确定数量
  170. TODAYSELLRECKONQTY float64 `json:"todaysellreckonqty" xorm:"'TODAYSELLRECKONQTY'"` // 今日销售合同已确定数量
  171. ORIBUYPRICEDAMOUNT float64 `json:"oribuypricedamount" xorm:"'ORIBUYPRICEDAMOUNT'"` // 期初采购合同已定价金额
  172. ORISELLPRICEDAMOUNT float64 `json:"orisellpricedamount" xorm:"'ORISELLPRICEDAMOUNT'"` // 期初销售合同已定价金额
  173. BUYPRICEDAMOUNT float64 `json:"buypricedamount" xorm:"'BUYPRICEDAMOUNT'"` // 采购合同已定价金额
  174. SELLPRICEDAMOUNT float64 `json:"sellpricedamount" xorm:"'SELLPRICEDAMOUNT'"` // 销售合同已定价金额
  175. ORIBUYRECKONQTY float64 `json:"oribuyreckonqty" xorm:"'ORIBUYRECKONQTY'"` // 期初采购合同交收量
  176. ORISELLRECKONQTY float64 `json:"orisellreckonqty" xorm:"'ORISELLRECKONQTY'"` // 期初销售合同交收量
  177. ORIBUYCONTRACTINQTY float64 `json:"oribuycontractinqty" xorm:"'ORIBUYCONTRACTINQTY'"` // 期初采购合同入库量
  178. ORISELLCONTRACTOUTQTY float64 `json:"orisellcontractoutqty" xorm:"'ORISELLCONTRACTOUTQTY'"` // 期初销售合同出库量
  179. ORIPRODUCEINQTY float64 `json:"oriproduceinqty" xorm:"'ORIPRODUCEINQTY'"` // 期初生产入库量
  180. ORIPRODUCEOUTQTY float64 `json:"oriproduceoutqty" xorm:"'ORIPRODUCEOUTQTY'"` // 期初生产出库量
  181. BUYRECKONQTY float64 `json:"buyreckonqty" xorm:"'BUYRECKONQTY'"` // 采购合同交收量
  182. SELLRECKONQTY float64 `json:"sellreckonqty" xorm:"'SELLRECKONQTY'"` // 销售合同交收量
  183. BUYCONTRACTINQTY float64 `json:"buycontractinqty" xorm:"'BUYCONTRACTINQTY'"` // 采购合同入库量
  184. SELLCONTRACTOUTQTY float64 `json:"sellcontractoutqty" xorm:"'SELLCONTRACTOUTQTY'"` // 销售合同出库量
  185. PRODUCEINQTY float64 `json:"produceinqty" xorm:"'PRODUCEINQTY'"` // 生产入库量
  186. PRODUCEOUTQTY float64 `json:"produceoutqty" xorm:"'PRODUCEOUTQTY'"` // 生产出库量
  187. ENUMDICNAME string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 现货商品单位名称
  188. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'wrstandardname'"` // 品类名称
  189. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'wrstandardcode'"` // 品类代码
  190. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'deliverygoodscode'"` // 现货商品代码
  191. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'deliverygoodsname'"` // 现货商品名称
  192. GOODSUNITID int32 `json:"goodsunitid" xorm:"'goodsunitid'"` // 现货商品单位id
  193. BRANDNAME string `json:"brandname" xorm:"'brandname'"` // 品牌名称
  194. ACCOUNTNAME string `json:"accountname" xorm:"'accountname'"` // 所属机构名称
  195. BIZTYPE int32 `json:"biztype" xorm:"'BIZTYPE'"` // 业务类型 1-套保 2-套利
  196. CURRENCYID int32 `json:"currencyid" xorm:"'CURRENCYID'"` // 币种id
  197. CURRENCYNAME string `json:"currencyname"` // 币种名称
  198. TOTALBUYPRICEDQTY float64 `json:"totalbuypricedqty"` // 采购定价量 = 期末 - 期初
  199. TOTALSELLPRICEDQTY float64 `json:"totalsellpricedqty"` // 销售定价量 = 期末 - 期初
  200. BeginDate string `json:"-"` // 开始日期
  201. EndDate string `json:"-"` // 结束日期
  202. }
  203. func (r *Ermcp3ReckonAreaSpotSub) calc() {
  204. r.TOTALBUYPRICEDQTY = r.BUYPRICEDQTY - r.ORIBUYPRICEDQTY
  205. r.TOTALSELLPRICEDQTY = r.SELLPRICEDQTY - r.ORISELLPRICEDQTY
  206. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  207. }
  208. func (r *Ermcp3ReckonAreaSpotSub) buildSql() string {
  209. var sqlId utils.SQLVal = "SELECT t.ORIBUYRECKONQTY," +
  210. " t.ORISELLRECKONQTY," +
  211. " t.ORIBUYCONTRACTINQTY," +
  212. " t.ORISELLCONTRACTOUTQTY," +
  213. " t.ORIPRODUCEINQTY," +
  214. " t.ORIPRODUCEOUTQTY," +
  215. " t.BUYRECKONQTY," +
  216. " t.SELLRECKONQTY," +
  217. " t.BUYCONTRACTINQTY," +
  218. " t.SELLCONTRACTOUTQTY," +
  219. " t.PRODUCEINQTY," +
  220. " t.PRODUCEOUTQTY," +
  221. " t.Reckondate," +
  222. " t.AREAUSERID," +
  223. " t.ACCOUNTID," +
  224. " t.WRFACTORTYPEID," +
  225. " t.DELIVERYGOODSID," +
  226. " t.WRSTANDARDID," +
  227. " t.SPOTGOODSBRANDID," +
  228. " t.ORIBUYPRICEDQTY," +
  229. " t.ORISELLPRICEDQTY," +
  230. " t.BUYPRICEDQTY," +
  231. " t.SELLPRICEDQTY," +
  232. " t.TOTALSPOTQTY," +
  233. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  234. " t.TODAYBUYRECKONQTY," +
  235. " t.TODAYSELLRECKONQTY," +
  236. " t.ORIBUYPRICEDAMOUNT," +
  237. " t.ORISELLPRICEDAMOUNT," +
  238. " t.BUYPRICEDAMOUNT," +
  239. " t.SELLPRICEDAMOUNT," +
  240. " t.currencyid," +
  241. " t.biztype," +
  242. " w.wrstandardname," +
  243. " w.wrstandardcode," +
  244. " g.deliverygoodscode," +
  245. " g.deliverygoodsname," +
  246. " g.goodsunitid," +
  247. " d.dgfactoryitemvalue brandname," +
  248. " u.accountname," +
  249. " e.enumdicname" +
  250. " FROM RECKON_ERMCP_AREASPOTSUB t" +
  251. " LEFT JOIN WRSTANDARD w" +
  252. " on t.wrstandardid = w.wrstandardid" +
  253. " LEFT JOIN DELIVERYGOODS g" +
  254. " on t.deliverygoodsid = g.deliverygoodsid" +
  255. " LEFT JOIN DGFACTORYITEM d" +
  256. " on t.spotgoodsbrandid = d.dgfactoryitemid" +
  257. " LEFT JOIN USERACCOUNT u" +
  258. " on t.areauserid = u.userid" +
  259. " LEFT JOIN ENUMDICITEM e" +
  260. " on g.goodsunitid = e.enumitemname" +
  261. " and e.enumdiccode = 'goodsunit'" +
  262. " and e.enumitemstatus = 1" +
  263. " WHERE 1 = 1"
  264. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  265. sqlId.AndEx("t.ACCOUNTID", r.ACCOUNTID, r.ACCOUNTID > 0)
  266. sqlId.AndEx("t.deliverygoodsid", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  267. sqlId.AndEx("t.WRSTANDARDID", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  268. sqlId.AndEx("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  269. if r.RECKONDATE != "" {
  270. sqlId.And("t.RECKONDATE", r.RECKONDATE)
  271. } else if r.BeginDate != "" && r.BeginDate == r.EndDate {
  272. sqlId.And("t.RECKONDATE", r.BeginDate)
  273. } else {
  274. if r.BeginDate != "" {
  275. sqlId.BiggerOrEq("t.RECKONDATE", r.BeginDate)
  276. }
  277. if r.EndDate != "" {
  278. sqlId.LessOrEq("t.RECKONDATE", r.EndDate)
  279. }
  280. }
  281. sqlId.Join(" order by t.RECKONDATE")
  282. return sqlId.String()
  283. }
  284. // GetDataEx 获取现货日报表
  285. func (r *Ermcp3ReckonAreaSpotSub) GetDataEx() (interface{}, error) {
  286. sData := make([]Ermcp3ReckonAreaSpotSub, 0)
  287. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  288. for i := range sData {
  289. sData[i].calc()
  290. }
  291. return sData, err
  292. }
  293. // Ermcp3ReportAreaSpotSub 现货分类月报表(作废)
  294. type Ermcp3ReportAreaSpotSub struct {
  295. ORIBUYRECKONQTY float64 `json:"oribuyreckonqty" xorm:"'ORIBUYRECKONQTY'"` // 期初采购合同交收量【期初】
  296. ORISELLRECKONQTY float64 `json:"orisellreckonqty" xorm:"'ORISELLRECKONQTY'"` // 期初销售合同交收量【期初】
  297. ORIBUYCONTRACTINQTY float64 `json:"oribuycontractinqty" xorm:"'ORIBUYCONTRACTINQTY'"` // 期初采购合同入库量【期初】
  298. ORISELLCONTRACTOUTQTY float64 `json:"orisellcontractoutqty" xorm:"'ORISELLCONTRACTOUTQTY'"` // 期初销售合同出库量【期初】
  299. ORIPRODUCEINQTY float64 `json:"oriproduceinqty" xorm:"'ORIPRODUCEINQTY'"` // 期初生产入库量【期初】
  300. ORIPRODUCEOUTQTY float64 `json:"oriproduceoutqty" xorm:"'ORIPRODUCEOUTQTY'"` // 期初生产出库量【期初】
  301. BUYRECKONQTY float64 `json:"buyreckonqty" xorm:"'BUYRECKONQTY'"` // 采购合同交收量【期末】
  302. SELLRECKONQTY float64 `json:"sellreckonqty" xorm:"'SELLRECKONQTY'"` // 销售合同交收量【期末】
  303. BUYCONTRACTINQTY float64 `json:"buycontractinqty" xorm:"'BUYCONTRACTINQTY'"` // 采购合同入库量【期末】
  304. SELLCONTRACTOUTQTY float64 `json:"sellcontractoutqty" xorm:"'SELLCONTRACTOUTQTY'"` // 销售合同出库量【期末】
  305. PRODUCEINQTY float64 `json:"produceinqty" xorm:"'PRODUCEINQTY'"` // 生产入库量【期末】
  306. PRODUCEOUTQTY float64 `json:"produceoutqty" xorm:"'PRODUCEOUTQTY'"` // 生产出库量【期末】
  307. CYCLETIME string `json:"cycletime" xorm:"'CYCLETIME'" form:"cycletime"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  308. CYCLETYPE int32 `json:"cycletype" xorm:"'CYCLETYPE'" form:"cycletype"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  309. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'" form:"userid" binding:"required"` // 账户所属机构
  310. ACCOUNTID int64 `json:"accountid" xorm:"'ACCOUNTID'" form:"accountid"` // 期货账户ID
  311. WRFACTORTYPEID int64 `json:"wrfactortypeid" xorm:"'WRFACTORTYPEID'"` // 仓单要素类型ID(212+Unix秒时间戳(10位)+xxxxxx)
  312. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'" form:"deliverygoodsid"` // 现货品种ID
  313. WRSTANDARDID int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'" form:"wrstandardid"` // 品类ID
  314. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'" form:"spotgoodsbrandid"` // 现货品牌ID
  315. ORIBUYPRICEDQTY float64 `json:"oribuypricedqty" xorm:"'ORIBUYPRICEDQTY'"` // 期初采购合同已定价数量【期初】
  316. ORISELLPRICEDQTY float64 `json:"orisellpricedqty" xorm:"'ORISELLPRICEDQTY'"` // 期初销售合同已定价数量【期初】
  317. BUYPRICEDQTY float64 `json:"buypricedqty" xorm:"'BUYPRICEDQTY'"` // 采购合同已定价数量【期末】
  318. SELLPRICEDQTY float64 `json:"sellpricedqty" xorm:"'SELLPRICEDQTY'"` // 销售合同已定价数量【期末】
  319. TOTALSPOTQTY float64 `json:"totalspotqty" xorm:"'TOTALSPOTQTY'"` // 现货头寸总量 = 采购合同已定价数量 - 销售合同已定价数量【期末】
  320. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  321. TODAYBUYRECKONQTY float64 `json:"todaybuyreckonqty" xorm:"'TODAYBUYRECKONQTY'"` // 今日采购合同已确定数量【汇总】
  322. TODAYSELLRECKONQTY float64 `json:"todaysellreckonqty" xorm:"'TODAYSELLRECKONQTY'"` // 今日销售合同已确定数量【汇总】
  323. ORIBUYPRICEDAMOUNT float64 `json:"oribuypricedamount" xorm:"'ORIBUYPRICEDAMOUNT'"` // 期初采购合同已定价金额【期初】
  324. ORISELLPRICEDAMOUNT float64 `json:"orisellpricedamount" xorm:"'ORISELLPRICEDAMOUNT'"` // 期初销售合同已定价金额【期初】
  325. BUYPRICEDAMOUNT float64 `json:"buypricedamount" xorm:"'BUYPRICEDAMOUNT'"` // 采购合同已定价金额【期末】
  326. SELLPRICEDAMOUNT float64 `json:"sellpricedamount" xorm:"'SELLPRICEDAMOUNT'"` // 销售合同已定价金额【期末】
  327. ENUMDICNAME string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 现货商品单位名称
  328. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'wrstandardname'"` // 品类名称
  329. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'wrstandardcode'"` // 品类代码
  330. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'deliverygoodscode'"` // 现货商品代码
  331. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'deliverygoodsname'"` // 现货商品名称
  332. GOODSUNITID int32 `json:"goodsunitid" xorm:"'goodsunitid'"` // 现货商品单位id
  333. BRANDNAME string `json:"brandname" xorm:"'brandname'"` // 品牌名称
  334. ACCOUNTNAME string `json:"accountname" xorm:"'accountname'"` // 所属机构名称
  335. BIZTYPE int32 `json:"biztype" xorm:"'BIZTYPE'"` // 业务类型 1-套保 2-套利
  336. CURRENCYID int32 `json:"currencyid" xorm:"'CURRENCYID'"` // 币种id
  337. CURRENCYNAME string `json:"currencyname"` // 币种名称
  338. TOTALBUYPRICEDQTY float64 `json:"totalbuypricedqty"` // 采购定价量 = 期末 - 期初
  339. TOTALSELLPRICEDQTY float64 `json:"totalsellpricedqty"` // 销售定价量 = 期末 - 期初
  340. }
  341. func (r *Ermcp3ReportAreaSpotSub) calc() {
  342. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  343. r.TOTALBUYPRICEDQTY = r.BUYPRICEDQTY - r.ORIBUYPRICEDQTY
  344. r.TOTALSELLPRICEDQTY = r.SELLPRICEDQTY - r.ORISELLPRICEDQTY
  345. }
  346. func (r *Ermcp3ReportAreaSpotSub) buildSql() string {
  347. var sqlId utils.SQLVal = "SELECT t.ORIBUYRECKONQTY," +
  348. " t.ORISELLRECKONQTY," +
  349. " t.ORIBUYCONTRACTINQTY," +
  350. " t.ORISELLCONTRACTOUTQTY," +
  351. " t.ORIPRODUCEINQTY," +
  352. " t.ORIPRODUCEOUTQTY," +
  353. " t.BUYRECKONQTY," +
  354. " t.SELLRECKONQTY," +
  355. " t.BUYCONTRACTINQTY," +
  356. " t.SELLCONTRACTOUTQTY," +
  357. " t.PRODUCEINQTY," +
  358. " t.PRODUCEOUTQTY," +
  359. " t.CYCLETIME," +
  360. " t.CYCLETYPE," +
  361. " t.AREAUSERID," +
  362. " t.ACCOUNTID," +
  363. " t.WRFACTORTYPEID," +
  364. " t.DELIVERYGOODSID," +
  365. " t.WRSTANDARDID," +
  366. " t.SPOTGOODSBRANDID," +
  367. " t.ORIBUYPRICEDQTY," +
  368. " t.ORISELLPRICEDQTY," +
  369. " t.BUYPRICEDQTY," +
  370. " t.SELLPRICEDQTY," +
  371. " t.TOTALSPOTQTY," +
  372. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  373. " t.TODAYBUYRECKONQTY," +
  374. " t.TODAYSELLRECKONQTY," +
  375. " t.ORIBUYPRICEDAMOUNT," +
  376. " t.ORISELLPRICEDAMOUNT," +
  377. " t.BUYPRICEDAMOUNT," +
  378. " t.SELLPRICEDAMOUNT," +
  379. " t.currencyid," +
  380. " t.biztype," +
  381. " w.wrstandardname," +
  382. " w.wrstandardcode," +
  383. " g.deliverygoodscode," +
  384. " g.deliverygoodsname," +
  385. " g.goodsunitid," +
  386. " d.dgfactoryitemvalue brandname," +
  387. " u.accountname," +
  388. " e.enumdicname" +
  389. " FROM REPORT_ERMCP_AREASPOTSUB t" +
  390. " LEFT JOIN WRSTANDARD w on t.wrstandardid=w.wrstandardid" +
  391. " LEFT JOIN DELIVERYGOODS g on t.deliverygoodsid=g.deliverygoodsid" +
  392. " LEFT JOIN DGFACTORYITEM d on t.spotgoodsbrandid=d.dgfactoryitemid" +
  393. " LEFT JOIN USERACCOUNT u on t.areauserid=u.userid" +
  394. " LEFT JOIN ENUMDICITEM e on g.goodsunitid=e.enumitemname and e.enumdiccode='goodsunit' and e.enumitemstatus=1" +
  395. " WHERE 1 = 1"
  396. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  397. sqlId.And("t.cycletype", r.CYCLETYPE)
  398. sqlId.And("t.cycletime", r.CYCLETIME)
  399. sqlId.AndEx("t.ACCOUNTID", r.ACCOUNTID, r.ACCOUNTID > 0)
  400. sqlId.AndEx("t.deliverygoodsid", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  401. sqlId.AndEx("t.WRSTANDARDID", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  402. sqlId.AndEx("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  403. return sqlId.String()
  404. }
  405. // GetDataEx 获取现货分类报表
  406. func (r *Ermcp3ReportAreaSpotSub) GetDataEx() (interface{}, error) {
  407. sData := make([]Ermcp3ReportAreaSpotSub, 0)
  408. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  409. for i := range sData {
  410. sData[i].calc()
  411. }
  412. return sData, err
  413. }
  414. // Ermcp3ExpourseReport 敞口报表
  415. type Ermcp3ExpourseReport struct {
  416. RECKONDATE string `json:"reckondate" xorm:"'RECKONDATE'"` // 日照时期(yyyyMMdd)
  417. CYCLETIME string `json:"cycletime" xorm:"'CYCLETIME'"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  418. CYCLETYPE int32 `json:"cycletype" xorm:"'CYCLETYPE'"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  419. ORITOTALSPOTQTY float64 `json:"oritotalspotqty" xorm:"'ORITOTALSPOTQTY'"` // 期初现货头寸总量
  420. ORITOTALFUTUREQTY float64 `json:"oritotalfutureqty" xorm:"'ORITOTALFUTUREQTY'"` // 期初期货头寸总量
  421. ORITOTALEXPOSURE float64 `json:"oritotalexposure" xorm:"'ORITOTALEXPOSURE'"` // 期初实时总敞口
  422. ORINEEDHEDGEEXPOSOURE float64 `json:"orineedhedgeexposoure" xorm:"'ORINEEDHEDGEEXPOSOURE'"` // 期初应套保敞口
  423. ORIHEDGEQTY float64 `json:"orihedgeqty" xorm:"'ORIHEDGEQTY'"` // 期初套保量
  424. ORIARBITRAGEQTY float64 `json:"oriarbitrageqty" xorm:"'ORIARBITRAGEQTY'"` // 期初套利量
  425. ORINEEDHEDGEQTY float64 `json:"orineedhedgeqty" xorm:"'ORINEEDHEDGEQTY'"` // 期初应套保量
  426. ORINEEDARBITRAGEQTY float64 `json:"orineedarbitrageqty" xorm:"'ORINEEDARBITRAGEQTY'"` // 期初应套利量
  427. ORITOTALNEEDHEDGEQTY float64 `json:"oritotalneedhedgeqty" xorm:"'ORITOTALNEEDHEDGEQTY'"` // 期初应套保总量
  428. MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"'MIDDLEGOODSID'"` // 套保品种ID
  429. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构\交易用户ID
  430. ACCOUNTID int64 `json:"accountid" xorm:"'ACCOUNTID'"` // 期货账户ID (作废, 默认为0)
  431. ORIBUYPLANQTY float64 `json:"oribuyplanqty" xorm:"'ORIBUYPLANQTY'"` // 期初采购计划数量
  432. ORIBUYPRICEDQTY float64 `json:"oribuypricedqty" xorm:"'ORIBUYPRICEDQTY'"` // 期初采购合同已定价数量
  433. ORISELLPLANQTY float64 `json:"orisellplanqty" xorm:"'ORISELLPLANQTY'"` // 期初销售计划数量
  434. ORISELLPRICEDQTY float64 `json:"orisellpricedqty" xorm:"'ORISELLPRICEDQTY'"` // 期初销售合同已定价数量
  435. ORIBUYFUTUREQTY float64 `json:"oribuyfutureqty" xorm:"'ORIBUYFUTUREQTY'"` // 期初买入期货数量
  436. ORISELLFUTUREQTY float64 `json:"orisellfutureqty" xorm:"'ORISELLFUTUREQTY'"` // 期初卖出期货数量
  437. BUYPLANQTY float64 `json:"buyplanqty" xorm:"'BUYPLANQTY'"` // 采购计划数量
  438. BUYPRICEDQTY float64 `json:"buypricedqty" xorm:"'BUYPRICEDQTY'"` // 采购合同已定价数量
  439. SELLPLANQTY float64 `json:"sellplanqty" xorm:"'SELLPLANQTY'"` // 销售计划数量
  440. SELLPRICEDQTY float64 `json:"sellpricedqty" xorm:"'SELLPRICEDQTY'"` // 销售合同已定价数量
  441. BUYFUTUREQTY float64 `json:"buyfutureqty" xorm:"'BUYFUTUREQTY'"` // 买入期货数量
  442. SELLFUTUREQTY float64 `json:"sellfutureqty" xorm:"'SELLFUTUREQTY'"` // 卖出期货数量
  443. TOTALSPOTQTY float64 `json:"totalspotqty" xorm:"'TOTALSPOTQTY'"` // 现货头寸总量
  444. TOTALFUTUREQTY float64 `json:"totalfutureqty" xorm:"'TOTALFUTUREQTY'"` // 期货头寸总量(期货总量)
  445. TOTALEXPOSURE float64 `json:"totalexposure" xorm:"'TOTALEXPOSURE'"` // 实时总敞口(总敞口)
  446. TOTALHEDGERATIO float64 `json:"totalhedgeratio" xorm:"'TOTALHEDGERATIO'"` // 敞口比例
  447. TOTALNEEDHEDGEQTY float64 `json:"totalneedhedgeqty" xorm:"'TOTALNEEDHEDGEQTY'"` // 应套保总量(现货应套保总量)
  448. NEEDHEDGEEXPOSOURE float64 `json:"needhedgeexposoure" xorm:"'NEEDHEDGEEXPOSOURE'"` // 应套保敞口(套保敞口)
  449. NEEDHEDGERATIO float64 `json:"needhedgeratio" xorm:"'NEEDHEDGERATIO'"` // 应套保敞口比例
  450. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  451. HEDGEQTY float64 `json:"hedgeqty" xorm:"'HEDGEQTY'"` // 套保量
  452. ARBITRAGEQTY float64 `json:"arbitrageqty" xorm:"'ARBITRAGEQTY'"` // 套利量
  453. NEEDHEDGEQTY float64 `json:"needhedgeqty" xorm:"'NEEDHEDGEQTY'"` // 应套保量
  454. NEEDARBITRAGEQTY float64 `json:"needarbitrageqty" xorm:"'NEEDARBITRAGEQTY'"` // 应套利量
  455. MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保商品名称
  456. MIDDLEGOODSCODE string `json:"middlgoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保商品代码
  457. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 单位id
  458. MGNEEDHEDGERATIO float64 `json:"mgneedhedgeratio" xorm:"'MGNEEDHEDGERATIO'"` // 套保比例(套保品的)
  459. NEEDARBITRAGERATIO float64 `json:"needarbitrageratio" xorm:"'NEEDARBITRAGERATIO'"` // 套利比例(套保品的)
  460. ENUMDICNAME string `json:"enumdicname"` // 单位名称
  461. ACCOUNTNAME string `json:"accountname"` // 机构名称
  462. DiffSpotQty float64 `json:"diffspotqty"` // 变动量(现货)
  463. DiffMgQtyA float64 `json:"diffmgqtya"` // 套保变动量
  464. DiffMgQtyB float64 `json:"diffmgqtyb"` // 套利变动量
  465. DiffFutuQty float64 `json:"difffutuqty"` // 变动量(期货)
  466. DiffQty float64 `json:"diffqty"` // 变动量(总敞口)
  467. DiffHedgeQty float64 `json:"diffhedgeqty"` // 变动量(现货应套保总量)
  468. DiffExposure float64 `json:"diffexposure"` // 变动量(套保敞口)
  469. QueryType int32 `json:"-"` // 查询类型 1-报表
  470. BeginDate string `json:"begindate"` // 开始交易日
  471. EndDate string `json:"enddate"` // 结束交易日
  472. }
  473. func (r *Ermcp3ExpourseReport) calc() {
  474. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  475. r.ACCOUNTNAME = mtpcache.GetUserNameByUserId(r.AREAUSERID)
  476. // 变动量(现货) = 现货头寸总量 - 期初现货头寸总量
  477. r.DiffSpotQty = r.TOTALSPOTQTY - r.ORITOTALSPOTQTY
  478. // 套保变动量 = 套保量 - 期初套保量
  479. r.DiffMgQtyA = r.HEDGEQTY - r.ORIHEDGEQTY
  480. // 套利变动量 = 套利量 - 期初套利量
  481. r.DiffMgQtyB = r.ARBITRAGEQTY - r.ORIARBITRAGEQTY
  482. // 变动量(期货) = (买入 - 买入期初) - (卖出 - 卖出期初)
  483. r.DiffFutuQty = (r.BUYFUTUREQTY - r.ORIBUYFUTUREQTY) - (r.SELLFUTUREQTY - r.ORISELLFUTUREQTY)
  484. // 变动量(敞口) = 实时敞口 - 期初实时敞口
  485. r.DiffQty = r.TOTALEXPOSURE - r.ORITOTALEXPOSURE
  486. // 变动量(现货应套保总量)
  487. r.DiffHedgeQty = r.TOTALNEEDHEDGEQTY - r.ORITOTALNEEDHEDGEQTY
  488. // 变动量(套保敞口)
  489. r.DiffExposure = r.NEEDHEDGEEXPOSOURE - r.ORINEEDHEDGEEXPOSOURE
  490. }
  491. func (r *Ermcp3ExpourseReport) buildSql() string {
  492. if r.CYCLETYPE == 0 {
  493. return r.buildSqlDay()
  494. }
  495. return r.buildSqlCycle()
  496. }
  497. func (r *Ermcp3ExpourseReport) buildSqlDay() string {
  498. var sqlId utils.SQLVal = "SELECT t.ORITOTALSPOTQTY," +
  499. " t.ORITOTALFUTUREQTY," +
  500. " t.ORITOTALEXPOSURE," +
  501. " t.ORINEEDHEDGEEXPOSOURE," +
  502. " t.ORIHEDGEQTY," +
  503. " t.ORIARBITRAGEQTY," +
  504. " t.ORINEEDHEDGEQTY," +
  505. " t.ORINEEDARBITRAGEQTY," +
  506. " t.ORITOTALNEEDHEDGEQTY," +
  507. " t.RECKONDATE," +
  508. " t.MIDDLEGOODSID," +
  509. " t.AREAUSERID," +
  510. " t.ACCOUNTID," +
  511. " t.ORIBUYPLANQTY," +
  512. " t.ORIBUYPRICEDQTY," +
  513. " t.ORISELLPLANQTY," +
  514. " t.ORISELLPRICEDQTY," +
  515. " t.ORIBUYFUTUREQTY," +
  516. " t.ORISELLFUTUREQTY," +
  517. " t.BUYPLANQTY," +
  518. " t.BUYPRICEDQTY," +
  519. " t.SELLPLANQTY," +
  520. " t.SELLPRICEDQTY," +
  521. " t.BUYFUTUREQTY," +
  522. " t.SELLFUTUREQTY," +
  523. " t.TOTALSPOTQTY," +
  524. " t.TOTALFUTUREQTY," +
  525. " t.TOTALEXPOSURE," +
  526. " t.TOTALHEDGERATIO," +
  527. " t.TOTALNEEDHEDGEQTY," +
  528. " t.NEEDHEDGEEXPOSOURE," +
  529. " t.NEEDHEDGERATIO," +
  530. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  531. " t.HEDGEQTY," +
  532. " t.ARBITRAGEQTY," +
  533. " t.NEEDHEDGEQTY," +
  534. " t.NEEDARBITRAGEQTY," +
  535. " g.middlegoodsname," +
  536. " g.middlegoodscode," +
  537. " g.goodsunitid unitid," +
  538. " g.needhedgeratio MGNEEDHEDGERATIO," +
  539. " g.needarbitrageratio" +
  540. " FROM RECKON_ERMCP_AREAEXPOSURE t" +
  541. " LEFT JOIN ERMS_MIDDLEGOODS g" +
  542. " on t.middlegoodsid = g.middlegoodsid" +
  543. " WHERE 1 = 1"
  544. sqlId.AndEx("t.AREAUSERID", r.AREAUSERID, r.AREAUSERID > 0)
  545. if r.QueryType == 1 {
  546. sqlId.And("t.RECKONDATE", r.RECKONDATE)
  547. } else if r.QueryType == 2 {
  548. sqlId.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  549. }
  550. return sqlId.String()
  551. }
  552. func (r *Ermcp3ExpourseReport) buildSqlCycle() string {
  553. var sqlId utils.SQLVal = "SELECT t.cycletime," +
  554. " t.cycletype," +
  555. " t.ORITOTALSPOTQTY," +
  556. " t.ORITOTALFUTUREQTY," +
  557. " t.ORITOTALEXPOSURE," +
  558. " t.ORINEEDHEDGEEXPOSOURE," +
  559. " t.ORIHEDGEQTY," +
  560. " t.ORIARBITRAGEQTY," +
  561. " t.ORINEEDHEDGEQTY," +
  562. " t.ORINEEDARBITRAGEQTY," +
  563. " t.ORITOTALNEEDHEDGEQTY," +
  564. " t.MIDDLEGOODSID," +
  565. " t.AREAUSERID," +
  566. " t.ACCOUNTID," +
  567. " t.ORIBUYPLANQTY," +
  568. " t.ORIBUYPRICEDQTY," +
  569. " t.ORISELLPLANQTY," +
  570. " t.ORISELLPRICEDQTY," +
  571. " t.ORIBUYFUTUREQTY," +
  572. " t.ORISELLFUTUREQTY," +
  573. " t.BUYPLANQTY," +
  574. " t.BUYPRICEDQTY," +
  575. " t.SELLPLANQTY," +
  576. " t.SELLPRICEDQTY," +
  577. " t.BUYFUTUREQTY," +
  578. " t.SELLFUTUREQTY," +
  579. " t.TOTALSPOTQTY," +
  580. " t.TOTALFUTUREQTY," +
  581. " t.TOTALEXPOSURE," +
  582. " t.TOTALHEDGERATIO," +
  583. " t.TOTALNEEDHEDGEQTY," +
  584. " t.NEEDHEDGEEXPOSOURE," +
  585. " t.NEEDHEDGERATIO," +
  586. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  587. " t.HEDGEQTY," +
  588. " t.ARBITRAGEQTY," +
  589. " t.NEEDHEDGEQTY," +
  590. " t.NEEDARBITRAGEQTY," +
  591. " g.middlegoodsname," +
  592. " g.middlegoodscode," +
  593. " g.goodsunitid unitid," +
  594. " g.needhedgeratio MGNEEDHEDGERATIO," +
  595. " g.needarbitrageratio" +
  596. " FROM REPORT_ERMCP_AREAEXPOSURE t" +
  597. " LEFT JOIN ERMS_MIDDLEGOODS g" +
  598. " on t.middlegoodsid = g.middlegoodsid" +
  599. " WHERE 1 = 1"
  600. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  601. sqlId.And("t.CYCLETYPE", r.CYCLETYPE)
  602. sqlId.And("t.CYCLETIME", r.CYCLETIME)
  603. return sqlId.String()
  604. }
  605. // GetDataEx 获取敞报表
  606. func (r *Ermcp3ExpourseReport) GetDataEx() (interface{}, error) {
  607. sData := make([]Ermcp3ExpourseReport, 0)
  608. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  609. for i := range sData {
  610. sData[i].calc()
  611. sData[i].BeginDate = r.BeginDate
  612. sData[i].EndDate = r.EndDate
  613. }
  614. return sData, err
  615. }
  616. // Ermcp3ExposureContractDetail 敞口合同明细
  617. type Ermcp3ExposureContractDetail struct {
  618. MIDDLEGOODSID int32 `json:"middlegoodsid" xorm:"'MIDDLEGOODSID'"` // 套保品种id
  619. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货商品id
  620. CONVERTRATIO float64 `json:"convertratio" xorm:"'CONVERTRATIO'"` // 折算系数(套保品种)
  621. USERID int64 `json:"userid" xorm:"'USERID'"` // 机构id
  622. SPOTCONTRACTID string `json:"spotcontractid" xorm:"'SPOTCONTRACTID'"` // 合同id
  623. CONTRACTNO string `json:"contractno" xorm:"'CONTRACTNO'"` // 合同编号
  624. CONTRACTTYPE int32 `json:"contracttype" xorm:"'CONTRACTTYPE'"` // 现货合同类型 - 1:采购 -1:销售
  625. BIZTYPE int32 `json:"biztype" xorm:"'BIZTYPE'"` // 业务类型 1-套保 2-套利
  626. BUYUSERID int64 `json:"buyuserid" xorm:"'BUYUSERID'"` // 采购方id
  627. SELLUSERID int64 `json:"selluserid" xorm:"'SELLUSERID'"` // 销售方id
  628. QTY float64 `json:"qty" xorm:"'QTY'"` // 合同量
  629. PRICEDQTY float64 `json:"pricedqty" xorm:"'PRICEDQTY'"` // 已定价量
  630. WRSTANDARDID int32 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 品类id
  631. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  632. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  633. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 品类单位id
  634. MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保品种名称
  635. MIDDLEGOODSCODE string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保品种代码
  636. GOODSUNITID int32 `json:"-" xorm:"'GOODSUNITID'"` // 套保品种单位id
  637. TRADEDATE string `json:"tradedate" xorm:"'tradedate'"` // 交易日
  638. NEEDHEDGERATIO float64 `json:"needhedgeratio" xorm:"'NEEDHEDGERATIO'"` // 应套保比例
  639. NEEDARBITRAGERATIO float64 `json:"needarbitrageratio" xorm:"'NEEDARBITRAGERATIO'"` // 应套利比例
  640. BRANDNAME string `json:"brandname" xorm:"'BRANDNAME'"` // 品牌名称
  641. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货商品代码
  642. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货商品名称
  643. CONVERTFACTOR float64 `json:"convertfactor" xorm:"'CONVERTFACTOR'"` // 标仓系数
  644. TODAYPRICEDQTY float64 `json:"todaypricedqty" xorm:"'TODAYPRICEDQTY'"` // 今定价量
  645. EnumdicName string `json:"enumdicname"` // 单位名称
  646. BUYUSERNAME string `json:"buyusername"` // 采购方名称
  647. SELLUSERNAME string `json:"sellusername"` // 销售方名称
  648. CurQty float64 `json:"curqty"` // 今定价量
  649. DiffQty float64 `json:"diffqty"` // 套保品种今变动量
  650. DiffHedgeQty float64 `json:"diffhedgeqty"` // 套保变动量
  651. DiffNeedHedgeQty float64 `json:"diffneedhedgeqty"` // 应套保变动量
  652. BeginDate string `json:"-"` // 开始交易日
  653. EndDate string `json:"-"` // 结束交易日
  654. }
  655. func (r *Ermcp3ExposureContractDetail) calc() {
  656. r.CurQty = r.PRICEDQTY
  657. r.DiffQty = r.QTY * r.CONVERTRATIO
  658. r.DiffHedgeQty = r.TODAYPRICEDQTY * r.CONVERTRATIO * r.CONVERTFACTOR
  659. if r.BIZTYPE == 1 {
  660. r.DiffNeedHedgeQty = r.TODAYPRICEDQTY * r.CONVERTRATIO * r.CONVERTFACTOR * r.NEEDHEDGERATIO
  661. } else {
  662. r.DiffNeedHedgeQty = r.TODAYPRICEDQTY * r.CONVERTRATIO * r.CONVERTFACTOR * r.NEEDARBITRAGERATIO
  663. }
  664. r.EnumdicName = mtpcache.GetEnumDicitemName(r.UNITID)
  665. r.BUYUSERNAME = mtpcache.GetUserNameByUserId(r.BUYUSERID)
  666. r.SELLUSERNAME = mtpcache.GetUserNameByUserId(r.SELLUSERID)
  667. }
  668. func (r *Ermcp3ExposureContractDetail) buildSql() string {
  669. var sqlId utils.SQLVal = "select t.middlegoodsid," +
  670. " t.deliverygoodsid," +
  671. " t.convertratio," +
  672. " s.userid," +
  673. " to_char(s.spotcontractid) spotcontractid," +
  674. " s.contractno," +
  675. " s.contracttype," +
  676. " s.biztype," +
  677. " s.buyuserid," +
  678. " s.selluserid," +
  679. " s.qty," +
  680. " s.pricedqty," +
  681. " s.wrstandardid," +
  682. " s.reckondate tradedate," +
  683. " s.todaypricedqty," +
  684. " w.wrstandardname," +
  685. " w.wrstandardcode," +
  686. " w.unitid," +
  687. " w.convertfactor," +
  688. " mg.middlegoodsname," +
  689. " mg.middlegoodscode," +
  690. " mg.goodsunitid," +
  691. " mg.needhedgeratio," +
  692. " mg.needarbitrageratio," +
  693. " dg.dgfactoryitemid brandid," +
  694. " dg.dgfactoryitemvalue brandName," +
  695. " g.deliverygoodscode," +
  696. " g.deliverygoodsname" +
  697. " from erms2_wrsconvertdetail t" +
  698. " inner join reckon_ermcp_spotcontract s" +
  699. " on t.deliverygoodsid = s.deliverygoodsid" +
  700. " left join erms_middlegoods mg" +
  701. " on t.middlegoodsid = mg.middlegoodsid" +
  702. " left join wrstandard w" +
  703. " on s.wrstandardid = w.wrstandardid" +
  704. " left join dgfactoryitem dg" +
  705. " on s.spotgoodsbrandid = dg.dgfactoryitemid" +
  706. " left join deliverygoods g" +
  707. " on s.deliverygoodsid = g.deliverygoodsid" +
  708. " where t.wrstandardid = 0" +
  709. " and s.contractstatus in (2, 3)"
  710. sqlId.AndEx("s.reckondate", r.TRADEDATE, len(r.TRADEDATE) > 0)
  711. if len(r.BeginDate) > 0 && len(r.EndDate) > 0 {
  712. sqlId.Join(fmt.Sprintf(" and s.reckondate >= '%v' and s.reckondate <= '%v'", r.BeginDate, r.EndDate))
  713. }
  714. sqlId.And("t.middlegoodsid", r.MIDDLEGOODSID)
  715. sqlId.Join(fmt.Sprintf(" and %v in(s.userid, s.tradeuserid)", r.USERID))
  716. return sqlId.String()
  717. }
  718. // GetDataEx 获取敞口合同明细
  719. func (r *Ermcp3ExposureContractDetail) GetDataEx() (interface{}, error) {
  720. sData := make([]Ermcp3ExposureContractDetail, 0)
  721. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  722. for i := range sData {
  723. sData[i].calc()
  724. }
  725. return sData, err
  726. }
  727. // Ermcp3ExposureHedgeplanDetail 敞口套保计划明细
  728. type Ermcp3ExposureHedgeplanDetail struct {
  729. MIDDLEGOODSID int32 `json:"middlegoodsid" xorm:"'MIDDLEGOODSID'"` // 套保品种id
  730. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货商品id
  731. CONVERTRATIO float64 `json:"convertratio" xorm:"'CONVERTRATIO'"` // 折算系数(套保品种)
  732. USERID int64 `json:"userid" xorm:"'USERID'"` // 机构id
  733. HEDGEPLANID string `json:"hedgeplanid" xorm:"'HEDGEPLANID'"` // 套保计划id
  734. HEDGEPLANNO string `json:"hedgeplanno" xorm:"'HEDGEPLANNO'"` // 套保计划名称
  735. BIZTYPE int32 `json:"biztype" xorm:"'BIZTYPE'"` // 业务类型(期现用途,业务类型就是期现用途) 1-套保 2-套利
  736. QTY float64 `json:"qty" xorm:"'QTY'"` // 合同量
  737. PRICEDQTY float64 `json:"pricedqty" xorm:"'PRICEDQTY'"` // 已定价量
  738. WRSTANDARDID int32 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 品类id
  739. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  740. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  741. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 品类单位id
  742. MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保品种名称
  743. MIDDLEGOODSCODE string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保品种代码
  744. GOODSUNITID int32 `json:"-" xorm:"'GOODSUNITID'"` // 套保品种单位id
  745. TRADEDATE string `json:"tradedate" xorm:"'tradedate'"` // 交易日(登记日)
  746. NEEDHEDGERATIO float64 `json:"needhedgeratio" xorm:"'NEEDHEDGERATIO'"` // 应套保比例
  747. NEEDARBITRAGERATIO float64 `json:"needarbitrageratio" xorm:"'NEEDARBITRAGERATIO'"` // 应套利比例
  748. CONTRACTTYPE int32 `json:"contracttype" xorm:"'CONTRACTTYPE'"` // 计划类型 - 1:采购 -1:销售
  749. HEDGEPLANSTATUS int32 `json:"hedgeplanstatus" xorm:"'HEDGEPLANSTATUS'"` // 套保计划状态 - 0:未提交 1:待审核 2:执行中 3:正常完结 4:审核拒绝 5:异常完结 6:已撤回
  750. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货商品代码
  751. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货商吕名称
  752. DGUNITID int32 `json:"dgunitid" xorm:"'DGUNITID'"` // 现货商品单位id
  753. EnumdicName string `json:"enumdicname"` // 单位名称(品类)
  754. MGUNITIDNAME string `json:"mgunitidname"` // 单位名称(套保商品)
  755. DGUNITIDNAME string `json:"dgunitidname"` // 单位名称(现货商品)
  756. CurQty float64 `json:"-"` // 今定价量
  757. DiffQty float64 `json:"diffqty"` // 套保品种今变动量
  758. ChangQty float64 `json:"changqty"` // 应套保总量变化量
  759. BeginDate string `json:"-"`
  760. EndDate string `json:"-"`
  761. }
  762. func (r *Ermcp3ExposureHedgeplanDetail) calc() {
  763. r.EnumdicName = mtpcache.GetEnumDicitemName(r.UNITID)
  764. r.MGUNITIDNAME = mtpcache.GetEnumDicitemName(r.GOODSUNITID)
  765. r.DGUNITIDNAME = mtpcache.GetEnumDicitemName(r.DGUNITID)
  766. r.CurQty = r.QTY
  767. r.DiffQty = r.QTY * r.CONVERTRATIO
  768. r.ChangQty = r.QTY * r.NEEDHEDGERATIO * r.CONVERTRATIO
  769. }
  770. func (r *Ermcp3ExposureHedgeplanDetail) buildSql() string {
  771. var sqlId utils.SQLVal = "select t.middlegoodsid," +
  772. " t.deliverygoodsid," +
  773. " t.convertratio," +
  774. " s.areauserid userid," +
  775. " to_char(s.hedgeplanid) hedgeplanid," +
  776. " s.hedgeplanno," +
  777. " s.contracttype," +
  778. " s.biztype," +
  779. " s.planqty qty," +
  780. " s.wrstandardid," +
  781. " s.audittradedate tradedate," +
  782. " s.hedgeplanstatus," +
  783. " w.wrstandardname," +
  784. " w.wrstandardcode," +
  785. " w.unitid," +
  786. " g.deliverygoodscode," +
  787. " g.deliverygoodsname," +
  788. " g.goodsunitid," +
  789. " mg.middlegoodsname," +
  790. " mg.middlegoodscode," +
  791. " mg.goodsunitid," +
  792. " mg.needhedgeratio," +
  793. " mg.needarbitrageratio" +
  794. " from erms2_wrsconvertdetail t" +
  795. " inner join ermcp_hedgeplan s" +
  796. " on t.deliverygoodsid = s.deliverygoodsid" +
  797. " left join erms_middlegoods mg" +
  798. " on t.middlegoodsid = mg.middlegoodsid" +
  799. " left join wrstandard w" +
  800. " on s.wrstandardid = w.wrstandardid" +
  801. " left join deliverygoods g on s.deliverygoodsid=g.deliverygoodsid" +
  802. " where t.wrstandardid = 0" +
  803. " and s.hedgeplanstatus in (2, 3)"
  804. sqlId.AndEx("s.audittradedate", r.TRADEDATE, len(r.TRADEDATE) > 0)
  805. if len(r.BeginDate) > 0 && len(r.EndDate) > 0 {
  806. sqlId.Join(fmt.Sprintf(" and s.audittradedate >= '%v' and s.audittradedate <= '%v'", r.BeginDate, r.EndDate))
  807. }
  808. sqlId.And("t.middlegoodsid", r.MIDDLEGOODSID)
  809. sqlId.Join(fmt.Sprintf(" and %v in(s.areauserid, s.tradeuserid)", r.USERID))
  810. return sqlId.String()
  811. }
  812. // GetDataEx 获取敞口套保计划明细
  813. func (r *Ermcp3ExposureHedgeplanDetail) GetDataEx() (interface{}, error) {
  814. sData := make([]Ermcp3ExposureHedgeplanDetail, 0)
  815. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  816. for i := range sData {
  817. sData[i].calc()
  818. }
  819. return sData, err
  820. }
  821. // Ermcp3AreaSpotPLReport 现货报表(日/月/周/季/年)
  822. type Ermcp3AreaSpotPLReport struct {
  823. RECKONDATE string `json:"reckondate" xorm:"RECKONDATE"` // 日照时期(yyyyMMdd)
  824. CYCLETIME string `json:"cycletime" xorm:"'CYCLETIME'"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  825. CYCLETYPE int32 `json:"cycletype" xorm:"'CYCLETYPE'"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  826. AREAUSERID int64 `json:"areauserid" xorm:"AREAUSERID"` // 所属机构\交易用户ID
  827. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 期货账户ID (作废, 默认为0)
  828. WRFACTORTYPEID int64 `json:"wrfactortypeid" xorm:"WRFACTORTYPEID"` // 仓单要素类型ID(212+Unix秒时间戳(10位)+xxxxxx)
  829. CURRENCYID int32 `json:"currencyid" xorm:"CURRENCYID"` // 结算币种ID【原值】
  830. BIZTYPE int32 `json:"biztype" xorm:"BIZTYPE"` // 业务类型 - 1:套保 2:套利
  831. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"DELIVERYGOODSID"` // 现货品种ID
  832. WRSTANDARDID int64 `json:"wrstandardid" xorm:"WRSTANDARDID"` // 现货品类ID
  833. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"SPOTGOODSBRANDID"` // 现货品牌ID
  834. ORIBUYQTY float64 `json:"oribuyqty" xorm:"ORIBUYQTY"` // 期初采购总量
  835. ORIBUYAMOUNT float64 `json:"oribuyamount" xorm:"ORIBUYAMOUNT"` // 期初采购总额
  836. ORISELLQTY float64 `json:"orisellqty" xorm:"ORISELLQTY"` // 期初销售总量
  837. ORISELLAMOUNT float64 `json:"orisellamount" xorm:"ORISELLAMOUNT"` // 期初销售总额
  838. ORIQTY float64 `json:"oriqty" xorm:"ORIQTY"` // 期初量
  839. ORIAVERAGEPRICE float64 `json:"oriaverageprice" xorm:"ORIAVERAGEPRICE"` // 期初均价
  840. ORIAMOUNT float64 `json:"oriamount" xorm:"ORIAMOUNT"` // 期初额
  841. TODAYBUYQTY float64 `json:"todaybuyqty" xorm:"TODAYBUYQTY"` // 今日采购量(今采购量)
  842. TODAYBUYAMOUNT float64 `json:"todaybuyamount" xorm:"TODAYBUYAMOUNT"` // 今日采购额(今采购额)
  843. TODAYBUYAVERAGEPRICE float64 `json:"todaybuyaverageprice" xorm:"TODAYBUYAVERAGEPRICE"` // 今日采购均价
  844. TODAYSELLQTY float64 `json:"todaysellqty" xorm:"TODAYSELLQTY"` // 今日销售量(今销售量)
  845. TODAYSELLAMOUNT float64 `json:"todaysellamount" xorm:"TODAYSELLAMOUNT"` // 今日销售额(今销售额)
  846. TODAYSELLAVERAGEPRICE float64 `json:"todaysellaverageprice" xorm:"TODAYSELLAVERAGEPRICE"` // 今日销售均价
  847. CURBUYQTY float64 `json:"curbuyqty" xorm:"CURBUYQTY"` // 期末采购总量
  848. CURBUYAMOUNT float64 `json:"curbuyamount" xorm:"CURBUYAMOUNT"` // 期末采购总额
  849. CURSELLQTY float64 `json:"cursellqty" xorm:"CURSELLQTY"` // 期末销售总量
  850. CURSELLAMOUNT float64 `json:"cursellamount" xorm:"CURSELLAMOUNT"` // 期末销售总额
  851. CURQTY float64 `json:"curqty" xorm:"CURQTY"` // 期末量
  852. CURAVERAGEPRICE float64 `json:"curaverageprice" xorm:"CURAVERAGEPRICE"` // 期末均价
  853. CURAMOUNT float64 `json:"curamount" xorm:"CURAMOUNT"` // 期末额
  854. CURSPOTPRICE float64 `json:"curspotprice" xorm:"CURSPOTPRICE"` // 参考市价(最新价)
  855. CURMARKETVALUE float64 `json:"curmarketvalue" xorm:"CURMARKETVALUE"` // 参考市值(期末市值)
  856. ACTUALPL float64 `json:"actualpl" xorm:"ACTUALPL"` // 现货损益
  857. FLOATPL float64 `json:"floatpl" xorm:"FLOATPL"` // 浮动损益
  858. UPDATETIME string `json:"updatetime" xorm:"UPDATETIME"` // 更新时间
  859. TODAYINQTY float64 `json:"todayinqty" xorm:"TODAYINQTY"` // 今日入库量(今入库量)
  860. TODAYOUTQTY float64 `json:"todayoutqty" xorm:"TODAYOUTQTY"` // 今日出库量(今出库量)
  861. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货商品代码
  862. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货商品名称
  863. GOODSUNITID int32 `json:"goodsunitid" xorm:"'GOODSUNITID'"` // 现货商品单位id
  864. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  865. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  866. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 品类单位id
  867. BRANDNAME string `json:"brandname" xorm:"'BRANDNAME'"` // 品牌名称
  868. EnumdicName string `json:"enumdicname"` // 现货商品单位名称
  869. UNITIDNAME string `json:"unitidname"` // 品类单位名称
  870. ACCOUNTNAME string `json:"accountname"` // 机构名称
  871. CURRENCYNAME string `json:"currencyname"` // 币种名称
  872. QueryType int32 `json:"-"` // 查询类型 1-报表 2-报表明细
  873. BeginDate string `json:"begindate"` // 开始交易日
  874. EndDate string `json:"enddate"` // 结束交易日
  875. }
  876. func (r *Ermcp3AreaSpotPLReport) calc() {
  877. r.EnumdicName = mtpcache.GetEnumDicitemName(r.GOODSUNITID)
  878. r.UNITIDNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  879. r.ACCOUNTNAME = mtpcache.GetUserNameByUserId(r.AREAUSERID)
  880. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  881. fCalcAvePrice := func(avePrice *float64, amount, qty float64) {
  882. if qty > 1e-10 {
  883. *avePrice = amount / qty
  884. } else if qty < -1e-10 {
  885. *avePrice = amount / qty
  886. *avePrice, _ = decimal.NewFromFloat(*avePrice).Round(3).Float64()
  887. } else {
  888. *avePrice = 0
  889. }
  890. }
  891. // 期初均价
  892. fCalcAvePrice(&r.ORIAVERAGEPRICE, r.ORIAMOUNT, r.ORIQTY)
  893. // 期末均价
  894. fCalcAvePrice(&r.CURAVERAGEPRICE, r.CURAMOUNT, r.CURQTY)
  895. // 今采购均价
  896. fCalcAvePrice(&r.TODAYBUYAVERAGEPRICE, r.TODAYBUYAMOUNT, r.TODAYBUYQTY)
  897. // 今销售均价
  898. fCalcAvePrice(&r.TODAYSELLAVERAGEPRICE, r.TODAYSELLAMOUNT, r.TODAYSELLQTY)
  899. }
  900. func (r *Ermcp3AreaSpotPLReport) buildSql() string {
  901. // 日报表
  902. if r.QueryType == 1 && r.CYCLETYPE == 0 {
  903. return r.buildSqlDay()
  904. }
  905. // 日报表明细
  906. if r.QueryType == 2 && r.CYCLETYPE == 0 {
  907. return r.buildSqlDayDetail()
  908. }
  909. return r.buildSqlCycle()
  910. }
  911. // buildSqlDay 现货日报表查询语句
  912. func (r *Ermcp3AreaSpotPLReport) buildSqlDay() string {
  913. var sqlId utils.SQLVal = "select a.*," +
  914. " g.deliverygoodscode," +
  915. " g.deliverygoodsname," +
  916. " g.goodsunitid" +
  917. " from (SELECT t.RECKONDATE," +
  918. " t.AREAUSERID," +
  919. " t.CURRENCYID," +
  920. " t.DELIVERYGOODSID," +
  921. " sum(t.ORIBUYQTY) ORIBUYQTY," +
  922. " sum(t.ORIBUYAMOUNT) ORIBUYAMOUNT," +
  923. " sum(t.ORISELLQTY) ORISELLQTY," +
  924. " sum(t.ORISELLAMOUNT) ORISELLAMOUNT," +
  925. " sum(t.ORIQTY) ORIQTY," +
  926. " sum(t.ORIAMOUNT) ORIAMOUNT," +
  927. " sum(t.TODAYBUYQTY) TODAYBUYQTY," +
  928. " sum(t.TODAYBUYAMOUNT) TODAYBUYAMOUNT," +
  929. " sum(t.TODAYSELLQTY) TODAYSELLQTY," +
  930. " sum(t.TODAYSELLAMOUNT) TODAYSELLAMOUNT," +
  931. " sum(t.CURBUYQTY) CURBUYQTY," +
  932. " sum(t.CURBUYAMOUNT) CURBUYAMOUNT," +
  933. " sum(t.CURSELLQTY) CURSELLQTY," +
  934. " sum(t.CURSELLAMOUNT) CURSELLAMOUNT," +
  935. " sum(t.CURQTY) CURQTY," +
  936. " sum(t.CURAMOUNT) CURAMOUNT," +
  937. " max(t.CURSPOTPRICE) CURSPOTPRICE," +
  938. " sum(t.CURMARKETVALUE) CURMARKETVALUE," +
  939. " sum(t.ACTUALPL) ACTUALPL," +
  940. " sum(t.FLOATPL) FLOATPL," +
  941. " sum(t.TODAYINQTY) TODAYINQTY," +
  942. " sum(t.TODAYOUTQTY) TODAYOUTQTY" +
  943. " FROM RECKON_ERMCP_AREASPOTPL t" +
  944. " WHERE 1=1 %v" +
  945. " GROUP BY t.RECKONDATE," +
  946. " t.AREAUSERID," +
  947. " t.CURRENCYID," +
  948. " t.DELIVERYGOODSID) a" +
  949. " LEFT JOIN DELIVERYGOODS g" +
  950. " on a.deliverygoodsid = g.deliverygoodsid"
  951. var sqlParam utils.SQLVal
  952. sqlParam.And("t.AREAUSERID", r.AREAUSERID)
  953. if r.QueryType == 1 {
  954. sqlParam.And("t.RECKONDATE", r.RECKONDATE)
  955. } else if r.QueryType == 2 {
  956. sqlParam.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  957. }
  958. sqlId.FormatParam(sqlParam.String())
  959. return sqlId.String()
  960. }
  961. func (r *Ermcp3AreaSpotPLReport) buildSqlDayDetail() string {
  962. var sqlId utils.SQLVal = "select a.*," +
  963. " g.deliverygoodscode," +
  964. " g.deliverygoodsname," +
  965. " g.goodsunitid," +
  966. " w.wrstandardcode," +
  967. " w.wrstandardname," +
  968. " w.unitid," +
  969. " dg.dgfactoryitemvalue brandName" +
  970. " from (SELECT t.RECKONDATE," +
  971. " t.AREAUSERID," +
  972. " t.CURRENCYID," +
  973. " t.DELIVERYGOODSID," +
  974. " t.WRSTANDARDID," +
  975. " t.SPOTGOODSBRANDID," +
  976. " sum(t.ORIBUYQTY) ORIBUYQTY," +
  977. " sum(t.ORIBUYAMOUNT) ORIBUYAMOUNT," +
  978. " sum(t.ORISELLQTY) ORISELLQTY," +
  979. " sum(t.ORISELLAMOUNT) ORISELLAMOUNT," +
  980. " sum(t.ORIQTY) ORIQTY," +
  981. " sum(t.ORIAMOUNT) ORIAMOUNT," +
  982. " sum(t.TODAYBUYQTY) TODAYBUYQTY," +
  983. " sum(t.TODAYBUYAMOUNT) TODAYBUYAMOUNT," +
  984. " sum(t.TODAYSELLQTY) TODAYSELLQTY," +
  985. " sum(t.TODAYSELLAMOUNT) TODAYSELLAMOUNT," +
  986. " sum(t.CURBUYQTY) CURBUYQTY," +
  987. " sum(t.CURBUYAMOUNT) CURBUYAMOUNT," +
  988. " sum(t.CURSELLQTY) CURSELLQTY," +
  989. " sum(t.CURSELLAMOUNT) CURSELLAMOUNT," +
  990. " sum(t.CURQTY) CURQTY," +
  991. " sum(t.CURAMOUNT) CURAMOUNT," +
  992. " max(t.CURSPOTPRICE) CURSPOTPRICE," +
  993. " sum(t.CURMARKETVALUE) CURMARKETVALUE," +
  994. " sum(t.ACTUALPL) ACTUALPL," +
  995. " sum(t.FLOATPL) FLOATPL," +
  996. " sum(t.TODAYINQTY) TODAYINQTY," +
  997. " sum(t.TODAYOUTQTY) TODAYOUTQTY" +
  998. " FROM RECKON_ERMCP_AREASPOTPL t" +
  999. " WHERE 1 = 1 %v" +
  1000. " GROUP BY t.RECKONDATE," +
  1001. " t.AREAUSERID," +
  1002. " t.CURRENCYID," +
  1003. " t.DELIVERYGOODSID," +
  1004. " t.WRSTANDARDID," +
  1005. " t.SPOTGOODSBRANDID) a" +
  1006. " LEFT JOIN DELIVERYGOODS g" +
  1007. " on a.deliverygoodsid = g.deliverygoodsid" +
  1008. " LEFT JOIN WRSTANDARD w" +
  1009. " on a.wrstandardid = w.wrstandardid" +
  1010. " LEFT JOIN DGFACTORYITEM dg" +
  1011. " on a.spotgoodsbrandid = dg.dgfactoryitemid"
  1012. var sqlParam utils.SQLVal
  1013. sqlParam.And("t.AREAUSERID", r.AREAUSERID)
  1014. sqlParam.AndEx("t.RECKONDATE", r.RECKONDATE, len(r.RECKONDATE) > 0)
  1015. if len(r.BeginDate) > 0 && len(r.EndDate) > 0 {
  1016. sqlParam.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  1017. }
  1018. sqlParam.And("t.CURRENCYID", r.CURRENCYID)
  1019. sqlParam.And("t.DELIVERYGOODSID", r.DELIVERYGOODSID)
  1020. sqlId.FormatParam(sqlParam.String())
  1021. return sqlId.String()
  1022. }
  1023. // buildSqlCycle 周期报表查询语句
  1024. func (r *Ermcp3AreaSpotPLReport) buildSqlCycle() string {
  1025. var sqlId utils.SQLVal = "select a.*," +
  1026. " g.deliverygoodscode," +
  1027. " g.deliverygoodsname," +
  1028. " g.goodsunitid" +
  1029. " from (SELECT t.cycletype," +
  1030. " t.cycletime," +
  1031. " t.AREAUSERID," +
  1032. " t.CURRENCYID," +
  1033. " t.DELIVERYGOODSID," +
  1034. " sum(t.ORIBUYQTY) ORIBUYQTY," +
  1035. " sum(t.ORIBUYAMOUNT) ORIBUYAMOUNT," +
  1036. " sum(t.ORISELLQTY) ORISELLQTY," +
  1037. " sum(t.ORISELLAMOUNT) ORISELLAMOUNT," +
  1038. " sum(t.ORIQTY) ORIQTY," +
  1039. " sum(t.ORIAMOUNT) ORIAMOUNT," +
  1040. " sum(t.TODAYBUYQTY) TODAYBUYQTY," +
  1041. " sum(t.TODAYBUYAMOUNT) TODAYBUYAMOUNT," +
  1042. " sum(t.TODAYSELLQTY) TODAYSELLQTY," +
  1043. " sum(t.TODAYSELLAMOUNT) TODAYSELLAMOUNT," +
  1044. " sum(t.CURBUYQTY) CURBUYQTY," +
  1045. " sum(t.CURBUYAMOUNT) CURBUYAMOUNT," +
  1046. " sum(t.CURSELLQTY) CURSELLQTY," +
  1047. " sum(t.CURSELLAMOUNT) CURSELLAMOUNT," +
  1048. " sum(t.CURQTY) CURQTY," +
  1049. " sum(t.CURAMOUNT) CURAMOUNT," +
  1050. " max(t.CURSPOTPRICE) CURSPOTPRICE," +
  1051. " sum(t.CURMARKETVALUE) CURMARKETVALUE," +
  1052. " sum(t.ACTUALPL) ACTUALPL," +
  1053. " sum(t.FLOATPL) FLOATPL," +
  1054. " sum(t.TODAYINQTY) TODAYINQTY," +
  1055. " sum(t.TODAYOUTQTY) TODAYOUTQTY" +
  1056. " FROM REPORT_ERMCP_AREASPOTPL t" +
  1057. " WHERE 1=1 %v" +
  1058. " GROUP BY t.AREAUSERID," +
  1059. " t.cycletype," +
  1060. " t.cycletime," +
  1061. " t.CURRENCYID," +
  1062. " t.DELIVERYGOODSID) a" +
  1063. " LEFT JOIN DELIVERYGOODS g" +
  1064. " on a.deliverygoodsid = g.deliverygoodsid"
  1065. var sqlParam utils.SQLVal
  1066. sqlParam.And("t.AREAUSERID", r.AREAUSERID)
  1067. sqlParam.And("t.Cycletype", r.CYCLETYPE)
  1068. sqlParam.And("t.CYCLETIME", r.CYCLETIME)
  1069. sqlId.FormatParam(sqlParam.String())
  1070. return sqlId.String()
  1071. }
  1072. // GetDataEx 获取现货报表(日/月/周/季/年)
  1073. func (r *Ermcp3AreaSpotPLReport) GetDataEx() (interface{}, error) {
  1074. sData := make([]Ermcp3AreaSpotPLReport, 0)
  1075. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1076. for i := range sData {
  1077. sData[i].calc()
  1078. sData[i].BeginDate = r.BeginDate
  1079. sData[i].EndDate = r.EndDate
  1080. }
  1081. return sData, err
  1082. }
  1083. // Ermcp3FinanceReport 财务报表
  1084. type Ermcp3FinanceReport struct {
  1085. RECKONDATE string `json:"reckondate" xorm:"RECKONDATE"` // 日照时期(yyyyMMdd)
  1086. CYCLETIME string `json:"cycletime" xorm:"CYCLETIME"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  1087. CYCLETYPE int32 `json:"cycletype" xorm:"CYCLETYPE"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  1088. SELLPREINVOICEDAMOUNT float64 `json:"sellpreinvoicedamount" xorm:"SELLPREINVOICEDAMOUNT"` // 销售预开票额(预开票额)
  1089. SELLUNINVOICEDAMOUNT float64 `json:"selluninvoicedamount" xorm:"SELLUNINVOICEDAMOUNT"` // 销售应开票额(应开票额)
  1090. TODAYRECEIVESUM float64 `json:"todayreceivesum" xorm:"TODAYRECEIVESUM"` // 今收款合计
  1091. TODAYPAYSUM float64 `json:"todaypaysum" xorm:"TODAYPAYSUM"` // 今付款合计
  1092. UPDATETIME string `json:"updatetime" xorm:"UPDATETIME"` // 更新时间
  1093. AREAUSERID int64 `json:"areauserid" xorm:"AREAUSERID"` // 所属机构\交易用户ID
  1094. CURRENCYID int32 `json:"currencyid" xorm:"CURRENCYID"` // 结算币种ID
  1095. BIZTYPE int32 `json:"biztype" xorm:"BIZTYPE"` // 业务类型 - 1:套保 2:套利
  1096. BUYTODAYSETTLEAMOUNT float64 `json:"buytodaysettleamount" xorm:"BUYTODAYSETTLEAMOUNT"` // 采购今付款额(今付货款额)
  1097. SELLTODAYSETTLEAMOUNT float64 `json:"selltodaysettleamount" xorm:"SELLTODAYSETTLEAMOUNT"` // 销售今收款额(今收货款额)
  1098. BUYTODAYREFUNDAMOUNT float64 `json:"buytodayrefundamount" xorm:"BUYTODAYREFUNDAMOUNT"` // 采购今收退款额(今收退款额)
  1099. SELLTODAYREFUNDAMOUNT float64 `json:"selltodayrefundamount" xorm:"SELLTODAYREFUNDAMOUNT"` // 销售今付退款额(今付退款额)
  1100. SELLTODAYINVOICEAMOUNT float64 `json:"selltodayinvoiceamount" xorm:"SELLTODAYINVOICEAMOUNT"` // 销售今开票额(今开票额)
  1101. BUYTODAYINVOICEAMOUNT float64 `json:"buytodayinvoiceamount" xorm:"BUYTODAYINVOICEAMOUNT"` // 采购今收票额(今收票额)
  1102. BUYPREPAIDAMOUNT float64 `json:"buyprepaidamount" xorm:"BUYPREPAIDAMOUNT"` // 采购预付款额(预付货款额)
  1103. BUYUNPAIDAMOUNT float64 `json:"buyunpaidamount" xorm:"BUYUNPAIDAMOUNT"` // 采购应付款额(应付货款额)
  1104. BUYPREINVOICEDAMOUNT float64 `json:"buypreinvoicedamount" xorm:"BUYPREINVOICEDAMOUNT"` // 采购预收票额(预收票额)
  1105. BUYUNINVOICEDAMOUNT float64 `json:"buyuninvoicedamount" xorm:"BUYUNINVOICEDAMOUNT"` // 采购应收票额(应收票额)
  1106. SELLPREPAIDAMOUNT float64 `json:"sellprepaidamount" xorm:"SELLPREPAIDAMOUNT"` // 销售预收款额(预收货款额)
  1107. SELLUNPAIDAMOUNT float64 `json:"sellunpaidamount" xorm:"SELLUNPAIDAMOUNT"` // 销售应收款额(应收货款额)
  1108. WRFACTORTYPEID int64 `json:"wrfactortypeid" xorm:"WRFACTORTYPEID"` // 仓单要素类型ID(212+Unix秒时间戳(10位)+xxxxxx)
  1109. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"DELIVERYGOODSID"` // 现货品种ID
  1110. WRSTANDARDID int64 `json:"wrstandardid" xorm:"WRSTANDARDID"` // 现货商品ID
  1111. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"SPOTGOODSBRANDID"` // 现货品牌ID
  1112. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  1113. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  1114. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  1115. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  1116. BRANDNAME string `json:"brandname" xorm:"'BRANDNAME'"` // 品牌名称
  1117. ACCOUNTNAME string `json:"accountname"` // 机构名称
  1118. CURRENCYNAME string `json:"currencyname"` // 币种名称
  1119. QueryType int32 `json:"-"` // 查询类型 1-报表 2-报表明细
  1120. BeginDate string `json:"begindate"` // 开始交易日
  1121. EndDate string `json:"enddate"` // 结束交易日
  1122. SumFields string `json:"-"` // 维度字段
  1123. }
  1124. func (r *Ermcp3FinanceReport) calc() {
  1125. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  1126. r.ACCOUNTNAME = mtpcache.GetUserNameByUserId(r.AREAUSERID)
  1127. f := func(v *float64) {
  1128. if *v < 0 {
  1129. *v = 0
  1130. }
  1131. }
  1132. f(&r.BUYPREPAIDAMOUNT)
  1133. f(&r.SELLPREINVOICEDAMOUNT)
  1134. f(&r.BUYUNINVOICEDAMOUNT)
  1135. f(&r.SELLPREPAIDAMOUNT)
  1136. f(&r.BUYPREINVOICEDAMOUNT)
  1137. }
  1138. // getSumField 获取汇总维度字段
  1139. func (r *Ermcp3FinanceReport) getSumField() (fields []string) {
  1140. fields = append(fields, "areauserid")
  1141. fields = append(fields, "currencyid")
  1142. if r.CYCLETYPE == 0 {
  1143. // 日报表
  1144. fields = append(fields, "reckondate")
  1145. } else {
  1146. // 周期报表
  1147. fields = append(fields, "cycletype")
  1148. fields = append(fields, "cycletime")
  1149. }
  1150. baseField := map[string]string{
  1151. "1": "deliverygoodsid",
  1152. "2": "wrstandardid",
  1153. "3": "spotgoodsbrandid",
  1154. }
  1155. param := []string{}
  1156. if len(r.SumFields) > 0 {
  1157. param = strings.Split(r.SumFields, ",")
  1158. }
  1159. for k, v := range baseField {
  1160. for _, p := range param {
  1161. if k == p {
  1162. fields = append(fields, v)
  1163. }
  1164. }
  1165. }
  1166. return
  1167. }
  1168. func (r *Ermcp3FinanceReport) getExFieldInfo() (strFiled string, strleftJoin string) {
  1169. if len(r.SumFields) > 0 {
  1170. param := strings.Split(r.SumFields, ",")
  1171. fHas := func(v string) bool {
  1172. for i := range param {
  1173. if param[i] == v {
  1174. return true
  1175. }
  1176. }
  1177. return false
  1178. }
  1179. if fHas("1") {
  1180. if len(strFiled) > 0 {
  1181. strFiled += ","
  1182. }
  1183. strFiled += "g.deliverygoodscode, g.deliverygoodsname, g.goodsunitid"
  1184. strleftJoin += " LEFT JOIN deliverygoods g on a.deliverygoodsid = g.deliverygoodsid"
  1185. }
  1186. if fHas("2") {
  1187. if len(strFiled) > 0 {
  1188. strFiled += ","
  1189. }
  1190. strFiled += "w.wrstandardname, w.wrstandardcode, w.unitid"
  1191. strleftJoin += " LEFT JOIN WRSTANDARD w on a.wrstandardid = w.wrstandardid"
  1192. }
  1193. if fHas("3") {
  1194. if len(strFiled) > 0 {
  1195. strFiled += ","
  1196. }
  1197. strFiled += "gb.dgfactoryitemvalue brandname"
  1198. strleftJoin += " LEFT JOIN dgfactoryitem gb on a.spotgoodsbrandid = gb.dgfactoryitemid"
  1199. }
  1200. }
  1201. return
  1202. }
  1203. func (r *Ermcp3FinanceReport) buildSql() string {
  1204. fields := r.getSumField()
  1205. if r.CYCLETYPE == 0 {
  1206. // 查日照报
  1207. return r.buildSqlReckon(fields)
  1208. } else {
  1209. // 查报表表
  1210. return r.buildSqlReport(fields)
  1211. }
  1212. }
  1213. func (r *Ermcp3FinanceReport) buildSqlReckon(fields []string) string {
  1214. var sqlId, sqlParam utils.SQLVal
  1215. var strFileds string
  1216. for _, v := range fields {
  1217. if len(strFileds) > 0 {
  1218. strFileds += ","
  1219. }
  1220. strFileds += "t." + v
  1221. }
  1222. sqlParam.And("t.AREAUSERID", r.AREAUSERID)
  1223. sqlParam.AndEx("t.RECKONDATE", r.RECKONDATE, len(r.RECKONDATE) > 0)
  1224. if len(r.BeginDate) > 0 && len(r.EndDate) > 0 {
  1225. sqlParam.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  1226. }
  1227. sqlParam.AndEx("t.CURRENCYID", r.CURRENCYID, r.CURRENCYID > 0)
  1228. exFileds, strleftJoin := r.getExFieldInfo()
  1229. if len(exFileds) > 0 {
  1230. // 有左联查额外信息(RECKON_ERMCP_AFINANCESUB明细表, 注意是不同的表)
  1231. sqlId = "select a.*, %v" +
  1232. " from (SELECT %v," +
  1233. " sum(t.BUYTODAYSETTLEAMOUNT) BUYTODAYSETTLEAMOUNT," +
  1234. " sum(t.BUYTODAYREFUNDAMOUNT) BUYTODAYREFUNDAMOUNT," +
  1235. " sum(t.BUYPREPAIDAMOUNT) BUYPREPAIDAMOUNT," +
  1236. " sum(t.BUYUNPAIDAMOUNT) BUYUNPAIDAMOUNT," +
  1237. " sum(t.BUYTODAYINVOICEAMOUNT) BUYTODAYINVOICEAMOUNT," +
  1238. " sum(t.BUYPREINVOICEDAMOUNT) BUYPREINVOICEDAMOUNT," +
  1239. " sum(t.BUYUNINVOICEDAMOUNT) BUYUNINVOICEDAMOUNT," +
  1240. " sum(t.SELLTODAYSETTLEAMOUNT) SELLTODAYSETTLEAMOUNT," +
  1241. " sum(t.SELLTODAYREFUNDAMOUNT) SELLTODAYREFUNDAMOUNT," +
  1242. " sum(t.SELLPREPAIDAMOUNT) SELLPREPAIDAMOUNT," +
  1243. " sum(t.SELLUNPAIDAMOUNT) SELLUNPAIDAMOUNT," +
  1244. " sum(t.SELLTODAYINVOICEAMOUNT) SELLTODAYINVOICEAMOUNT," +
  1245. " sum(t.SELLPREINVOICEDAMOUNT) SELLPREINVOICEDAMOUNT," +
  1246. " sum(t.SELLUNINVOICEDAMOUNT) SELLUNINVOICEDAMOUNT," +
  1247. " sum(t.TODAYRECEIVESUM) TODAYRECEIVESUM," +
  1248. " sum(t.TODAYPAYSUM) TODAYPAYSUM" +
  1249. " FROM RECKON_ERMCP_AFINANCESUB t" +
  1250. " WHERE 1 = 1 %v" +
  1251. " GROUP BY %v) a %v"
  1252. sqlId.FormatParam(exFileds, strFileds, sqlParam.String(), strFileds, strleftJoin)
  1253. } else {
  1254. sqlId = "SELECT %v," +
  1255. " sum(t.BUYTODAYSETTLEAMOUNT) BUYTODAYSETTLEAMOUNT," +
  1256. " sum(t.BUYTODAYREFUNDAMOUNT) BUYTODAYREFUNDAMOUNT," +
  1257. " sum(t.BUYPREPAIDAMOUNT) BUYPREPAIDAMOUNT," +
  1258. " sum(t.BUYUNPAIDAMOUNT) BUYUNPAIDAMOUNT," +
  1259. " sum(t.BUYTODAYINVOICEAMOUNT) BUYTODAYINVOICEAMOUNT," +
  1260. " sum(t.BUYPREINVOICEDAMOUNT) BUYPREINVOICEDAMOUNT," +
  1261. " sum(t.BUYUNINVOICEDAMOUNT) BUYUNINVOICEDAMOUNT," +
  1262. " sum(t.SELLTODAYSETTLEAMOUNT) SELLTODAYSETTLEAMOUNT," +
  1263. " sum(t.SELLTODAYREFUNDAMOUNT) SELLTODAYREFUNDAMOUNT," +
  1264. " sum(t.SELLPREPAIDAMOUNT) SELLPREPAIDAMOUNT," +
  1265. " sum(t.SELLUNPAIDAMOUNT) SELLUNPAIDAMOUNT," +
  1266. " sum(t.SELLTODAYINVOICEAMOUNT) SELLTODAYINVOICEAMOUNT," +
  1267. " sum(t.SELLPREINVOICEDAMOUNT) SELLPREINVOICEDAMOUNT," +
  1268. " sum(t.SELLUNINVOICEDAMOUNT) SELLUNINVOICEDAMOUNT," +
  1269. " sum(t.TODAYRECEIVESUM) TODAYRECEIVESUM," +
  1270. " sum(t.TODAYPAYSUM) TODAYPAYSUM" +
  1271. " FROM RECKON_ERMCP_AREAFINANCE t" +
  1272. " WHERE 1 = 1 %v" +
  1273. " GROUP BY %v"
  1274. sqlId.FormatParam(strFileds, sqlParam.String(), strFileds)
  1275. }
  1276. return sqlId.String()
  1277. }
  1278. func (r *Ermcp3FinanceReport) buildSqlReport(fields []string) string {
  1279. var sqlId, sqlParam utils.SQLVal
  1280. var strFileds string
  1281. for _, v := range fields {
  1282. if len(strFileds) > 0 {
  1283. strFileds += ","
  1284. }
  1285. strFileds += "t." + v
  1286. }
  1287. sqlParam.And("t.AREAUSERID", r.AREAUSERID)
  1288. sqlParam.And("t.CYCLETYPE", r.CYCLETYPE)
  1289. sqlParam.And("t.CYCLETIME", r.CYCLETIME)
  1290. sqlParam.AndEx("t.CURRENCYID", r.CURRENCYID, r.CURRENCYID > 0)
  1291. exFileds, strleftJoin := r.getExFieldInfo()
  1292. if len(exFileds) > 0 {
  1293. // 有左联查额外信息(REPORT_ERMCP_AFINANCESUB注意表名不同)
  1294. sqlId = "select a.*, %v" +
  1295. " from (SELECT %v," +
  1296. " sum(t.BUYTODAYSETTLEAMOUNT) BUYTODAYSETTLEAMOUNT," +
  1297. " sum(t.BUYTODAYREFUNDAMOUNT) BUYTODAYREFUNDAMOUNT," +
  1298. " sum(t.BUYPREPAIDAMOUNT) BUYPREPAIDAMOUNT," +
  1299. " sum(t.BUYUNPAIDAMOUNT) BUYUNPAIDAMOUNT," +
  1300. " sum(t.BUYTODAYINVOICEAMOUNT) BUYTODAYINVOICEAMOUNT," +
  1301. " sum(t.BUYPREINVOICEDAMOUNT) BUYPREINVOICEDAMOUNT," +
  1302. " sum(t.BUYUNINVOICEDAMOUNT) BUYUNINVOICEDAMOUNT," +
  1303. " sum(t.SELLTODAYSETTLEAMOUNT) SELLTODAYSETTLEAMOUNT," +
  1304. " sum(t.SELLTODAYREFUNDAMOUNT) SELLTODAYREFUNDAMOUNT," +
  1305. " sum(t.SELLPREPAIDAMOUNT) SELLPREPAIDAMOUNT," +
  1306. " sum(t.SELLUNPAIDAMOUNT) SELLUNPAIDAMOUNT," +
  1307. " sum(t.SELLTODAYINVOICEAMOUNT) SELLTODAYINVOICEAMOUNT," +
  1308. " sum(t.SELLPREINVOICEDAMOUNT) SELLPREINVOICEDAMOUNT," +
  1309. " sum(t.SELLUNINVOICEDAMOUNT) SELLUNINVOICEDAMOUNT," +
  1310. " sum(t.TODAYRECEIVESUM) TODAYRECEIVESUM," +
  1311. " sum(t.TODAYPAYSUM) TODAYPAYSUM" +
  1312. " FROM REPORT_ERMCP_AFINANCESUB t" +
  1313. " WHERE 1 = 1 %v" +
  1314. " GROUP BY %v) a %v"
  1315. sqlId.FormatParam(exFileds, strFileds, sqlParam.String(), strFileds, strleftJoin)
  1316. } else {
  1317. sqlId = "SELECT %v," +
  1318. " sum(t.BUYTODAYSETTLEAMOUNT) BUYTODAYSETTLEAMOUNT," +
  1319. " sum(t.BUYTODAYREFUNDAMOUNT) BUYTODAYREFUNDAMOUNT," +
  1320. " sum(t.BUYPREPAIDAMOUNT) BUYPREPAIDAMOUNT," +
  1321. " sum(t.BUYUNPAIDAMOUNT) BUYUNPAIDAMOUNT," +
  1322. " sum(t.BUYTODAYINVOICEAMOUNT) BUYTODAYINVOICEAMOUNT," +
  1323. " sum(t.BUYPREINVOICEDAMOUNT) BUYPREINVOICEDAMOUNT," +
  1324. " sum(t.BUYUNINVOICEDAMOUNT) BUYUNINVOICEDAMOUNT," +
  1325. " sum(t.SELLTODAYSETTLEAMOUNT) SELLTODAYSETTLEAMOUNT," +
  1326. " sum(t.SELLTODAYREFUNDAMOUNT) SELLTODAYREFUNDAMOUNT," +
  1327. " sum(t.SELLPREPAIDAMOUNT) SELLPREPAIDAMOUNT," +
  1328. " sum(t.SELLUNPAIDAMOUNT) SELLUNPAIDAMOUNT," +
  1329. " sum(t.SELLTODAYINVOICEAMOUNT) SELLTODAYINVOICEAMOUNT," +
  1330. " sum(t.SELLPREINVOICEDAMOUNT) SELLPREINVOICEDAMOUNT," +
  1331. " sum(t.SELLUNINVOICEDAMOUNT) SELLUNINVOICEDAMOUNT," +
  1332. " sum(t.TODAYRECEIVESUM) TODAYRECEIVESUM," +
  1333. " sum(t.TODAYPAYSUM) TODAYPAYSUM" +
  1334. " FROM REPORT_ERMCP_AREAFINANCE t" +
  1335. " WHERE 1 = 1 %v" +
  1336. " GROUP BY %v"
  1337. sqlId.FormatParam(strFileds, sqlParam.String(), strFileds)
  1338. }
  1339. return sqlId.String()
  1340. }
  1341. // GetDataEx 获取财务报表
  1342. func (r *Ermcp3FinanceReport) GetDataEx() (interface{}, error) {
  1343. sData := make([]Ermcp3FinanceReport, 0)
  1344. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1345. for i := range sData {
  1346. sData[i].calc()
  1347. sData[i].BeginDate = r.BeginDate
  1348. sData[i].EndDate = r.EndDate
  1349. }
  1350. return sData, err
  1351. }
  1352. // Ermcp3AreaStockReportEx 库存报表
  1353. type Ermcp3AreaStockReportEx struct {
  1354. RECKONDATE string `json:"reckondate" xorm:"RECKONDATE"` // 日照时期(yyyyMMdd)
  1355. CYCLETIME string `json:"cycletime" xorm:"CYCLETIME"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  1356. CYCLETYPE int32 `json:"cycletype" xorm:"CYCLETYPE"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  1357. USERID int64 `json:"userid" xorm:"'USERID'"` // 机构ID
  1358. WRSTANDARDID int32 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 品类ID
  1359. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'"` // 现货品牌ID
  1360. WAREHOUSEINFOID string `json:"warehouseinfoid" xorm:"'WAREHOUSEINFOID'"` // 仓库ID
  1361. ORISTOCK float64 `json:"oristock" xorm:"'ORISTOCK'"` // 期初库存量
  1362. CURSTOCK float64 `json:"curstock" xorm:"'CURSTOCK'"` // 期末库存量
  1363. TODAYBUYINQTY float64 `json:"todaybuyinqty" xorm:"'TODAYBUYINQTY'"` // 今采购入库量
  1364. TODAYPRODUCEINQTY float64 `json:"todayproduceinqty" xorm:"'TODAYPRODUCEINQTY'"` // 今内部入库量
  1365. TODAYSELLOUTQTY float64 `json:"todayselloutqty" xorm:"'TODAYSELLOUTQTY'"` // 今销售出库量
  1366. TODAYPRODUCEOUTQTY float64 `json:"todayproduceoutqty" xorm:"'TODAYPRODUCEOUTQTY'"` // 今内部出库量
  1367. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  1368. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  1369. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  1370. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 品类单位id
  1371. BRANDNAME string `json:"brandname" xorm:"'BRANDNAME'"` // 品牌名称
  1372. WAREHOUSENAME string `json:"warehousename" xorm:"'WAREHOUSENAME'"` // 仓库名称
  1373. WAREHOUSECODE string `json:"warehousecode" xorm:"'WAREHOUSECODE'"` // 仓库代码
  1374. WAREHOUSETYPE int32 `json:"warehousetype" xorm:"'WAREHOUSETYPE'"` // 仓库类型 - 1 厂库 2 自有库 3 合作库
  1375. USERNAME string `json:"username"` // 机构名称
  1376. ENUMDICNAME string `json:"enumdicname"` // 单位名称
  1377. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货品种id
  1378. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  1379. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  1380. GOODSUNITID int32 `json:"goodsunitid" xorm:"'GOODSUNITID'"` // 现货单位id
  1381. UNBUYINQTY float64 `json:"unbuyinqty"` // 采购未入库量(数据库未找到相关字段?)
  1382. UNSELLOUTQTY float64 `json:"unselloutqty"` // 销售未出库量(数据库未找到相关字段?)
  1383. DiffQty float64 `json:"diffqty"` // 库存变化量 = 期末 - 期初
  1384. BeginDate string `json:"begindate"` // 开始交易日
  1385. EndDate string `json:"enddate"` // 结束交易日
  1386. SumFields string `json:"-"` // 汇总维度(逗号隔开) 1-品种 2-品类 3-品牌 4-仓库
  1387. }
  1388. func (r *Ermcp3AreaStockReportEx) calc() {
  1389. r.USERNAME = mtpcache.GetUserNameByUserId(r.USERID)
  1390. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  1391. r.DiffQty = r.CURSTOCK - r.ORISTOCK
  1392. }
  1393. // getSumField 获取汇总维度字段
  1394. func (r *Ermcp3AreaStockReportEx) getSumField() (fields []string, bSum bool) {
  1395. fields = append(fields, "userid")
  1396. if r.CYCLETYPE == 0 {
  1397. // 日报表
  1398. fields = append(fields, "reckondate")
  1399. } else {
  1400. // 周期报表
  1401. fields = append(fields, "cycletype")
  1402. fields = append(fields, "cycletime")
  1403. }
  1404. baseField := map[string]string{
  1405. "1": "deliverygoodsid",
  1406. "2": "wrstandardid",
  1407. "3": "spotgoodsbrandid",
  1408. "4": "warehouseinfoid",
  1409. }
  1410. bSum = false
  1411. param := []string{}
  1412. if len(r.SumFields) > 0 {
  1413. param = strings.Split(r.SumFields, ",")
  1414. }
  1415. if len(param) == 0 {
  1416. // 全字段, 不需要汇总
  1417. for _, v := range baseField {
  1418. fields = append(fields, v)
  1419. }
  1420. bSum = false
  1421. } else {
  1422. bIncludeAll := true
  1423. // 判断是否包含所有维度
  1424. for k := range baseField {
  1425. bExist := false
  1426. for _, p := range param {
  1427. if k == p {
  1428. bExist = true
  1429. break
  1430. }
  1431. }
  1432. if !bExist {
  1433. bIncludeAll = false
  1434. break
  1435. }
  1436. }
  1437. if bIncludeAll {
  1438. // 包含了所有维度, 不需要汇总
  1439. for _, v := range baseField {
  1440. fields = append(fields, v)
  1441. }
  1442. bSum = false
  1443. } else {
  1444. tmp := map[string]string{}
  1445. for _, p := range param {
  1446. if v, ok := baseField[p]; ok {
  1447. // 利用map特性去重, 先保存在一个临时map中
  1448. tmp[p] = v
  1449. bSum = true
  1450. }
  1451. }
  1452. if bSum {
  1453. for _, v := range tmp {
  1454. fields = append(fields, v)
  1455. }
  1456. }
  1457. }
  1458. }
  1459. return
  1460. }
  1461. func (r *Ermcp3AreaStockReportEx) getExFieldInfo() (strFiled string, strleftJoin string) {
  1462. if len(r.SumFields) > 0 {
  1463. param := strings.Split(r.SumFields, ",")
  1464. fHas := func(v string) bool {
  1465. for i := range param {
  1466. if param[i] == v {
  1467. return true
  1468. }
  1469. }
  1470. return false
  1471. }
  1472. if fHas("1") {
  1473. if len(strFiled) > 0 {
  1474. strFiled += ","
  1475. }
  1476. strFiled += "g.deliverygoodscode, g.deliverygoodsname, g.goodsunitid"
  1477. strleftJoin += " LEFT JOIN deliverygoods g on a.deliverygoodsid = g.deliverygoodsid"
  1478. }
  1479. if fHas("2") {
  1480. if len(strFiled) > 0 {
  1481. strFiled += ","
  1482. }
  1483. strFiled += "w.wrstandardname, w.wrstandardcode, w.unitid"
  1484. strleftJoin += " LEFT JOIN WRSTANDARD w on a.wrstandardid = w.wrstandardid"
  1485. }
  1486. if fHas("3") {
  1487. if len(strFiled) > 0 {
  1488. strFiled += ","
  1489. }
  1490. strFiled += "gb.dgfactoryitemvalue brandname"
  1491. strleftJoin += " LEFT JOIN dgfactoryitem gb on a.spotgoodsbrandid = gb.dgfactoryitemid"
  1492. }
  1493. if fHas("4") {
  1494. if len(strFiled) > 0 {
  1495. strFiled += ","
  1496. }
  1497. strFiled += "h.warehousecode, h.warehousename, h.warehousetype"
  1498. strleftJoin += " LEFT JOIN WAREHOUSEINFO h on a.warehouseinfoid=h.autoid"
  1499. }
  1500. }
  1501. return
  1502. }
  1503. func (r *Ermcp3AreaStockReportEx) buildSql() (sqlId string) {
  1504. fields, bSum := r.getSumField()
  1505. if r.CYCLETYPE == 0 {
  1506. // 日报表
  1507. if bSum {
  1508. sqlId = r.buildSqlReckonSum(fields)
  1509. } else {
  1510. sqlId = r.buildSqlReckon()
  1511. }
  1512. } else {
  1513. // 周期报表
  1514. if bSum {
  1515. sqlId = r.buildSqlReportSum(fields)
  1516. } else {
  1517. sqlId = r.buildSqlReport()
  1518. }
  1519. }
  1520. return
  1521. }
  1522. // GetDataEx 获取库存报表
  1523. func (r *Ermcp3AreaStockReportEx) GetDataEx() (interface{}, error) {
  1524. sData := make([]Ermcp3AreaStockReportEx, 0)
  1525. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1526. for i := range sData {
  1527. sData[i].calc()
  1528. sData[i].BeginDate = r.BeginDate
  1529. sData[i].EndDate = r.EndDate
  1530. }
  1531. return sData, err
  1532. }
  1533. // buildSqlReckon 日照表
  1534. func (r *Ermcp3AreaStockReportEx) buildSqlReckon() string {
  1535. var sqlId utils.SQLVal = "SELECT t.TODAYBUYINQTY," +
  1536. " t.TODAYPRODUCEINQTY," +
  1537. " t.reckondate," +
  1538. " t.TODAYSELLOUTQTY," +
  1539. " t.TODAYPRODUCEOUTQTY," +
  1540. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  1541. " t.USERID," +
  1542. " t.WRSTANDARDID," +
  1543. " t.SPOTGOODSBRANDID," +
  1544. " t.WAREHOUSEINFOID," +
  1545. " t.deliverygoodsid," +
  1546. " t.ORISTOCK," +
  1547. " t.CURSTOCK," +
  1548. " w.wrstandardname," +
  1549. " w.wrstandardcode," +
  1550. " w.unitid," +
  1551. " gb.dgfactoryitemvalue brandname," +
  1552. " h.warehousename," +
  1553. " h.warehousecode," +
  1554. " h.warehousetype," +
  1555. " g.deliverygoodscode," +
  1556. " g.deliverygoodsname," +
  1557. " g.goodsunitid" +
  1558. " FROM RECKON_ERMCP_AREASTOCK t" +
  1559. " LEFT JOIN WRSTANDARD w" +
  1560. " on t.wrstandardid = w.wrstandardid" +
  1561. " LEFT JOIN dgfactoryitem gb" +
  1562. " on t.spotgoodsbrandid = gb.dgfactoryitemid" +
  1563. " LEFT JOIN deliverygoods g" +
  1564. " on t.deliverygoodsid = g.deliverygoodsid" +
  1565. " LEFT JOIN WAREHOUSEINFO h" +
  1566. " on t.warehouseinfoid = h.autoid" +
  1567. " WHERE 1 = 1"
  1568. sqlId.And("t.USERID", r.USERID)
  1569. sqlId.AndEx("t.RECKONDATE", r.RECKONDATE, len(r.RECKONDATE) > 0)
  1570. if len(r.BeginDate) > 0 && len(r.EndDate) > 0 {
  1571. sqlId.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  1572. }
  1573. // 现货商品id
  1574. sqlId.AndEx("t.DELIVERYGOODSID", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  1575. // 品类id
  1576. sqlId.AndEx("t.WRSTANDARDID", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  1577. // 品牌id
  1578. sqlId.AndEx("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  1579. // 仓库id
  1580. sqlId.AndEx("t.WAREHOUSEINFOID", r.WAREHOUSEINFOID, len(r.WAREHOUSEINFOID) > 0)
  1581. sqlId.Join(" order by t.reckondate")
  1582. return sqlId.String()
  1583. }
  1584. // buildSqlReckonSum 日照表(汇总维度)
  1585. func (r *Ermcp3AreaStockReportEx) buildSqlReckonSum(fields []string) string {
  1586. var sqlId utils.SQLVal = "SELECT a.*, %v" +
  1587. " from (SELECT %v," +
  1588. " sum(t.ORISTOCK) ORISTOCK," +
  1589. " sum(t.CURSTOCK) CURSTOCK," +
  1590. " sum(t.TODAYBUYINQTY) TODAYBUYINQTY," +
  1591. " sum(t.TODAYPRODUCEINQTY) TODAYPRODUCEINQTY," +
  1592. " sum(t.TODAYSELLOUTQTY) TODAYSELLOUTQTY," +
  1593. " sum(t.TODAYPRODUCEOUTQTY) TODAYPRODUCEOUTQTY" +
  1594. " FROM RECKON_ERMCP_AREASTOCK t" +
  1595. " WHERE 1 = 1 %v" +
  1596. " GROUP BY %v) a %v"
  1597. var sqlParam utils.SQLVal
  1598. sqlParam.And("t.USERID", r.USERID)
  1599. sqlParam.AndEx("t.RECKONDATE", r.RECKONDATE, len(r.RECKONDATE) > 0)
  1600. if len(r.BeginDate) > 0 && len(r.EndDate) > 0 {
  1601. sqlParam.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  1602. }
  1603. // 现货商品id
  1604. sqlParam.AndEx("t.DELIVERYGOODSID", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  1605. // 品类id
  1606. sqlParam.AndEx("t.WRSTANDARDID", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  1607. // 品牌id
  1608. sqlParam.AndEx("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  1609. // 仓库id
  1610. sqlParam.AndEx("t.WAREHOUSEINFOID", r.WAREHOUSEINFOID, len(r.WAREHOUSEINFOID) > 0)
  1611. var strFileds string
  1612. for _, v := range fields {
  1613. if len(strFileds) > 0 {
  1614. strFileds += ","
  1615. }
  1616. strFileds += "t." + v
  1617. }
  1618. exFields, exLeftJoinTable := r.getExFieldInfo()
  1619. sqlId.FormatParam(exFields, strFileds, sqlParam.String(), strFileds, exLeftJoinTable)
  1620. sqlId.Join(" order by a.reckondate")
  1621. return sqlId.String()
  1622. }
  1623. // buildSqlReport 报表表
  1624. func (r *Ermcp3AreaStockReportEx) buildSqlReport() string {
  1625. var sqlId utils.SQLVal = "SELECT t.TODAYBUYINQTY," +
  1626. " t.TODAYPRODUCEINQTY," +
  1627. " t.cycletype," +
  1628. " t.cycletime," +
  1629. " t.USERID," +
  1630. " t.WRSTANDARDID," +
  1631. " t.SPOTGOODSBRANDID," +
  1632. " t.WAREHOUSEINFOID," +
  1633. " t.deliverygoodsid," +
  1634. " t.TODAYSELLOUTQTY," +
  1635. " t.TODAYPRODUCEOUTQTY," +
  1636. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  1637. " t.ORISTOCK," +
  1638. " t.CURSTOCK," +
  1639. " w.wrstandardname," +
  1640. " w.wrstandardcode," +
  1641. " w.unitid," +
  1642. " gb.dgfactoryitemvalue brandname," +
  1643. " h.warehousename," +
  1644. " h.warehousecode," +
  1645. " h.warehousetype," +
  1646. " g.deliverygoodscode," +
  1647. " g.deliverygoodsname," +
  1648. " g.goodsunitid" +
  1649. " FROM REPORT_ERMCP_AREASTOCK t" +
  1650. " LEFT JOIN WRSTANDARD w" +
  1651. " on t.wrstandardid = w.wrstandardid" +
  1652. " LEFT JOIN dgfactoryitem gb" +
  1653. " on t.spotgoodsbrandid = gb.dgfactoryitemid" +
  1654. " LEFT JOIN deliverygoods g" +
  1655. " on t.deliverygoodsid = g.deliverygoodsid" +
  1656. " LEFT JOIN WAREHOUSEINFO h" +
  1657. " on t.warehouseinfoid = h.autoid" +
  1658. " WHERE 1 = 1"
  1659. sqlId.And("t.USERID", r.USERID)
  1660. sqlId.And("t.cycletype", r.CYCLETYPE)
  1661. sqlId.And("t.cycletime", r.CYCLETIME)
  1662. // 现货商品id
  1663. sqlId.AndEx("t.DELIVERYGOODSID", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  1664. // 品类id
  1665. sqlId.AndEx("t.WRSTANDARDID", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  1666. // 品牌id
  1667. sqlId.AndEx("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  1668. // 仓库id
  1669. sqlId.AndEx("t.WAREHOUSEINFOID", r.WAREHOUSEINFOID, len(r.WAREHOUSEINFOID) > 0)
  1670. return sqlId.String()
  1671. }
  1672. // buildSqlReport 报表表(汇总维度)
  1673. func (r *Ermcp3AreaStockReportEx) buildSqlReportSum(fields []string) string {
  1674. var sqlId utils.SQLVal = "SELECT a.*, %v" +
  1675. " from (SELECT %v," +
  1676. " sum(t.ORISTOCK) ORISTOCK," +
  1677. " sum(t.CURSTOCK) CURSTOCK," +
  1678. " sum(t.TODAYBUYINQTY) TODAYBUYINQTY," +
  1679. " sum(t.TODAYPRODUCEINQTY) TODAYPRODUCEINQTY," +
  1680. " sum(t.TODAYSELLOUTQTY) TODAYSELLOUTQTY," +
  1681. " sum(t.TODAYPRODUCEOUTQTY) TODAYPRODUCEOUTQTY" +
  1682. " FROM REPORT_ERMCP_AREASTOCK t" +
  1683. " WHERE 1 = 1 %v" +
  1684. " GROUP BY %v) a %v"
  1685. var sqlParam utils.SQLVal
  1686. sqlParam.And("t.USERID", r.USERID)
  1687. sqlParam.And("t.cycletype", r.CYCLETYPE)
  1688. sqlParam.And("t.cycletime", r.CYCLETIME)
  1689. // 现货商品id
  1690. sqlParam.AndEx("t.DELIVERYGOODSID", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  1691. // 品类id
  1692. sqlParam.AndEx("t.WRSTANDARDID", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  1693. // 品牌id
  1694. sqlParam.AndEx("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  1695. // 仓库id
  1696. sqlParam.AndEx("t.WAREHOUSEINFOID", r.WAREHOUSEINFOID, len(r.WAREHOUSEINFOID) > 0)
  1697. var strFileds string
  1698. for _, v := range fields {
  1699. if len(strFileds) > 0 {
  1700. strFileds += ","
  1701. }
  1702. strFileds += "t." + v
  1703. }
  1704. exFields, exLeftJoinTable := r.getExFieldInfo()
  1705. sqlId.FormatParam(exFields, strFileds, sqlParam.String(), strFileds, exLeftJoinTable)
  1706. return sqlId.String()
  1707. }
  1708. // Ermcp3ArealSumPL 损益汇总表
  1709. type Ermcp3ArealSumPL struct {
  1710. RECKONDATE string `json:"reckondate" xorm:"RECKONDATE"` // 日照时期(yyyyMMdd)
  1711. CYCLETIME string `json:"cycletime" xorm:"'CYCLETIME'"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  1712. CYCLETYPE int32 `json:"cycletype" xorm:"'CYCLETYPE'"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  1713. AREAUSERID int64 `json:"areauserid" xorm:"AREAUSERID"` // 所属机构\交易用户ID
  1714. MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"MIDDLEGOODSID"` // 套保品种ID(SEQ_ERMS_MIDDLEGOODS)
  1715. CURRENCYID int32 `json:"currencyid" xorm:"CURRENCYID"` // 结算币种ID
  1716. SPOTACTUALPL float64 `json:"spotactualpl" xorm:"SPOTACTUALPL"` // 现货损益
  1717. SPOTFLOATPL float64 `json:"spotfloatpl" xorm:"SPOTFLOATPL"` // 现货浮动损益
  1718. FUTUREACTUALPL float64 `json:"futureactualpl" xorm:"FUTUREACTUALPL"` // 期货损益
  1719. FUTUREFLOATPL float64 `json:"futurefloatpl" xorm:"FUTUREFLOATPL"` // 期货浮动损益
  1720. SUMACTUALPL float64 `json:"sumactualpl" xorm:"SUMACTUALPL"` // 实际损益 = (ActualPL + FutureActualPL)
  1721. SUMPL float64 `json:"sumpl" xorm:"'SUMPL'"` // 汇总损益
  1722. UPDATETIME string `json:"updatetime" xorm:"UPDATETIME"` // 更新时间
  1723. MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保品种名称
  1724. MIDDLEGOODSCODE string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保品种代码
  1725. GOODSUNITID int32 `json:"goodsunitid" xorm:"'GOODSUNITID'"` // 套保品种单位id
  1726. ACCOUNTNAME string `json:"accountname"` // 机构名称
  1727. ENUMDICNAME string `json:"enumdicname"` // 单位名称(套保品种)
  1728. CURRENCYNAME string `json:"currencyname"` // 币种名称
  1729. QueryType int32 `json:"-"` // 查询类型 1-报表 2-报表明细
  1730. BeginDate string `json:"begindate"` // 开始交易日
  1731. EndDate string `json:"enddate"` // 结束交易日
  1732. }
  1733. func (r *Ermcp3ArealSumPL) calc() {
  1734. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  1735. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.GOODSUNITID)
  1736. r.ACCOUNTNAME = mtpcache.GetUserNameByUserId(r.AREAUSERID)
  1737. }
  1738. func (r *Ermcp3ArealSumPL) buildSql() string {
  1739. // 日报表
  1740. if r.QueryType == 1 && r.CYCLETYPE == 0 {
  1741. return r.buildSqlDay()
  1742. }
  1743. // 日报表明细
  1744. if r.QueryType == 2 && r.CYCLETYPE == 0 {
  1745. return r.buildSqlDayDetail()
  1746. }
  1747. return r.buildSqlCycle()
  1748. }
  1749. // buildSqlDay 损益汇总日报表(需要汇总维度)
  1750. func (r *Ermcp3ArealSumPL) buildSqlDay() string {
  1751. var sqlId utils.SQLVal = "SELECT t.RECKONDATE," +
  1752. " t.AREAUSERID," +
  1753. " t.CURRENCYID," +
  1754. " sum(t.SPOTACTUALPL) SPOTACTUALPL," +
  1755. " sum(t.SPOTFLOATPL) SPOTFLOATPL," +
  1756. " sum(t.FUTUREACTUALPL) FUTUREACTUALPL," +
  1757. " sum(t.FUTUREFLOATPL) FUTUREFLOATPL," +
  1758. " sum(t.SUMACTUALPL) SUMACTUALPL," +
  1759. " sum(t.SUMPL) SUMPL" +
  1760. " FROM RECKON_ERMCP_AREASUMPL t" +
  1761. " WHERE 1 = 1"
  1762. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  1763. if r.QueryType == 1 {
  1764. sqlId.And("t.RECKONDATE", r.RECKONDATE)
  1765. } else if r.QueryType == 2 {
  1766. sqlId.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  1767. }
  1768. sqlId.Join(" GROUP BY t.RECKONDATE, t.AREAUSERID, t.CURRENCYID")
  1769. return sqlId.String()
  1770. }
  1771. func (r *Ermcp3ArealSumPL) buildSqlDayDetail() string {
  1772. var sqlId utils.SQLVal = "SELECT t.RECKONDATE," +
  1773. " t.AREAUSERID," +
  1774. " t.MIDDLEGOODSID," +
  1775. " t.CURRENCYID," +
  1776. " t.SPOTACTUALPL," +
  1777. " t.SPOTFLOATPL," +
  1778. " t.FUTUREACTUALPL," +
  1779. " t.FUTUREFLOATPL," +
  1780. " t.SUMACTUALPL," +
  1781. " t.SUMPL," +
  1782. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  1783. " g.middlegoodsname," +
  1784. " g.middlegoodscode," +
  1785. " g.goodsunitid" +
  1786. " FROM RECKON_ERMCP_AREASUMPL t" +
  1787. " LEFT JOIN ERMS_MIDDLEGOODS g on t.middlegoodsid=g.middlegoodsid" +
  1788. " WHERE 1 = 1"
  1789. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  1790. sqlId.AndEx("t.RECKONDATE", r.RECKONDATE, len(r.RECKONDATE) > 0)
  1791. if len(r.BeginDate) > 0 && len(r.EndDate) > 0 {
  1792. sqlId.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  1793. }
  1794. sqlId.And("t.CURRENCYID", r.CURRENCYID)
  1795. return sqlId.String()
  1796. }
  1797. func (r *Ermcp3ArealSumPL) buildSqlCycle() string {
  1798. var sqlId utils.SQLVal = "SELECT t.AREAUSERID," +
  1799. " t.CYCLETIME," +
  1800. " t.CYCLETYPE," +
  1801. " t.CURRENCYID," +
  1802. " sum(t.SPOTACTUALPL) SPOTACTUALPL," +
  1803. " sum(t.SPOTFLOATPL) SPOTFLOATPL," +
  1804. " sum(t.FUTUREACTUALPL) FUTUREACTUALPL," +
  1805. " sum(t.FUTUREFLOATPL) FUTUREFLOATPL," +
  1806. " sum(t.SUMACTUALPL) SUMACTUALPL," +
  1807. " sum(t.SUMPL) SUMPL" +
  1808. " FROM REPORT_ERMCP_AREASUMPL t" +
  1809. " WHERE 1 = 1"
  1810. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  1811. sqlId.And("t.cycletype", r.CYCLETYPE)
  1812. sqlId.And("t.cycletime", r.CYCLETIME)
  1813. sqlId.Join(" GROUP BY t.AREAUSERID, t.CURRENCYID, t.CYCLETIME, t.CYCLETYPE")
  1814. return sqlId.String()
  1815. }
  1816. // GetDataEx 获取损益汇总表
  1817. func (r *Ermcp3ArealSumPL) GetDataEx() (interface{}, error) {
  1818. sData := make([]Ermcp3ArealSumPL, 0)
  1819. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1820. for i := range sData {
  1821. sData[i].calc()
  1822. sData[i].BeginDate = r.BeginDate
  1823. sData[i].EndDate = r.EndDate
  1824. }
  1825. return sData, err
  1826. }
  1827. // Ermcp3TaFutuReDataReport 期货报表
  1828. type Ermcp3TaFutuReDataReport struct {
  1829. RECKONDATE string `json:"reckondate" xorm:"RECKONDATE"` // 日照时期(yyyyMMdd)
  1830. CYCLETIME string `json:"cycletime" xorm:"CYCLETIME"` // 周期时间 月(YYYYMM) 季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
  1831. CYCLETYPE int32 `json:"cycletype" xorm:"CYCLETYPE"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
  1832. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 交易账户
  1833. GOODSID int32 `json:"goodsid" xorm:"GOODSID"` // 交易合约
  1834. BUYORSELL int32 `json:"buyorsell" xorm:"BUYORSELL"` // 持仓方向
  1835. CURRENCYID int32 `json:"currencyid" xorm:"CURRENCYID"` // 结算币种ID
  1836. USERID int64 `json:"userid" xorm:"USERID"` // 账户所属用户ID
  1837. RELATEDUSERID int64 `json:"relateduserid" xorm:"RELATEDUSERID"` // 账户关联用户ID
  1838. GOODSGROUPID int32 `json:"goodsgroupid" xorm:"GOODSGROUPID"` // 交易品种
  1839. ORIHOLDQTY float64 `json:"oriholdqty" xorm:"ORIHOLDQTY"` // 期初持仓量
  1840. ORIOPENAMOUNT float64 `json:"oriopenamount" xorm:"ORIOPENAMOUNT"` // 期初开仓额
  1841. ORIHOLDAMOUNT float64 `json:"oriholdamount" xorm:"ORIHOLDAMOUNT"` // 期初持仓额
  1842. TODAYOPENQTY float64 `json:"todayopenqty" xorm:"TODAYOPENQTY"` // 今开仓量
  1843. TODAYOPENAMOUNT float64 `json:"todayopenamount" xorm:"TODAYOPENAMOUNT"` // 今开仓额
  1844. TODAYCLOSEQTY float64 `json:"todaycloseqty" xorm:"TODAYCLOSEQTY"` // 今平仓量
  1845. TODAYCLOSEAMOUNT float64 `json:"todaycloseamount" xorm:"TODAYCLOSEAMOUNT"` // 今平仓额
  1846. HOLDQTY float64 `json:"holdqty" xorm:"HOLDQTY"` // 期末持仓量
  1847. OPENAMOUNT float64 `json:"openamount" xorm:"OPENAMOUNT"` // 期末开仓额
  1848. HOLDAMOUNT float64 `json:"holdamount" xorm:"HOLDAMOUNT"` // 期末持仓额
  1849. RECKONPRICE float64 `json:"reckonprice" xorm:"RECKONPRICE"` // 结算价
  1850. RECKONHOLDAMOUNT float64 `json:"reckonholdamount" xorm:"RECKONHOLDAMOUNT"` // 结算持仓额
  1851. CHARGE float64 `json:"charge" xorm:"CHARGE"` // 手续费
  1852. CLOSEPL float64 `json:"closepl" xorm:"CLOSEPL"` // 平仓损益
  1853. RECKONPL float64 `json:"reckonpl" xorm:"RECKONPL"` // 结算损益
  1854. LASTPRICE float64 `json:"lastprice" xorm:"LASTPRICE"` // 最新价
  1855. LASTHOLDAMOUNT float64 `json:"lastholdamount" xorm:"LASTHOLDAMOUNT"` // 当前持仓额
  1856. FLOATPL float64 `json:"floatpl" xorm:"FLOATPL"` // 浮动损益
  1857. GOODSGROUPSPOTQTY float64 `json:"goodsgroupspotqty" xorm:"GOODSGROUPSPOTQTY"` // 交易品种期末量 (= 期末持仓量 * 合约乘数)
  1858. TODAYGOODSGROUPSPOTQTY float64 `json:"todaygoodsgroupspotqty" xorm:"TODAYGOODSGROUPSPOTQTY"` // 交易品种变化量 (=(期末持仓量 - 期初持仓量)* 合约乘数)
  1859. MIDDLEGOODSQTY float64 `json:"middlegoodsqty" xorm:"MIDDLEGOODSQTY"` // 套保品种期末量 (=交易品种期末量 * 期货品种折算系数)
  1860. TODAYMIDDLEGOODSQTY float64 `json:"todaymiddlegoodsqty" xorm:"TODAYMIDDLEGOODSQTY"` // 套保品种变化量 (= 交易品种变化量*期货品种折算系数)
  1861. RECKONPL2 float64 `json:"reckonpl2" xorm:"RECKONPL2"` // 结算逐笔盈亏
  1862. OUTERGROUPCODE string `json:"outergroupcode" xorm:"'OUTERGROUPCODE'"` // 交易品种代码
  1863. GOODSGROUPNAME string `json:"goodsgroupname" xorm:"'GOODSGROUPNAME'"` // 交易品种名称
  1864. GOODSCODE string `json:"goodscode" xorm:"'GOODSCODE'"` // 交易合约代码
  1865. GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'"` // 交易合约名称
  1866. GOODUNITID int32 `json:"goodunitid" xorm:"'GOODUNITID'"` // 交易合约单位id
  1867. ACCOUNTNAME string `json:"accountname" xorm:"'ACCOUNTNAME'"` // 交易账号名称
  1868. MIDDLEGOODSID int32 `json:"middlegoodsid" xorm:"'MIDDLEGOODSID'"` // 套保品种id
  1869. MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保商品名称
  1870. MIDDLEGOODSCODE string `json:"middlgoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保商品代码
  1871. OPENAVGPRICE float64 `json:"openavgprice"` // 开仓均价
  1872. CLOSEAVGPRICE float64 `json:"closeavgprice"` // 平仓均价
  1873. ENUMDICNAME string `json:"enumdicname"` // 单位名称
  1874. CURRENCYNAME string `json:"currencyname"` // 币种名称
  1875. QueryType int32 `json:"-"` // 查询类型 1-报表 2-报表明细
  1876. BeginDate string `json:"begindate"` // 开始交易日
  1877. EndDate string `json:"enddate"` // 结束交易日
  1878. }
  1879. func (r *Ermcp3TaFutuReDataReport) calc() {
  1880. if r.TODAYOPENQTY != 0 {
  1881. r.OPENAVGPRICE = r.TODAYOPENAMOUNT / r.TODAYOPENQTY
  1882. }
  1883. if r.TODAYCLOSEQTY != 0 {
  1884. r.CLOSEAVGPRICE = r.TODAYCLOSEAMOUNT / r.TODAYCLOSEQTY
  1885. }
  1886. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.GOODUNITID)
  1887. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  1888. }
  1889. func (r *Ermcp3TaFutuReDataReport) userType() int32 {
  1890. var userType int32 = 2
  1891. areaUserId := mtpcache.GetAreaUserId(r.USERID, 0)
  1892. if areaUserId == r.USERID {
  1893. userType = 2
  1894. } else {
  1895. userType = 7
  1896. }
  1897. return userType
  1898. }
  1899. func (r *Ermcp3TaFutuReDataReport) buildSql() string {
  1900. userType := r.userType()
  1901. // 日报表
  1902. if r.QueryType == 1 && r.CYCLETYPE == 0 {
  1903. return r.buildSqlReckon(userType)
  1904. }
  1905. // 日报表明细
  1906. if r.QueryType == 2 && r.CYCLETYPE == 0 {
  1907. return r.buildSqlReckonDetail(userType)
  1908. }
  1909. return r.buildSqlReport(userType)
  1910. }
  1911. // buildSqlReckon 日照表
  1912. func (r *Ermcp3TaFutuReDataReport) buildSqlReckon(userType int32) string {
  1913. var sqlId utils.SQLVal = "select a.*," +
  1914. " gp.outergroupcode," +
  1915. " gp.goodsgroupname," +
  1916. " g.goodscode," +
  1917. " g.goodsname," +
  1918. " g.goodunitid," +
  1919. " mg.middlegoodsid," +
  1920. " mg.middlegoodscode," +
  1921. " mg.middlegoodsname" +
  1922. " from (SELECT t.RECKONDATE," +
  1923. " t.GOODSID," +
  1924. " t.BUYORSELL," +
  1925. " t.CURRENCYID," +
  1926. " t.%v USERID," +
  1927. " t.GOODSGROUPID," +
  1928. " t.middlegoodsid," +
  1929. " sum(t.ORIHOLDQTY) ORIHOLDQTY," +
  1930. " sum(t.ORIOPENAMOUNT) ORIOPENAMOUNT," +
  1931. " sum(t.ORIHOLDAMOUNT) ORIHOLDAMOUNT," +
  1932. " sum(t.TODAYOPENQTY) TODAYOPENQTY," +
  1933. " sum(t.TODAYOPENAMOUNT) TODAYOPENAMOUNT," +
  1934. " sum(t.TODAYCLOSEQTY) TODAYCLOSEQTY," +
  1935. " sum(t.TODAYCLOSEAMOUNT) TODAYCLOSEAMOUNT," +
  1936. " sum(t.HOLDQTY) HOLDQTY," +
  1937. " sum(t.OPENAMOUNT) OPENAMOUNT," +
  1938. " sum(t.HOLDAMOUNT) HOLDAMOUNT," +
  1939. " sum(t.RECKONPRICE) RECKONPRICE," +
  1940. " sum(t.RECKONHOLDAMOUNT) RECKONHOLDAMOUNT," +
  1941. " sum(t.CHARGE) CHARGE," +
  1942. " sum(t.CLOSEPL) CLOSEPL," +
  1943. " sum(t.RECKONPL) RECKONPL," +
  1944. " max(t.LASTPRICE) LASTPRICE," +
  1945. " sum(t.LASTHOLDAMOUNT) LASTHOLDAMOUNT," +
  1946. " sum(t.FLOATPL) FLOATPL," +
  1947. " sum(t.GOODSGROUPSPOTQTY) GOODSGROUPSPOTQTY," +
  1948. " sum(t.TODAYGOODSGROUPSPOTQTY) TODAYGOODSGROUPSPOTQTY," +
  1949. " sum(t.MIDDLEGOODSQTY) MIDDLEGOODSQTY," +
  1950. " sum(t.TODAYMIDDLEGOODSQTY) TODAYMIDDLEGOODSQTY," +
  1951. " sum(t.Reckonpl2) RECKONPL2" +
  1952. " FROM RECKON_ERMCP_TAFUTUREDATA t" +
  1953. " WHERE 1 = 1 %v" +
  1954. " GROUP BY t.RECKONDATE," +
  1955. " t.GOODSID," +
  1956. " t.BUYORSELL," +
  1957. " t.CURRENCYID," +
  1958. " t.%v," +
  1959. " t.middlegoodsid," +
  1960. " t.GOODSGROUPID) a" +
  1961. " left join goodsgroup gp" +
  1962. " on a.goodsgroupid = gp.goodsgroupid" +
  1963. " left join goods g" +
  1964. " on a.goodsid = g.goodsid" +
  1965. " left join erms_middlegoods mg on a.middlegoodsid=mg.middlegoodsid"
  1966. userId := "USERID"
  1967. var sqlParam utils.SQLVal
  1968. if userType == 2 {
  1969. sqlParam.AndEx("t.userid", r.USERID, userType == 2)
  1970. userId = "USERID"
  1971. } else if userType == 7 {
  1972. sqlParam.AndEx("t.relateduserid", r.USERID, userType == 7)
  1973. userId = "RELATEDUSERID"
  1974. }
  1975. sqlParam.AndEx("t.reckondate", r.RECKONDATE, len(r.RECKONDATE) > 0)
  1976. if len(r.BeginDate) > 0 && len(r.EndDate) > 0 {
  1977. sqlParam.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  1978. }
  1979. sqlId.FormatParam(userId, sqlParam.String(), userId)
  1980. return sqlId.String()
  1981. }
  1982. // buildSqlReckon 日照表明细
  1983. func (r *Ermcp3TaFutuReDataReport) buildSqlReckonDetail(userType int32) string {
  1984. var sqlId utils.SQLVal = "select a.*," +
  1985. " gp.outergroupcode," +
  1986. " gp.goodsgroupname," +
  1987. " g.goodscode," +
  1988. " g.goodsname," +
  1989. " g.goodunitid," +
  1990. " ta.accountname," +
  1991. " mg.middlegoodsid," +
  1992. " mg.middlegoodscode," +
  1993. " mg.middlegoodsname" +
  1994. " from (SELECT t.reckondate," +
  1995. " t.GOODSID," +
  1996. " t.BUYORSELL," +
  1997. " t.CURRENCYID," +
  1998. " t.%v USERID," +
  1999. " t.accountid," +
  2000. " t.GOODSGROUPID," +
  2001. " t.middlegoodsid," +
  2002. " sum(t.ORIHOLDQTY) ORIHOLDQTY," +
  2003. " sum(t.ORIOPENAMOUNT) ORIOPENAMOUNT," +
  2004. " sum(t.ORIHOLDAMOUNT) ORIHOLDAMOUNT," +
  2005. " sum(t.TODAYOPENQTY) TODAYOPENQTY," +
  2006. " sum(t.TODAYOPENAMOUNT) TODAYOPENAMOUNT," +
  2007. " sum(t.TODAYCLOSEQTY) TODAYCLOSEQTY," +
  2008. " sum(t.TODAYCLOSEAMOUNT) TODAYCLOSEAMOUNT," +
  2009. " sum(t.HOLDQTY) HOLDQTY," +
  2010. " sum(t.OPENAMOUNT) OPENAMOUNT," +
  2011. " sum(t.HOLDAMOUNT) HOLDAMOUNT," +
  2012. " sum(t.RECKONPRICE) RECKONPRICE," +
  2013. " sum(t.RECKONHOLDAMOUNT) RECKONHOLDAMOUNT," +
  2014. " sum(t.CHARGE) CHARGE," +
  2015. " sum(t.CLOSEPL) CLOSEPL," +
  2016. " sum(t.RECKONPL) RECKONPL," +
  2017. " max(t.LASTPRICE) LASTPRICE," +
  2018. " sum(t.LASTHOLDAMOUNT) LASTHOLDAMOUNT," +
  2019. " sum(t.FLOATPL) FLOATPL," +
  2020. " sum(t.GOODSGROUPSPOTQTY) GOODSGROUPSPOTQTY," +
  2021. " sum(t.TODAYGOODSGROUPSPOTQTY) TODAYGOODSGROUPSPOTQTY," +
  2022. " sum(t.MIDDLEGOODSQTY) MIDDLEGOODSQTY," +
  2023. " sum(t.TODAYMIDDLEGOODSQTY) TODAYMIDDLEGOODSQTY," +
  2024. " sum(t.Reckonpl2) RECKONPL2" +
  2025. " FROM RECKON_ERMCP_TAFUTUREDATA t" +
  2026. " WHERE 1 = 1 %v" +
  2027. " GROUP BY t.reckondate," +
  2028. " t.GOODSID," +
  2029. " t.BUYORSELL," +
  2030. " t.CURRENCYID," +
  2031. " t.%v," +
  2032. " t.accountid," +
  2033. " t.middlegoodsid," +
  2034. " t.GOODSGROUPID) a" +
  2035. " left join goodsgroup gp" +
  2036. " on a.goodsgroupid = gp.goodsgroupid" +
  2037. " left join goods g" +
  2038. " on a.goodsid = g.goodsid" +
  2039. " left join taaccount ta on a.accountid = ta.accountid" +
  2040. " left join erms_middlegoods mg on a.middlegoodsid=mg.middlegoodsid"
  2041. userId := "USERID"
  2042. var sqlParam utils.SQLVal
  2043. if userType == 2 {
  2044. sqlParam.AndEx("t.userid", r.USERID, userType == 2)
  2045. userId = "USERID"
  2046. } else if userType == 7 {
  2047. sqlParam.AndEx("t.relateduserid", r.USERID, userType == 7)
  2048. userId = "RELATEDUSERID"
  2049. }
  2050. sqlParam.And("t.CURRENCYID", r.CURRENCYID)
  2051. sqlParam.And("t.GOODSGROUPID", r.GOODSGROUPID)
  2052. sqlParam.And("t.GOODSID", r.GOODSID)
  2053. sqlParam.And("t.BUYORSELL", r.BUYORSELL)
  2054. sqlParam.AndEx("t.reckondate", r.RECKONDATE, len(r.RECKONDATE) > 0)
  2055. if len(r.BeginDate) > 0 && len(r.EndDate) > 0 {
  2056. sqlParam.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  2057. }
  2058. sqlId.FormatParam(userId, sqlParam.String(), userId)
  2059. return sqlId.String()
  2060. }
  2061. // buildSqlReckon 报表表
  2062. func (r *Ermcp3TaFutuReDataReport) buildSqlReport(userType int32) string {
  2063. var sqlId utils.SQLVal = "select a.*," +
  2064. " gp.outergroupcode," +
  2065. " gp.goodsgroupname," +
  2066. " g.goodscode," +
  2067. " g.goodsname," +
  2068. " g.goodunitid," +
  2069. " mg.middlegoodsid," +
  2070. " mg.middlegoodscode," +
  2071. " mg.middlegoodsname" +
  2072. " from (SELECT t.cycletype," +
  2073. " t.cycletime," +
  2074. " t.GOODSID," +
  2075. " t.BUYORSELL," +
  2076. " t.CURRENCYID," +
  2077. " t.%v USERID," +
  2078. " t.GOODSGROUPID," +
  2079. " t.middlegoodsid," +
  2080. " sum(t.ORIHOLDQTY) ORIHOLDQTY," +
  2081. " sum(t.ORIOPENAMOUNT) ORIOPENAMOUNT," +
  2082. " sum(t.ORIHOLDAMOUNT) ORIHOLDAMOUNT," +
  2083. " sum(t.TODAYOPENQTY) TODAYOPENQTY," +
  2084. " sum(t.TODAYOPENAMOUNT) TODAYOPENAMOUNT," +
  2085. " sum(t.TODAYCLOSEQTY) TODAYCLOSEQTY," +
  2086. " sum(t.TODAYCLOSEAMOUNT) TODAYCLOSEAMOUNT," +
  2087. " sum(t.HOLDQTY) HOLDQTY," +
  2088. " sum(t.OPENAMOUNT) OPENAMOUNT," +
  2089. " sum(t.HOLDAMOUNT) HOLDAMOUNT," +
  2090. " sum(t.RECKONPRICE) RECKONPRICE," +
  2091. " sum(t.RECKONHOLDAMOUNT) RECKONHOLDAMOUNT," +
  2092. " sum(t.CHARGE) CHARGE," +
  2093. " sum(t.CLOSEPL) CLOSEPL," +
  2094. " sum(t.RECKONPL) RECKONPL," +
  2095. " max(t.LASTPRICE) LASTPRICE," +
  2096. " sum(t.LASTHOLDAMOUNT) LASTHOLDAMOUNT," +
  2097. " sum(t.FLOATPL) FLOATPL," +
  2098. " sum(t.GOODSGROUPSPOTQTY) GOODSGROUPSPOTQTY," +
  2099. " sum(t.TODAYGOODSGROUPSPOTQTY) TODAYGOODSGROUPSPOTQTY," +
  2100. " sum(t.MIDDLEGOODSQTY) MIDDLEGOODSQTY," +
  2101. " sum(t.TODAYMIDDLEGOODSQTY) TODAYMIDDLEGOODSQTY," +
  2102. " sum(t.Reckonpl2) RECKONPL2" +
  2103. " FROM REPORT_ERMCP_TAFUTUREDATA t" +
  2104. " WHERE 1 = 1 %v" +
  2105. " GROUP BY t.cycletype," +
  2106. " t.cycletime," +
  2107. " t.GOODSID," +
  2108. " t.BUYORSELL," +
  2109. " t.CURRENCYID," +
  2110. " t.%v," +
  2111. " t.middlegoodsid," +
  2112. " t.GOODSGROUPID) a" +
  2113. " left join goodsgroup gp" +
  2114. " on a.goodsgroupid = gp.goodsgroupid" +
  2115. " left join goods g" +
  2116. " on a.goodsid = g.goodsid" +
  2117. " left join erms_middlegoods mg on a.middlegoodsid=mg.middlegoodsid"
  2118. userId := "USERID"
  2119. var sqlParam utils.SQLVal
  2120. if userType == 2 {
  2121. sqlParam.AndEx("t.userid", r.USERID, userType == 2)
  2122. userId = "USERID"
  2123. } else if userType == 7 {
  2124. sqlParam.AndEx("t.relateduserid", r.USERID, userType == 7)
  2125. userId = "RELATEDUSERID"
  2126. }
  2127. sqlParam.And("t.cycletype", r.CYCLETYPE)
  2128. sqlParam.And("t.cycletime", r.CYCLETIME)
  2129. sqlId.FormatParam(userId, sqlParam.String(), userId)
  2130. return sqlId.String()
  2131. }
  2132. // GetDataEx 获取期货报表
  2133. func (r *Ermcp3TaFutuReDataReport) GetDataEx() (interface{}, error) {
  2134. sData := make([]Ermcp3TaFutuReDataReport, 0)
  2135. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  2136. for i := range sData {
  2137. sData[i].calc()
  2138. sData[i].BeginDate = r.BeginDate
  2139. sData[i].EndDate = r.EndDate
  2140. }
  2141. return sData, err
  2142. }
  2143. // ReckonDayPosition 持仓头寸日照
  2144. type ReckonDayPosition struct {
  2145. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 账号Id
  2146. GOODSID int32 `json:"goodsid" xorm:"GOODSID"` // 商品Id
  2147. RECKONDATE string `json:"reckondate" xorm:"RECKONDATE"` // 日照日期(yyyyMMdd)
  2148. BUYPOSITIONQTY int32 `json:"buypositionqty" xorm:"BUYPOSITIONQTY"` // 买期初持仓数量
  2149. BUYHOLDERAMOUNT float64 `json:"buyholderamount" xorm:"BUYHOLDERAMOUNT"` // 买持仓期初总金额
  2150. BUYCURPOSITIONQTY int32 `json:"buycurpositionqty" xorm:"BUYCURPOSITIONQTY"` // 买当前持仓总数量
  2151. BUYCURHOLDERAMOUNT float64 `json:"buycurholderamount" xorm:"BUYCURHOLDERAMOUNT"` // 买当前持仓总金额
  2152. BUYFROZENQTY int32 `json:"buyfrozenqty" xorm:"BUYFROZENQTY"` // 买持仓冻结
  2153. BUYOTHERFROZENQTY int32 `json:"buyotherfrozenqty" xorm:"BUYOTHERFROZENQTY"` // 买持仓其他冻结(交割冻结)
  2154. BUYOPENREQQTY int32 `json:"buyopenreqqty" xorm:"BUYOPENREQQTY"` // 买开仓申请数量
  2155. BUYRECKONPL float64 `json:"buyreckonpl" xorm:"BUYRECKONPL"` // 买结算盈亏
  2156. BUYINTEREST float64 `json:"buyinterest" xorm:"BUYINTEREST"` // 买递延费(仓储费)
  2157. BUYUSEDMARGIN float64 `json:"buyusedmargin" xorm:"BUYUSEDMARGIN"` // 占用保证金
  2158. BUYOPENTOTALQTY int32 `json:"buyopentotalqty" xorm:"BUYOPENTOTALQTY"` // 今日买开仓总数量
  2159. BUYCLOSETOTALQTY int32 `json:"buyclosetotalqty" xorm:"BUYCLOSETOTALQTY"` // 今日买平仓总数量
  2160. BUYCLOSETOTALPL float64 `json:"buyclosetotalpl" xorm:"BUYCLOSETOTALPL"` // 买平仓总盈亏
  2161. SELLPOSITIONQTY int32 `json:"sellpositionqty" xorm:"SELLPOSITIONQTY"` // 卖期初持仓数量
  2162. SELLHOLDERAMOUNT float64 `json:"sellholderamount" xorm:"SELLHOLDERAMOUNT"` // 卖持仓期初总金额
  2163. SELLCURPOSITIONQTY int32 `json:"sellcurpositionqty" xorm:"SELLCURPOSITIONQTY"` // 卖当前持仓数量
  2164. SELLCURHOLDERAMOUNT float64 `json:"sellcurholderamount" xorm:"SELLCURHOLDERAMOUNT"` // 卖当前持仓总金额
  2165. SELLFROZENQTY int32 `json:"sellfrozenqty" xorm:"SELLFROZENQTY"` // 卖持仓冻结
  2166. SELLOTHERFROZENQTY int32 `json:"sellotherfrozenqty" xorm:"SELLOTHERFROZENQTY"` // 卖持仓其他冻结(交割冻结)
  2167. SELLOPENREQQTY int32 `json:"sellopenreqqty" xorm:"SELLOPENREQQTY"` // 卖开仓申请数量
  2168. SELLRECKONPL float64 `json:"sellreckonpl" xorm:"SELLRECKONPL"` // 卖结算盈亏
  2169. SELLINTEREST float64 `json:"sellinterest" xorm:"SELLINTEREST"` // 卖递延费
  2170. SELLUSEDMARGIN float64 `json:"sellusedmargin" xorm:"SELLUSEDMARGIN"` // 卖占用保证金-作废
  2171. SELLOPENTOTALQTY int32 `json:"sellopentotalqty" xorm:"SELLOPENTOTALQTY"` // 卖开仓总数量
  2172. SELLCLOSETOTALQTY int32 `json:"sellclosetotalqty" xorm:"SELLCLOSETOTALQTY"` // 卖平仓总数量
  2173. SELLCLOSETOTALPL float64 `json:"sellclosetotalpl" xorm:"SELLCLOSETOTALPL"` // 卖平仓总盈亏
  2174. TRADEPROPERTY int32 `json:"tradeproperty" xorm:"TRADEPROPERTY"` // 交易属性
  2175. MARGINALGORITHM int32 `json:"marginalgorithm" xorm:"MARGINALGORITHM"` // 保证金收取方式 - 1:比率 2:固定
  2176. MARGINVALUE float64 `json:"marginvalue" xorm:"MARGINVALUE"` // 保证金设置值(投资管理系统-多LongMarginValue)
  2177. BUYFEEALGORITHM int32 `json:"buyfeealgorithm" xorm:"BUYFEEALGORITHM"` // 买递延费收取方式 - 1:比率 2:固定
  2178. BUYMEMBERFEEVALUE float64 `json:"buymemberfeevalue" xorm:"BUYMEMBERFEEVALUE"` // 买会员递延费设置值
  2179. BUYEXCHAGEFEEVALUE float64 `json:"buyexchagefeevalue" xorm:"BUYEXCHAGEFEEVALUE"` // 买交易所递延费设置值
  2180. SELLFEEALGORITHM int32 `json:"sellfeealgorithm" xorm:"SELLFEEALGORITHM"` // 卖递延费收取方式 - 1:比率 2:固定
  2181. SELLMEMBERFEEVALUE float64 `json:"sellmemberfeevalue" xorm:"SELLMEMBERFEEVALUE"` // 卖会员递延费设置值
  2182. SELLEXCHAGEFEEVALUE float64 `json:"sellexchagefeevalue" xorm:"SELLEXCHAGEFEEVALUE"` // 卖交易所递延费设置值
  2183. INTEREST2 float64 `json:"interest2" xorm:"INTEREST2"` // 过夜费
  2184. ACCOUNTCURRENCYID int32 `json:"accountcurrencyid" xorm:"ACCOUNTCURRENCYID"` // 账户币种ID
  2185. GOODSCURRENCYID int32 `json:"goodscurrencyid" xorm:"GOODSCURRENCYID"` // 商品币种ID
  2186. CUREXCHANGERATE float64 `json:"curexchangerate" xorm:"CUREXCHANGERATE"` // 当前汇率
  2187. BUYRECKONPL2 float64 `json:"buyreckonpl2" xorm:"BUYRECKONPL2"` // 买结算盈亏(逐笔) - 根据持仓单日照表字段汇率
  2188. SELLRECKONPL2 float64 `json:"sellreckonpl2" xorm:"SELLRECKONPL2"` // 结算盈亏(逐笔) - 根据持仓单日照表字段汇率
  2189. BUYCURTDPOSITION int32 `json:"buycurtdposition" xorm:"BUYCURTDPOSITION"` // 买期末今日头寸
  2190. BUYFRETDPOSITION int32 `json:"buyfretdposition" xorm:"BUYFRETDPOSITION"` // 买冻结今日头寸
  2191. SELLCURTDPOSITION int32 `json:"sellcurtdposition" xorm:"SELLCURTDPOSITION"` // 卖期末今日头寸
  2192. SELLFRETDPOSITION int32 `json:"sellfretdposition" xorm:"SELLFRETDPOSITION"` // 卖冻结今日头寸
  2193. INTERESTCHARGE float64 `json:"interestcharge" xorm:"INTERESTCHARGE"` // 利息(110)
  2194. SHORTMARGINVALUE float64 `json:"shortmarginvalue" xorm:"SHORTMARGINVALUE"` // 保证金设置值(投资管理系统-空)
  2195. BUYDEFERCHARGE float64 `json:"buydefercharge" xorm:"BUYDEFERCHARGE"` // 买递延费2(仓储费2)
  2196. SELLDEFERCHARGE float64 `json:"selldefercharge" xorm:"SELLDEFERCHARGE"` // 卖递延费2
  2197. RELATEDUSERID int64 `json:"relateduserid" xorm:"'RELATEDUSERID'"` // 关联用户id
  2198. MIDDLEGOODSID int32 `json:"middlegoodsid" xorm:"'MIDDLEGOODSID'"` // 套保商品id
  2199. MIDDLEGOODSCODE string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保商品代码
  2200. MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保商品名称
  2201. NEEDHEDGERATIO float64 `json:"needhedgeratio" xorm:"'NEEDHEDGERATIO'"` // 应套保比例
  2202. NEEDARBITRAGERATIO float64 `json:"needarbitrageratio" xorm:"'NEEDARBITRAGERATIO'"` // 应套利比例
  2203. GOODSGROUPID int32 `json:"goodsgroupid" xorm:"'GOODSGROUPID'"` // 交易品种id
  2204. CONVERTRATIO float64 `json:"convertratio" xorm:"'CONVERTRATIO'"` // 折算系数
  2205. GOODSCODE string `json:"goodscode" xorm:"'GOODSCODE'"` // 交易商品代码
  2206. GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'"` // 交易商品名称
  2207. GOODUNITID int32 `json:"goodunitid" xorm:"'GOODUNITID'"` // 交易商品单位id
  2208. AGREEUNIT float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约乘数
  2209. ENUMDICNAME string `json:"enumdicname"` // 单位名称(交易商品)
  2210. ACCOUNTNAME string `json:"accountname" xorm:"'ACCOUNTNAME'"` // 交易账户
  2211. DiffBuyQty float64 `json:"diffbuyqty"` // 交易品种今变化量(买)
  2212. DiffMgBuyQty float64 `json:"diffmgbuyqty"` // 套保品种今变化量(买)
  2213. DiffNeedMgBuyQty float64 `json:"diffneedmgbuyqty"` // 应套保总量变化量(买)
  2214. DiffSellQty float64 `json:"diffsellqty"` // 交易品种今变化量(卖)
  2215. DiffMgSellQty float64 `json:"diffmgsellqty"` // 套保品种今变化量(卖)
  2216. DiffNeedMgSellQty float64 `json:"diffneedmgsellqty"` // 应套保总量变化量(卖)
  2217. BeginDate string `json:"begindate"` // 开始交易日
  2218. EndDate string `json:"enddate"` // 结束交易日
  2219. }
  2220. func (r *ReckonDayPosition) calc() {
  2221. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.GOODUNITID)
  2222. if r.BUYPOSITIONQTY > 0 || r.BUYCURPOSITIONQTY > 0 {
  2223. r.DiffBuyQty = float64(r.BUYCURPOSITIONQTY) * r.AGREEUNIT
  2224. r.DiffMgBuyQty = float64(r.BUYCURPOSITIONQTY) * r.AGREEUNIT * r.CONVERTRATIO
  2225. r.DiffNeedMgBuyQty = float64(r.BUYCURPOSITIONQTY) * r.AGREEUNIT * r.CONVERTRATIO * r.NEEDHEDGERATIO
  2226. }
  2227. if r.SELLPOSITIONQTY > 0 || r.SELLCURPOSITIONQTY > 0 {
  2228. r.DiffBuyQty = float64(r.SELLCURPOSITIONQTY) * r.AGREEUNIT
  2229. r.DiffMgBuyQty = float64(r.SELLCURPOSITIONQTY) * r.AGREEUNIT * r.CONVERTRATIO
  2230. r.DiffNeedMgBuyQty = float64(r.SELLCURPOSITIONQTY) * r.AGREEUNIT * r.CONVERTRATIO * r.NEEDHEDGERATIO
  2231. }
  2232. }
  2233. func (r *ReckonDayPosition) buildSql() string {
  2234. var sqlId utils.SQLVal = "with tmp as" +
  2235. " (select t.middlegoodsid," +
  2236. " t.middlegoodscode," +
  2237. " t.middlegoodsname," +
  2238. " t.needhedgeratio," +
  2239. " t.needarbitrageratio," +
  2240. " t.goodsgroupid," +
  2241. " c.convertratio," +
  2242. " g.goodsid," +
  2243. " g.goodscode," +
  2244. " g.goodsname," +
  2245. " g.agreeunit," +
  2246. " g.goodunitid" +
  2247. " from erms_middlegoods t" +
  2248. " inner join ermcp_ggconvertconfig c" +
  2249. " on t.goodsgroupid = c.destgoodsgroupid" +
  2250. " inner join goods g" +
  2251. " on g.goodsgroupid = c.srcgoodsgroupid)" +
  2252. "SELECT t.ACCOUNTID," +
  2253. " t.GOODSID," +
  2254. " t.RECKONDATE," +
  2255. " t.BUYPOSITIONQTY," +
  2256. " t.BUYHOLDERAMOUNT," +
  2257. " t.BUYCURPOSITIONQTY," +
  2258. " t.BUYCURHOLDERAMOUNT," +
  2259. " t.BUYFROZENQTY," +
  2260. " t.BUYOTHERFROZENQTY," +
  2261. " t.BUYOPENREQQTY," +
  2262. " t.BUYRECKONPL," +
  2263. " t.BUYINTEREST," +
  2264. " t.BUYUSEDMARGIN," +
  2265. " t.BUYOPENTOTALQTY," +
  2266. " t.BUYCLOSETOTALQTY," +
  2267. " t.BUYCLOSETOTALPL," +
  2268. " t.SELLPOSITIONQTY," +
  2269. " t.SELLHOLDERAMOUNT," +
  2270. " t.SELLCURPOSITIONQTY," +
  2271. " t.SELLCURHOLDERAMOUNT," +
  2272. " t.SELLFROZENQTY," +
  2273. " t.SELLOTHERFROZENQTY," +
  2274. " t.SELLOPENREQQTY," +
  2275. " t.SELLRECKONPL," +
  2276. " t.SELLINTEREST," +
  2277. " t.SELLUSEDMARGIN," +
  2278. " t.SELLOPENTOTALQTY," +
  2279. " t.SELLCLOSETOTALQTY," +
  2280. " t.SELLCLOSETOTALPL," +
  2281. " t.TRADEPROPERTY," +
  2282. " t.MARGINALGORITHM," +
  2283. " t.MARGINVALUE," +
  2284. " t.BUYFEEALGORITHM," +
  2285. " t.BUYMEMBERFEEVALUE," +
  2286. " t.BUYEXCHAGEFEEVALUE," +
  2287. " t.SELLFEEALGORITHM," +
  2288. " t.SELLMEMBERFEEVALUE," +
  2289. " t.SELLEXCHAGEFEEVALUE," +
  2290. " t.INTEREST2," +
  2291. " t.ACCOUNTCURRENCYID," +
  2292. " t.GOODSCURRENCYID," +
  2293. " t.CUREXCHANGERATE," +
  2294. " t.BUYRECKONPL2," +
  2295. " t.SELLRECKONPL2," +
  2296. " t.BUYCURTDPOSITION," +
  2297. " t.BUYFRETDPOSITION," +
  2298. " t.SELLCURTDPOSITION," +
  2299. " t.SELLFRETDPOSITION," +
  2300. " t.INTERESTCHARGE," +
  2301. " t.SHORTMARGINVALUE," +
  2302. " t.BUYDEFERCHARGE," +
  2303. " t.SELLDEFERCHARGE," +
  2304. " ta.relateduserid," +
  2305. " ta.accountname," +
  2306. " tmp.*" +
  2307. " FROM RECKON_DAYPOSITION t" +
  2308. " INNER JOIN tmp" +
  2309. " on t.goodsid = tmp.goodsid" +
  2310. " INNER JOIN TAACCOUNT ta" +
  2311. " on t.accountid = ta.accountid" +
  2312. " WHERE 1 = 1" +
  2313. " and (t.buypositionqty > 0 or t.buycurpositionqty > 0 or t.SELLPOSITIONQTY > 0 or t.SELLCURPOSITIONQTY > 0)"
  2314. sqlId.And("ta.RELATEDUSERID", r.RELATEDUSERID)
  2315. sqlId.And("tmp.MIDDLEGOODSID", r.MIDDLEGOODSID)
  2316. sqlId.AndEx("t.RECKONDATE", r.RECKONDATE, len(r.RECKONDATE) > 0)
  2317. if len(r.BeginDate) > 0 && len(r.EndDate) > 0 {
  2318. sqlId.Join(fmt.Sprintf(" and t.RECKONDATE >= '%v' and t.RECKONDATE <= '%v' ", r.BeginDate, r.EndDate))
  2319. }
  2320. return sqlId.String()
  2321. }
  2322. // GetDataEx 获取持仓头寸日照
  2323. func (r *ReckonDayPosition) GetDataEx() ([]ReckonDayPosition, error) {
  2324. sData := make([]ReckonDayPosition, 0)
  2325. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  2326. for i := range sData {
  2327. sData[i].calc()
  2328. }
  2329. return sData, err
  2330. }
  2331. // HISOUTTRADEPOSITION 外部头寸日照
  2332. type HISOUTTRADEPOSITION struct {
  2333. HISTRADEDATE string `json:"histradedate" xorm:"'HISTRADEDATE'"` // 日期
  2334. ISVALIDDATA int32 `json:"isvaliddata" xorm:"'ISVALIDDATA'"` // 是否有效
  2335. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 资金账号[外部母账户]
  2336. HEDGEGOODSID int32 `json:"hedgegoodsid" xorm:"HEDGEGOODSID"` // 对冲合约ID
  2337. HEDGEACCOUNTCODE string `json:"hedgeaccountcode" xorm:"HEDGEACCOUNTCODE"` // 对冲账号
  2338. TRADEDATE string `json:"tradedate" xorm:"TRADEDATE"` // 交易日(yyyyMMdd)
  2339. MARKETID int32 `json:"marketid" xorm:"MARKETID"` // 市场ID
  2340. YDBUYPOSITION int32 `json:"ydbuyposition" xorm:"YDBUYPOSITION"` // 期初买头寸
  2341. CURBUYPOSITION int32 `json:"curbuyposition" xorm:"CURBUYPOSITION"` // 期末买头寸
  2342. CURYDBUYPOSITION int32 `json:"curydbuyposition" xorm:"CURYDBUYPOSITION"` // 期末上日买头寸
  2343. CURTDBUYPOSITION int32 `json:"curtdbuyposition" xorm:"CURTDBUYPOSITION"` // 期末今日买头寸
  2344. FREYDBUYPOSITION int32 `json:"freydbuyposition" xorm:"FREYDBUYPOSITION"` // 冻结上日买头寸
  2345. FRETDBUYPOSITION int32 `json:"fretdbuyposition" xorm:"FRETDBUYPOSITION"` // 冻结今日买头寸
  2346. YDSELLPOSITION int32 `json:"ydsellposition" xorm:"YDSELLPOSITION"` // 期初卖头寸
  2347. CURSELLPOSITION int32 `json:"cursellposition" xorm:"CURSELLPOSITION"` // 期末卖头寸
  2348. CURYDSELLPOSITION int32 `json:"curydsellposition" xorm:"CURYDSELLPOSITION"` // 期末上日卖头寸
  2349. CURTDSELLPOSITION int32 `json:"curtdsellposition" xorm:"CURTDSELLPOSITION"` // 期末今日卖头寸
  2350. FREYDSELLPOSITION int32 `json:"freydsellposition" xorm:"FREYDSELLPOSITION"` // 冻结上日卖头寸
  2351. FRETDSELLPOSITION int32 `json:"fretdsellposition" xorm:"FRETDSELLPOSITION"` // 冻结今日卖头寸
  2352. BUYOPENCOST float64 `json:"buyopencost" xorm:"BUYOPENCOST"` // 买开仓成本
  2353. BUYPOSITIONCOST float64 `json:"buypositioncost" xorm:"BUYPOSITIONCOST"` // 买持仓成本
  2354. BUYUSEMARGIN float64 `json:"buyusemargin" xorm:"BUYUSEMARGIN"` // 买占用保证金
  2355. SELLOPENCOST float64 `json:"sellopencost" xorm:"SELLOPENCOST"` // 卖开仓成本
  2356. SELLPOSITIONCOST float64 `json:"sellpositioncost" xorm:"SELLPOSITIONCOST"` // 卖持仓成本
  2357. SELLUSEMARGIN float64 `json:"sellusemargin" xorm:"SELLUSEMARGIN"` // 卖占用保证金
  2358. RELATEDUSERID int64 `json:"relateduserid" xorm:"'RELATEDUSERID'"` // 关联用户id
  2359. MIDDLEGOODSID int32 `json:"middlegoodsid" xorm:"'MIDDLEGOODSID'"` // 套保商品id
  2360. MIDDLEGOODSCODE string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保商品代码
  2361. MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保商品名称
  2362. NEEDHEDGERATIO float64 `json:"needhedgeratio" xorm:"'NEEDHEDGERATIO'"` // 应套保比例
  2363. NEEDARBITRAGERATIO float64 `json:"needarbitrageratio" xorm:"'NEEDARBITRAGERATIO'"` // 应套利比例
  2364. GOODSGROUPID int32 `json:"goodsgroupid" xorm:"'GOODSGROUPID'"` // 交易品种id
  2365. CONVERTRATIO float64 `json:"convertratio" xorm:"'CONVERTRATIO'"` // 折算系数
  2366. GOODSCODE string `json:"goodscode" xorm:"'GOODSCODE'"` // 交易商品代码
  2367. GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'"` // 交易商品名称
  2368. GOODUNITID int32 `json:"goodunitid" xorm:"'GOODUNITID'"` // 交易商品单位id
  2369. AGREEUNIT float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约乘数
  2370. ENUMDICNAME string `json:"enumdicname"` // 单位名称(交易商品)
  2371. ACCOUNTNAME string `json:"accountname" xorm:"'ACCOUNTNAME'"` // 交易账户
  2372. DiffBuyQty float64 `json:"diffbuyqty"` // 交易品种今变化量(买)
  2373. DiffMgBuyQty float64 `json:"diffmgbuyqty"` // 套保品种今变化量(买)
  2374. DiffNeedMgBuyQty float64 `json:"diffneedmgbuyqty"` // 应套保总量变化量(买)
  2375. DiffSellQty float64 `json:"diffsellqty"` // 交易品种今变化量(卖)
  2376. DiffMgSellQty float64 `json:"diffmgsellqty"` // 套保品种今变化量(卖)
  2377. DiffNeedMgSellQty float64 `json:"diffneedmgsellqty"` // 应套保总量变化量(卖)
  2378. BeginDate string `json:"begindate"` // 开始交易日
  2379. EndDate string `json:"enddate"` // 结束交易日
  2380. }
  2381. func (r *HISOUTTRADEPOSITION) calc() {
  2382. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.GOODUNITID)
  2383. if r.YDBUYPOSITION > 0 || r.CURBUYPOSITION > 0 {
  2384. r.DiffBuyQty = float64(r.CURBUYPOSITION) * r.AGREEUNIT
  2385. r.DiffMgBuyQty = float64(r.CURBUYPOSITION) * r.AGREEUNIT * r.CONVERTRATIO
  2386. r.DiffNeedMgBuyQty = float64(r.CURBUYPOSITION) * r.AGREEUNIT * r.CONVERTRATIO * r.NEEDHEDGERATIO
  2387. }
  2388. if r.YDSELLPOSITION > 0 || r.CURSELLPOSITION > 0 {
  2389. r.DiffBuyQty = float64(r.CURSELLPOSITION) * r.AGREEUNIT
  2390. r.DiffMgBuyQty = float64(r.CURSELLPOSITION) * r.AGREEUNIT * r.CONVERTRATIO
  2391. r.DiffNeedMgBuyQty = float64(r.CURSELLPOSITION) * r.AGREEUNIT * r.CONVERTRATIO * r.NEEDHEDGERATIO
  2392. }
  2393. }
  2394. func (r *HISOUTTRADEPOSITION) buildSql() string {
  2395. var sqlId utils.SQLVal = "with tmp as" +
  2396. " (select t.middlegoodsid," +
  2397. " t.middlegoodscode," +
  2398. " t.middlegoodsname," +
  2399. " t.needhedgeratio," +
  2400. " t.needarbitrageratio," +
  2401. " t.goodsgroupid," +
  2402. " c.convertratio," +
  2403. " g.goodsid," +
  2404. " g.goodscode," +
  2405. " g.goodsname," +
  2406. " g.agreeunit," +
  2407. " g.goodunitid" +
  2408. " from erms_middlegoods t" +
  2409. " inner join ermcp_ggconvertconfig c" +
  2410. " on t.goodsgroupid = c.destgoodsgroupid" +
  2411. " inner join goods g" +
  2412. " on g.goodsgroupid = c.srcgoodsgroupid)" +
  2413. "SELECT t.HISTRADEDATE," +
  2414. " t.ISVALIDDATA," +
  2415. " t.ACCOUNTID," +
  2416. " t.HEDGEGOODSID," +
  2417. " t.HEDGEACCOUNTCODE," +
  2418. " t.TRADEDATE," +
  2419. " t.MARKETID," +
  2420. " t.YDBUYPOSITION," +
  2421. " t.CURBUYPOSITION," +
  2422. " t.CURYDBUYPOSITION," +
  2423. " t.CURTDBUYPOSITION," +
  2424. " t.FREYDBUYPOSITION," +
  2425. " t.FRETDBUYPOSITION," +
  2426. " t.YDSELLPOSITION," +
  2427. " t.CURSELLPOSITION," +
  2428. " t.CURYDSELLPOSITION," +
  2429. " t.CURTDSELLPOSITION," +
  2430. " t.FREYDSELLPOSITION," +
  2431. " t.FRETDSELLPOSITION," +
  2432. " t.BUYOPENCOST," +
  2433. " t.BUYPOSITIONCOST," +
  2434. " t.BUYUSEMARGIN," +
  2435. " t.SELLOPENCOST," +
  2436. " t.SELLPOSITIONCOST," +
  2437. " t.SELLUSEMARGIN," +
  2438. " ta.relateduserid," +
  2439. " ta.accountname," +
  2440. " tmp.*" +
  2441. " FROM HIS_HEDGE_OUTTRADEPOSITION t" +
  2442. " INNER JOIN tmp" +
  2443. " on t.HEDGEGOODSID = tmp.goodsid" +
  2444. " INNER JOIN TAACCOUNT ta" +
  2445. " on t.accountid = ta.accountid" +
  2446. " WHERE 1 = 1" +
  2447. " and (t.YDBUYPOSITION > 0 or t.CURBUYPOSITION > 0 or t.YDSELLPOSITION > 0 or t.CURSELLPOSITION > 0)"
  2448. sqlId.And("ta.RELATEDUSERID", r.RELATEDUSERID)
  2449. sqlId.And("tmp.MIDDLEGOODSID", r.MIDDLEGOODSID)
  2450. sqlId.AndEx("t.HISTRADEDATE", r.HISTRADEDATE, len(r.HISTRADEDATE) > 0)
  2451. if len(r.BeginDate) > 0 && len(r.EndDate) > 0 {
  2452. sqlId.Join(fmt.Sprintf(" and t.HISTRADEDATE >= '%v' and t.HISTRADEDATE <= '%v' ", r.BeginDate, r.EndDate))
  2453. }
  2454. return sqlId.String()
  2455. }
  2456. // GetDataEx 获取外部头寸日照
  2457. func (r *HISOUTTRADEPOSITION) GetDataEx() ([]HISOUTTRADEPOSITION, error) {
  2458. sData := make([]HISOUTTRADEPOSITION, 0)
  2459. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  2460. for i := range sData {
  2461. sData[i].calc()
  2462. }
  2463. return sData, err
  2464. }
  2465. // Ermcp3ExposureFutuDetail 敞口报表期货明细
  2466. type Ermcp3ExposureFutuDetail struct {
  2467. ACCOUNTID int64 `json:"accountid"` // 交易账户id
  2468. ACCOUNTNAME string `json:"accountname"` // 交易账户
  2469. GOODSID int32 `json:"goodsid"` // 商品id
  2470. GOODSCODE string `json:"goodscode"` // 商品代码
  2471. GOODSNAME string `json:"goodsname"` // 商品名称
  2472. BUYORSELL int32 `json:"buyorsell"` // 方向 0-买 1-卖
  2473. ORIHOLDQTY float64 `json:"oriholdqty"` // 期初持仓量
  2474. HOLDQTY float64 `json:"holdqty"` // 期末持仓量
  2475. TODAYOPENQTY float64 `json:"todayopenqty"` // 今开仓量
  2476. TODAYCLOSEQTY float64 `json:"todaycloseqty"` // 今平仓量
  2477. DiffTradeQty float64 `json:"difftradeqty"` // 交易品种今变化量
  2478. DiffMgQty float64 `json:"diffmgqty"` // 套保品种今变化量
  2479. DiffNeedQty float64 `json:"diffneedqty"` // 应套保总量变化量
  2480. MIDDLEGOODSID int32 `json:"middlegoodsid"` // 套保商品id
  2481. MIDDLEGOODSCODE string `json:"middlegoodscode"` // 套保商品代码
  2482. MIDDLEGOODSNAME string `json:"middlegoodsname"` // 套保商品名称
  2483. ENUMDICNAME string `json:"enumdicname"` // 单位名称
  2484. USERID int64 `json:"-"` // 用户id
  2485. RECKONDATE string `json:"tradedate"` // 交易日
  2486. BeginDate string `json:"begindate"` // 开始交易日
  2487. EndDate string `json:"enddate"` // 结束交易日
  2488. }
  2489. func (r *Ermcp3ExposureFutuDetail) fromOutPositionBuy(v *HISOUTTRADEPOSITION) {
  2490. r.ACCOUNTID = v.ACCOUNTID
  2491. r.ACCOUNTNAME = v.ACCOUNTNAME
  2492. r.GOODSID = v.HEDGEGOODSID
  2493. r.GOODSCODE = v.GOODSCODE
  2494. r.GOODSNAME = v.GOODSNAME
  2495. r.BUYORSELL = 0
  2496. r.ORIHOLDQTY = float64(v.YDBUYPOSITION)
  2497. r.HOLDQTY = float64(v.CURBUYPOSITION)
  2498. r.TODAYOPENQTY = 0
  2499. r.TODAYCLOSEQTY = 0
  2500. r.DiffTradeQty = v.DiffBuyQty
  2501. r.DiffMgQty = v.DiffMgBuyQty
  2502. r.DiffNeedQty = v.DiffNeedMgBuyQty
  2503. r.MIDDLEGOODSID = v.MIDDLEGOODSID
  2504. r.MIDDLEGOODSCODE = v.MIDDLEGOODSCODE
  2505. r.MIDDLEGOODSNAME = v.MIDDLEGOODSNAME
  2506. r.ENUMDICNAME = v.ENUMDICNAME
  2507. r.RECKONDATE = v.HISTRADEDATE
  2508. }
  2509. func (r *Ermcp3ExposureFutuDetail) fromOutPositionSell(v *HISOUTTRADEPOSITION) {
  2510. r.ACCOUNTID = v.ACCOUNTID
  2511. r.ACCOUNTNAME = v.ACCOUNTNAME
  2512. r.GOODSID = v.HEDGEGOODSID
  2513. r.GOODSCODE = v.GOODSCODE
  2514. r.GOODSNAME = v.GOODSNAME
  2515. r.BUYORSELL = 1
  2516. r.ORIHOLDQTY = float64(v.YDSELLPOSITION)
  2517. r.HOLDQTY = float64(v.CURSELLPOSITION)
  2518. r.TODAYOPENQTY = 0
  2519. r.TODAYCLOSEQTY = 0
  2520. r.DiffTradeQty = v.DiffSellQty
  2521. r.DiffMgQty = v.DiffMgSellQty
  2522. r.DiffNeedQty = v.DiffNeedMgSellQty
  2523. r.MIDDLEGOODSID = v.MIDDLEGOODSID
  2524. r.MIDDLEGOODSCODE = v.MIDDLEGOODSCODE
  2525. r.MIDDLEGOODSNAME = v.MIDDLEGOODSNAME
  2526. r.ENUMDICNAME = v.ENUMDICNAME
  2527. r.RECKONDATE = v.HISTRADEDATE
  2528. }
  2529. func (r *Ermcp3ExposureFutuDetail) fromTradePositionBuy(v *ReckonDayPosition) {
  2530. r.ACCOUNTID = v.ACCOUNTID
  2531. r.ACCOUNTNAME = v.ACCOUNTNAME
  2532. r.GOODSID = v.GOODSID
  2533. r.GOODSCODE = v.GOODSCODE
  2534. r.GOODSNAME = v.GOODSNAME
  2535. r.BUYORSELL = 0
  2536. r.ORIHOLDQTY = float64(v.BUYPOSITIONQTY)
  2537. r.HOLDQTY = float64(v.BUYCURPOSITIONQTY)
  2538. r.TODAYOPENQTY = 0
  2539. r.TODAYCLOSEQTY = 0
  2540. r.DiffTradeQty = v.DiffBuyQty
  2541. r.DiffMgQty = v.DiffMgBuyQty
  2542. r.DiffNeedQty = v.DiffNeedMgBuyQty
  2543. r.MIDDLEGOODSID = v.MIDDLEGOODSID
  2544. r.MIDDLEGOODSCODE = v.MIDDLEGOODSCODE
  2545. r.MIDDLEGOODSNAME = v.MIDDLEGOODSNAME
  2546. r.ENUMDICNAME = v.ENUMDICNAME
  2547. r.RECKONDATE = v.RECKONDATE
  2548. }
  2549. func (r *Ermcp3ExposureFutuDetail) fromTradePositionSell(v *ReckonDayPosition) {
  2550. r.ACCOUNTID = v.ACCOUNTID
  2551. r.ACCOUNTNAME = v.ACCOUNTNAME
  2552. r.GOODSID = v.GOODSID
  2553. r.GOODSCODE = v.GOODSCODE
  2554. r.GOODSNAME = v.GOODSNAME
  2555. r.BUYORSELL = 1
  2556. r.ORIHOLDQTY = float64(v.SELLPOSITIONQTY)
  2557. r.HOLDQTY = float64(v.SELLCURPOSITIONQTY)
  2558. r.TODAYOPENQTY = 0
  2559. r.TODAYCLOSEQTY = 0
  2560. r.DiffTradeQty = v.DiffSellQty
  2561. r.DiffMgQty = v.DiffMgSellQty
  2562. r.DiffNeedQty = v.DiffNeedMgSellQty
  2563. r.MIDDLEGOODSID = v.MIDDLEGOODSID
  2564. r.MIDDLEGOODSCODE = v.MIDDLEGOODSCODE
  2565. r.MIDDLEGOODSNAME = v.MIDDLEGOODSNAME
  2566. r.ENUMDICNAME = v.ENUMDICNAME
  2567. r.RECKONDATE = v.RECKONDATE
  2568. }
  2569. // GetDataEx 获取敞口报表期货明细
  2570. func (r *Ermcp3ExposureFutuDetail) GetDataEx() (interface{}, error) {
  2571. sData := make([]Ermcp3ExposureFutuDetail, 0)
  2572. if mtpcache.IsAreaUserId(r.USERID) {
  2573. // 查母账户头寸
  2574. m := HISOUTTRADEPOSITION{RELATEDUSERID: r.USERID, HISTRADEDATE: r.RECKONDATE,
  2575. BeginDate: r.BeginDate, EndDate: r.EndDate, MIDDLEGOODSID: r.MIDDLEGOODSID}
  2576. d, _ := m.GetDataEx()
  2577. for _, v := range d {
  2578. if v.YDBUYPOSITION > 0 || v.CURBUYPOSITION > 0 {
  2579. val := Ermcp3ExposureFutuDetail{}
  2580. val.fromOutPositionBuy(&v)
  2581. val.BeginDate = r.BeginDate
  2582. val.EndDate = r.EndDate
  2583. sData = append(sData, val)
  2584. }
  2585. if v.YDSELLPOSITION > 0 || v.CURSELLPOSITION > 0 {
  2586. val := Ermcp3ExposureFutuDetail{}
  2587. val.fromOutPositionSell(&v)
  2588. val.BeginDate = r.BeginDate
  2589. val.EndDate = r.EndDate
  2590. sData = append(sData, val)
  2591. }
  2592. }
  2593. } else {
  2594. // 查子账户头寸
  2595. m := ReckonDayPosition{RELATEDUSERID: r.USERID, RECKONDATE: r.RECKONDATE,
  2596. BeginDate: r.BeginDate, EndDate: r.EndDate, MIDDLEGOODSID: r.MIDDLEGOODSID}
  2597. d, _ := m.GetDataEx()
  2598. for _, v := range d {
  2599. if v.BUYPOSITIONQTY > 0 || v.BUYCURPOSITIONQTY > 0 {
  2600. val := Ermcp3ExposureFutuDetail{}
  2601. val.fromTradePositionBuy(&v)
  2602. val.BeginDate = r.BeginDate
  2603. val.EndDate = r.EndDate
  2604. sData = append(sData, val)
  2605. }
  2606. if v.SELLPOSITIONQTY > 0 || v.SELLCURPOSITIONQTY > 0 {
  2607. val := Ermcp3ExposureFutuDetail{}
  2608. val.fromTradePositionSell(&v)
  2609. val.BeginDate = r.BeginDate
  2610. val.EndDate = r.EndDate
  2611. sData = append(sData, val)
  2612. }
  2613. }
  2614. }
  2615. return sData, nil
  2616. }
  2617. // Ermcp3ExposureParamChLog 敞口报表参数调整明细
  2618. type Ermcp3ExposureParamChLog struct {
  2619. LOGID string `json:"logid" xorm:"LOGID"` // 流水ID(609+Unix秒时间戳(10位)+xxxxxx)
  2620. MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"MIDDLEGOODSID"` // 套保品种
  2621. AREAUSERID int64 `json:"areauserid" xorm:"AREAUSERID"` // 所属机构\交易用户ID
  2622. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 期货账户ID (作废, 默认为0)
  2623. CHANGELOGTYPE int32 `json:"changelogtype" xorm:"CHANGELOGTYPE"` // 变更流水类型 - 1:套保比率变更 2:套利比率变更
  2624. PARAMBEFOREVALUE float64 `json:"parambeforevalue" xorm:"PARAMBEFOREVALUE"` // 参数变更前(调整前参数值)
  2625. PARAMAFTERVALUE float64 `json:"paramaftervalue" xorm:"PARAMAFTERVALUE"` // 参数变更后(调整后参数值)
  2626. CURVALUE float64 `json:"curvalue" xorm:"CURVALUE"` // 当前套保\套利量(套保总量|套利总量)
  2627. BEFOREVALUE float64 `json:"beforevalue" xorm:"BEFOREVALUE"` // 应套保\套利量变更前(调整前应套保总量)
  2628. AFTERVALUE float64 `json:"aftervalue" xorm:"AFTERVALUE"` // 应套保\套利量变更后(调整后应套保总量)
  2629. LOGDATETIME string `json:"logdatetime" xorm:"LOGDATETIME"` // 流水日期
  2630. TRADEDATE string `json:"tradedate" xorm:"TRADEDATE"` // 交易日(yyyyMMdd)
  2631. MIDDLEGOODSCODE string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保品种代码
  2632. MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保品种名称
  2633. DiffValue float64 `json:"diffvalue"` // 应套保总量变化量
  2634. BeginDate string `json:"begindate"` // 开始交易日
  2635. EndDate string `json:"enddate"` // 结束交易日
  2636. }
  2637. func (r *Ermcp3ExposureParamChLog) calc() {
  2638. r.DiffValue = r.AFTERVALUE - r.BEFOREVALUE
  2639. }
  2640. func (r *Ermcp3ExposureParamChLog) buildSql() string {
  2641. var sqlId utils.SQLVal = "SELECT t.LOGID," +
  2642. " t.MIDDLEGOODSID," +
  2643. " t.AREAUSERID," +
  2644. " t.ACCOUNTID," +
  2645. " t.CHANGELOGTYPE," +
  2646. " t.PARAMBEFOREVALUE," +
  2647. " t.PARAMAFTERVALUE," +
  2648. " t.CURVALUE," +
  2649. " t.BEFOREVALUE," +
  2650. " t.AFTERVALUE," +
  2651. " to_char(t.LOGDATETIME, 'yyyy-mm-dd hh24:mi:ss') LOGDATETIME," +
  2652. " t.TRADEDATE," +
  2653. " g.middlegoodscode," +
  2654. " g.middlegoodsname" +
  2655. " FROM ERMCP_EXPOSUREPARAMCHGLOG t" +
  2656. " LEFT JOIN ERMS_MIDDLEGOODS g on t.middlegoodsid=g.middlegoodsid" +
  2657. " WHERE 1 = 1"
  2658. sqlId.And("t.AREAUSERID", r.AREAUSERID)
  2659. sqlId.AndEx("t.TRADEDATE", r.TRADEDATE, len(r.TRADEDATE) > 0)
  2660. if len(r.BeginDate) > 0 && len(r.EndDate) > 0 {
  2661. sqlId.Join(fmt.Sprintf(" and t.TRADEDATE >= '%v' and t.TRADEDATE <= '%v' ", r.BeginDate, r.EndDate))
  2662. }
  2663. return sqlId.String()
  2664. }
  2665. // GetDataEx 获取敞口报表参数调整明细
  2666. func (r *Ermcp3ExposureParamChLog) GetDataEx() (interface{}, error) {
  2667. sData := make([]Ermcp3ExposureParamChLog, 0)
  2668. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  2669. for i := range sData {
  2670. sData[i].calc()
  2671. sData[i].BeginDate = r.BeginDate
  2672. sData[i].EndDate = r.EndDate
  2673. }
  2674. return sData, err
  2675. }