ermcp3.go 162 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674
  1. /**
  2. * @Author: zou.yingbin
  3. * @Create : 2021/4/14 11:11
  4. * @Modify : 2021/4/14 11:11
  5. */
  6. package models
  7. import (
  8. "encoding/json"
  9. "fmt"
  10. "mtp2_if/db"
  11. "mtp2_if/logger"
  12. "mtp2_if/mtpcache"
  13. "mtp2_if/utils"
  14. "strings"
  15. )
  16. // ErmcpDeliveryGoods 现货品种(交割品种)
  17. type ErmcpDeliveryGoods struct {
  18. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货品种ID(SEQ_DELIVERYGOODS)
  19. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  20. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  21. GOODSUNITID int32 `json:"goodsunitid" xorm:"'GOODSUNITID'"` // 现货品种单位ID
  22. DELIVERYGOODSTYPE int32 `json:"deliverygoodstype" xorm:"'DELIVERYGOODSTYPE'"` // 现货品种类型: 1-整装不拆分 2-散装记录明细 3:整装拆分 4:散装不记录明细
  23. STANDARDQTY int32 `json:"standardqty" xorm:"'STANDARDQTY'"` // 标准数量(库位数量) [标准品特有]
  24. STANDARDQTYRANGE int32 `json:"standardqtyrange" xorm:"'STANDARDQTYRANGE'"` // 标准数量偏差范围 [标准品特有]
  25. AUDITFLAG int32 `json:"auditflag" xorm:"'AUDITFLAG'"` // 交割是否需要审核 - 0:不需要 1:需要审核 默认为0
  26. ISVALID int32 `json:"isvalid" xorm:"'ISVALID'"` // 是否有效 - 0:无效 1:有效
  27. AGREEUNIT int32 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位[散货时默认为1, 整装时默认为标准数量]
  28. QTYDECIMALPLACE int32 `json:"qtydecimalplace" xorm:"'QTYDECIMALPLACE'"` // 成交量小数位
  29. CATEGORYID int32 `json:"categoryid" xorm:"'CATEGORYID'"` // 类别ID(SEQ_WRCATEGORY)
  30. DGSTATUS int32 `json:"dgstatus" xorm:"'DGSTATUS'"` // 品种状态 - 作废 - 0:未激活 1:正常
  31. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构
  32. REMARK string `json:"remark" xorm:"'REMARK'"` // 备注
  33. EnumdicName string `json:"enumdicname"` // 现货品种单位名称
  34. ExcludeCfg int32 `json:"-"` // 排除已配置的业务类型商品 1-套保 2-套利
  35. }
  36. func (r *ErmcpDeliveryGoods) calc() {
  37. r.EnumdicName = mtpcache.GetEnumDicitemName(r.GOODSUNITID)
  38. }
  39. func (r *ErmcpDeliveryGoods) buildSql() string {
  40. var sqlId utils.SQLVal = "SELECT t.DELIVERYGOODSID," +
  41. " t.DELIVERYGOODSCODE," +
  42. " t.DELIVERYGOODSNAME," +
  43. " t.GOODSUNITID," +
  44. " t.DELIVERYGOODSTYPE," +
  45. " t.STANDARDQTY," +
  46. " t.STANDARDQTYRANGE," +
  47. " t.AUDITFLAG," +
  48. " t.ISVALID," +
  49. " t.ISSPLIT," +
  50. " t.AGREEUNIT," +
  51. " t.QTYDECIMALPLACE," +
  52. " t.CATEGORYID," +
  53. " t.DGSTATUS," +
  54. " t.REMARK," +
  55. " t.AREAUSERID" +
  56. " FROM DELIVERYGOODS t" +
  57. " WHERE 1 = 1"
  58. sqlId.AndEx("t.AREAUSERID", r.AREAUSERID, r.AREAUSERID > 0)
  59. sqlId.AndEx("t.DELIVERYGOODSID", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  60. if r.ExcludeCfg > 0 {
  61. sqlId.Join(fmt.Sprintf(" and t.deliverygoodsid not in(select distinct deliverygoodsid from ermcp_bizgroupspotgoods where biztype = %v)", r.ExcludeCfg))
  62. }
  63. return sqlId.String()
  64. }
  65. // GetDataEx 获取现货商品(交割商品)
  66. func (r *ErmcpDeliveryGoods) GetDataEx() (interface{}, error) {
  67. return r.GetData()
  68. }
  69. // GetData 从数据库中查询数据
  70. func (r *ErmcpDeliveryGoods) GetData() ([]ErmcpDeliveryGoods, error) {
  71. sData := make([]ErmcpDeliveryGoods, 0)
  72. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  73. for i := range sData {
  74. sData[i].calc()
  75. }
  76. return sData, err
  77. }
  78. // ErmcpDGFactoryItem 品种选择项定义表
  79. type ErmcpDGFactoryItem struct {
  80. DGFACTORYITEMID int64 `json:"dgfactoryitemid" xorm:"'DGFACTORYITEMID'"` // 选择项ID(SEQ_DGFACTORYITEM)
  81. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货品种ID
  82. DGFACTORYITEMTYPEID int64 `json:"dgfactoryitemtypeid" xorm:"'DGFACTORYITEMTYPEID'"` // 要素项类型
  83. DGFACTORYITEMVALUE string `json:"dgfactoryitemvalue" xorm:"'DGFACTORYITEMVALUE'"` // 要素项值(类型为仓库时填写仓库名称)
  84. WAREHOUSEID int64 `json:"warehouseid" xorm:"'WAREHOUSEID'"` // 仓库ID(类型为仓库时填写)
  85. ISVALID int32 `json:"isvalid" xorm:"'ISVALID'"` // 是否有效 - 0:无效 1:有效
  86. ORDERINDEX int32 `json:"orderindex" xorm:"'ORDERINDEX'"` // 顺序
  87. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 用户id
  88. }
  89. func (r *ErmcpDGFactoryItem) buildSql() string {
  90. var sqlId utils.SQLVal = "SELECT DGFACTORYITEMID," +
  91. " t.DELIVERYGOODSID," +
  92. " to_char(t.DGFACTORYITEMTYPEID) DGFACTORYITEMTYPEID," +
  93. " t.DGFACTORYITEMVALUE," +
  94. " to_char(t.WAREHOUSEID) WAREHOUSEID," +
  95. " t.ISVALID," +
  96. " t.ORDERINDEX," +
  97. " g.areauserid" +
  98. " FROM DGFACTORYITEM t" +
  99. " left join deliverygoods g" +
  100. " on t.deliverygoodsid = g.deliverygoodsid" +
  101. " WHERE t.ISVALID = 1"
  102. sqlId.AndEx("g.areauserid", r.AREAUSERID, r.AREAUSERID > 0)
  103. sqlId.AndEx("t.DGFACTORYITEMID", r.DGFACTORYITEMID, r.DGFACTORYITEMID > 0)
  104. sqlId.AndEx("t.DELIVERYGOODSID", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  105. sqlId.AndEx("t.DGFACTORYITEMTYPEID", r.DGFACTORYITEMTYPEID, r.DGFACTORYITEMTYPEID > 0)
  106. sqlId.AndEx("t.ORDERINDEX", r.ORDERINDEX, r.ORDERINDEX > 0)
  107. return sqlId.String()
  108. }
  109. // GetDataEx 获取品种选择项定义
  110. func (r *ErmcpDGFactoryItem) GetDataEx() (interface{}, error) {
  111. return r.GetData()
  112. }
  113. // GetData 从数据库中查询数据
  114. func (r *ErmcpDGFactoryItem) GetData() (interface{}, error) {
  115. sData := make([]ErmcpDGFactoryItem, 0)
  116. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  117. return sData, err
  118. }
  119. // Ermcp3Brand 品牌(从品种选择项定义表中查)
  120. type Ermcp3Brand struct {
  121. BRANDID int64 `json:"brandid"` // 品牌id
  122. BRANDNAME string `json:"brandname"` // 品牌名称
  123. DELIVERYGOODSID int64 `json:"deliverygoodsid"` // 品种ID
  124. AREAUSERID int64 `json:"areauserid"` // 用户id
  125. ISVALID int32 `json:"isvalid" xorm:"'ISVALID'"` // 是否有效
  126. }
  127. // GetDataEx 从数据库中查询数据
  128. func (r *Ermcp3Brand) GetDataEx() (interface{}, error) {
  129. return r.GetData()
  130. }
  131. // GetData 获取品牌数据
  132. func (r *Ermcp3Brand) GetData() ([]Ermcp3Brand, error) {
  133. m := ErmcpDGFactoryItem{
  134. DELIVERYGOODSID: int32(r.DELIVERYGOODSID),
  135. DGFACTORYITEMTYPEID: 2,
  136. }
  137. sData := make([]Ermcp3Brand, 0)
  138. if d, err := m.GetDataEx(); err == nil {
  139. if dgLst, ok := d.([]ErmcpDGFactoryItem); ok {
  140. for _, val := range dgLst {
  141. sData = append(sData, Ermcp3Brand{BRANDID: val.DGFACTORYITEMID, AREAUSERID: val.AREAUSERID,
  142. BRANDNAME: val.DGFACTORYITEMVALUE, DELIVERYGOODSID: int64(val.DELIVERYGOODSID), ISVALID: val.ISVALID})
  143. }
  144. }
  145. }
  146. return sData, nil
  147. }
  148. // ErmcpRelatedGoods 现货品种的关联交易商品
  149. type ErmcpRelatedGoods struct {
  150. GoodsId int `json:"goodsid" xorm:"'GoodsId'"` // 商品id
  151. GoodsCode string `json:"goodscode" xorm:"'GoodsCode'"` // 商品代码
  152. GoodsName string `json:"goodsname" xorm:"'GoodsName'"` // 商品名称
  153. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 品种ID
  154. AREAUSERID int64 `json:"-"` // 所属机构
  155. }
  156. func (r *ErmcpRelatedGoods) buildSql() string {
  157. var sqlId utils.SQLVal = "select distinct t.deliverygoodsid, g.goodsid, g.goodscode, g.goodsname" +
  158. " from deliverygoods t" +
  159. " inner join ERMS2_WRSConvertDetail w" +
  160. " on t.deliverygoodsid = w.deliverygoodsid" +
  161. " inner join erms_middlegoods m" +
  162. " on w.middlegoodsid = m.middlegoodsid" +
  163. " inner join ERMCP_GGConvertConfig gc" +
  164. " on m.goodsgroupid = gc.destgoodsgroupid" +
  165. " inner join goods g" +
  166. " on gc.srcgoodsgroupid = g.goodsgroupid" +
  167. " where 1 = 1"
  168. sqlId.AndEx("t.AREAUSERID", r.AREAUSERID, r.AREAUSERID > 0)
  169. sqlId.AndEx("t.DELIVERYGOODSID", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  170. return sqlId.String()
  171. }
  172. // GetDataEx 获取现货关联交易商品
  173. func (r *ErmcpRelatedGoods) GetDataEx() (interface{}, error) {
  174. return r.GetData()
  175. }
  176. // GetData 获取现货关联交易商品
  177. func (r *ErmcpRelatedGoods) GetData() ([]ErmcpRelatedGoods, error) {
  178. sData := make([]ErmcpRelatedGoods, 0)
  179. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  180. return sData, err
  181. }
  182. // ErmcpDeliveryGoodsDetail2 现货商品详情(含转换系数)
  183. type ErmcpDeliveryGoodsDetail2 struct {
  184. ErmcpDeliveryGoodsDetail
  185. CONVERTRATIO float64 `json:"convertratio" xorm:"'CONVERTRATIO'"` // 套保系数(折算系数)
  186. }
  187. // ErmcpDeliveryGoodsDetail 现货商品详情
  188. type ErmcpDeliveryGoodsDetail struct {
  189. Data ErmcpDeliveryGoods `json:"data"` // 现货商品基本信息(交割品种)
  190. GmList []Ermcp3Wrstandard `json:"gmlist"` // 品类列表(仓单标准)
  191. GbList []Ermcp3Brand `json:"gblist"` // 品牌列表
  192. }
  193. func (r *ErmcpDeliveryGoodsDetail) addGmList(lst []Ermcp3Wrstandard) {
  194. for i := range lst {
  195. if lst[i].DELIVERYGOODSID == r.Data.DELIVERYGOODSID && lst[i].ISVALID == 1 {
  196. r.GmList = append(r.GmList, lst[i])
  197. }
  198. }
  199. }
  200. func (r *ErmcpDeliveryGoodsDetail) addGbList(lst []Ermcp3Brand) {
  201. for i := range lst {
  202. if lst[i].DELIVERYGOODSID == int64(r.Data.DELIVERYGOODSID) {
  203. r.GbList = append(r.GbList, lst[i])
  204. }
  205. }
  206. }
  207. // GetData 从数据库中查询数据
  208. func (r *ErmcpDeliveryGoodsDetail) GetData() ([]ErmcpDeliveryGoodsDetail, error) {
  209. sData := make([]ErmcpDeliveryGoodsDetail, 0)
  210. m := ErmcpDeliveryGoods{AREAUSERID: r.Data.AREAUSERID, DELIVERYGOODSID: r.Data.DELIVERYGOODSID}
  211. data, err := m.GetData()
  212. if err != nil {
  213. return sData, err
  214. }
  215. if data == nil || len(data) == 0 {
  216. return sData, nil
  217. }
  218. // 基本信息
  219. for i := range data {
  220. val := ErmcpDeliveryGoodsDetail{Data: data[i],
  221. GmList: make([]Ermcp3Wrstandard, 0), GbList: make([]Ermcp3Brand, 0),
  222. }
  223. sData = append(sData, val)
  224. }
  225. //品类/品牌/套保信息
  226. gm := Ermcp3Wrstandard{AREAUSERID: r.Data.AREAUSERID, DELIVERYGOODSID: r.Data.DELIVERYGOODSID, ISVALID: 1}
  227. gb := Ermcp3Brand{DELIVERYGOODSID: int64(r.Data.DELIVERYGOODSID)}
  228. gmLst, _ := gm.GetDataEx()
  229. gbLst, _ := gb.GetData()
  230. for i := range sData {
  231. sData[i].addGmList(gmLst.([]Ermcp3Wrstandard))
  232. sData[i].addGbList(gbLst)
  233. }
  234. return sData, nil
  235. }
  236. // GetDataEx 从数据库中查询数据
  237. func (r *ErmcpDeliveryGoodsDetail) GetDataEx() (interface{}, error) {
  238. return r.GetData()
  239. }
  240. // ErmcpDeliveryGoodsDetailEx 现货商品详情(含套保列表)
  241. type ErmcpDeliveryGoodsDetailEx struct {
  242. ErmcpDeliveryGoodsDetail
  243. MgList []Ermcp3MiddleGoodsDetail2 `json:"mgList"` // 套保列表
  244. }
  245. // GetDataEx 获取现货商品详情(含套保信息列表)
  246. func (r *ErmcpDeliveryGoodsDetailEx) GetDataEx() (interface{}, error) {
  247. sData := make([]ErmcpDeliveryGoodsDetailEx, 0)
  248. mDg := r.ErmcpDeliveryGoodsDetail
  249. // 查现货商品列表
  250. if dgList, err := mDg.GetData(); err == nil {
  251. for i := range dgList {
  252. sData = append(sData, ErmcpDeliveryGoodsDetailEx{ErmcpDeliveryGoodsDetail: dgList[i],
  253. MgList: make([]Ermcp3MiddleGoodsDetail2, 0)})
  254. }
  255. }
  256. if len(sData) == 0 {
  257. return sData, nil
  258. }
  259. // 查转换关系
  260. mWc := WRSConverTDetail{}
  261. if wc, err := mWc.GetData(); err == nil {
  262. // 查套保商品列表
  263. mMg := Ermcp3MiddleGoodsDetail{}
  264. mMg.Mg.AREAUSERID = r.Data.AREAUSERID
  265. if mgLst, err := mMg.GetData(); err == nil {
  266. for i := range sData {
  267. sData[i].addMgList(mgLst, wc)
  268. }
  269. }
  270. }
  271. return sData, nil
  272. }
  273. // addMgList 添加关联的套保信息列表
  274. func (r *ErmcpDeliveryGoodsDetailEx) addMgList(lst []Ermcp3MiddleGoodsDetail, wc []WRSConverTDetail) {
  275. for i := range wc {
  276. if r.Data.DELIVERYGOODSID == wc[i].DELIVERYGOODSID {
  277. for k := range lst {
  278. if int64(lst[k].Mg.MIDDLEGOODSID) == wc[i].MIDDLEGOODSID {
  279. val := Ermcp3MiddleGoodsDetail2{Ermcp3MiddleGoodsDetail: lst[k], CONVERTRATIO: wc[i].CONVERTRATIO}
  280. r.MgList = append(r.MgList, val)
  281. }
  282. }
  283. }
  284. }
  285. }
  286. // Ermcp3MiddleGoodsDetail2 套保品种详情(含转换系数)
  287. type Ermcp3MiddleGoodsDetail2 struct {
  288. Ermcp3MiddleGoodsDetail
  289. CONVERTRATIO float64 `json:"convertratio" xorm:"'CONVERTRATIO'"` // 套保系数(折算系数)
  290. }
  291. // Ermcp3MiddleGoodsDetail 套保品种详情
  292. type Ermcp3MiddleGoodsDetail struct {
  293. Mg ErmcpMiddleGoodsModel `json:"mg"` // 套保商品信息
  294. GPList []Ermcp3GoodsGroupEx `json:"gplist"` // 关联商品组列表
  295. }
  296. // GetData 获取套保品种详情(不含现货列表)
  297. func (r *Ermcp3MiddleGoodsDetail) GetData() ([]Ermcp3MiddleGoodsDetail, error) {
  298. sData := make([]Ermcp3MiddleGoodsDetail, 0)
  299. // 查基本信息
  300. mMg := ErmcpMiddleGoodsModel{AREAUSERID: r.Mg.AREAUSERID, MIDDLEGOODSID: r.Mg.MIDDLEGOODSID, ISVALID: 1}
  301. if mgLst, err := mMg.GetData2(); err == nil {
  302. for i := range mgLst {
  303. sData = append(sData, Ermcp3MiddleGoodsDetail{Mg: mgLst[i], GPList: make([]Ermcp3GoodsGroupEx, 0)})
  304. }
  305. }
  306. if len(sData) == 0 {
  307. return sData, nil
  308. }
  309. bExist := false
  310. // 查关联期货商品组
  311. mGp := Ermcp3MiddleGoodsRelateGroup{AREAUSERID: r.Mg.AREAUSERID}
  312. if gpLst, err := mGp.GetData(); err == nil {
  313. for i := range sData {
  314. sData[i].addGoodsGroup(gpLst)
  315. }
  316. bExist = len(gpLst) > 0
  317. }
  318. if bExist {
  319. mGoods := Ermcp3GoodsEx{AREAUSERID: r.Mg.AREAUSERID}
  320. if gLst, err := mGoods.GetData(); err == nil {
  321. for i := range sData {
  322. sData[i].addGoods(gLst)
  323. }
  324. }
  325. }
  326. return sData, nil
  327. }
  328. func (r *Ermcp3MiddleGoodsDetail) addGoodsGroup(gpLst []Ermcp3MiddleGoodsRelateGroup) {
  329. for i := range gpLst {
  330. if gpLst[i].MIDDLEGOODSID == r.Mg.MIDDLEGOODSID {
  331. bExist := false
  332. for _, v := range r.GPList {
  333. if v.GOODSGROUPID == gpLst[i].GOODSGROUPID {
  334. bExist = true
  335. break
  336. }
  337. }
  338. if !bExist {
  339. val := Ermcp3GoodsGroupEx{
  340. GOODSGROUPID: gpLst[i].GOODSGROUPID,
  341. MIDDLEGOODSID: gpLst[i].MIDDLEGOODSID,
  342. CONVERTRATIO: gpLst[i].CONVERTRATIO,
  343. EXEXCHANGECODE: gpLst[i].EXEXCHANGECODE,
  344. GOODSGROUPNAME: gpLst[i].GOODSGROUPNAME,
  345. ENUMDICNAME: gpLst[i].ENUMDICNAME,
  346. GOODSUNITID: gpLst[i].GOODSUNITID,
  347. GList: make([]Ermcp3Goods, 0),
  348. }
  349. r.GPList = append(r.GPList, val)
  350. }
  351. }
  352. }
  353. }
  354. func (r *Ermcp3MiddleGoodsDetail) addGoods(gpLst []Ermcp3GoodsEx) {
  355. for i := range gpLst {
  356. if gpLst[i].MIDDLEGOODSID == r.Mg.MIDDLEGOODSID {
  357. for k := range r.GPList {
  358. if r.GPList[k].GOODSGROUPID == gpLst[i].GOODSGROUPID {
  359. r.GPList[k].GList = append(r.GPList[k].GList, Ermcp3Goods{
  360. GOODSID: gpLst[i].GOODSID,
  361. GOODSNAME: gpLst[i].GOODSNAME,
  362. GOODSCODE: gpLst[i].GOODSCODE,
  363. AGREEUNIT: gpLst[i].AGREEUNIT,
  364. EXEXCHANGECODE: gpLst[i].EXEXCHANGECODE,
  365. ENUMDICNAME: gpLst[i].ENUMDICNAME,
  366. })
  367. }
  368. }
  369. }
  370. }
  371. }
  372. // Ermcp3MiddleGoodsDetailEx 套保品种详情(含现货列表)
  373. type Ermcp3MiddleGoodsDetailEx struct {
  374. Ermcp3MiddleGoodsDetail
  375. DgList []ErmcpDeliveryGoodsDetail2 `json:"dglist"` // 关联的现货品种列表
  376. }
  377. func (r *Ermcp3MiddleGoodsDetailEx) addDgList(dglst []ErmcpDeliveryGoodsDetail, wc []WRSConverTDetail) {
  378. for i := range wc {
  379. if wc[i].MIDDLEGOODSID == int64(r.Mg.MIDDLEGOODSID) {
  380. for _, detail := range dglst {
  381. if wc[i].DELIVERYGOODSID == detail.Data.DELIVERYGOODSID && detail.Data.ISVALID == 1 {
  382. val := ErmcpDeliveryGoodsDetail2{ErmcpDeliveryGoodsDetail: detail, CONVERTRATIO: wc[i].CONVERTRATIO}
  383. r.DgList = append(r.DgList, val)
  384. }
  385. }
  386. }
  387. }
  388. }
  389. // GetDataEx 从数据库中查询数据
  390. func (r *Ermcp3MiddleGoodsDetailEx) GetDataEx() (interface{}, error) {
  391. sData := make([]Ermcp3MiddleGoodsDetailEx, 0)
  392. // 查套保品种基本信息
  393. m := r.Ermcp3MiddleGoodsDetail
  394. if mgLst, err := m.GetData(); err == nil {
  395. for i := range mgLst {
  396. sData = append(sData, Ermcp3MiddleGoodsDetailEx{Ermcp3MiddleGoodsDetail: mgLst[i],
  397. DgList: make([]ErmcpDeliveryGoodsDetail2, 0)})
  398. }
  399. }
  400. // 查转换关系
  401. mWc := WRSConverTDetail{}
  402. if wc, err := mWc.GetData(); err == nil {
  403. // 查现货商品列表
  404. mDg := ErmcpDeliveryGoodsDetail{}
  405. mDg.Data.AREAUSERID = r.Mg.AREAUSERID
  406. if dgLst, err := mDg.GetData(); err == nil {
  407. for i := range sData {
  408. sData[i].addDgList(dgLst, wc)
  409. }
  410. }
  411. }
  412. return sData, nil
  413. }
  414. // Ermcp3MiddleGoodsRelateGroup 套保商品关联的期货商品组
  415. type Ermcp3MiddleGoodsRelateGroup struct {
  416. MIDDLEGOODSID uint32 `json:"middlegoodsid" xorm:"'middlegoodsid'"` // 套保商品id
  417. GOODSGROUPID int32 `json:"goodsgroupid" xorm:"'goodsgroupid'"` // 商品组id
  418. CONVERTRATIO float64 `json:"convertratio" xorm:"'convertratio'"` // 折算系数(品种系数)
  419. EXEXCHANGECODE string `json:"exexchangecode" xorm:"'exexchangecode'"` // 交易所代码
  420. GOODSGROUPNAME string `json:"goodsgroupname" xorm:"'goodsgroupname'"` // 商品组名称
  421. GOODSUNITID int32 `json:"goodsunitid" xorm:"'GOODUNITID'"` // 单位id
  422. ENUMDICNAME string `json:"enumdicname"` // 单位名称
  423. AREAUSERID int64 `json:"-"` // 所属机构id
  424. }
  425. func (r *Ermcp3MiddleGoodsRelateGroup) calc() {
  426. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.GOODSUNITID)
  427. }
  428. func (r *Ermcp3MiddleGoodsRelateGroup) buildSql() string {
  429. var sqlId utils.SQLVal = "select mg.areauserid," +
  430. " mg.middlegoodsid," +
  431. " gc.convertratio," +
  432. " ex.exexchangecode," +
  433. " gp.goodsgroupname," +
  434. " gp.goodunitid," +
  435. " gp.goodsgroupid" +
  436. " from erms_middlegoods mg" +
  437. " inner join ERMCP_GGConvertConfig gc" +
  438. " on mg.goodsgroupid = gc.destgoodsgroupid" +
  439. " inner join goodsgroup gp" +
  440. " on gc.srcgoodsgroupid = gp.goodsgroupid" +
  441. " left join externalexchange ex" +
  442. " on gp.exexchangeid = ex.autoid" +
  443. " where mg.isvalid = 1" +
  444. " and gp.goodsgroupstatus = 1"
  445. sqlId.AndEx("mg.AREAUSERID", r.AREAUSERID, r.AREAUSERID > 0)
  446. return sqlId.String()
  447. }
  448. // GetData 套保品关联的期货商品组信息
  449. func (r *Ermcp3MiddleGoodsRelateGroup) GetData() ([]Ermcp3MiddleGoodsRelateGroup, error) {
  450. sData := make([]Ermcp3MiddleGoodsRelateGroup, 0)
  451. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  452. for i := range sData {
  453. sData[i].calc()
  454. }
  455. return sData, err
  456. }
  457. // GetDataEx 套保品关联的期货商品组信息
  458. func (r *Ermcp3MiddleGoodsRelateGroup) GetDataEx() (interface{}, error) {
  459. return r.GetData()
  460. }
  461. // Ermcp3GoodsGroupEx 商品组(含商品列表)
  462. type Ermcp3GoodsGroupEx struct {
  463. MIDDLEGOODSID uint32 `json:"middlegoodsid" xorm:"'middlegoodsid'"` // 套保商品id
  464. GOODSGROUPID int32 `json:"goodsgroupid" xorm:"'goodsgroupid'"` // 商品组id
  465. CONVERTRATIO float64 `json:"convertratio" xorm:"'convertratio'"` // 折算系数(品种系数)
  466. EXEXCHANGECODE string `json:"exexchangecode" xorm:"'exexchangecode'"` // 交易所代码
  467. GOODSGROUPNAME string `json:"goodsgroupname" xorm:"'goodsgroupname'"` // 商品组名称
  468. GOODSUNITID int32 `json:"goodsunitid" xorm:"'GOODSUNITID'"` // 单位id
  469. ENUMDICNAME string `json:"enumdicname"` // 单位名称
  470. GList []Ermcp3Goods `json:"glist"` // 合约列表
  471. }
  472. // Ermcp3Goods 商品信息
  473. type Ermcp3Goods struct {
  474. GOODSID int32 `json:"goodsid" xorm:"'goodsid'"` // 期货商品id
  475. GOODSCODE string `json:"goodscode" xorm:"'goodscode'"` // 期货商品代码
  476. GOODSNAME string `json:"goodsname" xorm:"'goodsname'"` // 期货商品名称
  477. AGREEUNIT float32 `json:"agreeunit" xorm:"'agreeunit'"` // 合约单位(合约乘数)
  478. EXEXCHANGECODE string `json:"exexchangecode" xorm:"'exexchangecode'"` // 交易所代码
  479. ENUMDICNAME string `json:"enumdicname"` // 单位名称
  480. }
  481. // Ermcp3GoodsEx 套保品关联的期货商品(少量字段)
  482. type Ermcp3GoodsEx struct {
  483. MIDDLEGOODSID uint32 `json:"middlegoodsid" xorm:"'middlegoodsid'"` // 套保商品id
  484. GOODSID int32 `json:"goodsid" xorm:"'goodsid'"` // 期货商品id
  485. GOODSCODE string `json:"goodscode" xorm:"'goodscode'"` // 期货商品代码
  486. GOODSNAME string `json:"goodsname" xorm:"'goodsname'"` // 期货商品名称
  487. GOODUNITID int32 `json:"goodunitid" xorm:"'goodunitid'"` // 期货商品单位id
  488. CONVERTRATIO float64 `json:"convertratio" xorm:"'convertratio'"` // 折算系数(品种系数)
  489. GOODSGROUPID int32 `json:"goodsgroupid" xorm:"'goodsgroupid'"` // 商品组id
  490. EXEXCHANGECODE string `json:"exexchangecode" xorm:"'exexchangecode'"` // 交易所代码
  491. GOODSGROUPNAME string `json:"goodsgroupname" xorm:"'goodsgroupname'"` // 商品组名称
  492. GPUNITID int32 `json:"gpunitid" xorm:"'gpunitid'"` // 商品组单位id
  493. AGREEUNIT float32 `json:"agreeunit" xorm:"'agreeunit'"` // 合约单位(合约乘数)
  494. ENUMDICNAME string `json:"enumdicname"` // 单位名称
  495. GPENUMDICNAME string `json:"enumdicname2"` // 商品组单位名称
  496. AREAUSERID int64 `json:"-"` // 所属机构id
  497. }
  498. func (r *Ermcp3GoodsEx) calc() {
  499. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.GOODUNITID)
  500. r.GPENUMDICNAME = mtpcache.GetEnumDicitemName(r.GPUNITID)
  501. }
  502. func (r *Ermcp3GoodsEx) buildSql() string {
  503. var sqlId utils.SQLVal = "select mg.areauserid," +
  504. " mg.middlegoodsid," +
  505. " g.goodsid," +
  506. " g.goodscode," +
  507. " g.goodsname," +
  508. " g.goodunitid," +
  509. " g.goodsgroupid," +
  510. " g.agreeunit," +
  511. " gc.convertratio," +
  512. " ex.exexchangecode," +
  513. " gp.goodsgroupname," +
  514. " gp.goodunitid gpunitid" +
  515. " from erms_middlegoods mg" +
  516. " inner join ERMCP_GGConvertConfig gc" +
  517. " on mg.goodsgroupid = gc.destgoodsgroupid" +
  518. " inner join goodsgroup gp" +
  519. " on gc.srcgoodsgroupid = gp.goodsgroupid" +
  520. " inner join goods g" +
  521. " on gp.goodsgroupid = g.goodsgroupid" +
  522. " left join externalexchange ex" +
  523. " on gp.exexchangeid = ex.autoid" +
  524. " where g.goodsstatus not in(4,5,6) and mg.isvalid=1 and gp.goodsgroupstatus=1"
  525. sqlId.AndEx("mg.areauserid", r.AREAUSERID, r.AREAUSERID > 0)
  526. sqlId.Join(" order by mg.middlegoodsid")
  527. return sqlId.String()
  528. }
  529. // GetData 从数据库中查询数据
  530. func (r *Ermcp3GoodsEx) GetData() ([]Ermcp3GoodsEx, error) {
  531. sData := make([]Ermcp3GoodsEx, 0)
  532. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  533. for i := range sData {
  534. sData[i].calc()
  535. }
  536. return sData, err
  537. }
  538. // GetDataEx 从数据库中查询数据
  539. func (r *Ermcp3GoodsEx) GetDataEx() (interface{}, error) {
  540. return r.GetData()
  541. }
  542. // Ermcp3Contract 现货合同
  543. type Ermcp3Contract struct {
  544. SPOTCONTRACTID string `json:"spotcontractid" xorm:"'SPOTCONTRACTID'"` // 现货合同ID(602+Unix秒时间戳(10位)+xxxxxx)
  545. CONTRACTNO string `json:"contractno" xorm:"'CONTRACTNO'" form:"contractno"` // 现货合同编号
  546. CONTRACTTYPE int32 `json:"contracttype" xorm:"'CONTRACTTYPE'"` // 现货合同类型 - 1:采购 -1:销售
  547. USERID int64 `json:"userid" xorm:"'USERID'"` // 所属机构ID
  548. BUYUSERID int64 `json:"buyuserid" xorm:"'BUYUSERID'"` // 采购方ID
  549. BUYUSERName string `json:"buyusername" xorm:"'BUYUSERName'"` // 采购方名称
  550. SELLUSERID int64 `json:"selluserid" xorm:"'SELLUSERID'"` // 销售方ID
  551. SELLUSERNAME string `json:"sellusername" xorm:"'SELLUSERNAME'"` // 销售方名称
  552. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货品种ID
  553. WRSTANDARDID int32 `json:"wrstandardid" xorm:"'wrstandardid'"` // 品类ID
  554. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'" form:"wrstandardname"` // 品类名称
  555. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  556. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  557. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  558. PRODUCTTYPE int32 `json:"producttype" xorm:"'PRODUCTTYPE'"` // 产品类型 - 1:标准仓单 2:等标 3:非标
  559. CONVERTFACTOR float64 `json:"convertfactor" xorm:"'CONVERTFACTOR'"` // 标仓系数(品类)
  560. SPOTGOODSDESC string `json:"spotgoodsdesc" xorm:"'SPOTGOODSDESC'"` // 商品型号
  561. PRICETYPE int32 `json:"pricetype" xorm:"'PRICETYPE'"` // 定价类型 - 1:一口价 2:点价 3:暂定价
  562. QTY float64 `json:"qty" xorm:"'QTY'"` // 数量
  563. PRICE float64 `json:"price" xorm:"'PRICE'"` // 价格\暂定价 [1:一口价、3:暂定价]
  564. AMOUNT float64 `json:"amount" xorm:"'AMOUNT'"` // 金额 [1:一口价、3:暂定价]
  565. DELIVERYSTARTDATE string `json:"deliverystartdate" xorm:"'DELIVERYSTARTDATE'"` // 交收期(开始)
  566. DELIVERYENDDATE string `json:"deliveryenddate" xorm:"'DELIVERYENDDATE'"` // 交收期(结束)
  567. GOODSID int32 `json:"goodsid" xorm:"'GOODSID'"` // 点价合约ID - 0:为现货,其它为期货商品合约ID [2:点价 3:暂定价]
  568. GOODSCODE string `json:"goodscode" xorm:"'GOODSCODE'"` // 点价合约代码
  569. GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'"` // 点价商品名称
  570. PRICEMOVE float64 `json:"pricemove" xorm:"'PRICEMOVE'"` // 升贴水 [2:点价 3:暂定价]
  571. STARTDATE string `json:"startdate" xorm:"'STARTDATE'"` // 点价开始日期 [2:点价 3:暂定价]
  572. ENDDATE string `json:"enddate" xorm:"'ENDDATE'"` // 点价结束日期 [2:点价 3:暂定价]
  573. MARGIN float64 `json:"margin" xorm:"'MARGIN'"` // 当前保证金
  574. CONTRACTMARGIN float64 `json:"contractmargin" xorm:"'CONTRACTMARGIN'"` // 合同保证金
  575. EnumdicName string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 单位名称
  576. CONTRACCTSTATUS int32 `json:"contracctstatus" xorm:"'CONTRACTSTATUS'"` // 合同状态 - 0:未提交 1:待审核 2:执行中 3:正常完结 4:审核拒绝 5:异常完结 6:已撤回
  577. Remark string `json:"remark" xorm:"'Remark'"` // 备注
  578. POINTDESC string `json:"pointdesc" xorm:"'POINTDESC'"` // 点价备注
  579. AUDITREMARK string `json:"auditremark" xorm:"'AUDITREMARK'"` // 审核意见
  580. AUDITTIME string `json:"audittime" xorm:"'AUDITTIME'"` // 审核时间
  581. CREATETIME string `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  582. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  583. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'"` // 现货品牌ID(DGFactoryItem表的ID)
  584. BRANDNAME string `json:"brandname" xorm:"'brandname'"` // 品牌名称
  585. ATTACHMENT string `json:"attachment" xorm:"'ATTACHMENT'"` // 附件
  586. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 单位id(取品类上的单位id)
  587. TRADEUSERID int64 `json:"tradeuserid" xorm:"'TRADEUSERID'"` // 交易员id
  588. SALEUSERID int64 `json:"saleuserid" xorm:"'SALEUSERID'"` // 业务员id
  589. MERUSERID int64 `json:"meruserid" xorm:"'MERUSERID'"` // 跟单员id
  590. ACCOUNTID string `json:"accountid" xorm:"'ACCOUNTID'"` // 期货账户id
  591. BIZTYPE int32 `json:"biztype" xorm:"'BIZTYPE'"` // 业务类型 1-套保 2-套利
  592. CURRENCYID int32 `json:"currencyid" xorm:"'CURRENCYID'"` // 币种id
  593. SUBJECTID int64 `json:"subjectid" xorm:"'SUBJECTID'"` // 交易主体ID
  594. SUBJECTNAME string `json:"subjectname" xorm:"'SUBJECTNAME'"` // 交易主体名称
  595. VATRATE float64 `json:"vatrate" xorm:"'VATRATE'"` // 增值税率
  596. SELLNICKNAME string `json:"sellnickname"` // 采购方昵称
  597. BUYNICKNAME string `json:"buynickname"` // 销售方昵称
  598. TRADEUSERLOGINCODE string `json:"tradeuserlogincode"` // 交易员登录代码
  599. SALEUSERLOGINCODE string `json:"saleuserlogincode"` // 业务员登录代码
  600. MERUSERLOGINCODE string `json:"meruserlogincode"` // 跟单员登录代码
  601. CURRENCYNAME string `json:"currencyname"` // 币种名称
  602. TRADEUSERNAME string `json:"tradeusername"` // 交易员名称
  603. SALEUSERNAME string `json:"saleusername"` // 业务员名称
  604. MERUSERNAME string `json:"merusername"` // 跟单员名称
  605. // 筛选条件
  606. QryType string `json:"-"` // 查询类型(逗号隔开,如1,2,3) 1-未提交 2-待审核 3-履约中 4-已完成
  607. UserType int32 `json:"-"` // 用户类型 2-管理员 7-企业成员
  608. OwnUserId int64 `json:"-"` // 登录用户id
  609. STATUS string `json:"-"` // 状态筛选
  610. ISTODAY int32 `json:"-"` // 是否查今日
  611. }
  612. func (r *Ermcp3Contract) getQryTypeStatus() string {
  613. r.QryType = strings.TrimSpace(r.QryType)
  614. r.QryType = strings.Trim(r.QryType, " ")
  615. sTmp := make([]string, 0)
  616. for _, v := range r.QryType {
  617. var status string
  618. switch v {
  619. case '1': // 未提交
  620. status = "0,4,6"
  621. case '2': // 待审核
  622. status = "1"
  623. case '3': // 履约中
  624. status = "2"
  625. case '4': // 已完成
  626. status = "3,5"
  627. }
  628. if status != "" {
  629. sTmp = append(sTmp, status)
  630. }
  631. }
  632. newStatus := strings.Join(sTmp, ",")
  633. return newStatus
  634. }
  635. func (r *Ermcp3Contract) calc() {
  636. r.BUYUSERName, r.BUYNICKNAME = mtpcache.GetUserNameAndNickName(r.BUYUSERID)
  637. r.SELLUSERNAME, r.SELLNICKNAME = mtpcache.GetUserNameAndNickName(r.SELLUSERID)
  638. r.EnumdicName = mtpcache.GetEnumDicitemName(r.UNITID)
  639. r.TRADEUSERLOGINCODE = mtpcache.GetLoginCodeByUserId(r.TRADEUSERID)
  640. r.SALEUSERLOGINCODE = mtpcache.GetLoginCodeByUserId(r.SALEUSERID)
  641. r.MERUSERLOGINCODE = mtpcache.GetLoginCodeByUserId(r.MERUSERID)
  642. r.TRADEUSERNAME = mtpcache.GetUserNameByUserId(r.TRADEUSERID)
  643. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  644. r.SALEUSERNAME = mtpcache.GetUserNameByUserId(r.SALEUSERID)
  645. r.MERUSERNAME = mtpcache.GetUserNameByUserId(r.MERUSERID)
  646. }
  647. func (r *Ermcp3Contract) buildSql() string {
  648. var sqlId utils.SQLVal = `
  649. SELECT to_char(t.SPOTCONTRACTID) SPOTCONTRACTID,
  650. t.CONTRACTNO,
  651. t.CONTRACTTYPE,
  652. t.USERID,
  653. t.BUYUSERID,
  654. t.SELLUSERID,
  655. t.DELIVERYGOODSID,
  656. t.wrstandardid,
  657. t.PRODUCTTYPE,
  658. w.CONVERTFACTOR,
  659. t.SPOTGOODSDESC,
  660. t.PRICETYPE,
  661. t.QTY,
  662. t.PRICE,
  663. t.AMOUNT,
  664. to_char(t.DELIVERYSTARTDATE, 'yyyy-mm-dd hh24:mi:ss') DELIVERYSTARTDATE,
  665. to_char(t.DELIVERYENDDATE, 'yyyy-mm-dd hh24:mi:ss') DELIVERYENDDATE,
  666. t.GOODSID,
  667. t.PRICEMOVE,
  668. to_char(t.STARTDATE, 'yyyy-mm-dd hh24:mi:ss') STARTDATE,
  669. to_char(t.ENDDATE, 'yyyy-mm-dd hh24:mi:ss') ENDDATE,
  670. t.MARGIN,
  671. t.contractmargin,
  672. t.remark,
  673. t.pointdesc,
  674. t.auditremark,
  675. to_char(t.contractattachment) attachment,
  676. t.contractstatus,
  677. t.SPOTGOODSBRANDID,
  678. to_char(t.audittime, 'yyyy-mm-dd hh24:mi:ss') audittime,
  679. to_char(t.createtime, 'yyyy-mm-dd hh24:mi:ss') createtime,
  680. to_char(t.updatetime, 'yyyy-mm-dd hh24:mi:ss') updatetime,
  681. g.deliverygoodscode,
  682. g.deliverygoodsname,
  683. g2.goodscode,
  684. g2.goodsname,
  685. gb.dgfactoryitemvalue brandname,
  686. w.wrstandardname,
  687. w.wrstandardcode,
  688. w.vatrate,
  689. w.unitid,
  690. t.tradeuserid,
  691. t.saleuserid,
  692. t.meruserid,
  693. t.currencyid,
  694. to_char(t.accountid) accountid,
  695. t.biztype,
  696. to_char(t.subjectid) subjectid,
  697. b.subjectname
  698. FROM ERMCP_SPOTCONTRACT t
  699. left join ermcp_pa_areasubject b on t.subjectid=b.subjectid
  700. left join deliverygoods g
  701. on t.deliverygoodsid = g.deliverygoodsid
  702. left join goods g2
  703. on t.goodsid = g2.goodsid
  704. left join DGFACTORYITEM gb
  705. on t.spotgoodsbrandid = gb.dgfactoryitemid
  706. left join wrstandard w
  707. on t.wrstandardid = w.wrstandardid
  708. left join loginaccount l
  709. on t.applyid = l.loginid
  710. where 1 = 1
  711. `
  712. if len(r.SPOTCONTRACTID) > 0 {
  713. // 如果指定了合同id, 合同id是key , 则不需要再判断其它条件
  714. sqlId.AndEx("t.SPOTCONTRACTID", r.SPOTCONTRACTID, len(r.SPOTCONTRACTID) > 0)
  715. } else {
  716. sqlId.AndEx("t.CONTRACTTYPE", r.CONTRACTTYPE, r.CONTRACTTYPE != 0)
  717. // 用户条件
  718. sqlId.Join(fmt.Sprintf(" and %v in(t.userid, t.saleuserid, t.tradeuserid, t.meruserid, l.userid)", r.OwnUserId))
  719. if len(r.STATUS) > 0 {
  720. sqlId.JoinFormat(" and t.contractstatus in (%v)", r.STATUS)
  721. } else if len(r.QryType) > 0 {
  722. status := r.getQryTypeStatus()
  723. if len(status) > 0 {
  724. sqlId.Join(fmt.Sprintf(" and t.contractstatus in (%v)", status))
  725. }
  726. }
  727. }
  728. if r.CONTRACTNO != "" {
  729. sqlId.AndLike("t.contractno", r.CONTRACTNO)
  730. }
  731. if r.WRSTANDARDNAME != "" {
  732. sqlId.AndLike("w.wrstandardname", r.WRSTANDARDNAME)
  733. }
  734. if r.ISTODAY == 1 {
  735. sqlId.Join(" and trunc(t.createtime)=trunc(sysdate)")
  736. }
  737. return sqlId.String()
  738. }
  739. // GetDataEx 从数据库中查询数据
  740. func (r *Ermcp3Contract) GetDataEx() (interface{}, error) {
  741. sData := make([]Ermcp3Contract, 0)
  742. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  743. for i := range sData {
  744. sData[i].calc()
  745. }
  746. return sData, err
  747. }
  748. // Ermcp3SellBuyContract 采购/销售合同
  749. type Ermcp3SellBuyContract struct {
  750. UserID int64 `json:"userid" xorm:"'UserID'"` // 机构ID
  751. SpotContractId string `json:"spotcontractid" xorm:"'SPOTCONTRACTID'"` // 合同ID
  752. AccountName string `json:"accountname" xorm:"'ACCOUNTNAME'"` // 账户名称
  753. DeliveryGoodsId int `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货商品ID
  754. DeliveryGoodsCode string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  755. DeliveryGoodsName string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  756. SpotGoodsdesc string `json:"spotgoodsdesc" xorm:"'SPOTGOODSDESC'"` // 商品型号(商品规格)
  757. GoodsId int `json:"goodsid" xorm:"'GOODSID'"` // 点价商品ID
  758. GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'"` // 点价商品名称
  759. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'"` // 点价商品代码
  760. GOODSGROUPID int `json:"goodsgroupid" xorm:"'GOODSGROUPID'"` // 点价商品组id
  761. Pricemove float64 `json:"pricemove" xorm:"'PRICEMOVE'"` // 升贴水
  762. Qty float64 `json:"qty" xorm:"'QTY'"` // 合同量
  763. UnpricedQty float64 `json:"unpricedqty" xorm:"'UNPRICEDQTY'"` // 未定价量
  764. PricedQty float64 `json:"pricedqty" xorm:"'PRICEDQTY'"` // 已定价量
  765. UnsureQty float64 `json:"unsureqty" xorm:"'UNSUREQTY'"` // 未确定量
  766. PayAmount float64 `json:"payamount" xorm:"'PAYAMOUNT'"` // 已收付额(收款或付款)
  767. UnpayAmount float64 `json:"unpayamount"` // 应收付款额(应支付或应收款)
  768. PrePayAmount float64 `json:"prepayamount"` // 预收付额
  769. InvoiceAmount float64 `json:"invoiceamount" xorm:"'INVOICEAMOUNT'"` // 已开票额
  770. DaikaiAmount float64 `json:"daikaiamount" xorm:"'DAIKAIAMOUNT'"` // 应收(开)票额
  771. PreInvoiceAmount float64 `json:"preinvoiceamount"` // 预收(开)票额
  772. StartDate string `json:"startdate" xorm:"'STARTDATE'"` // 点价开始日
  773. EndDate string `json:"enddate" xorm:"'ENDDATE'"` // 点价结束日
  774. DeliveryStartDate string `json:"deliverystartdate" xorm:"'DELIVERYSTARTDATE'"` // 交割开始日
  775. DeliveryendDate string `json:"deliveryenddate" xorm:"'DELIVERYENDDATE'"` // 交割结束日
  776. Convertfactor float64 `json:"convertfactor" xorm:"'CONVERTFACTOR'"` // 标仓系数(品类)
  777. EnumdicName string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 单位名称
  778. Contracctstatus uint `json:"contracctstatus" xorm:"'CONTRACTSTATUS'"` // 合同状态- 0:未提交 1:待审核 2:执行中 3:正常完结 4:审核拒绝 5:异常完结 6:已撤回
  779. PriceType int `json:"pricetype" xorm:"'PRICETYPE'"` // 定价类型 - 1:一口价 2:点价 3:暂定价
  780. ProductType int `json:"producttype" xorm:"'PRODUCTTYPE'"` // 产品类型 - 1:标准仓单 2:等标 3:非标
  781. Contracttype int32 `json:"contracttype" xorm:"'CONTRACTTYPE'"` // 合同类型 1-采购, -1-销售
  782. Pricedamount float64 `json:"pricedamount" xorm:"'PRICEDAMOUNT'"` // 已定价额
  783. PricedAvg float64 `json:"pricedavg" xorm:"'PRICEDAVG'"` // 已点均价
  784. Margin float64 `json:"margin" xorm:"'MARGIN'"` // 保证金
  785. CONTRACTMARGIN float64 `json:"contractmargin" xorm:"'CONTRACTMARGIN'"` // 合同保证金
  786. Remark string `json:"remark" xorm:"'Remark'"` // 备注
  787. ATTACHMENT string `json:"attachment" xorm:"'ATTACHMENT'"` // 附件
  788. ReckonRealQty float64 `json:"reckonrealqty" xorm:"'ReckonRealQty'"` // 已交收量
  789. OriReckonRealQty float64 `json:"orireckonrealqty" xorm:"'OriReckonRealQty'"` // 应交收量
  790. ReckonOtherAmount float64 `json:"reckonotheramount" xorm:"'ReckonOtherAmount'"` // 其它费用
  791. ReckonAdjustAmount float64 `json:"reckonadjustamount" xorm:"'ReckonAdjustAmount'"` // 调整金额
  792. Price float64 `json:"price" xorm:"'Price'"` // 价格
  793. LoanAmount float64 `json:"loanamount" xorm:"'LoanAmount'"` // 贷款总额=已定价额+调整金额
  794. Contractno string `json:"contractno" xorm:"'Contractno'"` // 合同编号
  795. TotalAmount float64 `json:"totalamount" xorm:"'-'"` // 合计总额
  796. ReckonedAmount float64 `json:"reckonedamount" xorm:"'ReckonedAmount'"` // 实际已收付额(已确定额,已收付总额-已退款总额)
  797. BUYUSERID int64 `json:"-" xorm:"'BUYUSERID'"` // 采购方ID
  798. SELLUSERID int64 `json:"-" xorm:"'SELLUSERID'"` // 销售方ID
  799. AUDITTIME string `json:"audittime" xorm:"'AUDITTIME'"` // 审核时间
  800. CREATETIME string `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  801. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'"` // 现货品牌ID(DGFactoryItem表的ID)
  802. BRANDNAME string `json:"brandname" xorm:"'brandname'"` // 品牌名称
  803. WRSTANDARDID int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 品类ID
  804. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  805. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  806. TRADEUSERID int64 `json:"tradeuserid" xorm:"'TRADEUSERID'"` // 交易员id
  807. SALEUSERID int64 `json:"saleuserid" xorm:"'SALEUSERID'"` // 业务员id
  808. MERUSERID int64 `json:"meruserid" xorm:"'MERUSERID'"` // 跟单员id
  809. ACCOUNTID string `json:"accountid" xorm:"'ACCOUNTID'"` // 期货账户id
  810. BIZTYPE int32 `json:"biztype" xorm:"'BIZTYPE'"` // 业务类型 1-套保 2-套利
  811. CURRENCYID int32 `json:"currencyid" xorm:"'CURRENCYID'"` // 币种id
  812. SUBJECTID int64 `json:"subjectid" xorm:"'SUBJECTID'"` // 交易主体ID
  813. SUBJECTNAME string `json:"subjectname" xorm:"'SUBJECTNAME'"` // 交易主体名称
  814. VATRATE float64 `json:"vatrate" xorm:"'VATRATE'"` // 增值税率
  815. BIZSUBJECTID int64 `json:"bizsubjectid" xorm:"BIZSUBJECTID"` // 归属业务部门ID - SubjectID
  816. NICKNAME string `json:"nickname"` // 账户昵称
  817. TRADEUSERLOGINCODE string `json:"tradeuserlogincode"` // 交易员登录代码
  818. SALEUSERLOGINCODE string `json:"saleuserlogincode"` // 业务员登录代码
  819. MERUSERLOGINCODE string `json:"meruserlogincode"` // 跟单员登录代码
  820. CURRENCYNAME string `json:"currencyname"` // 币种名称
  821. TRADEUSERNAME string `json:"tradeusername"` // 交易员名称
  822. SALEUSERNAME string `json:"saleusername"` // 业务员名称
  823. MERUSERNAME string `json:"merusername"` // 跟单员名称
  824. // 筛选条件
  825. QryType int32 `json:"-"` // 查询类型 1-未提交 2-待审核 3-履约中 4-已完成
  826. UserType int32 `json:"-"` // 用户类型 2-管理员 7-企业成员
  827. OwnUserId int64 `json:"-"` // 登录用户id
  828. STATUS string `json:"-"` // 状态筛选
  829. ISTODAY int32 `json:"-"` // 是否查今日
  830. }
  831. func (r *Ermcp3SellBuyContract) calc() {
  832. r.TotalAmount = r.LoanAmount + r.ReckonOtherAmount
  833. // #95629 公式变更 modify:2021-06-16 09:54:08
  834. // 应付款额=货款总额-已付款额+已退款额
  835. // 应收款额=货款总额-已收款额+已退款额
  836. r.UnpayAmount = r.LoanAmount - r.ReckonedAmount
  837. // 预付款额=已付款额-已退款额-货款总额
  838. // 预收款额=已收款额-已退款额-货款总额
  839. r.PrePayAmount = r.ReckonedAmount - r.LoanAmount
  840. // 预收票额=已收票额-货款总额
  841. // 预开票额=已开票额-货款总额
  842. r.PreInvoiceAmount = r.InvoiceAmount - r.LoanAmount
  843. // 应收票额=货款总额-已收票额
  844. // 应开票额=货款总额-已开票额
  845. r.DaikaiAmount = r.LoanAmount - r.InvoiceAmount
  846. if r.Contracttype == 1 {
  847. //采购合同, 取销售方名称
  848. r.AccountName, r.NICKNAME = mtpcache.GetUserNameAndNickName(r.SELLUSERID)
  849. } else {
  850. //销售合同, 取采购方名称
  851. r.AccountName, r.NICKNAME = mtpcache.GetUserNameAndNickName(r.BUYUSERID)
  852. }
  853. r.TRADEUSERLOGINCODE = mtpcache.GetLoginCodeByUserId(r.TRADEUSERID)
  854. r.SALEUSERLOGINCODE = mtpcache.GetLoginCodeByUserId(r.SALEUSERID)
  855. r.MERUSERLOGINCODE = mtpcache.GetLoginCodeByUserId(r.MERUSERID)
  856. r.TRADEUSERNAME = mtpcache.GetUserNameByUserId(r.TRADEUSERID)
  857. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  858. r.SALEUSERNAME = mtpcache.GetUserNameByUserId(r.SALEUSERID)
  859. r.MERUSERNAME = mtpcache.GetUserNameByUserId(r.MERUSERID)
  860. }
  861. func (r *Ermcp3SellBuyContract) buildSql() string {
  862. var sqlId utils.SQLVal = `
  863. select t.contractno,
  864. to_char(t.SpotContractId) SpotContractId,
  865. t.deliverygoodsid,
  866. t.spotgoodsdesc,
  867. t.goodsid,
  868. t.pricemove,
  869. t.userid,
  870. t.BUYUSERID,
  871. t.SELLUSERID,
  872. t.qty,
  873. t.qty - t.pricedqty unpricedqty,
  874. t.pricedqty,
  875. (case
  876. when t.pricetype = 3 then
  877. t.qty - t.RECKONREALQTY
  878. else
  879. t.pricedqty - nvl(t.ReckonRealQty, 0)
  880. end) unsureqty,
  881. t.reckonedamount PayAmount,
  882. t.invoiceamount,
  883. (t.pricedamount + t.RECKONADJUSTAMOUNT - t.invoiceamount) as daikaiAmount,
  884. to_char(t.startdate, 'yyyy-mm-dd hh24:mi:ss') startdate,
  885. to_char(t.enddate, 'yyyy-mm-dd hh24:mi:ss') enddate,
  886. to_char(t.deliverystartdate, 'yyyy-mm-dd hh24:mi:ss') deliverystartdate,
  887. to_char(t.deliveryenddate, 'yyyy-mm-dd hh24:mi:ss') deliveryenddate,
  888. wr.convertfactor,
  889. t.contractstatus,
  890. t.pricetype,
  891. t.producttype,
  892. t.contracttype,
  893. t.remark,
  894. to_char(t.contractattachment) attachment,
  895. t.margin,
  896. t.contractmargin,
  897. t.SPOTGOODSBRANDID,
  898. t.tradeuserid,
  899. t.saleuserid,
  900. t.meruserid,
  901. t.currencyid,
  902. t.biztype,
  903. g.deliverygoodscode,
  904. g.deliverygoodsname,
  905. wr.wrstandardid,
  906. wr.wrstandardname,
  907. wr.wrstandardcode,
  908. wr.vatrate,
  909. g2.goodscode,
  910. g2.goodsname,
  911. g2.goodsgroupid,
  912. e.enumdicname,
  913. t.contracttype,
  914. t.pricedamount,
  915. case
  916. when t.pricedqty > 0 then
  917. (t.pricedamount) / t.pricedqty
  918. else
  919. 0
  920. end pricedAvg,
  921. t.ReckonRealQty,
  922. t.OriReckonRealQty,
  923. t.ReckonOtherAmount,
  924. t.ReckonAdjustAmount,
  925. t.Price,
  926. t.ReckonedAmount,
  927. to_char(t.audittime, 'yyyy-mm-dd hh24:mi:ss') audittime,
  928. to_char(t.createtime, 'yyyy-mm-dd hh24:mi:ss') createtime,
  929. t.pricedamount + t.ReckonAdjustAmount as LoanAmount,
  930. gb.dgfactoryitemvalue BRANDNAME,
  931. to_char(t.subjectid) subjectid,
  932. b.subjectname,
  933. t.bizsubjectid
  934. from ermcp_spotcontract t
  935. left join ermcp_pa_areasubject b on t.subjectid=b.subjectid
  936. left join deliverygoods g
  937. on t.deliverygoodsid = g.deliverygoodsid
  938. left join goods g2
  939. on t.goodsid = g2.goodsid
  940. left join wrstandard wr
  941. on t.wrstandardid = wr.wrstandardid
  942. left join DGFactoryItem gb
  943. on t.spotgoodsbrandid = gb.dgfactoryitemid
  944. left join enumdicitem e
  945. on wr.unitid = e.enumitemname
  946. and e.enumdiccode = 'goodsunit'
  947. where 1 = 1
  948. `
  949. sqlId.AndEx("t.userid", r.UserID, r.UserID > 0)
  950. sqlId.AndEx("t.contracttype", r.Contracttype, r.Contracttype != 0)
  951. sqlId.AndEx("t.SpotContractId", r.SpotContractId, len(r.SpotContractId) > 0)
  952. if r.UserType == 7 {
  953. // 企业成员
  954. sqlId.Join(fmt.Sprintf(" and %v in(t.saleuserid, t.tradeuserid, t.meruserid)", r.OwnUserId))
  955. }
  956. if len(r.STATUS) > 0 {
  957. sqlId.JoinFormat(" and t.contractstatus in (%v)", r.STATUS)
  958. } else if r.QryType > 0 {
  959. var status string
  960. nQueryType := r.QryType
  961. if 1 == nQueryType {
  962. // 全部
  963. status = "2,3"
  964. } else if 2 == nQueryType {
  965. // 待点价
  966. status = "2"
  967. } else {
  968. // 履约
  969. status = "2"
  970. }
  971. if len(status) > 0 {
  972. sqlId.Join(fmt.Sprintf(" and t.contractstatus in (%v)", status))
  973. }
  974. }
  975. if r.ISTODAY == 1 {
  976. sqlId.Join(" and trunc(t.createtime)=trunc(sysdate)")
  977. }
  978. sqlId.JoinEx(r.QryType == 2, " and t.qty - t.pricedqty > 0 and t.pricetype !=1")
  979. return sqlId.String()
  980. }
  981. // GetDataEx 从数据库中查询数据
  982. func (r *Ermcp3SellBuyContract) GetDataEx() (interface{}, error) {
  983. sData := make([]Ermcp3SellBuyContract, 0)
  984. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  985. for i := range sData {
  986. sData[i].calc()
  987. }
  988. return sData, err
  989. }
  990. // Ermcp3ExposureDetail 敞口现货明细
  991. type Ermcp3ExposureDetail struct {
  992. Createtime string `json:"createtime" xorm:"'createtime'"` // 时间
  993. Areauserid int64 `json:"areauserid" xorm:"'areauserid'"` // 机构ID
  994. Logtype int32 `json:"logtype" xorm:"'logtype'"` // 类型 - 1:套保计划 2:现货合同
  995. Contracttype int32 `json:"contracttype" xorm:"'contracttype'"` // 现货合同类型 - 1:采购 -1:销售
  996. Qty float64 `json:"qty" xorm:"'qty'"` // 数量
  997. RelateNo string `json:"relateNo" xorm:"'relateNo'"` // 现货合同/套保计划编号
  998. Middlegoodsname string `json:"middlegoodsname" xorm:"'middlegoodsname'"` // 套保商品名称
  999. Middlegoodscode string `json:"middlegoodscode" xorm:"'middlegoodscode'"` // 套保商品代码
  1000. MiddlegoodsId int32 `json:"middlegoodsId" xorm:"'middlegoodsId'"` // 套保商品id
  1001. ChangeQty float64 `json:"changeQty" xorm:"'changeQty'"` // 套保变动量
  1002. Convertfactor float64 `json:"convertfactor" xorm:"'convertfactor'"` // 标仓系数
  1003. Convertratio float64 `json:"convertratio" xorm:"'convertratio'"` // 折算系数
  1004. DELIVERYGOODSID int32 `json:"-" xorm:"'DELIVERYGOODSID'"` // 现货品种id
  1005. DELIVERYGOODSCODE string `json:"-" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  1006. DELIVERYGOODSNAME string `json:"-" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  1007. MGUNITID int32 `json:"mgunitid" xorm:"'MGUNITID'"` // 套保品种单位id
  1008. MGUNITIDNAME string `json:"mgunitidname"` // 套保品种单位名称
  1009. WRSTANDARDID int32 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 现货商品ID(SEQ_WRSTANDARD)
  1010. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 现货商品代码
  1011. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 现货商品名称
  1012. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 现货商品单位id
  1013. ENUMDICNAME string `json:"enumdicname" xorm:"'enumdicname'"` // 现货商品单位名称
  1014. }
  1015. func (r *Ermcp3ExposureDetail) calc() {
  1016. // 销售合同转换为负数
  1017. if r.Logtype == 2 && r.Contracttype == -1 {
  1018. r.ChangeQty *= -1
  1019. r.Qty *= -1
  1020. }
  1021. // 采购计划 转换为负数
  1022. if r.Logtype == 1 && r.Contracttype == 1 {
  1023. r.ChangeQty *= -1
  1024. r.Qty *= -1
  1025. }
  1026. r.MGUNITIDNAME = mtpcache.GetEnumDicitemName(r.MGUNITID)
  1027. }
  1028. func (r *Ermcp3ExposureDetail) buildSql() string {
  1029. var sqlId utils.SQLVal = `
  1030. select to_char(t.updatetime, 'yyyy-mm-dd hh24:mi:ss') createtime,
  1031. s.userid as areauserid,
  1032. 2 as LogType,
  1033. s.contracttype,
  1034. t.todaypricedqty qty,
  1035. to_char(s.spotcontractid) as relateid,
  1036. s.contractno as relateNo,
  1037. t.todaypricedqty * c.convertratio * (1 / (1 + nvl(w.vatrate, 0))) as changeQty,
  1038. m.middlegoodsid,
  1039. m.middlegoodsname,
  1040. m.middlegoodscode,
  1041. m.goodsunitid mgunitid,
  1042. w.wrstandardid,
  1043. w.wrstandardcode,
  1044. w.wrstandardname,
  1045. w.unitid,
  1046. e.enumdicname,
  1047. c.convertratio
  1048. from ERMCP_SCMiddleGoods t
  1049. inner join ermcp_spotcontract s
  1050. on t.spotcontractid = s.spotcontractid
  1051. left join erms_middlegoods m
  1052. on t.middlegoodsid = m.middlegoodsid
  1053. left join erms2_wrsconvertdetail c
  1054. on t.middlegoodsid = c.middlegoodsid
  1055. and t.wrstandardid = c.wrstandardid
  1056. left join wrstandard w
  1057. on t.wrstandardid = w.wrstandardid
  1058. left join enumdicitem e
  1059. on w.unitid = e.enumitemname
  1060. and e.enumdiccode = 'goodsunit'
  1061. left join erms2_wrsconvertdetail c
  1062. on t.middlegoodsid = c.middlegoodsid
  1063. and t.wrstandardid = c.wrstandardid
  1064. where 1 = 1 and t.todaypricedqty > 0
  1065. `
  1066. sqlId.And("s.userid", r.Areauserid)
  1067. sqlId.And("t.middlegoodsid", r.MiddlegoodsId)
  1068. return sqlId.String()
  1069. }
  1070. // GetDataEx 从数据库中查询数据
  1071. func (r *Ermcp3ExposureDetail) GetDataEx() (interface{}, error) {
  1072. e := db.GetEngine()
  1073. s := e.SQL(r.buildSql())
  1074. sData := make([]Ermcp3ExposureDetail, 0)
  1075. if err := s.Find(&sData); err != nil {
  1076. return nil, err
  1077. }
  1078. for i := range sData {
  1079. sData[i].calc()
  1080. }
  1081. return sData, nil
  1082. }
  1083. // Ermcp3AreaSpot 敞口现货头寸
  1084. type Ermcp3AreaSpot struct {
  1085. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构
  1086. ORIBUYPLANQTY float64 `json:"-" xorm:"'ORIBUYPLANQTY'"` // 期初采购计划数量
  1087. ORIBUYPRICEDQTY float64 `json:"-" xorm:"'ORIBUYPRICEDQTY'"` // 期初采购合同已定价数量
  1088. ORISELLPLANQTY float64 `json:"-" xorm:"'ORISELLPLANQTY'"` // 期初销售计划数量
  1089. ORISELLPRICEDQTY float64 `json:"-" xorm:"'ORISELLPRICEDQTY'"` // 期初销售合同已定价数量
  1090. BUYPLANQTY float64 `json:"-" xorm:"'BUYPLANQTY'"` // 采购计划数量
  1091. BUYPRICEDQTY float64 `json:"-" xorm:"'BUYPRICEDQTY'"` // 采购合同已定价数量
  1092. SELLPLANQTY float64 `json:"-" xorm:"'SELLPLANQTY'"` // 销售计划数量
  1093. SELLPRICEDQTY float64 `json:"-" xorm:"'SELLPRICEDQTY'"` // 销售合同已定价数量
  1094. TOTALSPOTQTY float64 `json:"totalspotqty" xorm:"'TOTALSPOTQTY'"` // 当前数量(现货头寸总量) = (销售计划数量 - 销售已定价数量) - (采购计划数量 - 采购已定价数量)
  1095. OriToalSpotQty float64 `json:"oritoalspotqty" xorm:"'OriToalSpotQty'"` // 昨日数量
  1096. IncreaseQty float64 `json:"increaseqty" xorm:"'IncreaseQty'"` // 增加数量=销售计划数量+采购已定价数量
  1097. DecreaseQty float64 `json:"decreaseqty" xorm:"'DecreaseQty'"` // 减少数量=-(销售已定价数量+采购计划数量)
  1098. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  1099. CONVERTRATIO float64 `json:"convertratio" xorm:"'CONVERTRATIO'"` // 套保系数
  1100. WRSTANDARDID int32 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 现货商品ID(SEQ_WRSTANDARD)
  1101. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 现货商品代码
  1102. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 现货商品名称
  1103. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 现货商品单位id
  1104. ENUMDICNAME string `json:"enumdicname"` // 单位名称
  1105. }
  1106. func (r *Ermcp3AreaSpot) calc() {
  1107. /*
  1108. 增加数量=今日销售计划数量+今日采购已定价数量
  1109. 减少数量=-(今日销售已定价数量+今日采购计划数量)
  1110. 其中,
  1111. 今日销售计划数量=期末销售计划数量-期初销售计划数量
  1112. 今日采购已定价数量=期末采购已定价数量-期初采购已定价数量
  1113. 今日销售已定价数量=期末销售已定价数量-期初销售已定价数量
  1114. 今日采购计划数量=期末采购计划数量-期初采购计划数量
  1115. */
  1116. r.OriToalSpotQty = (r.ORISELLPLANQTY - r.ORISELLPRICEDQTY) - (r.ORIBUYPLANQTY - r.ORIBUYPRICEDQTY)
  1117. r.TOTALSPOTQTY = (r.SELLPLANQTY - r.SELLPRICEDQTY) - (r.BUYPLANQTY - r.BUYPRICEDQTY)
  1118. r.IncreaseQty = r.SELLPLANQTY - r.ORISELLPLANQTY + r.BUYPRICEDQTY - r.ORIBUYPRICEDQTY
  1119. r.DecreaseQty = (r.SELLPRICEDQTY - r.ORISELLPRICEDQTY + r.BUYPLANQTY - r.ORIBUYPLANQTY) * -1
  1120. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  1121. }
  1122. func (r *Ermcp3AreaSpot) buildSql() string {
  1123. // 2021.11.22 现货量都一样,取其中一条即可, 加distinct去重, by deng.yinping
  1124. var sqlId utils.SQLVal = `
  1125. select distinct t.AREAUSERID,
  1126. t.ORIBUYPLANQTY,
  1127. t.ORIBUYPRICEDQTY,
  1128. t.ORISELLPLANQTY,
  1129. t.ORISELLPRICEDQTY,
  1130. t.BUYPLANQTY,
  1131. t.BUYPRICEDQTY,
  1132. t.SELLPLANQTY,
  1133. t.SELLPRICEDQTY,
  1134. w.wrstandardid,
  1135. w.wrstandardcode,
  1136. w.wrstandardname,
  1137. w.unitid
  1138. from ermcp_areamiddlesum t
  1139. left join wrstandard w
  1140. on t.wrstandardid = w.wrstandardid
  1141. where 1 = 1
  1142. `
  1143. sqlId.And("t.areauserid", r.AREAUSERID)
  1144. return sqlId.String()
  1145. }
  1146. // GetDataEx 从数据库中查询数据
  1147. func (r *Ermcp3AreaSpot) GetDataEx() (interface{}, error) {
  1148. e := db.GetEngine()
  1149. s := e.SQL(r.buildSql())
  1150. sData := make([]Ermcp3AreaSpot, 0)
  1151. if err := s.Find(&sData); err != nil {
  1152. return nil, err
  1153. }
  1154. for i := range sData {
  1155. sData[i].calc()
  1156. }
  1157. return sData, nil
  1158. }
  1159. // Ermcp3AreaSpotDetail 敞口->现货头寸->现货明细
  1160. type Ermcp3AreaSpotDetail struct {
  1161. Relatedid string `json:"relatedid" xorm:"'relatedid'"` // 套保计划ID/现货合同ID
  1162. Relatedno string `json:"relatedno" xorm:"'relatedno'"` // 编号
  1163. LogType int32 `json:"logtype" xorm:"'logType'"` // 记录类型 1-套保 2-现货合同
  1164. Contracttype int32 `json:"contracttype" xorm:"'contracttype'"` // 合同类型 1-采购 -1-销售
  1165. Qty float64 `json:"qty" xorm:"'qty'"` // 数量
  1166. Strtime string `json:"strtime" xorm:"'strtime'"` // 时间
  1167. Enumdicname string `json:"enumdicname"` // 现货商品单位名称
  1168. Recordname string `json:"recordname"` // 类型名称
  1169. CREATETIME string `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  1170. Unitid int32 `json:"-" xorm:"'UNITID'"` // 单位ID
  1171. UserId int64 `json:"-"` // 所属用户ID
  1172. WRSTANDARDID int32 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 现货商品ID(SEQ_WRSTANDARD)
  1173. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 现货商品代码
  1174. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 现货商品名称
  1175. }
  1176. func (r *Ermcp3AreaSpotDetail) calc() {
  1177. var logTypeName, contractTypeName string
  1178. if r.LogType == 1 {
  1179. logTypeName = "计划"
  1180. } else {
  1181. logTypeName = "合同"
  1182. }
  1183. if r.Contracttype == 1 {
  1184. contractTypeName = "采购"
  1185. } else {
  1186. contractTypeName = "销售"
  1187. }
  1188. // 销售合同 数量转为负数
  1189. if r.LogType == 2 && r.Contracttype == -1 {
  1190. if r.Qty > 0 {
  1191. r.Qty = r.Qty * -1
  1192. }
  1193. }
  1194. // 采购计划 数量转为负数
  1195. if r.LogType == 1 && r.Contracttype == 1 {
  1196. if r.Qty > 0 {
  1197. r.Qty = r.Qty * -1
  1198. }
  1199. }
  1200. r.Recordname = contractTypeName + logTypeName
  1201. r.Enumdicname = mtpcache.GetEnumDicitemName(r.Unitid)
  1202. }
  1203. func (r *Ermcp3AreaSpotDetail) buildSql() string {
  1204. var sqlId utils.SQLVal = `
  1205. select *
  1206. from (select to_char(t.hedgeplanid) as relatedid,
  1207. t.hedgeplanno relatedno,
  1208. 1 as LogType,
  1209. t.contracttype,
  1210. t.planqty qty,
  1211. to_char(t.audittime, 'yyyy-mm-dd hh24:mi:ss') createtime,
  1212. w.wrstandardid,
  1213. w.wrstandardcode,
  1214. w.wrstandardname,
  1215. w.unitid,
  1216. t.areauserid as userid
  1217. from ermcp_hedgeplan t
  1218. inner join wrstandard w
  1219. on t.wrstandardid = w.wrstandardid
  1220. where t.hedgeplanstatus in (2, 3, 5)
  1221. and t.tradedate = to_char(sysdate, 'yyyymmdd')
  1222. and t.areauserid = %v
  1223. and t.wrstandardid = %v
  1224. union all
  1225. select to_char(t.spotcontractid) as relatedid,
  1226. t.contractno relatedno,
  1227. 2 as LogType,
  1228. t.contracttype,
  1229. t.qty,
  1230. to_char(t.audittime, 'yyyy-mm-dd hh24:mi:ss') createtime,
  1231. w.wrstandardid,
  1232. w.wrstandardcode,
  1233. w.wrstandardname,
  1234. w.unitid,
  1235. t.userid
  1236. from ermcp_spotcontract t
  1237. inner join wrstandard w
  1238. on t.wrstandardid = w.wrstandardid
  1239. where t.userid = %v
  1240. and t.wrstandardid = %v
  1241. and t.contractstatus in (2, 3, 5)
  1242. and t.tradedate = to_char(sysdate, 'yyyymmdd')) a
  1243. order by a.createtime desc
  1244. `
  1245. sqlId.FormatParam(r.UserId, r.WRSTANDARDID, r.UserId, r.WRSTANDARDID)
  1246. return sqlId.String()
  1247. }
  1248. // GetDataEx 从数据库中查询数据
  1249. func (r *Ermcp3AreaSpotDetail) GetDataEx() (interface{}, error) {
  1250. e := db.GetEngine()
  1251. s := e.SQL(r.buildSql())
  1252. sData := make([]Ermcp3AreaSpotDetail, 0)
  1253. if err := s.Find(&sData); err != nil {
  1254. return nil, err
  1255. }
  1256. for i := range sData {
  1257. sData[i].calc()
  1258. }
  1259. return sData, nil
  1260. }
  1261. // Ermcp3Wrstandard 现货品类
  1262. type Ermcp3Wrstandard struct {
  1263. WRSTANDARDID int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 品类ID(SEQ_WRSTANDARD)
  1264. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  1265. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货品种ID
  1266. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 品类单位ID
  1267. MINIVALUE int32 `json:"minivalue" xorm:"'MINIVALUE'"` // 最小变动值
  1268. MINIVALUEDP int32 `json:"minivaluedp" xorm:"'MINIVALUEDP'"` // 最小变动值小数位
  1269. REALMINIVALUE int32 `json:"realminivalue" xorm:"'REALMINIVALUE'"` // 实际最小变动值
  1270. REALMINIVALUEDP int32 `json:"realminivaluedp" xorm:"'REALMINIVALUEDP'"` // 实际最小变动值小数位
  1271. CREATORID int64 `json:"creatorid" xorm:"'CREATORID'"` // 创建人
  1272. CREATETIME string `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  1273. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  1274. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构
  1275. EnumdicName string `json:"enumdicname"` // 品类单位名称
  1276. ISVALID int32 `json:"isvalid" xorm:"'ISVALID'"` // 是否有效 0-无效(停用) 1-有效(正常)
  1277. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  1278. REMARK string `json:"remark" xorm:"'REMARK'"` // 备注
  1279. CONVERTFACTOR float64 `json:"convertfactor" xorm:"'CONVERTFACTOR'"` // 标仓系数
  1280. CANTRADE int32 `json:"cantrade" xorm:"'CANTRADE'"` // 是否允许交易 - 0:不允许 1:允许 -1:未配置(数据库里没有记录)
  1281. }
  1282. func (r *Ermcp3Wrstandard) calc() {
  1283. r.EnumdicName = mtpcache.GetEnumDicitemName(r.UNITID)
  1284. }
  1285. func (r *Ermcp3Wrstandard) buildSql() string {
  1286. /*
  1287. 任务 #2587
  1288. 描述
  1289. 【Go查询服务】仓单贸易可交易现货商品查询变更:根据系统参数989判断
  1290. 1. 无989 或 989 = 0: 查询所有现货商品
  1291. 2. 989 = 1: 原逻辑查询本市场设置的现货商品(MarketSpotGoodsConfig)
  1292. --989: 仓单贸易是否限制商品交易 默认为0, 云融为1
  1293. */
  1294. sqlId := `
  1295. select t.WRSTANDARDID,
  1296. t.WRSTANDARDCODE,
  1297. t.DELIVERYGOODSID,
  1298. t.UNITID,
  1299. t.MINIVALUE,
  1300. t.MINIVALUEDP,
  1301. t.REALMINIVALUE,
  1302. t.REALMINIVALUEDP,
  1303. t.CREATORID,
  1304. to_char(t.CREATETIME, 'yyyy-mm-dd hh24:mi:ss') CREATETIME,
  1305. t.WRSTANDARDNAME,
  1306. t.ISVALID,
  1307. to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME,
  1308. t.REMARK,
  1309. t.CONVERTFACTOR,
  1310. t.AREAUSERID,
  1311. nvl(m.cantrade, 1) cantrade
  1312. from wrstandard t
  1313. left join marketspotgoodsconfig m
  1314. on t.wrstandardid = m.wrstandardid
  1315. and exists (select 1
  1316. from systemparam c
  1317. where c.paramcode = '989'
  1318. and c.paramvalue = '1')
  1319. where 1 = 1
  1320. `
  1321. if r.AREAUSERID > 0 {
  1322. sqlId += fmt.Sprintf(" and t.AREAUSERID=%v", r.AREAUSERID)
  1323. }
  1324. if r.DELIVERYGOODSID > 0 {
  1325. sqlId = sqlId + fmt.Sprintf(" and t.DELIVERYGOODSID=%v", r.DELIVERYGOODSID)
  1326. }
  1327. sqlId += " order by createtime desc"
  1328. return sqlId
  1329. }
  1330. // GetDataEx 从数据库中查询数据
  1331. func (r *Ermcp3Wrstandard) GetDataEx() (interface{}, error) {
  1332. e := db.GetEngine()
  1333. s := e.SQL(r.buildSql())
  1334. sData := make([]Ermcp3Wrstandard, 0)
  1335. if err := s.Find(&sData); err != nil {
  1336. return nil, err
  1337. }
  1338. for i := range sData {
  1339. sData[i].calc()
  1340. }
  1341. return sData, nil
  1342. }
  1343. // Ermcp3AreaStockApply 出入库申请
  1344. type Ermcp3AreaStockApply struct {
  1345. INOUTAPPLYID string `json:"inoutapplyid" xorm:"'INOUTAPPLYID'"` // 申请ID(607+Unix秒时间戳(10位)+xxxxxx)
  1346. USERID int64 `json:"userid" xorm:"'USERID'"` // 机构ID
  1347. INOUTTYPE int32 `json:"inouttype" xorm:"'INOUTTYPE'"` // 出入库类型 - 5:采购入库 6:销售出库 7:生产入库 8:生产出库
  1348. WRSTANDARDID int32 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 品类ID
  1349. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'"` // 现货品牌ID
  1350. SPOTCONTRACTID string `json:"spotcontractid" xorm:"'SPOTCONTRACTID'"` // 关联现货合同ID
  1351. WAREHOUSEINFOID string `json:"warehouseinfoid" xorm:"'WAREHOUSEINFOID'"` // 现货仓库ID
  1352. APPLYSTATUS int32 `json:"applystatus" xorm:"'APPLYSTATUS'"` // 申请状态 - 1:待审核 2:审核通过 3:审核拒绝 4:处理失败 5:已撤回
  1353. APPLYSRC int32 `json:"applysrc" xorm:"'APPLYSRC'"` // 申请来源 - 1:管理端 2:终端
  1354. APPLYID int64 `json:"applyid" xorm:"'APPLYID'"` // 申请人
  1355. APPLYREMARK string `json:"applyremark" xorm:"'APPLYREMARK'"` // 申请备注
  1356. APPLYTIME string `json:"applytime" xorm:"'APPLYTIME'"` // 申请时间
  1357. AUDITSRC int32 `json:"auditsrc" xorm:"'AUDITSRC'"` // 审核来源 - 1:管理端 2:终端
  1358. AUDITID int64 `json:"auditid" xorm:"'AUDITID'"` // 审核人
  1359. AUDITTIME string `json:"audittime" xorm:"'AUDITTIME'"` // 审核时间
  1360. AUDITREMARK string `json:"auditremark" xorm:"'AUDITREMARK'"` // 审核备注
  1361. AUDITTRADEDATE string `json:"audittradedate" xorm:"'AUDITTRADEDATE'"` // 审核交易日(yyyyMMdd)
  1362. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  1363. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  1364. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 单位id
  1365. BRANDNAME string `json:"brandname" xorm:"'BRANDNAME'"` // 品牌名称
  1366. WAREHOUSENAME string `json:"warehousename" xorm:"'WAREHOUSENAME'"` // 仓库名称
  1367. WAREHOUSECODE string `json:"warehousecode" xorm:"'WAREHOUSECODE'"` // 仓库代码
  1368. WAREHOUSETYPE int32 `json:"warehousetype" xorm:"'WAREHOUSETYPE'"` // 仓库类型 - 1 厂库 2 自有库 3 合作库
  1369. CONTRACTNO string `json:"contractno" xorm:"'CONTRACTNO'"` // 合同编号
  1370. CONTRACTTYPE int32 `json:"contracttype" xorm:"'CONTRACTTYPE'"` // 现货合同类型 - 1:采购 -1:销售
  1371. BUYUSERID int64 `json:"buyuserid" xorm:"'BUYUSERID'"` // 采购方userid
  1372. SELLUSERID int64 `json:"selluserid" xorm:"'SELLUSERID'"` // 销售方userid
  1373. PRICETYPE int32 `json:"pricetype" xorm:"'PRICETYPE'"` // 定价类型 - 1:一口价 2:点价 3:暂定价
  1374. CONTRACTQTY float64 `json:"contractqty" xorm:"'CONTRACTQTY'"` // 合同量
  1375. DETAILJSON string `json:"detailjson" xorm:"'DETAILJSON'"` // 明细数据
  1376. BUYUSERNAME string `json:"buyusername"` // 采购方名称
  1377. SELLUSERNAME string `json:"sellusername"` // 销售方名称
  1378. APPLYNAME string `json:"applyname"` // 申请人名称
  1379. AUDITNAME string `json:"auditname"` // 审核人名称
  1380. ENUMDICNAME string `json:"enumdicname"` // 现货商品单位名称
  1381. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货品种id
  1382. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  1383. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  1384. BUYNICKNAME string `json:"buynickname"` // 采购方昵称
  1385. SELLNICKNAME string `json:"sellnickname"` // 销售方昵称
  1386. QTY float64 `json:"qty"` // 数量
  1387. FilterStatus string `json:"-"` // 查询条件, 申请状态, 逗号隔开
  1388. FilterType string `json:"-"` // 查询条件, 出入库类型, 逗号隔开
  1389. BeginDate string `json:"-"` // 开始日期
  1390. EndDate string `json:"-"` // 结束日期
  1391. UserType int32 `json:"-"` // 用户类型
  1392. }
  1393. func (r *Ermcp3AreaStockApply) calc() {
  1394. // 采购方名称
  1395. r.BUYUSERNAME, r.BUYNICKNAME = mtpcache.GetUserNameAndNickName(r.BUYUSERID)
  1396. // 销售方名称
  1397. r.SELLUSERNAME, r.SELLNICKNAME = mtpcache.GetUserNameAndNickName(r.SELLUSERID)
  1398. // 申请人名称
  1399. if r.APPLYSRC == 1 {
  1400. r.APPLYNAME = mtpcache.GetSystemmangerLoginCode(r.APPLYID)
  1401. } else {
  1402. r.APPLYNAME = mtpcache.GetLoginCodeByLoginId(r.APPLYID)
  1403. }
  1404. // 审核人名称
  1405. if r.AUDITSRC == 1 {
  1406. r.AUDITNAME = mtpcache.GetSystemmangerLoginCode(r.AUDITID)
  1407. } else {
  1408. r.AUDITNAME = mtpcache.GetLoginCodeByLoginId(r.AUDITID)
  1409. }
  1410. // 单位名称
  1411. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  1412. if len(r.DETAILJSON) > 0 {
  1413. // 解析qty字段
  1414. req := struct {
  1415. QTY float64 `json:"InOutQty"` // 数量
  1416. }{}
  1417. if json.Unmarshal([]byte(r.DETAILJSON), &req) == nil {
  1418. r.QTY = req.QTY
  1419. }
  1420. }
  1421. }
  1422. func (r *Ermcp3AreaStockApply) buildSql() string {
  1423. var sqlId utils.SQLVal = "SELECT to_char(t.operateapplyid) INOUTAPPLYID," +
  1424. " t.USERID," +
  1425. " t.operateapplytype INOUTTYPE," +
  1426. " t.WRSTANDARDID," +
  1427. " t.SPOTGOODSBRANDID," +
  1428. " t.DELIVERYGOODSID," +
  1429. " to_char(t.relatedid) SPOTCONTRACTID," +
  1430. " to_char(t.WAREHOUSEINFOID) WAREHOUSEINFOID," +
  1431. " to_char(t.detailjson) detailjson," +
  1432. " t.APPLYSTATUS," +
  1433. " t.APPLYSRC," +
  1434. " t.APPLYID," +
  1435. " t.remark APPLYREMARK," +
  1436. " to_char(t.APPLYTIME, 'yyyy-mm-dd hh24:mi:ss') APPLYTIME," +
  1437. " t.AUDITSRC," +
  1438. " t.AUDITID," +
  1439. " to_char(t.AUDITTIME, 'yyyy-mm-dd hh24:mi:ss') AUDITTIME," +
  1440. " t.AUDITREMARK," +
  1441. " t.AUDITTRADEDATE," +
  1442. " w.wrstandardname," +
  1443. " w.wrstandardcode," +
  1444. " w.unitid," +
  1445. " gb.dgfactoryitemvalue brandname," +
  1446. " h.warehousename," +
  1447. " h.warehousecode," +
  1448. " h.warehousetype," +
  1449. " s.contractno," +
  1450. " s.contracttype," +
  1451. " s.buyuserid," +
  1452. " s.selluserid," +
  1453. " s.pricetype," +
  1454. " s.qty CONTRACTQTY," +
  1455. " g.deliverygoodscode," +
  1456. " g.deliverygoodsname" +
  1457. " FROM ermcp_contractoperateapply t" +
  1458. " left join wrstandard w" +
  1459. " on t.wrstandardid = w.wrstandardid" +
  1460. " left join dgfactoryitem gb" +
  1461. " on t.spotgoodsbrandid = gb.dgfactoryitemid" +
  1462. " left join deliverygoods g" +
  1463. " on t.deliverygoodsid = g.deliverygoodsid" +
  1464. " left join warehouseinfo h" +
  1465. " on t.warehouseinfoid = h.autoid" +
  1466. " left join ermcp_spotcontract s" +
  1467. " on t.relatedid = s.spotcontractid" +
  1468. " WHERE t.operateapplytype in(5,6,7,8)"
  1469. areaUserId := mtpcache.GetAreaUserId(r.USERID, r.UserType)
  1470. if areaUserId == r.USERID {
  1471. // 机构用户
  1472. sqlId.And("t.USERID", r.USERID)
  1473. } else {
  1474. if r.INOUTTYPE == 7 || r.INOUTTYPE == 8 {
  1475. // 生产出入库, 没有相关合同
  1476. sqlId.And("t.USERID", r.USERID)
  1477. } else {
  1478. sqlId.Join(fmt.Sprintf(" and %v in(s.saleuserid, s.tradeuserid, s.meruserid)", r.USERID))
  1479. }
  1480. }
  1481. // 合同id
  1482. sqlId.AndInterEx("t.RELATEDID", r.SPOTCONTRACTID, len(r.SPOTCONTRACTID) > 0)
  1483. // 现货品种id
  1484. if r.DELIVERYGOODSID > 0 {
  1485. sqlId.And("t.DELIVERYGOODSID", r.DELIVERYGOODSID)
  1486. }
  1487. // 品类id
  1488. if r.WRSTANDARDID > 0 {
  1489. sqlId.And("t.WRSTANDARDID", r.WRSTANDARDID)
  1490. }
  1491. // 品牌id
  1492. if r.SPOTGOODSBRANDID > 0 {
  1493. sqlId.And("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID)
  1494. }
  1495. // 仓库id
  1496. sqlId.AndInterEx("t.WAREHOUSEINFOID", r.WAREHOUSEINFOID, len(r.WAREHOUSEINFOID) > 0)
  1497. // 日期范围
  1498. if len(r.BeginDate) > 0 {
  1499. if r.BeginDate == r.EndDate {
  1500. sqlId.And("t.tradedate", r.BeginDate)
  1501. } else if r.EndDate > r.BeginDate {
  1502. sqlId.BiggerOrEq("t.tradedate", r.BeginDate)
  1503. sqlId.LessOrEq("t.tradedate", r.EndDate)
  1504. }
  1505. }
  1506. // 出入库类型
  1507. if len(r.FilterType) > 0 {
  1508. // 原INOUTTYPE 1,2,3,4 转为 新表 5,6,7,8
  1509. r.FilterType = strings.ReplaceAll(r.FilterType, "1", "5")
  1510. r.FilterType = strings.ReplaceAll(r.FilterType, "2", "6")
  1511. r.FilterType = strings.ReplaceAll(r.FilterType, "3", "7")
  1512. r.FilterType = strings.ReplaceAll(r.FilterType, "4", "8")
  1513. if len(r.FilterType) == 1 {
  1514. sqlId.AndInterEx("t.OPERATEAPPLYTYPE", r.FilterType, true)
  1515. } else {
  1516. sqlId.Join(fmt.Sprintf(" and t.OPERATEAPPLYTYPE in(%v)", r.FilterType))
  1517. }
  1518. }
  1519. // 出入库状态
  1520. if len(r.FilterStatus) > 0 {
  1521. sqlId.Join(fmt.Sprintf(" and t.APPLYSTATUS in(%v)", r.FilterStatus))
  1522. }
  1523. // 排序
  1524. sqlId.Join(" order by t.APPLYTIME desc")
  1525. return sqlId.String()
  1526. }
  1527. // GetDataEx 查询库存申请(记录)
  1528. func (r *Ermcp3AreaStockApply) GetDataEx() (interface{}, error) {
  1529. sData := make([]Ermcp3AreaStockApply, 0)
  1530. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1531. if err == nil {
  1532. for i := range sData {
  1533. sData[i].calc()
  1534. }
  1535. }
  1536. return sData, err
  1537. }
  1538. // Ermcp3AreaStockApplySum 合同出入库数量汇总
  1539. type Ermcp3AreaStockApplySum struct {
  1540. INOUTTYPE int32 `json:"inouttype" xorm:"'INOUTTYPE'"` // 出入库类型 - 5:采购入库 6:销售出库 7:生产入库 8:生产出库
  1541. WRSTANDARDID int32 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 品类id
  1542. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'"` // 品牌id
  1543. BRANDNAME string `json:"brandname" xorm:"'BRANDNAME'"` // 品牌名称
  1544. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  1545. TOTALQTY float64 `json:"totalqty" xorm:"'TOTALQTY'"` // 总数量
  1546. SPOTCONTRACTID string `json:"spotcontractid" xorm:"'relatedid'"` // 关联现货合同ID
  1547. DETAILJSON string `json:"-" xorm:"'DETAILJSON'"` // 出入库数量
  1548. Key string `json:"-"` // 汇总主键
  1549. }
  1550. // Calc 计算和处理
  1551. func (r *Ermcp3AreaStockApplySum) Calc() {
  1552. if len(r.DETAILJSON) > 0 {
  1553. // 解析qty字段
  1554. req := struct {
  1555. QTY float64 `json:"InOutQty"` // 数量
  1556. }{}
  1557. if json.Unmarshal([]byte(r.DETAILJSON), &req) == nil {
  1558. r.TOTALQTY = req.QTY
  1559. }
  1560. }
  1561. r.Key = fmt.Sprintf("%v_%v_%v", r.INOUTTYPE, r.WRSTANDARDID, r.SPOTGOODSBRANDID)
  1562. }
  1563. func (r *Ermcp3AreaStockApplySum) buildSql() string {
  1564. var sqlId utils.SQLVal = "select t.detailjson," +
  1565. " t.operateapplytype INOUTTYPE," +
  1566. " t.wrstandardid," +
  1567. " t.relatedid," +
  1568. " t.spotgoodsbrandid," +
  1569. " gb.dgfactoryitemvalue brandname," +
  1570. " w.wrstandardcode," +
  1571. " w.wrstandardname" +
  1572. " from ermcp_contractoperateapply t" +
  1573. " left join dgfactoryitem gb" +
  1574. " on t.spotgoodsbrandid = gb.dgfactoryitemid" +
  1575. " left join wrstandard w" +
  1576. " on t.wrstandardid = w.wrstandardid" +
  1577. " where t.applystatus = 2 and t.operateapplytype in (5, 6)"
  1578. sqlId.And("t.relatedid", r.SPOTCONTRACTID)
  1579. return sqlId.String()
  1580. }
  1581. // GetDataEx 获取合同出入库汇总信息
  1582. func (r *Ermcp3AreaStockApplySum) GetDataEx() (interface{}, error) {
  1583. sData := make([]Ermcp3AreaStockApplySum, 0)
  1584. if err := db.GetEngine().SQL(r.buildSql()).Find(&sData); err == nil {
  1585. mSum := map[string]Ermcp3AreaStockApplySum{}
  1586. for i := range sData {
  1587. sData[i].Calc()
  1588. // 按品牌+品类+出入库类型 汇总
  1589. if d, ok := mSum[sData[i].Key]; ok {
  1590. d.TOTALQTY += sData[i].TOTALQTY
  1591. mSum[sData[i].Key] = d
  1592. } else {
  1593. mSum[sData[i].Key] = sData[i]
  1594. }
  1595. }
  1596. if len(mSum) > 0 {
  1597. sData = make([]Ermcp3AreaStockApplySum, 0)
  1598. for _, v := range mSum {
  1599. sData = append(sData, v)
  1600. }
  1601. }
  1602. }
  1603. return sData, nil
  1604. }
  1605. // Ermcp3AreaStock 机构库存表
  1606. type Ermcp3AreaStock struct {
  1607. TODAYBUYINQTY float64 `json:"todaybuyinqty" xorm:"'TODAYBUYINQTY'"` // 今日采购入库量
  1608. TODAYPRODUCEINQTY float64 `json:"todayproduceinqty" xorm:"'TODAYPRODUCEINQTY'"` // 今日生产入库量
  1609. TODAYSELLOUTQTY float64 `json:"todayselloutqty" xorm:"'TODAYSELLOUTQTY'"` // 今日销售出库量
  1610. TODAYPRODUCEOUTQTY float64 `json:"todayproduceoutqty" xorm:"'TODAYPRODUCEOUTQTY'"` // 今日生产出库量
  1611. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  1612. USERID int64 `json:"userid" xorm:"'USERID'" form:"userid" binding:"required"` // 机构ID
  1613. WRSTANDARDID string `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 品类ID
  1614. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'"` // 现货品牌ID
  1615. WAREHOUSEINFOID string `json:"warehouseinfoid" xorm:"'WAREHOUSEINFOID'"` // 仓库ID
  1616. ORISTOCK float64 `json:"oristock" xorm:"'ORISTOCK'"` // 期初库存量(昨日量)
  1617. CURSTOCK float64 `json:"curstock" xorm:"'CURSTOCK'"` // 期末库存量(今日量)
  1618. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  1619. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  1620. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 单位id
  1621. BRANDNAME string `json:"brandname" xorm:"'BRANDNAME'"` // 品牌名称
  1622. WAREHOUSENAME string `json:"warehousename" xorm:"'WAREHOUSENAME'"` // 仓库名称
  1623. WAREHOUSECODE string `json:"warehousecode" xorm:"'WAREHOUSECODE'"` // 仓库代码
  1624. WAREHOUSETYPE int32 `json:"warehousetype" xorm:"'WAREHOUSETYPE'"` // 仓库类型 - 1 厂库 2 自有库 3 合作库
  1625. USERNAME string `json:"username"` // 机构名称
  1626. ENUMDICNAME string `json:"enumdicname"` // 单位名称
  1627. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货品种id
  1628. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  1629. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  1630. GOODSUNITID int32 `json:"goodsunitid" xorm:"'GOODSUNITID'"` // 现货商品单位id
  1631. }
  1632. func (r *Ermcp3AreaStock) calc() {
  1633. r.USERNAME = mtpcache.GetUserNameByUserId(r.USERID)
  1634. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  1635. }
  1636. func (r *Ermcp3AreaStock) buildSql() string {
  1637. var sqlId utils.SQLVal = "SELECT t.TODAYBUYINQTY," +
  1638. " t.TODAYPRODUCEINQTY," +
  1639. " t.TODAYSELLOUTQTY," +
  1640. " t.TODAYPRODUCEOUTQTY," +
  1641. " to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME," +
  1642. " t.USERID," +
  1643. " t.WRSTANDARDID," +
  1644. " t.SPOTGOODSBRANDID," +
  1645. " t.WAREHOUSEINFOID," +
  1646. " t.DELIVERYGOODSID," +
  1647. " t.ORISTOCK," +
  1648. " t.CURSTOCK," +
  1649. " w.wrstandardname," +
  1650. " w.wrstandardcode," +
  1651. " w.unitid," +
  1652. " gb.dgfactoryitemvalue brandname," +
  1653. " h.warehousename," +
  1654. " h.warehousecode," +
  1655. " h.warehousetype," +
  1656. " g.deliverygoodsid," +
  1657. " g.deliverygoodscode," +
  1658. " g.deliverygoodsname," +
  1659. " g.goodsunitid" +
  1660. " FROM ERMCP_AREASTOCK t" +
  1661. " LEFT JOIN WRSTANDARD w" +
  1662. " on t.wrstandardid = w.wrstandardid" +
  1663. " LEFT JOIN dgfactoryitem gb" +
  1664. " on t.spotgoodsbrandid = gb.dgfactoryitemid" +
  1665. " LEFT JOIN deliverygoods g" +
  1666. " on t.deliverygoodsid = g.deliverygoodsid" +
  1667. " LEFT JOIN WAREHOUSEINFO h" +
  1668. " on t.warehouseinfoid = h.autoid" +
  1669. " WHERE 1 = 1"
  1670. sqlId.And("t.USERID", r.USERID)
  1671. sqlId.Join(" order by t.WRSTANDARDID, t.UPDATETIME desc")
  1672. return sqlId.String()
  1673. }
  1674. // GetDataEx 获取机构库存信息
  1675. func (r *Ermcp3AreaStock) GetDataEx() (interface{}, error) {
  1676. sData := make([]Ermcp3AreaStock, 0)
  1677. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1678. if err == nil {
  1679. for i := range sData {
  1680. sData[i].calc()
  1681. }
  1682. }
  1683. return sData, err
  1684. }
  1685. // Ermcp3SpotGoodsPrice 现货市价
  1686. type Ermcp3SpotGoodsPrice struct {
  1687. WRSTANDARDID int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 现货品类ID(通用则为0)
  1688. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'"` // 现货品牌ID(通用则为0, 不为0则须先有品类ID)
  1689. CURRENCYID int32 `json:"currencyid" xorm:"'CURRENCYID'"` // 报价货币ID
  1690. SPOTGOODSPRICE float64 `json:"spotgoodsprice" xorm:"'SPOTGOODSPRICE'"` // 现货价格
  1691. TRADEDATE string `json:"tradedate" xorm:"'TRADEDATE'"` // 交易日(yyyyMMdd)
  1692. OPERATESRC int32 `json:"operatesrc" xorm:"'OPERATESRC'"` // 最后操作来源 - 1:管理端 2:终端
  1693. OPERATEID int64 `json:"operateid" xorm:"'OPERATEID'"` // 最后操作人
  1694. OPERATETIME string `json:"operatetime" xorm:"'OPERATETIME'"` // 最后操作时间
  1695. ISVALID int32 `json:"isvalid" xorm:"'ISVALID'"` // 是否有效 - 0:无效 1:有效
  1696. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构id
  1697. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  1698. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  1699. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 现货商品单位id
  1700. BRANDNAME string `json:"brandname" xorm:"'BRANDNAME'"` // 品牌名称
  1701. GMUNITID int32 `json:"gmunitid" xorm:"'GMUNITID'"` // 品类单位id
  1702. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货商品id
  1703. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货商品代码
  1704. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货商品名称
  1705. OPERATORNAME string `json:"operatorname"` // 操作人名称
  1706. ENUMDICNAME string `json:"enumdicname"` // 现货商品单位名称
  1707. GBENUMDICNAME string `json:"gbenumdicname"` // 品类单位名称
  1708. CURRENCYNAME string `json:"currencyname"` // 币种名称
  1709. }
  1710. func (r *Ermcp3SpotGoodsPrice) calc() {
  1711. if r.OPERATESRC == 1 {
  1712. r.OPERATORNAME = mtpcache.GetSystemmangerLoginCode(r.OPERATEID)
  1713. } else {
  1714. r.OPERATORNAME = mtpcache.GetLoginCodeByLoginId(r.OPERATEID)
  1715. }
  1716. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  1717. r.GBENUMDICNAME = mtpcache.GetEnumDicitemName(r.GMUNITID)
  1718. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  1719. }
  1720. func (r *Ermcp3SpotGoodsPrice) buildSql() string {
  1721. var sqlId utils.SQLVal = "SELECT t.WRSTANDARDID," +
  1722. " t.SPOTGOODSBRANDID," +
  1723. " t.CURRENCYID," +
  1724. " t.SPOTGOODSPRICE," +
  1725. " t.TRADEDATE," +
  1726. " t.OPERATESRC," +
  1727. " t.OPERATEID," +
  1728. " to_char(t.OPERATETIME, 'yyyy-mm-dd hh24:mi:ss') OPERATETIME," +
  1729. " t.ISVALID," +
  1730. " w.areauserid," +
  1731. " w.wrstandardcode," +
  1732. " w.wrstandardname," +
  1733. " w.unitid gmunitid," +
  1734. " gb.dgfactoryitemvalue brandname," +
  1735. " g.deliverygoodsid," +
  1736. " g.deliverygoodscode," +
  1737. " g.deliverygoodsname," +
  1738. " g.goodsunitid unitid" +
  1739. " FROM ERMCP_SPOTGOODSPRICE t" +
  1740. " left join wrstandard w" +
  1741. " on t.wrstandardid = w.wrstandardid" +
  1742. " left join dgfactoryitem gb" +
  1743. " on t.spotgoodsbrandid = gb.dgfactoryitemid" +
  1744. " left join deliverygoods g" +
  1745. " on t.deliverygoodsid = g.deliverygoodsid" +
  1746. " WHERE 1 = 1"
  1747. sqlId.And("w.areauserid", r.AREAUSERID)
  1748. return sqlId.String()
  1749. }
  1750. // GetDataEx 获取现货市价
  1751. func (r *Ermcp3SpotGoodsPrice) GetDataEx() (interface{}, error) {
  1752. sData := make([]Ermcp3SpotGoodsPrice, 0)
  1753. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1754. if err == nil {
  1755. for i := range sData {
  1756. sData[i].calc()
  1757. }
  1758. }
  1759. return sData, err
  1760. }
  1761. // Ermcp3SpotGoodsPriceLog 现货市价操作日志
  1762. type Ermcp3SpotGoodsPriceLog struct {
  1763. LOGID int64 `json:"logid" xorm:"'LOGID'"` // 日志id
  1764. WRSTANDARDID int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 现货品类ID(通用则为0)
  1765. SPOTGOODSBRANDID int32 `json:"spotgoodsbrandid" xorm:"'SPOTGOODSBRANDID'"` // 现货品牌ID(通用则为0, 不为0则须先有品类ID)
  1766. CURRENCYID int64 `json:"currencyid" xorm:"'CURRENCYID'"` // 报价货币ID
  1767. SPOTGOODSPRICE float64 `json:"spotgoodsprice" xorm:"'SPOTGOODSPRICE'"` // 现货价格
  1768. TRADEDATE string `json:"tradedate" xorm:"'TRADEDATE'"` // 交易日(yyyyMMdd)
  1769. OPERATESRC int32 `json:"operatesrc" xorm:"'OPERATESRC'"` // 最后操作来源 - 1:管理端 2:终端
  1770. OPERATEID int64 `json:"operateid" xorm:"'OPERATEID'"` // 最后操作人
  1771. OPERATETIME string `json:"operatetime" xorm:"'OPERATETIME'"` // 最后操作时间
  1772. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构id
  1773. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  1774. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  1775. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 现货商品单位id
  1776. BRANDNAME string `json:"brandname" xorm:"'BRANDNAME'"` // 品牌名称
  1777. GMUNITID int32 `json:"gmunitid" xorm:"'GMUNITID'"` // 品类单位id
  1778. DELIVERYGOODSID int32 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货商品id
  1779. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货商品代码
  1780. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货商品名称
  1781. OPERATORNAME string `json:"operatorname"` // 操作人名称
  1782. ENUMDICNAME string `json:"enumdicname"` // 现货商品单位名称
  1783. GBENUMDICNAME string `json:"gbenumdicname"` // 品类单位名称
  1784. }
  1785. func (r *Ermcp3SpotGoodsPriceLog) calc() {
  1786. if r.OPERATESRC == 1 {
  1787. r.OPERATORNAME = mtpcache.GetSystemmangerLoginCode(r.OPERATEID)
  1788. } else {
  1789. r.OPERATORNAME = mtpcache.GetLoginCodeByLoginId(r.OPERATEID)
  1790. }
  1791. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  1792. r.GBENUMDICNAME = mtpcache.GetEnumDicitemName(r.GMUNITID)
  1793. }
  1794. func (r *Ermcp3SpotGoodsPriceLog) buildSql() string {
  1795. var sqlId utils.SQLVal = "SELECT t.WRSTANDARDID," +
  1796. " t.SPOTGOODSBRANDID," +
  1797. " t.CURRENCYID," +
  1798. " t.SPOTGOODSPRICE," +
  1799. " t.TRADEDATE," +
  1800. " t.OPERATESRC," +
  1801. " t.OPERATEID," +
  1802. " to_char(t.OPERATETIME, 'yyyy-mm-dd hh24:mi:ss') OPERATETIME," +
  1803. " t.LOGID," +
  1804. " w.areauserid," +
  1805. " w.wrstandardcode," +
  1806. " w.wrstandardname," +
  1807. " w.unitid gmunitid," +
  1808. " gb.dgfactoryitemvalue brandname," +
  1809. " g.goodsunitid unitid ," +
  1810. " g.deliverygoodsid," +
  1811. " g.deliverygoodscode," +
  1812. " g.deliverygoodsname" +
  1813. " FROM ERMCP_SPOTGOODSPRICELOG t" +
  1814. " left join wrstandard w" +
  1815. " on t.wrstandardid = w.wrstandardid" +
  1816. " left join dgfactoryitem gb" +
  1817. " on t.spotgoodsbrandid = gb.dgfactoryitemid" +
  1818. " left join deliverygoods g" +
  1819. " on t.deliverygoodsid = g.deliverygoodsid" +
  1820. " WHERE 1 = 1"
  1821. sqlId.And("w.areauserid", r.AREAUSERID)
  1822. sqlId.And("t.deliverygoodsid", r.DELIVERYGOODSID)
  1823. sqlId.AndEx("t.SPOTGOODSBRANDID", r.SPOTGOODSBRANDID, r.SPOTGOODSBRANDID > 0)
  1824. sqlId.AndEx("t.wrstandardid", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  1825. return sqlId.String()
  1826. }
  1827. // GetDataEx 获取现货市价信息日志
  1828. func (r *Ermcp3SpotGoodsPriceLog) GetDataEx() (interface{}, error) {
  1829. sData := make([]Ermcp3SpotGoodsPriceLog, 0)
  1830. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  1831. if err == nil {
  1832. for i := range sData {
  1833. sData[i].calc()
  1834. }
  1835. }
  1836. return sData, err
  1837. }
  1838. // Ermcp3HedgePlan 套保计划表结构
  1839. type Ermcp3HedgePlan struct {
  1840. Areauserid int64 `json:"areauserid" xorm:"'Areauserid'"` // 用户ID
  1841. Hedgeplanid string `json:"hedgeplanid" xorm:"'Hedgeplanid'"` // 套保计划ID(601+Unix秒时间戳(10位)+xxxxxx)
  1842. Hedgeplanno string `json:"hedgeplanno" xorm:"'Hedgeplanno'"` // 套保计划编号(名称)
  1843. Contracttype int `json:"contracttype" xorm:"'Contracttype'"` // 计划类型 - 1:采购 -1:销售
  1844. Deliverygoodsid int `json:"deliverygoodsid" xorm:"'Deliverygoodsid'"` // 现货品种ID
  1845. Deliverygoodsname string `json:"deliverygoodsname" xorm:"'Deliverygoodsname'"` // 现货品种名称
  1846. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  1847. Producttype int `json:"producttype" xorm:"'Producttype'"` // 产品类型 - 1:标准仓单 2:等标 3:非标
  1848. Spotgoodsdesc string `json:"spotgoodsdesc" xorm:"'Spotgoodsdesc'"` // 商品型号
  1849. Planqty float64 `json:"planqty" xorm:"'Planqty'"` // 计划数量
  1850. Convertfactor float64 `json:"convertfactor" xorm:"'Convertfactor'"` // 标仓系数
  1851. Plantime string `json:"plantime" xorm:"'Plantime'"` // 计划时间
  1852. Hedgeplanstatus int `json:"hedgeplanstatus" xorm:"'Hedgeplanstatus'"` // 套保计划状态 - 0:未提交 1:待审核 2:执行中 3:正常完结 4:审核拒绝 5:异常完结 6:已撤回
  1853. Remark string `json:"remark" xorm:"'Remark'"` // 备注
  1854. CREATETIME string `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  1855. UPDATETIME string `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间
  1856. AUDITTIME string `json:"audittime" xorm:"'AUDITTIME'"` // 审核时间
  1857. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 单位id(现货商品)
  1858. ENUMDICNAME string `json:"enumdicname"` // 单位名称(现货商品)
  1859. WRSTANDARDID int32 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 品类id
  1860. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 品类代码
  1861. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 品类名称
  1862. ACCOUNTID int64 `json:"accountid" xorm:"'ACCOUNTID'"` // 资金账号
  1863. TAACCOUNTNAME string `json:"taaccountname" xorm:"'TAACCOUNTNAME'"` // 资金账号名称
  1864. TRADEUSERID int64 `json:"tradeuserid" xorm:"'TRADEUSERID'"` // 交易用户id
  1865. CURRENCYID int32 `json:"currencyid" xorm:"'CURRENCYID'"` // 币种id
  1866. WRUNITID int32 `json:"wrunitid" xorm:"'WRUNITID'"` // 品类单位id
  1867. AUDITID int64 `json:"auditid" xorm:"'auditid'"` // 审核id
  1868. AUDITSRC int32 `json:"auditsrc" xorm:"'AUDITSRC'"` // 审核来源 1-管理端 2-终端
  1869. AUDITREMARK string `json:"auditremark" xorm:"'auditremark'"` // 审核备注
  1870. AUDITNAME string `json:"auditname" xorm:"'AUDITNAME'"` // 审核人名称
  1871. VATRATE float64 `json:"vatrate" xorm:"'VATRATE'"` // 增值税率
  1872. WRUNITIDNAME string `json:"wrunitidame"` // 品类单位名称
  1873. TRADEUSERNAME string `json:"tradeusername"` // 交易用户名称
  1874. CURRENCYNAME string `json:"currencyname"` // 币种名称
  1875. UserType int32 `json:"-"` // 过滤条件, 用户类型
  1876. }
  1877. func (r *Ermcp3HedgePlan) calc() {
  1878. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.UNITID)
  1879. r.TRADEUSERNAME = mtpcache.GetUserNameByUserId(r.TRADEUSERID)
  1880. r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
  1881. if r.WRUNITID > 0 {
  1882. r.WRUNITIDNAME = mtpcache.GetEnumDicitemName(r.WRUNITID)
  1883. }
  1884. if r.AUDITSRC == 1 {
  1885. if r.AUDITNAME == "" && r.AUDITID > 0 {
  1886. r.AUDITNAME = mtpcache.GetSystemmangerLoginCode(r.AUDITID)
  1887. }
  1888. }
  1889. }
  1890. func (r *Ermcp3HedgePlan) buildSql(status string) string {
  1891. str := "select to_char(t.Hedgeplanid) Hedgeplanid," +
  1892. " t.Hedgeplanno," +
  1893. " t.Contracttype," +
  1894. " t.Deliverygoodsid," +
  1895. " g.Deliverygoodsname," +
  1896. " g.deliverygoodscode," +
  1897. " g.goodsunitid unitid," +
  1898. " t.Producttype," +
  1899. " t.Spotgoodsdesc," +
  1900. " t.Planqty," +
  1901. " t.Convertfactor," +
  1902. " to_char(t.Plantime, 'yyyy-mm-dd hh24:mi:ss') Plantime," +
  1903. " to_char(t.createtime, 'yyyy-mm-dd hh24:mi:ss') createtime," +
  1904. " to_char(t.updatetime, 'yyyy-mm-dd hh24:mi:ss') updatetime," +
  1905. " to_char(t.audittime, 'yyyy-mm-dd hh24:mi:ss') audittime," +
  1906. " t.Hedgeplanstatus," +
  1907. " t.Remark," +
  1908. " t.wrstandardid," +
  1909. " w.wrstandardcode," +
  1910. " w.wrstandardname," +
  1911. " w.unitid wrunitid," +
  1912. " w.vatrate," +
  1913. " t.accountid," +
  1914. " t.tradeuserid," +
  1915. " t.currencyid," +
  1916. " t.auditid," +
  1917. " t.auditsrc," +
  1918. " t.auditremark," +
  1919. " ta.accountname taaccountname," +
  1920. " l.accountname auditname" +
  1921. " from ermcp_hedgeplan t" +
  1922. " left join deliverygoods g" +
  1923. " on t.deliverygoodsid = g.deliverygoodsid" +
  1924. " left join wrstandard w" +
  1925. " on t.wrstandardid = w.wrstandardid" +
  1926. " left join taaccount ta" +
  1927. " on t.accountid = ta.accountid" +
  1928. " left join loginaccount l on t.auditid=l.loginid" +
  1929. " where t.hedgeplanstatus in (%v)"
  1930. if r.UserType == 0 {
  1931. // 终端没传值, 则自己去找
  1932. userId := mtpcache.GetAreaUserId(r.Areauserid, 0)
  1933. if userId == r.Areauserid {
  1934. r.UserType = 2
  1935. } else {
  1936. r.UserType = 7
  1937. }
  1938. }
  1939. if r.UserType == 2 {
  1940. str += " and t.areauserid = %v"
  1941. } else if r.UserType == 7 {
  1942. // 企业成员用tradeuserid匹配
  1943. str += " and t.tradeuserid = %v"
  1944. } else {
  1945. str += " and t.areauserid = %v"
  1946. }
  1947. if status == "2" {
  1948. // 执行中状态,按审核时间倒序
  1949. str += " order by t.audittime desc"
  1950. } else {
  1951. str += " order by t.updatetime desc"
  1952. }
  1953. return fmt.Sprintf(str, status, r.Areauserid)
  1954. }
  1955. // GetData 从数据库中查询套保计划数据
  1956. func (r *Ermcp3HedgePlan) GetData(status string) ([]Ermcp3HedgePlan, error) {
  1957. e := db.GetEngine()
  1958. sData := make([]Ermcp3HedgePlan, 0)
  1959. if err := e.SQL(r.buildSql(status)).Find(&sData); err != nil {
  1960. logger.GetLogger().Errorf("query hedgeplan:%v", err)
  1961. return sData, err
  1962. }
  1963. for i := range sData {
  1964. sData[i].calc()
  1965. }
  1966. return sData, nil
  1967. }
  1968. // Ermcp3GoodsGroup 商品组
  1969. type Ermcp3GoodsGroup struct {
  1970. GOODSGROUPID int32 `json:"goodsgroupid" xorm:"'GOODSGROUPID'"` // 商品组ID(自增ID)
  1971. GOODSGROUPNAME string `json:"goodsgroupname" xorm:"'GOODSGROUPNAME'"` // 商品组名称
  1972. GOODSGROUPSTATUS int32 `json:"goodsgroupstatus" xorm:"'GOODSGROUPSTATUS'"` // 商品组状态 - 1:正常 2:注销
  1973. MARKETID int32 `json:"marketid" xorm:"'MARKETID'"` // 所属市场ID
  1974. CREATETIME string `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  1975. CREATORID int32 `json:"creatorid" xorm:"'CREATORID'"` // 创建人
  1976. MODIFYTIME string `json:"modifytime" xorm:"'MODIFYTIME'"` // 修改时间
  1977. MODIFIERID int32 `json:"modifierid" xorm:"'MODIFIERID'"` // 修改人
  1978. QUOTESOURCEGROUPID int64 `json:"quotesourcegroupid" xorm:"'QUOTESOURCEGROUPID'"` // 所属行情源分组ID[参考行情市场用\通道交易]
  1979. OUTERGROUPCODE string `json:"outergroupcode" xorm:"'OUTERGROUPCODE'"` // 外部商品组代码[通道交易]
  1980. CANSHORT int32 `json:"canshort" xorm:"'CANSHORT'"` // 是否允许做空[通道交易] - 0:不能做空 1:可以做空
  1981. EXEXCHANGEID int64 `json:"exexchangeid" xorm:"'EXEXCHANGEID'"` // 外部交易所ID[通道交易]
  1982. CURRENCYID int32 `json:"currencyid" xorm:"'CURRENCYID'"` // 报价货币ID
  1983. GOODUNITID int32 `json:"goodunitid" xorm:"'GOODUNITID'"` // 报价单位ID
  1984. AGREEUNIT float32 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  1985. DECIMALPLACE int32 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  1986. QUOTEMINUNIT int32 `json:"quoteminunit" xorm:"'QUOTEMINUNIT'"` // 行情最小变动单位 [整数,报价小数位一起使用]
  1987. INNERDEALMODE int32 `json:"innerdealmode" xorm:"'INNERDEALMODE'"` // 内部成交方式[通道交易] - 1:净头寸 2:开平 3:平今
  1988. OUTERDEALMODE int32 `json:"outerdealmode" xorm:"'OUTERDEALMODE'"` // 外部成交方式[通道交易]- 1:净头寸 2:开平 3:平今
  1989. SYNCGOODSQTY int32 `json:"syncgoodsqty" xorm:"'SYNCGOODSQTY'"` // 同步合约数[通道交易-投资管理用] - 0表示不限
  1990. CLOSEPRICEMODE int32 `json:"closepricemode" xorm:"'CLOSEPRICEMODE'"` // 强平价格方式 - 1:市价 2:最新价 3:涨跌停(未实现)
  1991. GROUPCATEGROYID int32 `json:"groupcategroyid" xorm:"'GROUPCATEGROYID'"` // 品种分类ID
  1992. EXEXCHANGECODE string `json:"exexchangecode" xorm:"'EXEXCHANGECODE'"` // 交易所代码
  1993. EXEXCHANGENAME string `json:"exexchangename" xorm:"'EXEXCHANGENAME'"` // 交易所名称
  1994. EXCHANGEFULLNAME string `json:"exchangefullname" xorm:"'EXCHANGEFULLNAME'"` // 交易所全称
  1995. ENUMDICNAME string `json:"enumdicname"` // 单位名称
  1996. AreaUserId int64 `json:"areauserid" form:"areauserid" binding:"required"` // 所属机构id(套保品是有areauserid的,当要排除已配置商品组时需要areauserid过滤)
  1997. ExcludeCfg int32 `json:"excludecfg" form:"excludecfg"` // 排除套保品已配置期货分类下的商品组(但显示已配置商品组) 1-排除
  1998. }
  1999. func (r *Ermcp3GoodsGroup) calc() {
  2000. r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.GOODUNITID)
  2001. }
  2002. func (r *Ermcp3GoodsGroup) buildSql() string {
  2003. var sqlId utils.SQLVal = "SELECT t.GOODSGROUPID," +
  2004. " t.GOODSGROUPNAME," +
  2005. " t.GOODSGROUPSTATUS," +
  2006. " t.MARKETID," +
  2007. " to_char(t.CREATETIME, 'yyyy-mm-dd hh24:mi:ss') CREATETIME," +
  2008. " t.CREATORID," +
  2009. " to_char(t.MODIFYTIME, 'yyyy-mm-dd hh24:mi:ss') MODIFYTIME," +
  2010. " t.MODIFIERID," +
  2011. " t.QUOTESOURCEGROUPID," +
  2012. " t.OUTERGROUPCODE," +
  2013. " t.CANSHORT," +
  2014. " t.EXEXCHANGEID," +
  2015. " t.CURRENCYID," +
  2016. " t.GOODUNITID," +
  2017. " t.AGREEUNIT," +
  2018. " t.DECIMALPLACE," +
  2019. " t.QUOTEMINUNIT," +
  2020. " t.INNERDEALMODE," +
  2021. " t.OUTERDEALMODE," +
  2022. " t.SYNCGOODSQTY," +
  2023. " t.CLOSEPRICEMODE," +
  2024. " t.GROUPCATEGROYID," +
  2025. " e.exexchangecode," +
  2026. " e.exexchangename," +
  2027. " e.exchangefullname" +
  2028. " FROM GOODSGROUP t" +
  2029. " LEFT JOIN market m" +
  2030. " on t.marketid = m.marketid" +
  2031. " LEFT JOIN externalexchange e on t.exexchangeid=e.autoid" +
  2032. " WHERE 1 = 1" +
  2033. " and m.trademode = 15"
  2034. if r.ExcludeCfg == 1 {
  2035. str :=
  2036. "select goodsgroupid" +
  2037. " from goodsgroup t" +
  2038. " where t.groupcategroyid not in" +
  2039. " (select distinct g.groupcategroyid" +
  2040. " from erms_middlegoods t" +
  2041. " left join goodsgroup g" +
  2042. " on t.goodsgroupid = g.goodsgroupid" +
  2043. " where t.isvalid=1 and t.areauserid = %v)"
  2044. str = fmt.Sprintf(str, r.AreaUserId)
  2045. sqlId.Join(fmt.Sprintf(" and t.goodsgroupid in(%v)", str))
  2046. }
  2047. return sqlId.String()
  2048. }
  2049. // GetData 从数据库中查询数据
  2050. func (r *Ermcp3GoodsGroup) GetData() ([]Ermcp3GoodsGroup, error) {
  2051. sData := make([]Ermcp3GoodsGroup, 0)
  2052. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  2053. for i := range sData {
  2054. sData[i].calc()
  2055. }
  2056. return sData, err
  2057. }
  2058. // GetDataEx 商品组信息
  2059. func (r *Ermcp3GoodsGroup) GetDataEx() (interface{}, error) {
  2060. return r.GetData()
  2061. }
  2062. // Ermcp3RootUserAccount 顶级用户
  2063. type Ermcp3RootUserAccount struct {
  2064. ROOTUSERID int64 `json:"rootuserid" xorm:"ROOTUSERID"` // 根用户ID
  2065. CANRECOMMEND int32 `json:"canrecommend" xorm:"CANRECOMMEND"` // 是否可推荐 - 0:不可 1;可
  2066. USERID int64 `json:"userid" xorm:"USERID"` // 用户ID
  2067. USERTYPE int32 `json:"usertype" xorm:"USERTYPE"` // 账户类型 - 1:交易所 2:机构 3:会员子机构 4:经纪人 5:投资者 6:客户 7:企业成员(云平台)
  2068. MODIFYSTATUS int32 `json:"modifystatus" xorm:"MODIFYSTATUS"` // 变更状态 1 未变更 2 变更中 3 变更待审核 4 变更待复核(投资者)
  2069. ACCOUNTNAME string `json:"accountname" xorm:"ACCOUNTNAME"` // 账户名称(机构名称)
  2070. PARENTUSERID int64 `json:"parentuserid" xorm:"PARENTUSERID"` // 所属机构ID
  2071. BROKER int64 `json:"broker" xorm:"BROKER"` // 所属经纪人ID
  2072. SUBAREALEVELPATH string `json:"subarealevelpath" xorm:"SUBAREALEVELPATH"` // 子机构层级路径(逗号分隔,首尾加逗号)
  2073. REFEREEUSERID int64 `json:"refereeuserid" xorm:"REFEREEUSERID"` // 推荐人ID
  2074. MEMBERUSERID int64 `json:"memberuserid" xorm:"MEMBERUSERID"` // 所属会员ID
  2075. ACCOUNTSTATUS int32 `json:"accountstatus" xorm:"ACCOUNTSTATUS"` // 账户状态 - 1:待激活 2:待审核 3:待复审 4:正常 5:审核拒绝 6:停用(注销) 7:注销(删除)
  2076. RECKONACCOUNTID int64 `json:"reckonaccountid" xorm:"RECKONACCOUNTID"` // 默认结算资金账号ID(机构分润使用) 作废
  2077. CREATETIME string `json:"createtime" xorm:"CREATETIME"` // 创建时间
  2078. CREATORID int64 `json:"creatorid" xorm:"CREATORID"` // 创建人
  2079. AUDITTIME string `json:"audittime" xorm:"AUDITTIME"` // 审核时间
  2080. AUDITUSERID int64 `json:"audituserid" xorm:"AUDITUSERID"` // 审核人
  2081. AUDITREMARK string `json:"auditremark" xorm:"AUDITREMARK"` // 审核备注
  2082. CANCELTIME string `json:"canceltime" xorm:"CANCELTIME"` // 销户时间
  2083. CANCELUSERID int64 `json:"canceluserid" xorm:"CANCELUSERID"` // 销户人
  2084. MODIFYTIME string `json:"modifytime" xorm:"MODIFYTIME"` // 修改时间
  2085. MODIFIERID int64 `json:"modifierid" xorm:"MODIFIERID"` // 修改人
  2086. MODIFYREMARK string `json:"modifyremark" xorm:"MODIFYREMARK"` // 变更备注
  2087. MAXINVESTORNUM int64 `json:"maxinvestornum" xorm:"MAXINVESTORNUM"` // 最大用户数(经纪会员下投资者个数)
  2088. HASAUTH int32 `json:"hasauth" xorm:"HASAUTH"` // 是否已实名认证 - 0:未认证 1:已认证 2:已提交(待审核) 3:已拒绝
  2089. REFERCOUNT int32 `json:"refercount" xorm:"REFERCOUNT"` // 推荐总人数
  2090. REFERNUM string `json:"refernum" xorm:"REFERNUM"` // 推荐码
  2091. ISANONYMOUS int32 `json:"isanonymous" xorm:"ISANONYMOUS"` // 是否匿名下单 - 0:否 1:是
  2092. PARENTTOPUSER string `json:"parenttopuser" xorm:"PARENTTOPUSER"` // 上级顶级机构 [092=0,1时,默认为1, 092=2时若自已为顶级,则填入自己,自己不为顶级,填入ParentUserID的"ParentTopUser"]
  2093. SUBACCOUNTLEVEL int32 `json:"subaccountlevel" xorm:"SUBACCOUNTLEVEL"` // 子账户层数
  2094. APPLYSRC int32 `json:"applysrc" xorm:"APPLYSRC"` // 申请来源 - 1:管理端 2:终端
  2095. AUDITSRC int32 `json:"auditsrc" xorm:"AUDITSRC"` // 审核来源 - 1:管理端 2:终端
  2096. NICKNAME string `json:"nickname" xorm:"'NICKNAME'"` // 昵称
  2097. }
  2098. func (r *Ermcp3RootUserAccount) calc() {
  2099. }
  2100. func (r *Ermcp3RootUserAccount) buildSql() string {
  2101. var sqlId utils.SQLVal = `
  2102. SELECT t.ROOTUSERID,
  2103. t.CANRECOMMEND,
  2104. t.USERID,
  2105. t.USERTYPE,
  2106. t.MODIFYSTATUS,
  2107. t.ACCOUNTNAME,
  2108. t.PARENTUSERID,
  2109. t.BROKER,
  2110. t.SUBAREALEVELPATH,
  2111. t.REFEREEUSERID,
  2112. t.MEMBERUSERID,
  2113. t.ACCOUNTSTATUS,
  2114. t.RECKONACCOUNTID,
  2115. to_char(t.CREATETIME, 'yyyy-mm-dd hh24:mi:ss') CREATETIME,
  2116. t.CREATORID,
  2117. to_char(t.AUDITTIME, 'yyyy-mm-dd hh24:mi:ss') AUDITTIME,
  2118. t.AUDITUSERID,
  2119. t.AUDITREMARK,
  2120. to_char(t.CANCELTIME, 'yyyy-mm-dd hh24:mi:ss') CANCELTIME,
  2121. t.CANCELUSERID,
  2122. to_char(t.MODIFYTIME, 'yyyy-mm-dd hh24:mi:ss') MODIFYTIME,
  2123. t.MODIFIERID,
  2124. t.MODIFYREMARK,
  2125. t.MAXINVESTORNUM,
  2126. t.HASAUTH,
  2127. t.REFERCOUNT,
  2128. t.REFERNUM,
  2129. t.ISANONYMOUS,
  2130. t.PARENTTOPUSER,
  2131. t.SUBACCOUNTLEVEL,
  2132. t.APPLYSRC,
  2133. t.AUDITSRC,
  2134. u.nickname
  2135. FROM USERACCOUNT t
  2136. LEFT JOIN USERINFO u on t.userid=u.userid
  2137. WHERE 1 = 1
  2138. and t.userid in (select rootuserid from useraccount where userid = %v)
  2139. `
  2140. sqlId.FormatParam(r.USERID)
  2141. return sqlId.String()
  2142. }
  2143. // GetDataEx 获取顶级用户
  2144. func (r *Ermcp3RootUserAccount) GetDataEx() (interface{}, error) {
  2145. sData := make([]Ermcp3RootUserAccount, 0)
  2146. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  2147. for i := range sData {
  2148. sData[i].calc()
  2149. }
  2150. return sData, err
  2151. }
  2152. // Ermcp3PaAreaSubject 交易主体
  2153. type Ermcp3PaAreaSubject struct {
  2154. SUBJECTID int64 `json:"subjectid" xorm:"SUBJECTID" form:"subjectid"` // 主体ID(SEQ_ERMCP_PA_AREASUBJECT)
  2155. SUBJECTTYPE int32 `json:"subjecttype" xorm:"SUBJECTTYPE" form:"subjecttype"` // 主体类型 - 1:交易主体 2:业务部门
  2156. SUBJECTNAME string `json:"subjectname" xorm:"SUBJECTNAME"` // 主体名称
  2157. PARENTSUBJECTID string `json:"parentsubjectid" xorm:"PARENTSUBJECTID" form:"parentsubjectid"` // 上级主体ID
  2158. AREAUSERID int64 `json:"areauserid" xorm:"AREAUSERID" form:"userid"` // 所属机构
  2159. CREATETIME string `json:"createtime" xorm:"CREATETIME"` // 创建时间
  2160. CREATORSRC int32 `json:"creatorsrc" xorm:"CREATORSRC"` // 创建人来源 - 1:管理端 2:终端 3:交易
  2161. CREATORID string `json:"creatorid" xorm:"CREATORID" form:"creatorid"` // 创建人ID
  2162. MODIFIERSRC int32 `json:"modifiersrc" xorm:"MODIFIERSRC"` // 修改人来源 - 1:管理端 2:终端
  2163. MODIFIERID string `json:"modifierid" xorm:"MODIFIERID" form:"modifierid"` // 修改人
  2164. MODIFYTIME string `json:"modifytime" xorm:"MODIFYTIME"` // 修改时间
  2165. SUBJECTSTATUS int32 `json:"subjectstatus" xorm:"SUBJECTSTATUS" form:"subjectstatus"` // 主体状态 - 1:正常 2: 停用
  2166. CANMODIFY int32 `json:"canmodify" xorm:"CANMODIFY"` // 是否可修改 - 0:否 1:是
  2167. REMARK string `json:"remark" xorm:"REMARK"` // 备注
  2168. }
  2169. func (r *Ermcp3PaAreaSubject) calc() {
  2170. }
  2171. func (r *Ermcp3PaAreaSubject) buildSql() string {
  2172. var sqlId utils.SQLVal = `
  2173. SELECT t.SUBJECTID,
  2174. t.SUBJECTTYPE,
  2175. t.SUBJECTNAME,
  2176. t.PARENTSUBJECTID,
  2177. t.AREAUSERID,
  2178. to_char(t.CREATETIME, 'yyyy-mm-dd hh24:mi:ss') CREATETIME,
  2179. t.CREATORSRC,
  2180. t.CREATORID,
  2181. t.MODIFIERSRC,
  2182. t.MODIFIERID,
  2183. to_char(t.MODIFYTIME, 'yyyy-mm-dd hh24:mi:ss') MODIFYTIME,
  2184. t.SUBJECTSTATUS,
  2185. t.CANMODIFY,
  2186. t.REMARK
  2187. FROM ERMCP_PA_AREASUBJECT t
  2188. WHERE 1 = 1
  2189. `
  2190. areaUserId := mtpcache.GetAreaUserId(r.AREAUSERID, 0)
  2191. sqlId.And("t.AREAUSERID", areaUserId)
  2192. sqlId.AndEx("t.SUBJECTID", r.SUBJECTID, r.SUBJECTID > 0)
  2193. sqlId.AndEx("t.SUBJECTTYPE", r.SUBJECTTYPE, r.SUBJECTTYPE > 0)
  2194. sqlId.AndEx("t.SUBJECTSTATUS", r.SUBJECTSTATUS, r.SUBJECTSTATUS > 0)
  2195. return sqlId.String()
  2196. }
  2197. // GetDataEx 获取交易主体
  2198. func (r *Ermcp3PaAreaSubject) GetDataEx() (interface{}, error) {
  2199. sData := make([]Ermcp3PaAreaSubject, 0)
  2200. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  2201. for i := range sData {
  2202. sData[i].calc()
  2203. }
  2204. return sData, err
  2205. }
  2206. // Ermcp3PaAreaAuditCfg 审核设置
  2207. type Ermcp3PaAreaAuditCfg struct {
  2208. AREAUSERID int64 `json:"areauserid" xorm:"AREAUSERID" form:"userid"` // 用户ID
  2209. CUSTOMERAUDITFLAG int32 `json:"customerauditflag" xorm:"CUSTOMERAUDITFLAG"` // 客户资料是否需要审核 - 0:不需审核 1:需要审核
  2210. SPOTCONTRACTAUDITFLAG int32 `json:"spotcontractauditflag" xorm:"SPOTCONTRACTAUDITFLAG"` // 现货合同是否需要审核 - 0:不需审核 1:需要审核
  2211. POINTPRICEAUDITFLAG int32 `json:"pointpriceauditflag" xorm:"POINTPRICEAUDITFLAG"` // 点价是否需要审核 - 0:不需审核 1:需要审核
  2212. DELIVERYAUDITFLAG int32 `json:"deliveryauditflag" xorm:"DELIVERYAUDITFLAG"` // 交收是否需要审核 - 0:不需审核 1:需要审核
  2213. MONEYAUDITFLAG int32 `json:"moneyauditflag" xorm:"MONEYAUDITFLAG"` // 款项是否需要审核 - 0:不需审核 1:需要审核
  2214. INVOICEAUDITFLAG int32 `json:"invoiceauditflag" xorm:"INVOICEAUDITFLAG"` // 发票是否需要审核 - 0:不需审核 1:需要审核
  2215. BUYINAUDITFLAG int32 `json:"buyinauditflag" xorm:"BUYINAUDITFLAG"` // 采购入库是否需要审核 - 0:不需审核 1:需要审核
  2216. SELLOUTAUDITFLAG int32 `json:"selloutauditflag" xorm:"SELLOUTAUDITFLAG"` // 销售出库是否需要审核 - 0:不需审核 1:需要审核
  2217. PRODUCEINAUDITFLAG int32 `json:"produceinauditflag" xorm:"PRODUCEINAUDITFLAG"` // 生产入库是否需要审核 - 0:不需审核 1:需要审核
  2218. PRODUCEOUTAUDITFLAG int32 `json:"produceoutauditflag" xorm:"PRODUCEOUTAUDITFLAG"` // 生产出库是否需要审核 - 0:不需审核 1:需要审核
  2219. OPERATORSRC int32 `json:"operatorsrc" xorm:"OPERATORSRC"` // 操作来源 - 1:管理端 2:终端
  2220. OPERATORID int64 `json:"operatorid" xorm:"OPERATORID" form:"operatorid"` // 操作人
  2221. UPDATETIME string `json:"updatetime" xorm:"UPDATETIME"` // 更新时间
  2222. COSTRATIOAUDITFLAG int32 `json:"costratioauditflag" xorm:"COSTRATIOAUDITFLAG"` // 现货商品成本权重修改是否需要审核 - 0:不需审核 1:需要审核
  2223. MGNEEDHEDGERATIOAUDITFLAG int32 `json:"mgneedhedgeratioauditflag" xorm:"MGNEEDHEDGERATIOAUDITFLAG"` // 套保品种套保比例修改是否需要审 - 0:不需审核 1:需要审核
  2224. SGVTARATIOAUDITFLAG int32 `json:"sgvtaratioauditflag" xorm:"SGVTARATIOAUDITFLAG"` // 现货商品增值税税率修改是否需要审核 - 0:不需审核 1:需要审核
  2225. SGCONVERTRATIOAUDITFLAG int32 `json:"sgconvertratioauditflag" xorm:"SGCONVERTRATIOAUDITFLAG"` // 现货商品折算系数修改是否需要审核 - 0:不需审核 1:需要审核
  2226. }
  2227. func (r *Ermcp3PaAreaAuditCfg) calc() {
  2228. }
  2229. func (r *Ermcp3PaAreaAuditCfg) buildSql() string {
  2230. var sqlId utils.SQLVal = `
  2231. SELECT t.AREAUSERID,
  2232. t.CUSTOMERAUDITFLAG,
  2233. t.SPOTCONTRACTAUDITFLAG,
  2234. t.POINTPRICEAUDITFLAG,
  2235. t.DELIVERYAUDITFLAG,
  2236. t.MONEYAUDITFLAG,
  2237. t.INVOICEAUDITFLAG,
  2238. t.BUYINAUDITFLAG,
  2239. t.SELLOUTAUDITFLAG,
  2240. t.PRODUCEINAUDITFLAG,
  2241. t.PRODUCEOUTAUDITFLAG,
  2242. t.OPERATORSRC,
  2243. t.OPERATORID,
  2244. t.COSTRATIOAUDITFLAG,
  2245. t.MGNEEDHEDGERATIOAUDITFLAG,
  2246. t.SGVTARATIOAUDITFLAG,
  2247. t.SGCONVERTRATIOAUDITFLAG,
  2248. to_char(t.UPDATETIME, 'yyyy-mm-dd hh24:mi:ss') UPDATETIME
  2249. FROM ERMCP_PA_AREAAUDITCONFIG t
  2250. WHERE 1 = 1
  2251. `
  2252. areaUserId := mtpcache.GetAreaUserId(r.AREAUSERID, 0)
  2253. sqlId.And("t.AREAUSERID", areaUserId)
  2254. return sqlId.String()
  2255. }
  2256. // GetDataEx 获取审核设置
  2257. func (r *Ermcp3PaAreaAuditCfg) GetDataEx() (interface{}, error) {
  2258. sData := make([]Ermcp3PaAreaAuditCfg, 0)
  2259. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  2260. for i := range sData {
  2261. sData[i].calc()
  2262. }
  2263. return sData, err
  2264. }
  2265. // XHDeliveryGoods 商品信息-现货品种
  2266. type XHDeliveryGoods struct {
  2267. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'" form:"areauserid"` // 所属机构
  2268. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'" form:"deliverygoodsid"` // 现货品种ID(SEQ_DELIVERYGOODS)
  2269. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  2270. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  2271. ISVALID int32 `json:"isvalid" xorm:"'ISVALID'"` // 是否有效 - 0:无效 1:有效
  2272. DGSTATUS int32 `json:"dgstatus" xorm:"'DGSTATUS'"` // 品种状态 - 作废 - 0:未激活 1:正常
  2273. REMARK string `json:"remark" xorm:"'REMARK'"` // 备注
  2274. UNITID int64 `json:"unitid" xorm:"'UNITID'"` // 单位id(目前看,数据库中是空值)
  2275. WDLST []XHWrstandard `json:"wdlst"` // 品类(现货商品)列表
  2276. BDLST []XHBRAND `json:"bdlst"` // 品牌列表
  2277. FilterSubEmpty int32 `json:"filterSubEmpty" form:"filtersubempty"` // 过滤下级为空的
  2278. }
  2279. func (r *XHDeliveryGoods) calc() {
  2280. if r.WDLST == nil {
  2281. r.WDLST = make([]XHWrstandard, 0)
  2282. r.BDLST = make([]XHBRAND, 0)
  2283. }
  2284. }
  2285. func (r *XHDeliveryGoods) buildSql() string {
  2286. var sqlId utils.SQLVal = `
  2287. SELECT t.AREAUSERID,
  2288. t.DELIVERYGOODSID,
  2289. t.DELIVERYGOODSCODE,
  2290. t.DELIVERYGOODSNAME,
  2291. t.ISVALID,
  2292. t.DGSTATUS,
  2293. t.GOODSUNITID UNITID,
  2294. t.REMARK
  2295. FROM DELIVERYGOODS t
  2296. WHERE 1 = 1
  2297. `
  2298. sqlId.AndEx("t.AREAUSERID", r.AREAUSERID, r.AREAUSERID > 0)
  2299. sqlId.AndEx("t.DELIVERYGOODSID", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  2300. return sqlId.String()
  2301. }
  2302. // GetDataEx 获取商品信息-现货品种
  2303. func (r *XHDeliveryGoods) GetDataEx() (interface{}, error) {
  2304. sData := make([]XHDeliveryGoods, 0)
  2305. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  2306. for i := range sData {
  2307. sData[i].calc()
  2308. }
  2309. if len(sData) > 0 {
  2310. // 获取品类列表
  2311. m1 := XHWrstandard{AREAUSERID: r.AREAUSERID, DELIVERYGOODSID: r.DELIVERYGOODSID}
  2312. if d1, err := m1.GetDataEx(); err == nil {
  2313. lstWd := d1.([]XHWrstandard)
  2314. for i := range sData {
  2315. sData[i].addWdlst(lstWd)
  2316. }
  2317. }
  2318. // 获取品牌列表
  2319. m2 := XHBRAND{DELIVERYGOODSID: r.DELIVERYGOODSID, AREAUSERID: r.AREAUSERID}
  2320. if d2, err := m2.GetDataEx(); err == nil {
  2321. lstBrand := d2.([]XHBRAND)
  2322. for i := range sData {
  2323. sData[i].addBrandlst(lstBrand)
  2324. }
  2325. }
  2326. }
  2327. if r.FilterSubEmpty == 1 {
  2328. sData = r.filterSubEmpty(sData)
  2329. }
  2330. return sData, err
  2331. }
  2332. // 增加品类列表
  2333. func (r *XHDeliveryGoods) addWdlst(lstWd []XHWrstandard) {
  2334. for i := range lstWd {
  2335. if lstWd[i].DELIVERYGOODSID == r.DELIVERYGOODSID {
  2336. r.WDLST = append(r.WDLST, lstWd[i])
  2337. }
  2338. }
  2339. }
  2340. // 增加品牌列表
  2341. func (r *XHDeliveryGoods) addBrandlst(lstBrand []XHBRAND) {
  2342. for i := range lstBrand {
  2343. if lstBrand[i].DELIVERYGOODSID == r.DELIVERYGOODSID {
  2344. r.BDLST = append(r.BDLST, lstBrand[i])
  2345. }
  2346. }
  2347. }
  2348. //filterSubEmpty 层层递进过滤期货合约列表为空的品种、品类
  2349. func (r *XHDeliveryGoods) filterSubEmpty(sData []XHDeliveryGoods) []XHDeliveryGoods {
  2350. fGp := func(lst []TBGoodsGroup) []TBGoodsGroup {
  2351. tmp := make([]TBGoodsGroup, 0)
  2352. for i := range lst {
  2353. if len(lst[i].GDLST) > 0 {
  2354. tmp = append(tmp, lst[i])
  2355. }
  2356. }
  2357. return tmp
  2358. }
  2359. fMg := func(lst []XHMiddleGoods) []XHMiddleGoods {
  2360. tmp := make([]XHMiddleGoods, 0)
  2361. for i := range lst {
  2362. lst[i].GPLST = fGp(lst[i].GPLST)
  2363. }
  2364. for i := range lst {
  2365. if len(lst[i].GPLST) > 0 {
  2366. tmp = append(tmp, lst[i])
  2367. }
  2368. }
  2369. return tmp
  2370. }
  2371. fWd := func(lst []XHWrstandard) []XHWrstandard {
  2372. tmp := make([]XHWrstandard, 0)
  2373. for i := range lst {
  2374. lst[i].MGLST = fMg(lst[i].MGLST)
  2375. }
  2376. for i := range lst {
  2377. if len(lst[i].MGLST) > 0 {
  2378. tmp = append(tmp, lst[i])
  2379. }
  2380. }
  2381. return tmp
  2382. }
  2383. for i := range sData {
  2384. sData[i].WDLST = fWd(sData[i].WDLST)
  2385. }
  2386. tmp := make([]XHDeliveryGoods, 0)
  2387. for i := range sData {
  2388. if len(sData[i].WDLST) > 0 {
  2389. tmp = append(tmp, sData[i])
  2390. }
  2391. }
  2392. return tmp
  2393. }
  2394. // XHBRAND 现货品种/品牌
  2395. type XHBRAND struct {
  2396. BRANDID int64 `json:"brandid" xorm:"'BRANDID'"` // 品牌id
  2397. BRANDNAME string `json:"brandname" xorm:"'BRANDNAME'"` // 品牌名称
  2398. DELIVERYGOODSID int64 `json:"-" xorm:"'DELIVERYGOODSID'"` // 品种ID
  2399. AREAUSERID int64 `json:"-" xorm:"'AREAUSERID'"` // 用户id
  2400. ISVALID int32 `json:"isvalid" xorm:"'ISVALID'"` // 是否有效 0-无效 1-有效
  2401. }
  2402. // GetDataEx 获取现货品种/品牌
  2403. func (r *XHBRAND) GetDataEx() (interface{}, error) {
  2404. sData := make([]XHBRAND, 0)
  2405. var sqlId utils.SQLVal = `
  2406. SELECT DGFACTORYITEMID brandid,
  2407. t.DELIVERYGOODSID,
  2408. to_char(t.DGFACTORYITEMTYPEID) brandtypeid,
  2409. t.DGFACTORYITEMVALUE brandname,
  2410. to_char(t.WAREHOUSEID) WAREHOUSEID,
  2411. t.ISVALID,
  2412. t.ORDERINDEX,
  2413. g.areauserid
  2414. FROM DGFACTORYITEM t
  2415. left join deliverygoods g
  2416. on t.deliverygoodsid = g.deliverygoodsid
  2417. WHERE t.dgfactoryitemtypeid = 2
  2418. `
  2419. sqlId.AndEx("g.areauserid", r.AREAUSERID, r.AREAUSERID > 0)
  2420. sqlId.AndEx("g.deliverygoodsid", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  2421. err := db.GetEngine().SQL(sqlId.String()).Find(&sData)
  2422. return sData, err
  2423. }
  2424. // XHWrstandard 现货品种/品类
  2425. type XHWrstandard struct {
  2426. AREAUSERID int64 `json:"-" xorm:"'AREAUSERID'" form:"areauserid"` // 所属机构
  2427. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'" form:"deliverygoodsid"` // 品种ID
  2428. WRSTANDARDID int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 现货商品ID(SEQ_WRSTANDARD)
  2429. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 现货商品代码
  2430. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 现货商品名称
  2431. VATRATE float64 `json:"vatrate" xorm:"'VATRATE'"` // 增值税率
  2432. ENUMDICNAME string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 单位名称
  2433. UNITID int64 `json:"unitid" xorm:"'UNITID'"` // 单位id
  2434. THUMURLS string `json:"thumurls" xorm:"'THUMURLS'"` // 缩略图片(1:1)(逗号分隔)
  2435. PICTUREURLS string `json:"pictureurls" xorm:"'PICTUREURLS'"` // 详情图片(逗号分隔)
  2436. BANNERPICURL string `json:"bannerpicurl" xorm:"'BANNERPICURL'"` // banner图
  2437. MGLST []XHMiddleGoods `json:"mglst"` // 套保品列表
  2438. }
  2439. func (r *XHWrstandard) calc() {
  2440. if r.MGLST == nil {
  2441. r.MGLST = make([]XHMiddleGoods, 0)
  2442. }
  2443. }
  2444. func (r *XHWrstandard) buildSql() string {
  2445. var sqlId utils.SQLVal = `
  2446. select t.areauserid,
  2447. t.deliverygoodsid,
  2448. t.wrstandardid,
  2449. t.wrstandardcode,
  2450. t.wrstandardname,
  2451. t.vatrate,
  2452. t.unitid,
  2453. t.thumurls,
  2454. t.pictureurls,
  2455. t.bannerpicurl,
  2456. e.enumdicname
  2457. from wrstandard t
  2458. left join enumdicitem e
  2459. on t.unitid = e.enumitemname
  2460. and e.enumdiccode = 'goodsunit'
  2461. where 1 = 1
  2462. `
  2463. sqlId.AndEx("t.AREAUSERID", r.AREAUSERID, r.AREAUSERID > 0)
  2464. sqlId.AndEx("t.DELIVERYGOODSID", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  2465. return sqlId.String()
  2466. }
  2467. // GetDataEx 获取现货品种/品类
  2468. func (r *XHWrstandard) GetDataEx() (interface{}, error) {
  2469. sData := make([]XHWrstandard, 0)
  2470. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  2471. for i := range sData {
  2472. sData[i].calc()
  2473. }
  2474. if len(sData) > 0 {
  2475. // 获取套保品列表
  2476. m := XHMiddleGoods{AREAUSERID: r.AREAUSERID, WRSTANDARDID: r.WRSTANDARDID}
  2477. if d, err := m.GetDataEx(); err == nil {
  2478. lstMidd := d.([]XHMiddleGoods)
  2479. for i := range sData {
  2480. sData[i].addMgLst(lstMidd)
  2481. }
  2482. }
  2483. }
  2484. return sData, err
  2485. }
  2486. func (r *XHWrstandard) addMgLst(midd []XHMiddleGoods) {
  2487. for i := range midd {
  2488. if r.WRSTANDARDID == midd[i].WRSTANDARDID {
  2489. r.MGLST = append(r.MGLST, midd[i])
  2490. }
  2491. }
  2492. }
  2493. // XHMiddleGoods 现货品种/品类/套保品
  2494. type XHMiddleGoods struct {
  2495. AREAUSERID int64 `json:"-" xorm:"'AREAUSERID'" form:"areauserid"` // 所属机构
  2496. WRSTANDARDID int64 `json:"-" xorm:"'WRSTANDARDID'" form:"wrstandardid"` // 现货商品ID(SEQ_WRSTANDARD)
  2497. CONVERTRATIO float64 `json:"convertratio" xorm:"'CONVERTRATIO'"` // 拆算系数
  2498. COSTRATIO float64 `json:"costratio" xorm:"'COSTRATIO'"` // 成本权重
  2499. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货商品id
  2500. MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"'MIDDLEGOODSID'"` // 套保品种id
  2501. MIDDLEGOODSCODE string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保品种代码
  2502. MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保品种名称
  2503. ENUMDICNAME string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 单位名称
  2504. UNITID int64 `json:"unitid" xorm:"'UNITID'"` // 单位id
  2505. GOODSGROUPID int64 `json:"-" xorm:"'GOODSGROUPID'"` // 关联期货商品组id
  2506. GPLST []TBGoodsGroup `json:"GPLST"` // 期货品种列表
  2507. }
  2508. func (r *XHMiddleGoods) calc() {
  2509. r.GPLST = make([]TBGoodsGroup, 0)
  2510. }
  2511. func (r *XHMiddleGoods) buildSql() string {
  2512. var sqlId utils.SQLVal = `
  2513. select w.wrstandardid,
  2514. c.convertratio,
  2515. c.costratio,
  2516. c.deliverygoodsid,
  2517. m.areauserid,
  2518. m.middlegoodsid,
  2519. m.middlegoodscode,
  2520. m.middlegoodsname,
  2521. m.goodsunitid unitid,
  2522. m.goodsgroupid,
  2523. e.enumdicname
  2524. from wrstandard w
  2525. inner join erms2_wrsconvertdetail c
  2526. on w.wrstandardid = c.wrstandardid
  2527. inner join erms_middlegoods m
  2528. on c.middlegoodsid = m.middlegoodsid
  2529. left join enumdicitem e
  2530. on m.goodsunitid = e.enumitemname
  2531. and e.enumdiccode = 'goodsunit'
  2532. where 1 = 1 and w.isvalid = 1
  2533. `
  2534. sqlId.AndEx("m.areauserid", r.AREAUSERID, r.AREAUSERID > 0)
  2535. sqlId.AndEx("w.WRSTANDARDID", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  2536. return sqlId.String()
  2537. }
  2538. // GetDataEx 获取现货品种/品类/套保品
  2539. func (r *XHMiddleGoods) GetDataEx() (interface{}, error) {
  2540. sData := make([]XHMiddleGoods, 0)
  2541. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  2542. for i := range sData {
  2543. sData[i].calc()
  2544. }
  2545. if len(sData) > 0 {
  2546. // 获取关联期货品种
  2547. m1 := TBGoodsGroup{}
  2548. if d1, err := m1.GetDataEx(); err == nil {
  2549. gpLst := d1.([]TBGoodsGroup)
  2550. for i := range sData {
  2551. sData[i].addGpLst(gpLst)
  2552. }
  2553. }
  2554. }
  2555. return sData, err
  2556. }
  2557. func (r *XHMiddleGoods) addGpLst(lst []TBGoodsGroup) {
  2558. for i := range lst {
  2559. if r.GOODSGROUPID == lst[i].DESTGOODSGROUPID {
  2560. r.GPLST = append(r.GPLST, lst[i])
  2561. }
  2562. }
  2563. }
  2564. // TBMiddleGoods 商品信息-套保品种
  2565. type TBMiddleGoods struct {
  2566. AREAUSERID int64 `json:"areauserid" xorm:"'AREAUSERID'" form:"areauserid"` // 机构用户ID
  2567. MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"'MIDDLEGOODSID'" form:"middlegoodsid"` // 套保品种ID(SEQ_ERMS_MIDDLEGOODS)
  2568. MIDDLEGOODSCODE string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保品种代码
  2569. MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保品种名称
  2570. NEEDHEDGERATIO float64 `json:"needhedgeratio" xorm:"'NEEDHEDGERATIO'"` // 套保比率
  2571. NEEDARBITRAGERATIO float64 `json:"needarbitrageratio" xorm:"'NEEDARBITRAGERATIO'"` // 套利比率
  2572. GOODSGROUPID int64 `json:"-" xorm:"'GOODSGROUPID'"` // 关联期货商品组id
  2573. ENUMDICNAME string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 单位名称
  2574. GOODSUNITID int32 `json:"goodsunitid" xorm:"'GOODSUNITID'"` // 套保品种单位id
  2575. GPLST []TBGoodsGroup `json:"GPLST"` // 期货品种列表
  2576. WDLST []TBWrstandard `json:"WDLST"` // 商品信息列表(现货品类)
  2577. }
  2578. func (r *TBMiddleGoods) calc() {
  2579. r.GPLST = make([]TBGoodsGroup, 0)
  2580. r.WDLST = make([]TBWrstandard, 0)
  2581. }
  2582. func (r *TBMiddleGoods) buildSql() string {
  2583. var sqlId utils.SQLVal = `
  2584. select t.areauserid,
  2585. t.middlegoodsid,
  2586. t.middlegoodscode,
  2587. t.middlegoodsname,
  2588. t.needhedgeratio,
  2589. t.needarbitrageratio,
  2590. t.goodsgroupid,
  2591. t.goodsunitid,
  2592. e.enumdicname
  2593. from erms_middlegoods t
  2594. left join enumdicitem e
  2595. on t.goodsunitid = e.enumitemname
  2596. and e.enumdiccode = 'goodsunit'
  2597. where 1 = 1 and t.isvalid=1
  2598. `
  2599. sqlId.AndEx("t.areauserid", r.AREAUSERID, r.AREAUSERID > 0)
  2600. sqlId.AndEx("t.middlegoodsid", r.MIDDLEGOODSID, r.MIDDLEGOODSID > 0)
  2601. return sqlId.String()
  2602. }
  2603. // GetDataEx 获取商品信息-套保品种
  2604. func (r *TBMiddleGoods) GetDataEx() (interface{}, error) {
  2605. sData := make([]TBMiddleGoods, 0)
  2606. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  2607. for i := range sData {
  2608. sData[i].calc()
  2609. }
  2610. if len(sData) > 0 {
  2611. // 获取关联期货品种
  2612. m1 := TBGoodsGroup{}
  2613. if d1, err := m1.GetDataEx(); err == nil {
  2614. gpLst := d1.([]TBGoodsGroup)
  2615. for i := range sData {
  2616. sData[i].addGpLst(gpLst)
  2617. }
  2618. }
  2619. // 获取关联现货商品
  2620. m2 := TBWrstandard{}
  2621. if d2, err := m2.GetDataEx(); err == nil {
  2622. wdLst := d2.([]TBWrstandard)
  2623. for i := range sData {
  2624. sData[i].addWdLst(wdLst)
  2625. }
  2626. }
  2627. }
  2628. return sData, err
  2629. }
  2630. func (r *TBMiddleGoods) addGpLst(lst []TBGoodsGroup) {
  2631. for i := range lst {
  2632. if r.GOODSGROUPID == lst[i].DESTGOODSGROUPID {
  2633. r.GPLST = append(r.GPLST, lst[i])
  2634. }
  2635. }
  2636. }
  2637. func (r *TBMiddleGoods) addWdLst(lst []TBWrstandard) {
  2638. for i := range lst {
  2639. if r.MIDDLEGOODSID == lst[i].MIDDLEGOODSID {
  2640. r.WDLST = append(r.WDLST, lst[i])
  2641. }
  2642. }
  2643. }
  2644. // TBGoodsGroup 套保品种/期货品种
  2645. type TBGoodsGroup struct {
  2646. GOODSGROUPID int64 `json:"goodsgroupid" xorm:"'GOODSGROUPID'"` // 商品组ID(自增ID)
  2647. GOODSGROUPNAME string `json:"goodsgroupname" xorm:"'GOODSGROUPNAME'"` // 商品组名称
  2648. GOODUNITID int32 `json:"goodunitid" xorm:"'GOODUNITID'"` // 报价单位ID
  2649. CONVERTRATIO float64 `json:"convertratio" xorm:"'CONVERTRATIO'"` // 折算系数
  2650. DESTGOODSGROUPID int64 `json:"-" xorm:"'DESTGOODSGROUPID'"` // 目标商品组id
  2651. EXEXCHANGECODE string `json:"exexchangecode" xorm:"'EXEXCHANGECODE'"` // 交易所代码
  2652. EXEXCHANGENAME string `json:"exexchangename" xorm:"'EXEXCHANGENAME'"` // 交易所名称
  2653. ENUMDICNAME string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 单位名称
  2654. GDLST []TBGoods `json:"GDLST"` // 商品列表
  2655. }
  2656. func (r *TBGoodsGroup) calc() {
  2657. r.GDLST = make([]TBGoods, 0)
  2658. }
  2659. func (r *TBGoodsGroup) buildSql() string {
  2660. var sqlId utils.SQLVal = `
  2661. select t.goodsgroupid,
  2662. t.goodsgroupname,
  2663. t.goodunitid,
  2664. c.convertratio,
  2665. c.destgoodsgroupid,
  2666. ex.exexchangecode,
  2667. ex.exexchangename,
  2668. e.enumdicname
  2669. from goodsgroup t
  2670. inner join ermcp_ggconvertconfig c
  2671. on t.goodsgroupid = c.srcgoodsgroupid
  2672. left join externalexchange ex on t.exexchangeid=ex.autoid
  2673. left join enumdicitem e
  2674. on t.goodunitid = e.enumitemname
  2675. and e.enumdiccode = 'goodsunit'
  2676. where 1 = 1 and t.goodsgroupstatus=1
  2677. `
  2678. return sqlId.String()
  2679. }
  2680. // GetDataEx 获取套保品种/期货品种
  2681. func (r *TBGoodsGroup) GetDataEx() (interface{}, error) {
  2682. sData := make([]TBGoodsGroup, 0)
  2683. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  2684. for i := range sData {
  2685. sData[i].calc()
  2686. }
  2687. if len(sData) > 0 {
  2688. // 获取关联商品
  2689. m := TBGoods{}
  2690. if d, err := m.GetDataEx(); err == nil {
  2691. gdLst := d.([]TBGoods)
  2692. for i := range sData {
  2693. sData[i].addGdLst(gdLst)
  2694. }
  2695. }
  2696. }
  2697. return sData, err
  2698. }
  2699. func (r *TBGoodsGroup) addGdLst(lst []TBGoods) {
  2700. for i := range lst {
  2701. if r.GOODSGROUPID == lst[i].GOODSGROUPID {
  2702. r.GDLST = append(r.GDLST, lst[i])
  2703. }
  2704. }
  2705. }
  2706. // TBGoods 套保品种/期货品种/期货合约
  2707. type TBGoods struct {
  2708. GOODSID int64 `json:"goodsid" xorm:"'GOODSID'"` // 商品ID(自增ID SEQ_GOODS)
  2709. GOODSCODE string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码(内部)
  2710. GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称
  2711. GOODSGROUPID int64 `json:"-" xorm:"'GOODSGROUPID'"` // 所属商品组ID
  2712. AGREEUNIT float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约乘数
  2713. ENUMDICNAME string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 单位名称
  2714. }
  2715. func (r *TBGoods) calc() {
  2716. }
  2717. func (r *TBGoods) buildSql() string {
  2718. var sqlId utils.SQLVal = `
  2719. select t.goodsid,
  2720. t.goodscode,
  2721. t.goodsname,
  2722. t.goodsgroupid,
  2723. t.agreeunit,
  2724. e.enumdicname
  2725. from goods t
  2726. left join enumdicitem e
  2727. on t.goodunitid = e.enumitemname
  2728. and e.enumdiccode = 'goodsunit'
  2729. where 1 = 1
  2730. and t.goodsstatus not in (4, 5, 6, 7)
  2731. and t.goodsgroupid in
  2732. (select srcgoodsgroupid from ermcp_ggconvertconfig)
  2733. `
  2734. return sqlId.String()
  2735. }
  2736. // GetDataEx 获取套保品种/期货品种/期货合约
  2737. func (r *TBGoods) GetDataEx() (interface{}, error) {
  2738. sData := make([]TBGoods, 0)
  2739. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  2740. for i := range sData {
  2741. sData[i].calc()
  2742. }
  2743. return sData, err
  2744. }
  2745. // TBWrstandard 套保品种/商品信息(现货商品)
  2746. type TBWrstandard struct {
  2747. WRSTANDARDID int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 现货商品ID(SEQ_WRSTANDARD)
  2748. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 现货商品代码
  2749. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 现货商品名称
  2750. DELIVERYGOODSID int64 `json:"-" xorm:"'DELIVERYGOODSID'"` // 品种ID
  2751. VATRATE float64 `json:"vatrate" xorm:"'VATRATE'"` // 增值税率
  2752. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 品种名称
  2753. CONVERTRATIO float64 `json:"convertratio" xorm:"'CONVERTRATIO'"` // 折算系数
  2754. MIDDLEGOODSID int64 `json:"-" xorm:"'MIDDLEGOODSID'"` // 品种id
  2755. ENUMDICNAME string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 单位名称
  2756. }
  2757. func (r *TBWrstandard) calc() {
  2758. }
  2759. func (r *TBWrstandard) buildSql() string {
  2760. var sqlId utils.SQLVal = `
  2761. select t.wrstandardid,
  2762. t.wrstandardcode,
  2763. t.wrstandardname,
  2764. t.deliverygoodsid,
  2765. t.vatrate,
  2766. g.deliverygoodsname,
  2767. c.convertratio,
  2768. c.middlegoodsid,
  2769. e.enumdicname
  2770. from wrstandard t
  2771. left join deliverygoods g
  2772. on t.deliverygoodsid = g.deliverygoodsid
  2773. inner join erms2_wrsconvertdetail c
  2774. on t.wrstandardid = c.wrstandardid
  2775. left join enumdicitem e
  2776. on t.unitid = e.enumitemname
  2777. and e.enumdiccode = 'goodsunit'
  2778. where 1 = 1 and t.isvalid=1
  2779. order by c.middlegoodsid
  2780. `
  2781. return sqlId.String()
  2782. }
  2783. // GetDataEx 获取套保品种/商品信息(现货商品)
  2784. func (r *TBWrstandard) GetDataEx() (interface{}, error) {
  2785. sData := make([]TBWrstandard, 0)
  2786. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  2787. for i := range sData {
  2788. sData[i].calc()
  2789. }
  2790. return sData, err
  2791. }
  2792. // Ermcp3PaTradeLink 期现单据关联
  2793. type Ermcp3PaTradeLink struct {
  2794. ORDERTYPE int32 `json:"ordertype" xorm:"ORDERTYPE"` // 单据类型 - 1:期货单 2:看涨期权单 3:看跌期权单
  2795. OPTIONCODE string `json:"optioncode" xorm:"OPTIONCODE"` // 期权代码 [期权]
  2796. PREMIUM float64 `json:"premium" xorm:"PREMIUM"` // 权利金 [期权]
  2797. CHARGE float64 `json:"charge" xorm:"CHARGE"` // 手续费
  2798. CLOSEPL float64 `json:"closepl" xorm:"CLOSEPL"` // 平仓盈亏
  2799. EXECUTEPRICE int32 `json:"executeprice" xorm:"EXECUTEPRICE"` // 执行价 [期权]
  2800. TRADEID string `json:"tradeid" xorm:"TRADEID" form:"tradeid"` // 期货单号 | db:成交单号(108+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  2801. BUYORSELL int32 `json:"buyorsell" xorm:"BUYORSELL"` // 方向 - 0:买 1:卖
  2802. TRADEDATE string `json:"tradedate" xorm:"TRADEDATE" form:"tradedate"` // 交易日(yyyyMMdd)
  2803. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID" form:"accountid"` // 期货账户代码 | 账号ID
  2804. GOODSID int32 `json:"goodsid" xorm:"GOODSID" form:"goodsid"` // 商品ID
  2805. MARKETID int32 `json:"marketid" xorm:"MARKETID" form:"marketid"` // 市场ID
  2806. TRADETIME string `json:"tradetime" xorm:"TRADETIME"` // 时间 | db:成交时间
  2807. TRADEPRICE float64 `json:"tradeprice" xorm:"TRADEPRICE"` // 成交价格
  2808. TRADELOT int32 `json:"tradelot" xorm:"TRADELOT"` // 成交数量(期货数量) ps:这是手数,转换为具体多少吨要乘以AGREEUNIT | db:成交手数
  2809. TRADEAMOUNT float64 `json:"tradeamount" xorm:"TRADEAMOUNT"` // 成交金额(账户)
  2810. TRADETYPE int32 `json:"tradetype" xorm:"TRADETYPE"` // 成交类别 - 1:正常委托成交 2:风控斩仓成交 3:修正持仓成交 4:管理端斩仓成交
  2811. CHANNELBUILDTYPE int32 `json:"channelbuildtype" xorm:"CHANNELBUILDTYPE"` // 委托单据类型 0:无 1:建仓 2:平仓
  2812. CLOSETYPE int32 `json:"closetype" xorm:"CLOSETYPE"` // 平仓方式 - 0:无 1:平今 2:平昨
  2813. HEDGEFLAG int32 `json:"hedgeflag" xorm:"HEDGEFLAG"` // 投机套保标志 - 0:无 1:投机 2:套保 3:套利 4:套期保值(平安\合同) 5:单边(平安) 6:移仓(平安) 7:错单处理(平安) 8:跨期套利(平安) 9:套期保值(计划) 10:套利(合同) 11:换月(合同) 12:交割(金瑞)
  2814. PARENTACCOUNTID int64 `json:"parentaccountid" xorm:"PARENTACCOUNTID"` // 所属母账户
  2815. RELATEDOUTTRADEID string `json:"relatedouttradeid" xorm:"RELATEDOUTTRADEID"` // 关联外部成交单ID
  2816. SPOTCONTRACTID string `json:"spotcontractid" xorm:"SPOTCONTRACTID"` // 现货合同ID [4:套期保值\10\11]
  2817. GOODSGROUPID int32 `json:"goodsgroupid" xorm:"GOODSGROUPID"` // 对冲品种ID[期货合约商品组ID]
  2818. AGREEUNIT float64 `json:"agreeunit" xorm:"AGREEUNIT"` // 合约乘数
  2819. MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"MIDDLEGOODSID"` // 套保品种ID
  2820. CONVERTRATIO float64 `json:"convertratio" xorm:"CONVERTRATIO"` // 折算系数
  2821. MIDDLEGOODSQTY float64 `json:"middlegoodsqty" xorm:"MIDDLEGOODSQTY"` // 套保品种数量 = TradeQty * AgreeUnit * ConvertRatio
  2822. RELATEDQTY float64 `json:"relatedqty" xorm:"RELATEDQTY"` // 关联数量
  2823. RELATEDLOT float64 `json:"relatedlot" xorm:"RELATEDLOT"` // 已关联数量(已关联数量手) | db:关联手数
  2824. AREAUSERID string `json:"userid" xorm:"AREAUSERID" form:"userid"` // 所属机构 - 所属母账户的UserID
  2825. GOODSCODE string `json:"goodscode" xorm:"'GOODSCODE'"` // 合约代码
  2826. GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'"` // 合约名称
  2827. GOODUNITID int32 `json:"goodunitid" xorm:"'GOODUNITID'"` // 单位id
  2828. USERNAME string `json:"username" xorm:"'USERNAME'"` // 用户名称
  2829. TANAME string `json:"taname" xorm:"'TANAME'"` // 期货账户名称
  2830. ENUMDICNAME string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 单位名称
  2831. ORDERTYPENAME string `json:"ordertypename" xorm:"'ORDERTYPENAME'"` // 订单类型
  2832. }
  2833. func (r *Ermcp3PaTradeLink) calc() {
  2834. var str1, str2 string
  2835. if r.BUYORSELL == 0 {
  2836. str1 = "买入"
  2837. } else {
  2838. str1 = "卖出"
  2839. }
  2840. if r.CHANNELBUILDTYPE == 1 {
  2841. str2 = "建仓"
  2842. } else {
  2843. str2 = "平仓"
  2844. }
  2845. r.ORDERTYPENAME = str1 + str2
  2846. }
  2847. func (r *Ermcp3PaTradeLink) buildSql() string {
  2848. var sqlId utils.SQLVal = `
  2849. SELECT t.ORDERTYPE,
  2850. t.OPTIONCODE,
  2851. t.PREMIUM,
  2852. t.CHARGE,
  2853. t.CLOSEPL,
  2854. t.EXECUTEPRICE,
  2855. to_char(t.TRADEID) TRADEID,
  2856. t.BUYORSELL,
  2857. t.TRADEDATE,
  2858. t.ACCOUNTID,
  2859. t.GOODSID,
  2860. t.MARKETID,
  2861. to_char(t.TRADETIME, 'yyyy-mm-dd hh24:mi:ss') TRADETIME,
  2862. t.TRADEPRICE,
  2863. t.TRADELOT,
  2864. t.TRADEAMOUNT,
  2865. t.TRADETYPE,
  2866. t.CHANNELBUILDTYPE,
  2867. t.CLOSETYPE,
  2868. t.HEDGEFLAG,
  2869. t.PARENTACCOUNTID,
  2870. to_char(t.RELATEDOUTTRADEID) RELATEDOUTTRADEID,
  2871. t.SPOTCONTRACTID,
  2872. t.GOODSGROUPID,
  2873. t.AGREEUNIT,
  2874. t.MIDDLEGOODSID,
  2875. t.CONVERTRATIO,
  2876. t.MIDDLEGOODSQTY,
  2877. t.RELATEDQTY,
  2878. t.RELATEDLOT,
  2879. t.AREAUSERID,
  2880. g.goodscode,
  2881. g.goodsname,
  2882. g.goodunitid,
  2883. u.accountname username,
  2884. ta.accountname taname,
  2885. e.enumdicname
  2886. FROM ERMCP_PA_TRADELINK t
  2887. LEFT JOIN goods g
  2888. on t.goodsid = g.goodsid
  2889. LEFT JOIN taaccount ta
  2890. on t.accountid = ta.accountid
  2891. LEFT JOIN useraccount u
  2892. on ta.relateduserid = u.userid
  2893. LEFT JOIN enumdicitem e
  2894. on g.goodunitid = e.enumitemname
  2895. and e.enumdiccode = 'goodsunit'
  2896. WHERE 1 = 1 and t.tradelot > t.relatedlot
  2897. `
  2898. sqlId.JoinFormat(" and %v in (ta.relateduserid, ta.userid)", r.AREAUSERID)
  2899. return sqlId.String()
  2900. }
  2901. // GetDataEx 获取期现单据关联
  2902. func (r *Ermcp3PaTradeLink) GetDataEx() (interface{}, error) {
  2903. sData := make([]Ermcp3PaTradeLink, 0)
  2904. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  2905. for i := range sData {
  2906. sData[i].calc()
  2907. }
  2908. return sData, err
  2909. }
  2910. // Ermcp3SCMiddleGoods 业务关联现货订单
  2911. type Ermcp3SCMiddleGoods struct {
  2912. USERID int64 `json:"userid" xorm:"'USERID'" form:"userid"` // 用户id
  2913. CUSTOMERUSERID int64 `json:"customeruserid" xorm:"'CUSTOMERUSERID'"` // 对手id
  2914. CUSTOMERNAME string `json:"customername" xorm:"'CUSTOMERNAME'" form:"customername"` // 对手手名称
  2915. CONTRACTNO string `json:"contractno" xorm:"'CONTRACTNO'" form:"contractno"` // 合同编号
  2916. SPOTCONTRACTID string `json:"spotcontractid" xorm:"'SPOTCONTRACTID'"` // 合同编号
  2917. WRSTANDARDID int64 `json:"wrstandardid" xorm:"'WRSTANDARDID'"` // 现货商品id
  2918. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 现货商品代码
  2919. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'" form:"wrstandardname"` // 现货商品名称
  2920. UNITID int32 `json:"unitid" xorm:"'UNITID'"` // 现货单位id
  2921. VATRATE float64 `json:"vatrate" xorm:"'VATRATE'"` // 增值税率
  2922. MIDDLEGOODSPRICEDQTY3 float64 `json:"middlegoodspricedqty3" xorm:"'MIDDLEGOODSPRICEDQTY3'"` // 应套保数量 = MiddleGoodsPricedQty2 * 套保比率
  2923. RELATEDMIDDLEGOODSQTY float64 `json:"relatedmiddlegoodsqty" xorm:"'RELATEDMIDDLEGOODSQTY'"` // 已关联量(套保品种)(期货)
  2924. PRICEDQTY float64 `json:"pricedqty" xorm:"'PRICEDQTY'"` // 已定价量
  2925. MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"'MIDDLEGOODSID'"` // 套保品种ID
  2926. NEEDHEDGERATIO float64 `json:"needhedgeratio" xorm:"'NEEDHEDGERATIO'"` // 套保比例
  2927. CONTRACTTYPE int `json:"contracttype" xorm:"'CONTRACTTYPE'"` // 合同类型 1:采购 -1:销售
  2928. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 现货品种ID
  2929. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 现货品种代码
  2930. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 现货品种名称
  2931. ENUMDICNAME string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 现货单位名称
  2932. BIZTYPE int `json:"biztype" xorm:"'BIZTYPE'" form:"biztype"` // 业务类型 1:套保 2:套利
  2933. CONVERTRATIO float64 `json:"convertratio" xorm:"'CONVERTRATIO'"` // 折算系数
  2934. BUYORSELL int32 `json:"-" form:"buyorsell"` // 买卖方向, 用作筛选
  2935. GOODSGROUPID int32 `json:"-" form:"goodsgroupid"` // 期货商品组id, 用作筛选
  2936. }
  2937. func (r *Ermcp3SCMiddleGoods) calc() {
  2938. }
  2939. func (r *Ermcp3SCMiddleGoods) buildSql() string {
  2940. var sqlId utils.SQLVal = `
  2941. with tmp as
  2942. (select k.configid,
  2943. k.srcgoodsgroupid,
  2944. k.destgoodsgroupid,
  2945. k.convertratio,
  2946. m.middlegoodsid
  2947. from ermcp_ggconvertconfig k
  2948. inner join erms_middlegoods m
  2949. on k.destgoodsgroupid = m.goodsgroupid)
  2950. select s.userid,
  2951. s.customeruserid,
  2952. u1.accountname customername,
  2953. s.contractno,
  2954. s.contracttype,
  2955. s.biztype,
  2956. to_char(s.spotcontractid) spotcontractid,
  2957. w.wrstandardid,
  2958. w.wrstandardcode,
  2959. w.wrstandardname,
  2960. w.unitid,
  2961. w.vatrate,
  2962. t.middlegoodspricedqty3,
  2963. t.relatedmiddlegoodsqty,
  2964. t.pricedqty,
  2965. t.middlegoodsid,
  2966. mg.needhedgeratio,
  2967. dg.deliverygoodsid,
  2968. dg.deliverygoodscode,
  2969. dg.deliverygoodsname,
  2970. e.enumdicname,
  2971. tmp.convertratio
  2972. from ermcp_scmiddlegoods t
  2973. inner join ermcp_spotcontract s
  2974. on t.spotcontractid = s.spotcontractid
  2975. left join wrstandard w
  2976. on t.wrstandardid = w.wrstandardid
  2977. left join deliverygoods dg on w.deliverygoodsid=dg.deliverygoodsid
  2978. left join erms_middlegoods mg
  2979. on t.middlegoodsid = mg.middlegoodsid
  2980. left join useraccount u1
  2981. on s.customeruserid = u1.userid
  2982. left join enumdicitem e on w.unitid=e.enumitemname and e.enumdiccode='goodsunit'
  2983. inner join tmp on t.middlegoodsid=tmp.middlegoodsid and tmp.srcgoodsgroupid = %v
  2984. where 1 = 1 and t.middlegoodspricedqty3 > t.relatedmiddlegoodsqty and s.contractstatus = 2
  2985. `
  2986. sqlId.FormatParam(r.GOODSGROUPID)
  2987. if r.BUYORSELL == 0 {
  2988. r.CONTRACTTYPE = -1
  2989. } else {
  2990. r.CONTRACTTYPE = 1
  2991. }
  2992. sqlId.And("s.CONTRACTTYPE", r.CONTRACTTYPE)
  2993. sqlId.AndEx("s.biztype", r.BIZTYPE, r.BIZTYPE > 0)
  2994. sqlId.JoinFormat(" and %v in(s.userid, s.tradeuserid, s.saleuserid, s.tradeuserid)", r.USERID)
  2995. sqlId.AndLike("s.contractno", r.CONTRACTNO)
  2996. sqlId.AndLike("u1.accountname", r.CUSTOMERNAME)
  2997. sqlId.AndLike("w.wrstandardname", r.WRSTANDARDNAME)
  2998. return sqlId.String()
  2999. }
  3000. // GetDataEx 获取业务关联现货订单
  3001. func (r *Ermcp3SCMiddleGoods) GetDataEx() (interface{}, error) {
  3002. sData := make([]Ermcp3SCMiddleGoods, 0)
  3003. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  3004. for i := range sData {
  3005. sData[i].calc()
  3006. }
  3007. return sData, err
  3008. }
  3009. // Ermcp3TradeLinkDetail 期现关联记录
  3010. type Ermcp3TradeLinkDetail struct {
  3011. LINKDETAILID string `json:"linkdetailid" xorm:"LINKDETAILID" form:"linkdetailid"` // 关联ID(614+Unix秒时间戳(10位)+xxxxxx)
  3012. SPOTCONTRACTID string `json:"spotcontractid" xorm:"SPOTCONTRACTID" form:"spotcontractid"` // 现货合同\套保计划ID [4,10,11 - 现货合同ID] [9:套期保值(计划) - 套保计划ID]
  3013. LINKSTATUS int32 `json:"linkstatus" xorm:"LINKSTATUS" form:"linkstatus"` // 关联状态 - 1:成功 2:失败 3:解绑
  3014. RETCODE int32 `json:"retcode" xorm:"RETCODE"` // 返回码
  3015. TRADEID string `json:"tradeid" xorm:"TRADEID" form:"tradeid"` // 期货订单号 | 内部成交单ID
  3016. BUYORSELL int32 `json:"buyorsell" xorm:"BUYORSELL"` // 方向 - 0:买 1:卖
  3017. HEDGEFLAG int32 `json:"hedgeflag" xorm:"HEDGEFLAG"` // 业务类型 | 投机套保标志 - 0:无 1:投机 2:套保 3:套利 4:套期保值(平安\合同) 5:单边(平安) 6:移仓(平安) 7:错单处理(平安) 8:跨期套利(平安) 9:套期保值(计划) 10:套利(合同) 11:换月(合同) 12:交割(金瑞)
  3018. RELATEDLOT float64 `json:"relatedlot" xorm:"RELATEDLOT"` // 关联手数
  3019. GOODSID int32 `json:"goodsid" xorm:"GOODSID" form:"goodsid"` // 商品ID
  3020. GOODSGROUPID int32 `json:"goodsgroupid" xorm:"GOODSGROUPID" form:"goodsgroupid"` // 对冲品种ID[期货合约商品组ID]
  3021. MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"MIDDLEGOODSID" form:"middlegoodsid"` // 套保品种ID
  3022. RELATEDQTY float64 `json:"relatedqty" xorm:"RELATEDQTY"` // 关联数量 = RelatedLot * AgreeUnit * ConvertRatio
  3023. TRADEDATE string `json:"tradedate" xorm:"TRADEDATE" form:"tradedate"` // 关联交易日(yyyyMMdd)
  3024. RELATEDMODE int32 `json:"relatedmode" xorm:"RELATEDMODE"` // 关联方式 - 1:自动关联 2:手动关联 3:解绑关联
  3025. TRADETRADEDATE string `json:"tradetradedate" xorm:"TRADETRADEDATE" form:"tradetradedate"` // 成交交易日(yyyyMMdd)
  3026. TRADEPRICE float64 `json:"tradeprice" xorm:"TRADEPRICE"` // 成交价格
  3027. TRADELOT int32 `json:"tradelot" xorm:"TRADELOT"` // 成交数量 | 成交手数
  3028. SALEUSERID string `json:"saleuserid" xorm:"SALEUSERID" form:"saleuserid"` // 业务员ID
  3029. BIZSUBJECTID string `json:"bizsubjectid" xorm:"BIZSUBJECTID" form:"bizsubjectid"` // 归属业务部门ID - SubjectID
  3030. AGREEUNIT float64 `json:"agreeunit" xorm:"AGREEUNIT"` // 合约乘数
  3031. CONVERTRATIO float64 `json:"convertratio" xorm:"CONVERTRATIO"` // 折算系数
  3032. AREAUSERID string `json:"areauserid" xorm:"AREAUSERID" form:"userid"` // 所属机构
  3033. CREATORSRC int32 `json:"creatorsrc" xorm:"CREATORSRC"` // 创建人来源 - 1:管理端 2:终端 3:交易
  3034. CREATORID string `json:"creatorid" xorm:"CREATORID" form:"creatorid"` // 创建人ID
  3035. CREATETIME string `json:"createtime" xorm:"CREATETIME"` // 关联时间 | 创建时间
  3036. ACCOUNTID int64 `json:"accountid" xorm:"'ACCOUNTID'"` // 资金账号
  3037. TRADETIME string `json:"tradetime" xorm:"'TRADETIME'"` // 期货成交时间
  3038. CONTRACTNO string `json:"contractno" xorm:"'CONTRACTNO'" form:"contractno"` // 现货编号 (合同编号)
  3039. TANAME string `json:"taname" xorm:"'TANAME'" form:"taname"` // 期货账户
  3040. USERNAME string `json:"username" xorm:"'USERNAME'"` // 用户名称
  3041. GOODSCODE string `json:"goodscode" xorm:"'GOODSCODE'"` // 合约代码
  3042. GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'"` // 合约名称
  3043. ENUMDICNAME string `json:"enumdicname" xorm:"'ENUMDICNAME'"` // 单位名称
  3044. CHANNELBUILDTYPE int32 `json:"channelbuildtype" xorm:"'CHANNELBUILDTYPE'"` // 委托单据类型 0:无 1:建仓 2:平仓
  3045. MIDDLEGOODSCODE string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保品种代码
  3046. MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保品种名称
  3047. }
  3048. func (r *Ermcp3TradeLinkDetail) calc() {
  3049. }
  3050. func (r *Ermcp3TradeLinkDetail) buildSql() string {
  3051. var sqlId utils.SQLVal = `
  3052. select t.LINKSTATUS,
  3053. t.RETCODE,
  3054. to_char(t.LINKDETAILID) LINKDETAILID,
  3055. to_char(t.TRADEID) TRADEID,
  3056. t.BUYORSELL,
  3057. t.HEDGEFLAG,
  3058. t.SPOTCONTRACTID,
  3059. t.RELATEDLOT,
  3060. t.GOODSID,
  3061. t.GOODSGROUPID,
  3062. t.MIDDLEGOODSID,
  3063. t.RELATEDQTY,
  3064. t.TRADEDATE,
  3065. t.RELATEDMODE,
  3066. t.TRADETRADEDATE,
  3067. t.TRADEPRICE,
  3068. t.TRADELOT,
  3069. t.SALEUSERID,
  3070. t.BIZSUBJECTID,
  3071. t.AGREEUNIT,
  3072. t.CONVERTRATIO,
  3073. t.AREAUSERID,
  3074. t.CREATORSRC,
  3075. t.CREATORID,
  3076. to_char(t.CREATETIME, 'yyyy-mm-dd hh24:mi:ss') CREATETIME,
  3077. k.accountid,
  3078. to_char(k.tradetime, 'yyyy-mm-dd hh24:mi:ss') tradetime,
  3079. s.contractno,
  3080. ta.accountname taname,
  3081. u.accountname username,
  3082. g.goodscode,
  3083. g.goodsname,
  3084. g.agreeunit,
  3085. e.enumdicname,
  3086. k.channelbuildtype,
  3087. mg.middlegoodscode,
  3088. mg.middlegoodsname
  3089. from ERMCP_PA_TradeLinkDetail t
  3090. inner join ermcp_pa_tradelink k
  3091. on t.tradeid = k.tradeid
  3092. and t.buyorsell = k.buyorsell
  3093. inner join ermcp_spotcontract s
  3094. on t.spotcontractid = s.spotcontractid
  3095. left join taaccount ta
  3096. on k.accountid = ta.accountid
  3097. left join useraccount u
  3098. on ta.relateduserid = u.userid
  3099. left join goods g
  3100. on t.goodsid = g.goodsid
  3101. left join erms_middlegoods mg on t.middlegoodsid=mg.middlegoodsid
  3102. left join enumdicitem e
  3103. on g.goodunitid = e.enumitemname
  3104. and e.enumdiccode = 'goodsunit'
  3105. where 1 = 1
  3106. `
  3107. sqlId.JoinFormat(" and %v in (ta.relateduserid, ta.userid)", r.AREAUSERID)
  3108. sqlId.AndEx("t.linkstatus", r.LINKSTATUS, r.LINKSTATUS > 0)
  3109. sqlId.AndLike("t.TRADEID", r.TRADEID)
  3110. sqlId.AndLike("s.contractno", r.CONTRACTNO)
  3111. sqlId.AndLike("ta.accountname", r.TANAME)
  3112. return sqlId.String()
  3113. }
  3114. // GetDataEx 获取期现关联记录
  3115. func (r *Ermcp3TradeLinkDetail) GetDataEx() (interface{}, error) {
  3116. sData := make([]Ermcp3TradeLinkDetail, 0)
  3117. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  3118. for i := range sData {
  3119. sData[i].calc()
  3120. }
  3121. return sData, err
  3122. }
  3123. // Ermcp3OutTradeLink 外部成交单关联
  3124. type Ermcp3OutTradeLink struct {
  3125. GOODSID int32 `json:"goodsid" xorm:"'GOODSID'"` // 合约id
  3126. GOODSCODE string `json:"goodscode" xorm:"'GOODSCODE'" form:"goodscode"` // 合约代码
  3127. GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'" form:"goodsname"` // 合约名称
  3128. TRADETIME string `json:"tradetime" xorm:"'TRADETIME'"` // 成交时间
  3129. HEDGEACCOUNTCODE string `json:"hedgeaccountcode" xorm:"'HEDGEACCOUNTCODE'"` // 外部账号 | 对冲账号
  3130. BUYORSELL int32 `json:"buyorsell" xorm:"'BUYORSELL'"` // 买卖方向 - 0:买 1:卖
  3131. TRADEQTY int64 `json:"tradeqty" xorm:"'TRADEQTY'"` // 成交数量
  3132. TRADEPRICE float64 `json:"tradeprice" xorm:"'TRADEPRICE'"` // 成交价格
  3133. HASINNERORDER int32 `json:"hasinnerorder" xorm:"'HASINNERORDER'" form:"hasinnerorder"` // 是否有内部单关联 - 0:无 1:有
  3134. CHANNELBUILDTYPE int32 `json:"channelbuildtype" xorm:"'CHANNELBUILDTYPE'"` // 开平标志- 0:无 1:建仓 2:平仓
  3135. OUTTRADEID string `json:"outtradeid" xorm:"'OUTTRADEID'" form:"outtradeid"` // 外部订单号 | 外部成交单ID(114+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  3136. EXEXCHANGECODE string `json:"exexchangecode" xorm:"'EXEXCHANGECODE'"` // 交易所代码
  3137. EXEXCHANGENAME string `json:"exexchangename" xorm:"'EXEXCHANGENAME'"` // 交易所名称
  3138. CURRENCYID int32 `json:"-" xorm:"'CURRENCYID'"` // 币种id
  3139. CURRENCYNAME string `json:"currencyname" xorm:"'CURRENCYNAME'"` // 币种名称
  3140. USERID int64 `json:"-" form:"userid"` // 用户id, 用于过滤
  3141. }
  3142. func (r *Ermcp3OutTradeLink) calc() {
  3143. }
  3144. func (r *Ermcp3OutTradeLink) buildSql() string {
  3145. var sqlId utils.SQLVal = `
  3146. select g.goodsid,
  3147. g.goodscode,
  3148. g.goodsname,
  3149. to_char(t.tradetime, 'yyyy-mm-dd hh24:mi:ss') tradetime,
  3150. c.hedgeaccountcode,
  3151. t.buyorsell,
  3152. t.tradeqty,
  3153. t.tradeprice,
  3154. t.hasinnerorder,
  3155. t.channelbuildtype,
  3156. to_char(t.outtradeid) outtradeid,
  3157. ex.exexchangecode,
  3158. ex.exexchangename,
  3159. ta.currencyid,
  3160. e.enumdicname currencyname
  3161. from hedge_outtradedetail t
  3162. inner join goods g
  3163. on t.hedgegoodsid = g.goodsid
  3164. left join goodsgroup gp
  3165. on g.goodsgroupid = gp.goodsgroupid
  3166. left join externalexchange ex
  3167. on gp.exexchangeid = ex.autoid
  3168. left join hedge_outmainconfig c
  3169. on t.accountid = c.accountid
  3170. left join taaccount ta
  3171. on t.accountid = ta.accountid
  3172. left join enumdicitem e
  3173. on ta.currencyid = e.enumitemname
  3174. and e.enumdiccode = 'currency'
  3175. where 1 = 1
  3176. and %v in (ta.userid, ta.relateduserid)
  3177. `
  3178. sqlId.FormatParam(r.USERID)
  3179. sqlId.AndEx("t.hasinnerorder", r.HASINNERORDER, r.HASINNERORDER != -1)
  3180. sqlId.AndLike("t.outtradeid", r.OUTTRADEID)
  3181. sqlId.AndLike("g.goodscode||g.goodsname", r.GOODSNAME)
  3182. sqlId.Join(" order by t.tradetime desc")
  3183. return sqlId.String()
  3184. }
  3185. // GetDataEx 获取外部成交单关联
  3186. func (r *Ermcp3OutTradeLink) GetDataEx() (interface{}, error) {
  3187. sData := make([]Ermcp3OutTradeLink, 0)
  3188. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  3189. for i := range sData {
  3190. sData[i].calc()
  3191. }
  3192. return sData, err
  3193. }
  3194. // Ermcp3SubTaaccount 期货子账户
  3195. type Ermcp3SubTaaccount struct {
  3196. ACCOUNTID int64 `json:"accountid" xorm:"'ACCOUNTID'"` // 资金账户ID
  3197. TANAME string `json:"taname" xorm:"'TANAME'"` // 资金账号名称
  3198. TRADESTATUS int32 `json:"tradestatus" xorm:"'TRADESTATUS'"` // 交易状态 - 1:正常 2:受限 3:冻结(停用) 4:禁止建仓(人工受限) 5:禁止交易(人工冻结) 6:待激活 7:已删除(注销)
  3199. PARENTACCOUNTID int64 `json:"parentaccountid" xorm:"'PARENTACCOUNTID'" form:"parentaccountid"` // 所属根账号(母账号)
  3200. PARENTACCOUNTCODE string `json:"parentaccountcode" xorm:"'PARENTACCOUNTCODE'" form:"parentaccountcode"` // 所属根账号代码(母账号代码)
  3201. USERNAME string `json:"username" xorm:"'USERNAME'"` // 交易用户
  3202. }
  3203. func (r *Ermcp3SubTaaccount) calc() {
  3204. }
  3205. func (r *Ermcp3SubTaaccount) buildSql() string {
  3206. var sqlId utils.SQLVal = `
  3207. select t.accountid,
  3208. t.accountname taname,
  3209. t.tradestatus,
  3210. t.parentaccountid,
  3211. c.hedgeaccountcode parentaccountcode,
  3212. u.accountname username
  3213. from taaccount t
  3214. inner join hedge_outmainconfig c
  3215. on t.parentaccountid = c.accountid
  3216. left join useraccount u
  3217. on t.relateduserid = u.userid
  3218. where 1 = 1 and t.ismain=0
  3219. `
  3220. sqlId.AndEx("t.parentaccountid", r.PARENTACCOUNTID, r.PARENTACCOUNTID > 0)
  3221. sqlId.AndEx("c.hedgeaccountcode", r.PARENTACCOUNTCODE, r.PARENTACCOUNTCODE != "")
  3222. return sqlId.String()
  3223. }
  3224. // GetDataEx 获取期货子账户
  3225. func (r *Ermcp3SubTaaccount) GetDataEx() (interface{}, error) {
  3226. sData := make([]Ermcp3SubTaaccount, 0)
  3227. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  3228. for i := range sData {
  3229. sData[i].calc()
  3230. }
  3231. return sData, err
  3232. }
  3233. // Ermcp3InnerTradeLink 外部成交关联的内部成交单
  3234. type Ermcp3InnerTradeLink struct {
  3235. OUTTRADEID string `json:"outtradeid" xorm:"'OUTTRADEID'" form:"outtradeid"` // 外部成交单号
  3236. TRADETIME string `json:"tradetime" xorm:"'TRADETIME'"` // 关联时间 | 成交时间 ps:因为数据库表里没有关联时间, 所以取外部成交单的成交时间
  3237. TRADEID string `json:"tradeid" xorm:"'TRADEID'"` // 期货单号 | 内部成交单号(108+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  3238. ACCOUNTID int64 `json:"accountid" xorm:"'ACCOUNTID'"` // 期货账号代码 | 资金账号ID
  3239. TANAME string `json:"taname" xorm:"'TANAME'"` // 期货账户名称
  3240. USERNAME string `json:"username" xorm:"'USERNAME'"` // 用户名称
  3241. GOODSID int64 `json:"goodsid" xorm:"'GOODSID'"` // 商品ID
  3242. GOODSCODE string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码
  3243. GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称
  3244. BUYORSELL int32 `json:"buyorsell" xorm:"'BUYORSELL'"` // 方向 - 0:买 1:卖
  3245. CHANNELBUILDTYPE int32 `json:"channelbuildtype" xorm:"'CHANNELBUILDTYPE'"` // 委托单据类型 0:无 1:建仓 2:平仓
  3246. TRADEQTY int64 `json:"tradeqty" xorm:"'TRADEQTY'"` // 期货成交数量
  3247. TRADEPRICE float64 `json:"tradeprice" xorm:"'TRADEPRICE'"` // 成交价格
  3248. CURRENCYID int32 `json:"currencyid" xorm:"'CURRENCYID'"` // 币种id
  3249. CURRENCYNAME string `json:"currencyname" xorm:"'CURRENCYNAME'"` // 结算币种 名称
  3250. }
  3251. func (r *Ermcp3InnerTradeLink) calc() {
  3252. }
  3253. func (r *Ermcp3InnerTradeLink) buildSql() string {
  3254. var sqlId utils.SQLVal = `
  3255. select to_char(k.outtradeid) outtradeid,
  3256. t.tradetime,
  3257. to_char(t.tradeid) tradeid,
  3258. t.accountid,
  3259. ta.accountname taname,
  3260. u.accountname username,
  3261. t.goodsid,
  3262. g.goodscode,
  3263. g.goodsname,
  3264. t.buyorsell,
  3265. t.channelbuildtype,
  3266. t.tradeqty,
  3267. t.tradeprice,
  3268. ta.currencyid,
  3269. e.enumdicname currencyname
  3270. from hedge_innertradedetail t
  3271. inner join hedge_outtradedetail k
  3272. on k.mhpinnertradeid = t.tradeid
  3273. left join taaccount ta
  3274. on t.accountid = ta.accountid
  3275. left join useraccount u
  3276. on ta.relateduserid = u.userid
  3277. left join goods g
  3278. on t.goodsid = g.goodsid
  3279. left join enumdicitem e
  3280. on ta.currencyid = e.enumitemname
  3281. and e.enumdiccode = 'currency'
  3282. where 1 = 1
  3283. `
  3284. sqlId.AndEx("k.outtradeid", r.OUTTRADEID, r.OUTTRADEID != "")
  3285. return sqlId.String()
  3286. }
  3287. // GetDataEx 获取外部成交关联的内部成交单
  3288. func (r *Ermcp3InnerTradeLink) GetDataEx() (interface{}, error) {
  3289. sData := make([]Ermcp3InnerTradeLink, 0)
  3290. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  3291. for i := range sData {
  3292. sData[i].calc()
  3293. }
  3294. return sData, err
  3295. }
  3296. // Ermcp3ParamChangeApp 现货商品参数变更流水
  3297. type Ermcp3ParamChangeApp struct {
  3298. APPLICATIONID string `json:"applicationid" xorm:"APPLICATIONID" form:"applicationid"` // 申请ID(619+Unix秒时间戳(10位)+xxxxxx)
  3299. PARAMCHANGETYPE int32 `json:"paramchangetype" xorm:"PARAMCHANGETYPE" form:"paramchangetype"` // 参数变更类型 - 1:增值税率变更(现货商品) 2:折算系数变更(现货商品) 3:成本权重(现货商品) 4:套保比率变更(套保品种)
  3300. OPERATETYPE int32 `json:"operatetype" xorm:"OPERATETYPE" form:"operatetype"` // 操作类型 - 1:新增 2:修改
  3301. WRSTANDARDID int64 `json:"wrstandardid" xorm:"WRSTANDARDID" form:"wrstandardid"` // 现货商品ID [ParamChangeType = 1,2,3]
  3302. MIDDLEGOODSID int64 `json:"middlegoodsid" xorm:"MIDDLEGOODSID" form:"middlegoodsid"` // 套保品种ID [ParamChangeType = 2,3,4]
  3303. AREAUSERID int64 `json:"areauserid" xorm:"AREAUSERID" form:"userid"` // 所属机构用户ID
  3304. BEFOREVALUE float64 `json:"beforevalue" xorm:"BEFOREVALUE"` // 变更前
  3305. AFTERVALUE float64 `json:"aftervalue" xorm:"AFTERVALUE"` // 变更后
  3306. APPLYSRC int32 `json:"applysrc" xorm:"APPLYSRC"` // 申请来源 - 1:管理端 2:终端
  3307. APPLYID string `json:"applyid" xorm:"APPLYID" form:"applyid"` // 申请人
  3308. APPLYREMARK string `json:"applyremark" xorm:"APPLYREMARK"` // 申请备注
  3309. APPLYTIME string `json:"applytime" xorm:"APPLYTIME"` // 申请时间
  3310. APPLYSTATUS int32 `json:"applystatus" xorm:"APPLYSTATUS"` // 申请状态 - 1:待审核 2:审核通过 3:审核拒绝 4:处理失败 5:已撤回
  3311. AUDITTRADEDATE string `json:"audittradedate" xorm:"AUDITTRADEDATE" form:"audittradedate"` // 审核交易日(yyyyMMdd)
  3312. AUDITID string `json:"auditid" xorm:"AUDITID" form:"auditid"` // 审核人
  3313. AUDITSRC int32 `json:"auditsrc" xorm:"AUDITSRC"` // 审核来源 - 1:管理端 2:终端
  3314. AUDITTIME string `json:"audittime" xorm:"AUDITTIME"` // 审核时间
  3315. AUDITREMARK string `json:"auditremark" xorm:"AUDITREMARK"` // 审核备注
  3316. WRSTANDARDCODE string `json:"wrstandardcode" xorm:"'WRSTANDARDCODE'"` // 现货商品代码
  3317. WRSTANDARDNAME string `json:"wrstandardname" xorm:"'WRSTANDARDNAME'"` // 现货商品名称
  3318. DELIVERYGOODSID int64 `json:"deliverygoodsid" xorm:"'DELIVERYGOODSID'"` // 品种id
  3319. DELIVERYGOODSCODE string `json:"deliverygoodscode" xorm:"'DELIVERYGOODSCODE'"` // 品种代码
  3320. DELIVERYGOODSNAME string `json:"deliverygoodsname" xorm:"'DELIVERYGOODSNAME'"` // 品种名称
  3321. MIDDLEGOODSCODE string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保品种代码
  3322. MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保品种名称
  3323. APPLYNAME string `json:"applyname" xorm:"'APPLYNAME'"` // 申请人名称(代码)
  3324. AUDITNAME string `json:"auditname" xorm:"'AUDITNAME'"` // 审核人名称(代码)
  3325. FTSTATUS string `json:"-" form:"ftstatus"` // 状态筛选
  3326. }
  3327. func (r *Ermcp3ParamChangeApp) calc() {
  3328. }
  3329. func (r *Ermcp3ParamChangeApp) buildSql() string {
  3330. var sqlId utils.SQLVal = `
  3331. with tmp as
  3332. (select 2 as src,
  3333. loginid as usid,
  3334. nvl(to_char(accountname), to_char(logincode)) username
  3335. from loginaccount
  3336. union all
  3337. select 1 as src, autoid as usid, rolename
  3338. from systemmanagerrole)
  3339. SELECT t.APPLICATIONID,
  3340. t.PARAMCHANGETYPE,
  3341. t.OPERATETYPE,
  3342. t.WRSTANDARDID,
  3343. t.MIDDLEGOODSID,
  3344. t.AREAUSERID,
  3345. t.BEFOREVALUE,
  3346. t.AFTERVALUE,
  3347. t.APPLYSRC,
  3348. to_char(t.APPLYID) APPLYID,
  3349. t.APPLYREMARK,
  3350. to_char(t.APPLYTIME, 'yyyy-mm-dd hh24:mi:ss') APPLYTIME,
  3351. t.APPLYSTATUS,
  3352. t.AUDITTRADEDATE,
  3353. to_char(t.AUDITID) AUDITID,
  3354. t.AUDITSRC,
  3355. to_char(t.AUDITTIME, 'yyyy-mm-dd hh24:mi:ss') AUDITTIME,
  3356. t.AUDITREMARK,
  3357. w.wrstandardcode,
  3358. w.wrstandardname,
  3359. dg.deliverygoodsid,
  3360. dg.deliverygoodscode,
  3361. dg.deliverygoodsname,
  3362. m.middlegoodscode,
  3363. m.middlegoodsname,
  3364. k1.username applyname,
  3365. k2.username auditname
  3366. FROM ERMCP_PARAMCHANGEAPP t
  3367. LEFT JOIN WRSTANDARD w
  3368. on t.wrstandardid = w.wrstandardid
  3369. LEFT JOIN DELIVERYGOODS dg
  3370. on w.deliverygoodsid = dg.deliverygoodsid
  3371. LEFT JOIN ERMS_MIDDLEGOODS m
  3372. on t.middlegoodsid = m.middlegoodsid
  3373. LEFT JOIN tmp k1
  3374. on t.applysrc = k1.src
  3375. and t.applyid = k1.usid
  3376. LEFT JOIN tmp k2
  3377. on t.auditsrc = k2.src
  3378. and t.auditid = k2.usid
  3379. WHERE 1 = 1
  3380. `
  3381. sqlId.AndEx("t.AREAUSERID", r.AREAUSERID, r.AREAUSERID > 0)
  3382. sqlId.AndEx("t.WRSTANDARDID", r.WRSTANDARDID, r.WRSTANDARDID > 0)
  3383. sqlId.AndEx("dg.deliverygoodsid", r.DELIVERYGOODSID, r.DELIVERYGOODSID > 0)
  3384. sqlId.AndEx("t.OPERATETYPE", r.OPERATETYPE, r.OPERATETYPE > 0)
  3385. sqlId.AndEx("t.MIDDLEGOODSID", r.MIDDLEGOODSID, r.MIDDLEGOODSID > 0)
  3386. sqlId.AndEx("t.PARAMCHANGETYPE", r.PARAMCHANGETYPE, r.PARAMCHANGETYPE > 0)
  3387. if r.FTSTATUS != "" {
  3388. sqlId.JoinFormat(" and t.APPLYSTATUS in(%v)", r.FTSTATUS)
  3389. }
  3390. sqlId.Join(" order by t.audittime, t.applytime desc")
  3391. return sqlId.String()
  3392. }
  3393. // GetDataEx 获取现货商品参数变更流水
  3394. func (r *Ermcp3ParamChangeApp) GetDataEx() (interface{}, error) {
  3395. sData := make([]Ermcp3ParamChangeApp, 0)
  3396. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  3397. for i := range sData {
  3398. sData[i].calc()
  3399. }
  3400. return sData, err
  3401. }