hsby.go 112 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073
  1. package models
  2. import (
  3. "encoding/hex"
  4. "fmt"
  5. "math"
  6. "mtp2_if/db"
  7. "mtp2_if/pb"
  8. "mtp2_if/utils"
  9. "strconv"
  10. "strings"
  11. "time"
  12. "google.golang.org/protobuf/proto"
  13. )
  14. // Hsbygoodsex 商品扩展表
  15. type Hsbygoodsex struct {
  16. Goodsid int32 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商 品ID
  17. Hotindex int32 `json:"hotindex" xorm:"'HOTINDEX'"` // 景点热度
  18. Descprovinceid int64 `json:"descprovinceid" xorm:"'DESCPROVINCEID'"` // 目的地(省)
  19. Desccityid int64 `json:"desccityid" xorm:"'DESCCITYID'"` // 目的地(市)
  20. Vendorid int32 `json:"vendorid" xorm:"'VENDORID'"` // 供应商ID
  21. Goodsdesc string `json:"goodsdesc" xorm:"'GOODSDESC'"` // 商品详情
  22. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  23. Creatorid int64 `json:"creatorid" xorm:"'CREATORID'"` // 创建人
  24. Modifierid int64 `json:"modifierid" xorm:"'MODIFIERID'"` // 修改人
  25. Modifytime time.Time `json:"modifytime" xorm:"'MODIFYTIME'"` // 修改时间
  26. Memberratio float64 `json:"memberratio" xorm:"'MEMBERRATIO'"` // 会员货款比例 [71]
  27. Videourls string `json:"videourls" xorm:"'VIDEOURLS'"` // 介绍视频[多张用逗号分隔]
  28. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
  29. Goodsprice float64 `json:"goodsprice" xorm:"'GOODSPRICE'"` // 商品价格
  30. Categoryid int32 `json:"categoryid" xorm:"'CATEGORYID'"` // 类别ID(WRCATEGORY)
  31. }
  32. // TableName is HSBY_GOODSEX
  33. func (Hsbygoodsex) TableName() string {
  34. return "HSBY_GOODSEX"
  35. }
  36. // Hsbysupplierinfo 供应商表
  37. type Hsbysupplierinfo struct {
  38. Vendorid int32 `json:"vendorid" xorm:"'VENDORID'" binding:"required"` // 供应商ID(SEQ_HSBY_SUPPLIERINFO)
  39. Vendorname string `json:"vendorname" xorm:"'VENDORNAME'"` // 名称描述客服电话名称
  40. Vendordesc string `json:"vendordesc" xorm:"'VENDORDESC'"` // 描述
  41. Vendorphone string `json:"vendorphone" xorm:"'VENDORPHONE'"` // 客服电话
  42. Vendorattr string `json:"vendorattr" xorm:"'VENDORATTR'"` // 附件(多张,逗号分隔)
  43. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  44. Creatorid int64 `json:"creatorid" xorm:"'CREATORID'"` // 创建人
  45. Modifierid int64 `json:"modifierid" xorm:"'MODIFIERID'"` // 修改人
  46. Modifytime time.Time `json:"modifytime" xorm:"'MODIFYTIME'"` // 修改时间
  47. }
  48. // TableName is HSBY_SUPPLIERINFO
  49. func (Hsbysupplierinfo) TableName() string {
  50. return "HSBY_SUPPLIERINFO"
  51. }
  52. // Tradepayorder 交易待付款表
  53. type Tradepayorder struct {
  54. Tradeid int64 `json:"tradeid" xorm:"'TRADEID'" binding:"required"` // 成交单号(101+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  55. Tradedate string `json:"tradedate" xorm:"'TRADEDATE'"` // 交易日(yyyyMMdd)
  56. Marketid int32 `json:"marketid" xorm:"'MARKETID'"` // 市场ID
  57. Goodsid int32 `json:"goodsid" xorm:"'GOODSID'"` // 商品ID
  58. Buyorderid int64 `json:"buyorderid" xorm:"'BUYORDERID'"` // 买方委托单号
  59. Buyaccountid int64 `json:"buyaccountid" xorm:"'BUYACCOUNTID'"` // 买方账号ID[报价币种]
  60. Sellorderid int64 `json:"sellorderid" xorm:"'SELLORDERID'"` // 卖方委托单号
  61. Sellaccountid int64 `json:"sellaccountid" xorm:"'SELLACCOUNTID'"` // 卖方账号ID[报价币种]
  62. Tradeamount float64 `json:"tradeamount" xorm:"'TRADEAMOUNT'"` // 成交金额
  63. Tradecharge float64 `json:"tradecharge" xorm:"'TRADECHARGE'"` // 成交手续费(买方)
  64. Payflag int32 `json:"payflag" xorm:"'PAYFLAG'"` // 付款标识 - 1:未支付 2:已支付 3:已过期 4:已撤销 5:结算过期 6:预售终止
  65. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  66. Paytime time.Time `json:"paytime" xorm:"'PAYTIME'"` // 付款时间
  67. Paylimitedtime time.Time `json:"paylimitedtime" xorm:"'PAYLIMITEDTIME'"` // 支付期限
  68. Offamount float64 `json:"offamount" xorm:"'OFFAMOUNT'"` // 优惠金额
  69. Tradeprice float64 `json:"tradeprice" xorm:"'TRADEPRICE'"` // 成交价格
  70. Tradeqty int64 `json:"tradeqty" xorm:"'TRADEQTY'"` // 成交数量
  71. Payamount float64 `json:"payamount" xorm:"'PAYAMOUNT'"` // 支付金额 = TradeAmount + TradeCharge - OffAmount
  72. }
  73. // TableName is TRADE_PAYORDER
  74. func (Tradepayorder) TableName() string {
  75. return "TRADE_PAYORDER"
  76. }
  77. // Coupontype 优惠券类型表
  78. type Coupontype struct {
  79. Coupontypeid int32 `json:"coupontypeid" xorm:"'COUPONTYPEID'" binding:"required"` // 优惠券类型ID - SEQ_COUPONTYPE
  80. Areauserid int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构
  81. Couponname string `json:"couponname" xorm:"'COUPONNAME'"` // 优惠券名称
  82. Couponcategroy int32 `json:"couponcategroy" xorm:"'COUPONCATEGROY'"` // 种类 - 1:现金券 2:折扣券 3:折扣券(单张)
  83. Conditionvalue float64 `json:"conditionvalue" xorm:"'CONDITIONVALUE'"` // 条件阈值(可为0)
  84. Couponvalue float64 `json:"couponvalue" xorm:"'COUPONVALUE'"` // 面值[1:现金券 - 抵扣值 2:折扣券-折扣值]
  85. Limitedflag int32 `json:"limitedflag" xorm:"'LIMITEDFLAG'"` // 是否指定商品 - 0:不限 1:限制
  86. Limitedgoodsids string `json:"limitedgoodsids" xorm:"'LIMITEDGOODSIDS'"` // 指定商品IDs[逗号分隔,前后加逗号]
  87. Isgeneral int32 `json:"isgeneral" xorm:"'ISGENERAL'"` // 是否通用券 - 0:否 1:是
  88. Userscope string `json:"userscope" xorm:"'USERSCOPE'"` // 卖家范围(用户ID,逗号分隔,前后加逗号) [IsGeneral =0时使用]
  89. Qty int64 `json:"qty" xorm:"'QTY'"` // 数量
  90. Curqty int64 `json:"curqty" xorm:"'CURQTY'"` // 剩余数量
  91. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  92. Creatorid int64 `json:"creatorid" xorm:"'CREATORID'"` // 创建人
  93. Modifierid int64 `json:"modifierid" xorm:"'MODIFIERID'"` // 修改人
  94. Modifytime time.Time `json:"modifytime" xorm:"'MODIFYTIME'"` // 修改时间
  95. Usedqty int64 `json:"usedqty" xorm:"'USEDQTY'"` // 使用量
  96. Isvalid int32 `json:"isvalid" xorm:"'ISVALID'"` // 是否有效 - 0:无效 1:有效
  97. Expiredqty int64 `json:"expiredqty" xorm:"'EXPIREDQTY'"` // 失效量
  98. }
  99. // TableName is COUPONTYPE
  100. func (Coupontype) TableName() string {
  101. return "COUPONTYPE"
  102. }
  103. // Couponposition 优惠券头寸表 - 导历史(期末为0的清除)
  104. type Couponposition struct {
  105. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'" binding:"required"` // 资金账户ID
  106. Coupontypeid int32 `json:"coupontypeid" xorm:"'COUPONTYPEID'" binding:"required"` // 优惠券类型ID
  107. Userid int64 `json:"userid" xorm:"'USERID'"` // 用户ID
  108. Oriqty int64 `json:"oriqty" xorm:"'ORIQTY'"` // 期初数量
  109. Orifreezeqty int64 `json:"orifreezeqty" xorm:"'ORIFREEZEQTY'"` // 期初冻结数量
  110. Curqty int64 `json:"curqty" xorm:"'CURQTY'"` // 期末数量
  111. Curfreezeqty int64 `json:"curfreezeqty" xorm:"'CURFREEZEQTY'"` // 期末冻结数量
  112. Todayincrease int64 `json:"todayincrease" xorm:"'TODAYINCREASE'"` // 今日增加
  113. Todaydecrease int64 `json:"todaydecrease" xorm:"'TODAYDECREASE'"` // 今日减少
  114. }
  115. // TableName is COUPONPOSITION
  116. func (Couponposition) TableName() string {
  117. return "COUPONPOSITION"
  118. }
  119. // Couponhold 优惠券持仓表 - 导历史(不清当前表) - 每一个数量一条记录
  120. type Couponhold struct {
  121. Couponholdid int64 `json:"couponholdid" xorm:"'COUPONHOLDID'" binding:"required"` // 优惠券持仓ID(229+Unix秒时间戳(10位)+xxxxxx)
  122. Giveapplyid int64 `json:"giveapplyid" xorm:"'GIVEAPPLYID'"` // 发放申请ID(SEQ_COUPONGIVEAPPLY)
  123. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'"` // 资金账户ID
  124. Coupontypeid int32 `json:"coupontypeid" xorm:"'COUPONTYPEID'"` // 优惠券类型ID - SEQ_COUPONTYPE
  125. Couponcategroy int32 `json:"couponcategroy" xorm:"'COUPONCATEGROY'"` // 种类 - 1:现金券 2:折扣券 3:折扣券(单个商品)
  126. Conditionvalue float64 `json:"conditionvalue" xorm:"'CONDITIONVALUE'"` // 条件阈值(可为0)
  127. Couponvalue float64 `json:"couponvalue" xorm:"'COUPONVALUE'"` // 面值[1:现金券 - 抵扣值 2:折扣券-折扣值]
  128. Limitedflag int32 `json:"limitedflag" xorm:"'LIMITEDFLAG'"` // 是否指定商品 - 0:不限 1:限制
  129. Limitedgoodsids string `json:"limitedgoodsids" xorm:"'LIMITEDGOODSIDS'"` // 指定商品IDs[逗号分隔]
  130. Isgeneral int32 `json:"isgeneral" xorm:"'ISGENERAL'"` // 是否通用券 - 0:否 1:是
  131. Userscope string `json:"userscope" xorm:"'USERSCOPE'"` // 卖家范围(用户ID,逗号分隔) [IsGeneral =0时使用]
  132. Userid int64 `json:"userid" xorm:"'USERID'"` // 用户ID
  133. Qty int64 `json:"qty" xorm:"'QTY'"` // 数量(按1平铺)
  134. Startdate time.Time `json:"startdate" xorm:"'STARTDATE'"` // 开始日期
  135. Holdstatus int32 `json:"holdstatus" xorm:"'HOLDSTATUS'"` // 持仓状态 - 1:未生效 2:已生效 3:已使用 4:已过期
  136. Enddate time.Time `json:"enddate" xorm:"'ENDDATE'"` // 结束日期
  137. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  138. }
  139. // TableName is COUPONHOLD
  140. func (Couponhold) TableName() string {
  141. return "COUPONHOLD"
  142. }
  143. // Tradeordercoupon 交易委托优惠券表
  144. type Tradeordercoupon struct {
  145. Orderid string `json:"orderid" xorm:"'ORDERIDSTR'" binding:"required"` // 委托单号(100+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  146. Coupontypeid string `json:"coupontypeid" xorm:"'COUPONTYPEIDSTR'" binding:"required"` // 优惠券类型ID(买方)
  147. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'"` // 资金账户ID(买方)
  148. Usedqty int64 `json:"usedqty" xorm:"'USEDQTY'"` // 使用数量
  149. Couponcategroy int32 `json:"couponcategroy" xorm:"'COUPONCATEGROY'"` // 种类 - 1:现金券 2:折扣券
  150. Conditionvalue float64 `json:"conditionvalue" xorm:"'CONDITIONVALUE'"` // 条件阈值(可为0)
  151. Couponvalue float64 `json:"couponvalue" xorm:"'COUPONVALUE'"` // 面值[1:现金券 - 抵扣值 2:折扣券-折扣值(0-100)]
  152. Sellaccountid int64 `json:"sellaccountid" xorm:"'SELLACCOUNTID'"` // 资金账户ID(卖方)
  153. Marketid int32 `json:"marketid" xorm:"'MARKETID'"` // 市场ID
  154. Goodsid int32 `json:"goodsid" xorm:"'GOODSID'"` // 商品ID
  155. Tradeid string `json:"tradeid" xorm:"'TRADEIDSTR'"` // 成交单号(101+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  156. Tradeamount float64 `json:"tradeamount" xorm:"'TRADEAMOUNT'"` // 成交金额
  157. Offamount float64 `json:"offamount" xorm:"'OFFAMOUNT'"` // 优惠金额
  158. Handlestatus int32 `json:"handlestatus" xorm:"'HANDLESTATUS'"` // 处理状态
  159. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  160. }
  161. // TableName is TRADE_ORDERCOUPON
  162. func (Tradeordercoupon) TableName() string {
  163. return "TRADE_ORDERCOUPON"
  164. }
  165. // Hiscouponhold 优惠卷持仓历史表
  166. type Hiscouponhold struct {
  167. Couponholdid int64 `json:"couponholdid" xorm:"'COUPONHOLDID'" binding:"required"` //
  168. Giveapplyid int64 `json:"giveapplyid" xorm:"'GIVEAPPLYID'"` //
  169. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'"` //
  170. Coupontypeid int32 `json:"coupontypeid" xorm:"'COUPONTYPEID'"` //
  171. Couponcategroy int32 `json:"couponcategroy" xorm:"'COUPONCATEGROY'"` //
  172. Conditionvalue float64 `json:"conditionvalue" xorm:"'CONDITIONVALUE'"` //
  173. Couponvalue float64 `json:"couponvalue" xorm:"'COUPONVALUE'"` //
  174. Limitedflag int32 `json:"limitedflag" xorm:"'LIMITEDFLAG'"` //
  175. Limitedgoodsids string `json:"limitedgoodsids" xorm:"'LIMITEDGOODSIDS'"` //
  176. Isgeneral int32 `json:"isgeneral" xorm:"'ISGENERAL'"` //
  177. Userscope string `json:"userscope" xorm:"'USERSCOPE'"` //
  178. Userid int64 `json:"userid" xorm:"'USERID'"` //
  179. Qty int64 `json:"qty" xorm:"'QTY'"` //
  180. Startdate time.Time `json:"startdate" xorm:"'STARTDATE'"` //
  181. Holdstatus int32 `json:"holdstatus" xorm:"'HOLDSTATUS'"` //
  182. Enddate time.Time `json:"enddate" xorm:"'ENDDATE'"` //
  183. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` //
  184. Histradedate string `json:"histradedate" xorm:"'HISTRADEDATE'" binding:"required"` //
  185. Isvaliddata int32 `json:"isvaliddata" xorm:"'ISVALIDDATA'"` //
  186. Oriqty int64 `json:"oriqty" xorm:"'ORIQTY'"` //
  187. }
  188. // TableName is HIS_COUPONHOLD
  189. func (Hiscouponhold) TableName() string {
  190. return "HIS_COUPONHOLD"
  191. }
  192. // Clientfixedadconfig 终端固定广告配置 - 通用功能
  193. type Clientfixedadconfig struct {
  194. Adtype int32 `json:"adtype" xorm:"'ADTYPE'" binding:"required"` // 广告位类型 - 1:新品抢购(HSBY)
  195. Adsort int32 `json:"adsort" xorm:"'ADSORT'" binding:"required"` // 排序
  196. Imagepath string `json:"imagepath" xorm:"'IMAGEPATH'"` // 图片
  197. Recsize string `json:"recsize" xorm:"'RECSIZE'"` // 推荐尺寸
  198. Title string `json:"title" xorm:"'TITLE'"` // 标题
  199. Urltype int32 `json:"urltype" xorm:"'URLTYPE'"` // 链接类型 - 1:直接地址 2:商品ID
  200. Urlcontent string `json:"urlcontent" xorm:"'URLCONTENT'"` // 链接(地址或商品ID)
  201. Isshow int32 `json:"isshow" xorm:"'ISSHOW'"` // 是否展示 - 0:不展示 1:展示
  202. Createdate time.Time `json:"createdate" xorm:"'CREATEDATE'"` // 创建时间
  203. Creatorid int64 `json:"creatorid" xorm:"'CREATORID'"` // 创建人
  204. Updatedate time.Time `json:"updatedate" xorm:"'UPDATEDATE'"` // 更新时间
  205. Modifierid int64 `json:"modifierid" xorm:"'MODIFIERID'"` // 操作人
  206. Areauserid int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构ID
  207. }
  208. // TableName is CLIENT_FIXEDADCONFIG
  209. func (Clientfixedadconfig) TableName() string {
  210. return "CLIENT_FIXEDADCONFIG"
  211. }
  212. // HsbyTopGoods 热卖商品(二级市场挂牌点选)
  213. type HsbyTopGoods struct {
  214. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID(自增ID SEQ_GOODS)
  215. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  216. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  217. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  218. Marketid int64 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 所属市场ID
  219. Quoteminunit int64 `json:"quoteminunit" xorm:"'QUOTEMINUNIT'"` // 行情最小变动单位 [整数,报价小数位一起使用]
  220. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  221. Hotindex int32 `json:"hotindex" xorm:"'HOTINDEX'"` // 景点热度
  222. Videourls string `json:"videourls" xorm:"'VIDEOURLS'"` // 介绍视频[多张用逗号分隔]
  223. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
  224. Descprovinceid int64 `json:"descprovinceid" xorm:"'DESCPROVINCEID'"` // 目的地(省)
  225. Desccityid int64 `json:"desccityid" xorm:"'DESCCITYID'"` // 目的地(市)
  226. Currency string `json:"currency" xorm:"'CURRENCY'"` // 货币
  227. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  228. Trademode int32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  229. Last float64 `json:"last" xorm:"-"` // 现价
  230. }
  231. // GetHsbyTopGoodses 获取热门商品列表
  232. // 参数 marketIDs string 所属市场ID列表, 格式 1,2,3
  233. // 参数 descProvinceID int 目标省ID
  234. // 参数 descCityID int 目标城市ID
  235. // 返回 []TopGoods 热门商品列表
  236. // 返回 error error
  237. func GetHsbyTopGoodses(marketIDs string, descProvinceID, descCityID int) ([]HsbyTopGoods, error) {
  238. // 热门商品为二级市场(挂牌点选)下的商品信息
  239. engine := db.GetEngine()
  240. topGoodses := make([]HsbyTopGoods, 0)
  241. // 获取挂牌商品信息,以及扩展表信息
  242. // 与商城不一样的是,挂牌点选以商品表作为主表,同一商品可有多个委托单
  243. session := engine.Table("GOODS").
  244. Select(`GOODS.*,
  245. HSBY_GOODSEX.HOTINDEX, HSBY_GOODSEX.VIDEOURLS, HSBY_GOODSEX.PICURLS, HSBY_GOODSEX.DESCPROVINCEID, HSBY_GOODSEX.DESCCITYID,
  246. ENUMDICITEM.ENUMDICNAME CURRENCY, ENUMDICITEM.PARAM2 CURRENCYSIGN,
  247. MARKET.TRADEMODE`).
  248. Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = GOODS.GOODSID").
  249. Join("LEFT", "ENUMDICITEM", "ENUMDICITEM.ENUMITEMNAME = GOODS.CURRENCYID and ENUMDICITEM.ENUMDICCODE = 'currency'").
  250. Join("LEFT", "MARKET", "MARKET.MARKETID = GOODS.MARKETID").
  251. Where(fmt.Sprintf("GOODS.GOODSSTATUS = 3 and GOODS.MARKETID in (%s)", marketIDs)) // 二级市场只获取 3:上市 状态的商品
  252. if descProvinceID > 0 {
  253. session = session.And("HSBY_GOODSEX.DESCPROVINCEID = ?", descProvinceID)
  254. }
  255. if descCityID > 0 {
  256. session = session.And("HSBY_GOODSEX.DESCCITYID = ?", descCityID)
  257. }
  258. if err := session.Find(&topGoodses); err != nil {
  259. return nil, err
  260. }
  261. if len(topGoodses) == 0 {
  262. // 无数据
  263. return topGoodses, nil
  264. }
  265. // 获取商品ID列表
  266. goodsCodes := ""
  267. for _, v := range topGoodses {
  268. if len(goodsCodes) == 0 {
  269. goodsCodes = "'" + v.Goodscode + "'"
  270. } else {
  271. goodsCodes += ",'" + v.Goodscode + "'"
  272. }
  273. }
  274. // 获取商品现价
  275. quoteDays, err := GetQuoteDays(goodsCodes)
  276. if err != nil {
  277. return nil, err
  278. }
  279. for i, g := range topGoodses {
  280. topGoods := &topGoodses[i]
  281. // FIXME: - 这里应该使用 Duck Typing,后期再处理
  282. // 计算最小变动单位
  283. // lotSize := float64(topGoods.Quoteminunit) * math.Pow(0.1, float64(topGoods.Decimalplace))
  284. // topGoods.LotSize, _ = strconv.ParseFloat(utils.FormatFloat(lotSize, int(topGoods.Decimalplace)), 64)
  285. for _, q := range quoteDays {
  286. if g.Goodscode == q.Goodscode {
  287. if q.Last != 0 {
  288. topGoods.Last = utils.IntToFloat64(int(q.Last), int(g.Decimalplace))
  289. }
  290. // 没有现价则尝试用昨结
  291. if topGoods.Last == 0 && q.Presettle != 0 {
  292. topGoods.Last = utils.IntToFloat64(int(q.Presettle), int(g.Decimalplace))
  293. }
  294. continue
  295. }
  296. }
  297. }
  298. return topGoodses, nil
  299. }
  300. // HsbyListingGoodsDetail 二级市场(挂牌点选)商品信息详情
  301. type HsbyListingGoodsDetail struct {
  302. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID(自增ID SEQ_GOODS)
  303. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  304. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  305. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  306. Marketid int64 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 所属市场ID
  307. Quoteminunit int64 `json:"quoteminunit" xorm:"'QUOTEMINUNIT'"` // 行情最小变动单位 [整数,报价小数位一起使用]
  308. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  309. Hotindex int32 `json:"hotindex" xorm:"'HOTINDEX'"` // 景点热度
  310. Videourls string `json:"videourls" xorm:"'VIDEOURLS'"` // 介绍视频[多张用逗号分隔]
  311. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
  312. Descprovinceid int64 `json:"descprovinceid" xorm:"'DESCPROVINCEID'"` // 目的地(省)ID
  313. Desccityid int64 `json:"desccityid" xorm:"'DESCCITYID'"` // 目的地(市)ID
  314. Goodsdesc string `json:"goodsdesc" xorm:"'GOODSDESC'"` // 商品详情
  315. Goodsprice float64 `json:"goodsprice" xorm:"'GOODSPRICE'"` // 商品价格
  316. Currency string `json:"currency" xorm:"'CURRENCY'"` // 货币
  317. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  318. Vendorname string `json:"vendorname" xorm:"'VENDORNAME'"` // 供应商名称
  319. Vendorphone string `json:"vendorphone" xorm:"'VENDORPHONE'"` // 供应商客服电话
  320. Vendorattr string `json:"vendorattr" xorm:"'VENDORATTR'"` // 供应商附件(多张,逗号分隔)
  321. Trademode int32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  322. Last float64 `json:"last" xorm:"-"` // 现价
  323. Limitup float64 `json:"limitup" xorm:"-"` // 涨停价
  324. Limitdown float64 `json:"limitdown" xorm:"-"` // 跌停价
  325. StepValue float64 `json:"stepvalue" xorm:"-"` // 价格最小变动单位
  326. LotSize int `json:"lotsize" xorm:"-"` // 手数最小变动单位
  327. Buymaxqty int `json:"buymaxqty" xorm:"'-'"` // 购买上限 [71] - 0为不限
  328. }
  329. // GetHsbyListingGoodsDetail 获取二级市场(挂牌点选)商品信息详情
  330. // 参数 goodsID int 目标商品ID
  331. // 返回 *HsbyListingGoodsDetail 二级市场(挂牌点选)商品信息详情,查询无结果返回nil
  332. // 返回 error error
  333. func GetHsbyListingGoodsDetail(goodsID, accountID int) (*HsbyListingGoodsDetail, error) {
  334. engine := db.GetEngine()
  335. details := make([]HsbyListingGoodsDetail, 0)
  336. // 获取挂牌商品信息,以及扩展表信息
  337. // FIXME: - 这里使用Get方法,会造成SQL语句的嵌套出错,后期再研究
  338. session := engine.Table("GOODS").
  339. Select(`GOODS.GOODSID, GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE, GOODS.MARKETID, GOODS.QUOTEMINUNIT, GOODS.AGREEUNIT,
  340. HSBY_GOODSEX.HOTINDEX, HSBY_GOODSEX.VIDEOURLS, HSBY_GOODSEX.PICURLS, HSBY_GOODSEX.DESCPROVINCEID, HSBY_GOODSEX.Desccityid, HSBY_GOODSEX.Goodsdesc, HSBY_GOODSEX.GOODSPRICE,
  341. ENUMDICITEM.ENUMDICNAME CURRENCY, ENUMDICITEM.PARAM2 CURRENCYSIGN,
  342. HSBY_SUPPLIERINFO.VENDORNAME, HSBY_SUPPLIERINFO.VENDORPHONE, HSBY_SUPPLIERINFO.VENDORATTR,
  343. MARKET.TRADEMODE`).
  344. Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = GOODS.GOODSID").
  345. Join("LEFT", "ENUMDICITEM", "ENUMDICITEM.ENUMITEMNAME = GOODS.CURRENCYID and ENUMDICITEM.ENUMDICCODE = 'currency'").
  346. Join("LEFT", "HSBY_SUPPLIERINFO", "HSBY_SUPPLIERINFO.VENDORID = HSBY_GOODSEX.VENDORID").
  347. Join("LEFT", "MARKET", "MARKET.MARKETID = GOODS.MARKETID").
  348. Where("GOODS.GOODSID = ?", goodsID)
  349. if err := session.Find(&details); err != nil {
  350. return nil, err
  351. }
  352. // 无目标商品
  353. if len(details) == 0 {
  354. return nil, nil
  355. }
  356. hsbyListingGoodsDetail := details[0]
  357. // 获取商品现价和涨跌停价
  358. quoteDays, err := GetQuoteDays("'" + hsbyListingGoodsDetail.Goodscode + "'")
  359. if err != nil {
  360. return nil, err
  361. }
  362. if len(quoteDays) > 0 {
  363. if quoteDays[0].Last != 0 {
  364. hsbyListingGoodsDetail.Last = utils.IntToFloat64(int(quoteDays[0].Last), int(hsbyListingGoodsDetail.Decimalplace))
  365. }
  366. // 没有现价则尝试用昨结
  367. if hsbyListingGoodsDetail.Last == 0 && quoteDays[0].Presettle != 0 {
  368. hsbyListingGoodsDetail.Last = utils.IntToFloat64(int(quoteDays[0].Presettle), int(hsbyListingGoodsDetail.Decimalplace))
  369. }
  370. if quoteDays[0].Limitup != 0 {
  371. hsbyListingGoodsDetail.Limitup = utils.IntToFloat64(int(quoteDays[0].Limitup), int(hsbyListingGoodsDetail.Decimalplace))
  372. }
  373. if quoteDays[0].Limitdown != 0 {
  374. hsbyListingGoodsDetail.Limitdown = utils.IntToFloat64(int(quoteDays[0].Limitdown), int(hsbyListingGoodsDetail.Decimalplace))
  375. }
  376. }
  377. // 计算价格最小变动单位
  378. stepValue := float64(hsbyListingGoodsDetail.Quoteminunit) * math.Pow(0.1, float64(hsbyListingGoodsDetail.Decimalplace))
  379. hsbyListingGoodsDetail.StepValue, _ = strconv.ParseFloat(utils.FormatFloat(stepValue, int(hsbyListingGoodsDetail.Decimalplace)), 64)
  380. // 计算手数最小变动单位,改在上层进行设置,这里暂时设置成1
  381. hsbyListingGoodsDetail.LotSize = 1
  382. return &hsbyListingGoodsDetail, nil
  383. }
  384. // HsbyGoodsOrderDetail 二级市场挂牌商品当前可摘委托单信息
  385. type HsbyGoodsOrderDetail struct {
  386. Orderid string `json:"orderid" xorm:"'ORDERID'" binding:"required"` // 委托单号(100+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  387. Buyorsell int32 `json:"buyorsell" xorm:"'BUYORSELL'" binding:"required"` // 买卖 - 0:买 1:卖
  388. Ordertime time.Time `json:"ordertime" xorm:"'ORDERTIME'" binding:"required"` // 委托时间
  389. Orderprice float64 `json:"orderprice" xorm:"'ORDERPRICE'"` // 委托价格
  390. Enableqty int64 `json:"enableqty" xorm:"ENABLEQTY"` // 可用数量
  391. Customername string `json:"customername" xorm:"'CUSTOMERNAME'"` // 客户名称(企业名称),已脱敏
  392. Currencysign string `json:"currencysign" xorm:"-"` // 货币符号
  393. Goodunit string `json:"goodunit" xorm:"-"` // 报价单位
  394. }
  395. // GetHsbyGoodsOrderDetails 获取二级市场(挂牌点选)商品对应的挂牌委托单信息
  396. // 输入 goodsID int 商品ID
  397. // 输入 buyOrSell int 挂牌委托单方向(对手单方向),0:买 1:卖
  398. // 输入 price float64 参考价格。买方向委托单则价格小于等于(站在摘牌人的角度);卖方向委托单则价格大于等于
  399. // 输出 []HsbyGoodsOrderDetail 商品对应的挂牌委托单信息
  400. // 输出 error error
  401. func GetHsbyGoodsOrderDetails(goodsID, buyOrSell int, price float64, accountIDs string) ([]HsbyGoodsOrderDetail, error) {
  402. engine := db.GetEngine()
  403. // 获取与目标商品相关的挂牌委托单信息(ListingSelectType = 1 or 3; OrderStatus =3 or 7)
  404. hsbyGoodsOrderDetails := make([]HsbyGoodsOrderDetail, 0)
  405. session := engine.Table("TRADE_ORDERDETAIL").
  406. Select(`to_char(TRADE_ORDERDETAIL.ORDERID) ORDERID, TRADE_ORDERDETAIL.BUYORSELL, TRADE_ORDERDETAIL.ORDERTIME, TRADE_ORDERDETAIL.ORDERPRICE, (TRADE_ORDERDETAIL.ORDERQTY - TRADE_ORDERDETAIL.TRADEQTY - TRADE_ORDERDETAIL.CANCELQTY) ENABLEQTY,
  407. substr(USERINFO.CUSTOMERNAME,0,1)||'****' as CUSTOMERNAME`).
  408. Join("LEFT", "TAACCOUNT", "TAACCOUNT.ACCOUNTID = TRADE_ORDERDETAIL.ACCOUNTID").
  409. Join("LEFT", "USERINFO", "USERINFO.USERID = TAACCOUNT.RELATEDUSERID").
  410. Where("(TRADE_ORDERDETAIL.LISTINGSELECTTYPE = 1 or TRADE_ORDERDETAIL.LISTINGSELECTTYPE = 3) and (TRADE_ORDERDETAIL.ORDERSTATUS = 3 or TRADE_ORDERDETAIL.ORDERSTATUS = 7)").
  411. And("TRADE_ORDERDETAIL.GOODSID = ?", goodsID).
  412. And("TRADE_ORDERDETAIL.BUYORSELL = ?", buyOrSell)
  413. if len(accountIDs) > 0 {
  414. session = session.And(fmt.Sprintf("TRADE_ORDERDETAIL.ACCOUNTID not in (%s)", accountIDs))
  415. }
  416. if price > 0 {
  417. if buyOrSell == 0 {
  418. // 对手单买方向委托单则价格大于等于(站在摘牌人的角度,摘牌方面是卖,我的闲置下单)
  419. session = session.And("TRADE_ORDERDETAIL.ORDERPRICE >= ?", price)
  420. } else {
  421. // 对手单卖方向委托单则价格小于等于(站在摘牌人的角度,摘牌方面是买,热门商品下单)
  422. session = session.And("TRADE_ORDERDETAIL.ORDERPRICE <= ?", price)
  423. }
  424. }
  425. if err := session.Find(&hsbyGoodsOrderDetails); err != nil {
  426. return nil, err
  427. }
  428. // 获取商品货币符号和报价单位
  429. goods, err := GetGoods(goodsID)
  430. if err != nil {
  431. return nil, err
  432. }
  433. currencyEnums, err := GetEnumDicItem("currency", int(goods.Currencyid))
  434. if err != nil {
  435. return nil, err
  436. }
  437. currencysign := ""
  438. if len(currencyEnums) > 0 {
  439. currencysign = currencyEnums[0].Param2
  440. }
  441. goodsUnitEnums, err := GetEnumDicItem("goodsunit", int(goods.Goodunitid))
  442. if err != nil {
  443. return nil, err
  444. }
  445. goodsUnit := ""
  446. if len(goodsUnitEnums) > 0 {
  447. goodsUnit = goodsUnitEnums[0].Enumdicname
  448. }
  449. for i := range hsbyGoodsOrderDetails {
  450. orderDetail := &hsbyGoodsOrderDetails[i]
  451. // 设置货币符号和报价单位
  452. orderDetail.Currencysign = currencysign
  453. orderDetail.Goodunit = goodsUnit
  454. }
  455. return hsbyGoodsOrderDetails, nil
  456. }
  457. // HybsMyBuyOrderDetail 我的订单(一二级市场的买方向委托单)
  458. type HybsMyBuyOrderDetail struct {
  459. Orderid string `json:"orderid" xorm:"'ORDERID'" binding:"required"` // 委托单号(100+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  460. Marketid int32 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 市场ID
  461. Goodsid int32 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID
  462. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'" binding:"required"` // 账户ID[报价币种]
  463. Buyorsell int32 `json:"buyorsell" xorm:"'BUYORSELL'" binding:"required"` // 买卖 - 0:买 1:卖
  464. Orderprice float64 `json:"orderprice" xorm:"'ORDERPRICE'"` // 委托价格
  465. Orderqty int64 `json:"orderqty" xorm:"'ORDERQTY'" binding:"required"` // 委托数量
  466. Tradeqty int64 `json:"tradeqty" xorm:"'TRADEQTY'"` // 成交数量
  467. Cancelqty int64 `json:"cancelqty" xorm:"'CANCELQTY'"` // 撤单数量
  468. Ordertime time.Time `json:"ordertime" xorm:"'ORDERTIME'" binding:"required"` // 委托时间
  469. Listingselecttype int32 `json:"listingselecttype" xorm:"'LISTINGSELECTTYPE'"` // 挂牌点选类型 - 1:挂牌 2:摘牌 3:先摘后挂
  470. Orderstatus int32 `json:"orderstatus" xorm:"'ORDERSTATUS'"` // 委托状态 - 1: 委托请求 2:待冻结 3:委托成功 4: 委托失败 5:配对成功 6: 已撤销 7:部分成交 8:已成交 9:部成部撤 10:成交失败 11:已拒绝 12:经过摘牌(先摘后挂专用-先摘后挂已摘过) 13:冻结成功(通道交易专用) 14:通道已撤 15:通道部成部撤 16:成交失败违约(荷兰式竞拍专用)
  471. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  472. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  473. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  474. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  475. Picurls1 string `json:"picurls1" xorm:"'PICURLS1'"` // 预售商品介绍图片[多张用逗号分隔]
  476. Picurls2 string `json:"picurls2" xorm:"'PICURLS2'"` // 挂牌商品介绍图片[多张用逗号分隔]
  477. Trademode uint32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  478. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  479. Vendorname1 string `json:"vendorname1" xorm:"'VENDORNAME1'"` // 预售商品供应商名称
  480. Vendorname2 string `json:"vendorname2" xorm:"'VENDORNAME2'"` // 挂牌商品供应商名称
  481. MyBuyStatus int `json:"mybuystatus" xorm:"-"` // "我的订单"显示状态- 1:抢购中 2:求购中 3:已完成 4:已撤消 5:委托失败
  482. Orderamount float64 `json:"orderamount" xorm:"-"` // 委托金额
  483. }
  484. // GetHsbyBuyMyOrderDetails 获取“我的订单”数据(包括一二级市场)
  485. // 输入 accountIDs string 资金账户列表
  486. // 输入 myBuyStatus int "我的订单"状态, 1:抢购中 2:求购中 3:已完成
  487. // 输出 []HybsMyBuyOrderDetail “我的订单”数据
  488. // 输出 error error
  489. func GetHsbyBuyMyOrderDetails(accountIDs string, myBuyStatus int) ([]HybsMyBuyOrderDetail, error) {
  490. // 获取市场信息
  491. markets, err := GetMarkets()
  492. if err != nil {
  493. return nil, err
  494. }
  495. engine := db.GetEngine()
  496. // 委托状态
  497. orderStatus := "0" // 单据状态,为0的时候查询全部
  498. marketIDs := "" // 我的订单包括一二级市场的单据
  499. // FIXME: myBuyStatus 目前终端不传
  500. // switch myBuyStatus {
  501. // case 1: // 抢购中 (一级市场)
  502. // // 获取市场ID
  503. // for _, v := range markets {
  504. // if v.Trademode == 71 { // 预售挂牌
  505. // if len(marketIDs) == 0 {
  506. // marketIDs = strconv.Itoa(int(v.Marketid))
  507. // } else {
  508. // marketIDs += "," + strconv.Itoa(int(v.Marketid))
  509. // }
  510. // }
  511. // }
  512. // orderStatus = "3,7"
  513. // case 2: // 求购中(二级市场)
  514. // // 获取市场ID
  515. // for _, v := range markets {
  516. // if v.Trademode == 16 { // 挂牌点选
  517. // if len(marketIDs) == 0 {
  518. // marketIDs = strconv.Itoa(int(v.Marketid))
  519. // } else {
  520. // marketIDs += "," + strconv.Itoa(int(v.Marketid))
  521. // }
  522. // }
  523. // }
  524. // orderStatus = "3,7"
  525. // case 3: // 已完成
  526. // orderStatus = "8,9"
  527. // }
  528. // 默认取 TradeMode = 16 or 71 的市场
  529. if len(marketIDs) == 0 {
  530. for _, v := range markets {
  531. if v.Trademode == 16 || v.Trademode == 71 || v.Trademode == 70 {
  532. if len(marketIDs) == 0 {
  533. marketIDs = strconv.Itoa(int(v.Marketid))
  534. } else {
  535. marketIDs += "," + strconv.Itoa(int(v.Marketid))
  536. }
  537. }
  538. }
  539. }
  540. hybsMyBuyOrderDetails := make([]HybsMyBuyOrderDetail, 0)
  541. // "我的订单"都是买委托
  542. session := engine.Table("TRADE_ORDERDETAIL").
  543. Select(`to_char(TRADE_ORDERDETAIL.ORDERID) ORDERID, TRADE_ORDERDETAIL.*,
  544. GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE, GOODS.AGREEUNIT,
  545. HG1.PICURLS PICURLS1,
  546. HG2.PICURLS PICURLS2,
  547. MARKET.TRADEMODE,
  548. ENUMDICITEM.PARAM2 CURRENCYSIGN,
  549. HS1.VENDORNAME VENDORNAME1,
  550. HS2.VENDORNAME VENDORNAME2`).
  551. Join("LEFT", "GOODS", "GOODS.GOODSID = TRADE_ORDERDETAIL.GOODSID").
  552. Join("LEFT", "CPTRADE_PRESALEGOODSEX", "CPTRADE_PRESALEGOODSEX.GOODSID = TRADE_ORDERDETAIL.GOODSID").
  553. Join("LEFT", "HSBY_GOODSEX HG1", "HG1.GOODSID = CPTRADE_PRESALEGOODSEX.RELATEDGOODSID").
  554. Join("LEFT", "HSBY_GOODSEX HG2", "HG2.GOODSID = GOODS.GOODSID").
  555. Join("LEFT", "ENUMDICITEM", "GOODS.CURRENCYID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'currency'").
  556. Join("LEFT", "MARKET", "MARKET.MARKETID = TRADE_ORDERDETAIL.MARKETID").
  557. Join("LEFT", "HSBY_SUPPLIERINFO HS1", "HS1.VENDORID = HG1.VENDORID").
  558. Join("LEFT", "HSBY_SUPPLIERINFO HS2", "HS2.VENDORID = HG2.VENDORID").
  559. Where(fmt.Sprintf("TRADE_ORDERDETAIL.BUYORSELL = 0 and TRADE_ORDERDETAIL.ACCOUNTID in (%s)", accountIDs)).
  560. And(fmt.Sprintf("TRADE_ORDERDETAIL.MARKETID in (%s)", marketIDs))
  561. // 是否过滤状态(抢购中、求购中、已完成)
  562. if orderStatus != "0" {
  563. session = session.And(fmt.Sprintf("TRADE_ORDERDETAIL.ORDERSTATUS in (%s)", orderStatus))
  564. }
  565. if err := session.Find(&hybsMyBuyOrderDetails); err != nil {
  566. return nil, err
  567. }
  568. // 设置“我的订单”显示状态
  569. for i := range hybsMyBuyOrderDetails {
  570. detail := &hybsMyBuyOrderDetails[i]
  571. // 委托金额 = 委托价格 * 委托数量 * 合约单位
  572. detail.Orderamount = detail.Orderprice * float64(detail.Orderqty) * float64(detail.Agreeunit)
  573. if detail.Trademode == 71 && (detail.Orderstatus == 3 || detail.Orderstatus == 7) {
  574. // 抢购中 -> 待成交
  575. detail.MyBuyStatus = 1
  576. } else if detail.Trademode == 16 && (detail.Orderstatus == 3 || detail.Orderstatus == 7) {
  577. // 求购中 -> 待成交
  578. detail.MyBuyStatus = 2
  579. } else if detail.Trademode == 70 && (detail.Orderstatus == 3 || detail.Orderstatus == 7) {
  580. // 待成交
  581. detail.MyBuyStatus = 1
  582. } else if detail.Orderstatus == 8 || detail.Orderstatus == 9 {
  583. // 已提交
  584. detail.MyBuyStatus = 3
  585. } else if detail.Orderstatus == 6 || detail.Orderstatus == 22 {
  586. // 已撤销
  587. detail.MyBuyStatus = 4
  588. } else if detail.Orderstatus == 4 {
  589. // 委托失败
  590. detail.MyBuyStatus = 5
  591. }
  592. }
  593. return hybsMyBuyOrderDetails, nil
  594. }
  595. // HsbyMyGoods 我的商品(买方向持仓)
  596. type HsbyMyGoods struct {
  597. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'" binding:"required"` // 账号Id
  598. Goodsid int32 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品Id
  599. Buycurpositionqty int64 `json:"buycurpositionqty" xorm:"'BUYCURPOSITIONQTY'"` // 买当前持仓总数量
  600. Buycurholderamount float64 `json:"buycurholderamount" xorm:"'BUYCURHOLDERAMOUNT'"` // 买当前持仓总金额[商品币种]
  601. EnableQty int64 `json:"enableqty" xorm:"'ENABLEQTY'"` // 可用数量
  602. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  603. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  604. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  605. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  606. Goodsstatus int64 `json:"goodsstatus" xorm:"'GOODSSTATUS'"` // 商品状态- 1:待审核 2:未上市 3:上市 4:已注销 5:审核拒绝 6:退市 7:待退市
  607. Marketid int64 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 所属市场ID
  608. Quoteminunit int64 `json:"quoteminunit" xorm:"'QUOTEMINUNIT'"` // 行情最小变动单位 [整数,报价小数位一起使用]
  609. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
  610. Goodsprice float64 `json:"goodsprice" xorm:"'GOODSPRICE'"` // 商品价格
  611. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  612. Trademode int32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  613. Buyaverageprice float64 `json:"buyaverageprice" xorm:"-"` // 持仓均价
  614. Last float64 `json:"last" xorm:"-"` // 现价(仅使用于挂牌点选)
  615. Limitup float64 `json:"limitup" xorm:"-"` // 涨停价(仅使用于挂牌点选)
  616. Limitdown float64 `json:"limitdown" xorm:"-"` // 跌停价(仅使用于挂牌点选)
  617. StepValue float64 `json:"stepvalue" xorm:"-"` // 价格最小变动单位
  618. LotSize int `json:"lotsize" xorm:"-"` // 手数最小变动单位
  619. Buymaxqty int `json:"buymaxqty" xorm:"'-'"` // 购买上限 [71] - 0为不限
  620. }
  621. // GetHsbyMyGoods 获取“我的商品”信息
  622. // 输入 accountIDs string 资金账户列表,格式 1,2,3
  623. // 输出 []HsbyMyGoods “我的商品”信息
  624. // 输入 error error
  625. func GetHsbyMyGoods(accountIDs string) ([]HsbyMyGoods, error) {
  626. engine := db.GetEngine()
  627. hsbyMyGoodses := make([]HsbyMyGoods, 0)
  628. // 此定制版本,只查询出当前手数(期末)大于0的数据 (TRADEPOSITION.BUYCURPOSITIONQTY > 0)
  629. if err := engine.Table("TRADEPOSITION TP").
  630. Select(`TP.*, (TP.BUYCURPOSITIONQTY - TP.BUYFROZENQTY - TP.BUYOTHERFROZENQTY) ENABLEQTY,
  631. G.GOODSCODE, G.GOODSNAME, G.DECIMALPLACE, G.AGREEUNIT, G.GOODSSTATUS, G.MARKETID, G.QUOTEMINUNIT,
  632. GX.PICURLS, GX.GOODSPRICE,
  633. E.PARAM2 CURRENCYSIGN,
  634. M.TRADEMODE`).
  635. Join("LEFT", "GOODS G", "G.GOODSID = TP.GOODSID").
  636. Join("INNER", "HSBY_GOODSEX GX", "GX.GOODSID = G.GOODSID").
  637. Join("LEFT", "ENUMDICITEM E", "G.CURRENCYID = E.ENUMITEMNAME and E.ENUMDICCODE = 'currency'").
  638. Join("LEFT", "MARKET M", "M.MARKETID = G.MARKETID").
  639. Where(fmt.Sprintf("G.GOODSSTATUS = 3 and TP.BUYCURPOSITIONQTY > 0 and TP.ACCOUNTID in (%s)", accountIDs)).Find(&hsbyMyGoodses); err != nil {
  640. return nil, err
  641. }
  642. for i := range hsbyMyGoodses {
  643. myGoods := &hsbyMyGoodses[i]
  644. // 持仓均价
  645. averagePrice := myGoods.Buycurholderamount / float64(myGoods.Buycurpositionqty) / myGoods.Agreeunit
  646. myGoods.Buyaverageprice, _ = strconv.ParseFloat(utils.FormatFloat(averagePrice, int(myGoods.Decimalplace)), 64)
  647. // 获取商品现价和涨跌停价(挂牌点选)
  648. if myGoods.Trademode == 16 {
  649. quoteDays, err := GetQuoteDays("'" + myGoods.Goodscode + "'")
  650. if err != nil {
  651. return nil, err
  652. }
  653. if len(quoteDays) > 0 {
  654. if quoteDays[0].Last != 0 {
  655. myGoods.Last = utils.IntToFloat64(int(quoteDays[0].Last), int(myGoods.Decimalplace))
  656. }
  657. // 没有现价则尝试用昨结
  658. if myGoods.Last == 0 && quoteDays[0].Presettle != 0 {
  659. myGoods.Last = utils.IntToFloat64(int(quoteDays[0].Presettle), int(myGoods.Decimalplace))
  660. }
  661. if quoteDays[0].Limitup != 0 {
  662. myGoods.Limitup = utils.IntToFloat64(int(quoteDays[0].Limitup), int(myGoods.Decimalplace))
  663. }
  664. if quoteDays[0].Limitdown != 0 {
  665. myGoods.Limitdown = utils.IntToFloat64(int(quoteDays[0].Limitdown), int(myGoods.Decimalplace))
  666. }
  667. }
  668. }
  669. // 计算价格最小变动单位
  670. stepValue := float64(myGoods.Quoteminunit) * math.Pow(0.1, float64(myGoods.Decimalplace))
  671. myGoods.StepValue, _ = strconv.ParseFloat(utils.FormatFloat(stepValue, int(myGoods.Decimalplace)), 64)
  672. // 获取交易规则
  673. accountID, err := strconv.Atoi(accountIDs)
  674. if err != nil {
  675. return nil, err
  676. }
  677. rule, err := GetTodayAccountTradeRule(accountID, int(myGoods.Goodsid))
  678. if err != nil {
  679. // 查询失败
  680. return nil, err
  681. }
  682. if rule != nil {
  683. tradeRuleInfoStruct := &pb.TradeRuleInfoStruct{}
  684. if err := proto.Unmarshal([]byte(rule.Infocontent), tradeRuleInfoStruct); err != nil {
  685. // 查询失败
  686. return nil, err
  687. }
  688. // INSERT INTO TRADERULEDESCRIPTION (RULEID, RULENAME, REGEXPRESS, DEFAULTVALUE, REMARK) VALUES (103, '单笔最小交易量', '^[1-9]\d*$', 1, '请输入正整数!');
  689. for _, v := range tradeRuleInfoStruct.TradeRules {
  690. if int(*v.RuleID) == 103 {
  691. myGoods.LotSize = int(*v.ParamValue)
  692. }
  693. // 挂牌点选的最大建仓手数与预售的不一样,直接从规则里取
  694. if int(*v.RuleID) == 104 {
  695. myGoods.Buymaxqty = int(*v.ParamValue)
  696. }
  697. }
  698. }
  699. }
  700. return hsbyMyGoodses, nil
  701. }
  702. // HsbyPreGoods 新品上市商品(一级市场产能预售)
  703. type HsbyPreGoods struct {
  704. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID(自增ID SEQ_GOODS)
  705. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  706. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  707. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  708. Marketid int64 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 所属市场ID
  709. Goodsstatus int64 `json:"goodsstatus" xorm:"'GOODSSTATUS'"` // 商品状态- 2:未上市 3:上市
  710. Quoteminunit int64 `json:"quoteminunit" xorm:"'QUOTEMINUNIT'"` // 行情最小变动单位 [整数,报价小数位一起使用]
  711. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  712. Listingdate time.Time `json:"listingdate" xorm:"'LISTINGDATE'"` // 交易开始日期
  713. Lasttradedate time.Time `json:"lasttradedate" xorm:"'LASTTRADEDATE'"` // 最后交易日期(状态:待退市)
  714. Relatedgoodsid int64 `json:"relatedgoodsid" xorm:"'RELATEDGOODSID'"` // 关联交易合约ID
  715. Presaleqty int64 `json:"presaleqty" xorm:"'PRESALEQTY'"` // 预售数量
  716. Refprice float64 `json:"refprice" xorm:"'REFPRICE'"` // 参考价格[一口价]
  717. Presaledqty int64 `json:"presaledqty" xorm:"'PRESALEDQTY'"` // 已预售量(预售结束时更新)
  718. EnableQty int64 `json:"enableqty" xorm:"ENABLEQTY"` // 剩余数量
  719. Currency string `json:"currency" xorm:"'CURRENCY'"` // 货币
  720. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  721. Videourls string `json:"videourls" xorm:"'VIDEOURLS'"` // 介绍视频[多张用逗号分隔]
  722. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
  723. Descprovinceid int64 `json:"descprovinceid" xorm:"'DESCPROVINCEID'"` // 目的地(省)
  724. Desccityid int64 `json:"desccityid" xorm:"'DESCCITYID'"` // 目的地(市)
  725. Trademode int32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  726. }
  727. // GetHsbyPreGoodses 获取“新品上市”商品列表(一级市场产能预售)
  728. // 输入 marketIDs string 市场ID列表,格式 1,2,3
  729. // 输入 descProvinceID int 省ID
  730. // 输入 descCityID int 市ID
  731. // 输出 []HsbyPreGoods “新品上市”商品列表
  732. // 输出 error error
  733. func GetHsbyPreGoodses(marketIDs string, descProvinceID, descCityID int) ([]HsbyPreGoods, error) {
  734. engine := db.GetEngine()
  735. // 注意:一级产能预售市场使用的商品实际上是和二级市场有关系的,所以要使用 CPTRADE_PRESALEGOODSEX.RELATEDGOODSID 进行关联
  736. // 注意:CPTRADE_PRESALEGOODSEX 表的开始与结束时间是给大宗用的
  737. preGoodses := make([]HsbyPreGoods, 0)
  738. session := engine.Table("GOODS").
  739. Select(`GOODS.*,
  740. CPTRADE_PRESALEGOODSEX.RELATEDGOODSID, CPTRADE_PRESALEGOODSEX.PRESALEQTY, CPTRADE_PRESALEGOODSEX.REFPRICE,
  741. CPTRADE_PRESALEGOODSEX.PRESALEDQTY, (CPTRADE_PRESALEGOODSEX.PRESALEQTY - CPTRADE_PRESALEGOODSEX.PRESALEDQTY) ENABLEQTY,
  742. ENUMDICITEM.ENUMDICNAME CURRENCY, ENUMDICITEM.PARAM2 CURRENCYSIGN,
  743. HSBY_GOODSEX.VIDEOURLS, HSBY_GOODSEX.PICURLS, HSBY_GOODSEX.DESCPROVINCEID, HSBY_GOODSEX.DESCCITYID,
  744. MARKET.TRADEMODE`).
  745. Join("INNER", "CPTRADE_PRESALEGOODSEX", "CPTRADE_PRESALEGOODSEX.GOODSID = GOODS.GOODSID").
  746. Join("LEFT", "ENUMDICITEM", "ENUMDICITEM.ENUMITEMNAME = GOODS.CURRENCYID and ENUMDICITEM.ENUMDICCODE = 'currency'").
  747. Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = CPTRADE_PRESALEGOODSEX.RELATEDGOODSID").
  748. Join("LEFT", "MARKET", "MARKET.MARKETID = GOODS.MARKETID").
  749. Where(fmt.Sprintf("GOODS.GOODSSTATUS in (2,3) and GOODS.MARKETID in (%s)", marketIDs)) // 一级市场获取 2:未上市 3:上市 状态的商品
  750. if descProvinceID > 0 {
  751. session = session.And("HSBY_GOODSEX.DESCPROVINCEID = ?", descProvinceID)
  752. }
  753. if descCityID > 0 {
  754. session = session.And("HSBY_GOODSEX.DESCCITYID = ?", descCityID)
  755. }
  756. if err := session.Find(&preGoodses); err != nil {
  757. return nil, err
  758. }
  759. // for i := range preGoodses {
  760. // preGoods := &preGoodses[i]
  761. // // FIXME: - 这里应该使用 Duck Typing,后期再处理
  762. // // 计算最小变动单位
  763. // lotSize := float64(preGoods.Quoteminunit) * math.Pow(0.1, float64(preGoods.Decimalplace))
  764. // preGoods.LotSize, _ = strconv.ParseFloat(utils.FormatFloat(lotSize, int(preGoods.Decimalplace)), 64)
  765. // }
  766. return preGoodses, nil
  767. }
  768. // HsbyPreGoodsDetail 一级市场(产能预售)商品信息详情
  769. type HsbyPreGoodsDetail struct {
  770. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID(自增ID SEQ_GOODS)
  771. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  772. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  773. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  774. Marketid int64 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 所属市场ID
  775. Goodsstatus int64 `json:"goodsstatus" xorm:"'GOODSSTATUS'"` // 商品状态- 2:未上市 3:上市
  776. Quoteminunit int64 `json:"quoteminunit" xorm:"'QUOTEMINUNIT'"` // 行情最小变动单位 [整数,报价小数位一起使用]
  777. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  778. Listingdate time.Time `json:"listingdate" xorm:"'LISTINGDATE'"` // 交易开始日期
  779. Lasttradedate time.Time `json:"lasttradedate" xorm:"'LASTTRADEDATE'"` // 最后交易日期(状态:待退市)
  780. Relatedgoodsid int64 `json:"relatedgoodsid" xorm:"'RELATEDGOODSID'"` // 关联交易合约ID
  781. Presaleqty int64 `json:"presaleqty" xorm:"'PRESALEQTY'"` // 预售数量
  782. Refprice float64 `json:"refprice" xorm:"'REFPRICE'"` // 参考价格[一口价]
  783. Presaledqty int64 `json:"presaledqty" xorm:"'PRESALEDQTY'"` // 已预售量(预售结束时更新)
  784. EnableQty int64 `json:"enableqty" xorm:"ENABLEQTY"` // 剩余数量
  785. Buymaxqty int `json:"buymaxqty" xorm:"'BUYMAXQTY'"` // 购买上限 [71] - 0为不限
  786. Videourls string `json:"videourls" xorm:"'VIDEOURLS'"` // 介绍视频[多张用逗号分隔]
  787. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
  788. Descprovinceid int64 `json:"descprovinceid" xorm:"'DESCPROVINCEID'"` // 目的地(省)ID
  789. Desccityid int64 `json:"desccityid" xorm:"'DESCCITYID'"` // 目的地(市)ID
  790. Goodsdesc string `json:"goodsdesc" xorm:"'GOODSDESC'"` // 商品详情
  791. Currency string `json:"currency" xorm:"'CURRENCY'"` // 货币
  792. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  793. Goodunit string `json:"goodunit" xorm:"GOODUNIT"` // 报价单位
  794. Vendorname string `json:"vendorname" xorm:"'VENDORNAME'"` // 供应商名称
  795. Vendorphone string `json:"vendorphone" xorm:"'VENDORPHONE'"` // 供应商客服电话
  796. Vendorattr string `json:"vendorattr" xorm:"'VENDORATTR'"` // 供应商附件(多张,逗号分隔)
  797. Trademode int32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  798. Customername string `json:"customername" xorm:"'CUSTOMERNAME'"` // 发行单位
  799. StepValue float64 `json:"stepvalue" xorm:"-"` // 价格最小变动单位
  800. LotSize int `json:"lotsize" xorm:"-"` // 手数最小变动单位
  801. }
  802. // GetHsbyPreGoodsDetail 获取一级市场(产能预售)商品信息详情
  803. // 参数 goodsID int 目标商品ID
  804. // 返回 *HsbyListingGoodsDetail 二级市场(挂牌点选)商品信息详情,查询无结果返回nil
  805. // 返回 error error
  806. func GetHsbyPreGoodsDetail(goodsID, accountID int) (*HsbyPreGoodsDetail, error) {
  807. engine := db.GetEngine()
  808. details := make([]HsbyPreGoodsDetail, 0)
  809. // 获取挂牌商品信息,以及扩展表信息
  810. // FIXME: - 这里使用Get方法,会造成SQL语句的嵌套出错,后期再研究
  811. session := engine.Table("GOODS").
  812. Select(`GOODS.*,
  813. CPTRADE_PRESALEGOODSEX.RELATEDGOODSID, CPTRADE_PRESALEGOODSEX.PRESALEQTY, CPTRADE_PRESALEGOODSEX.REFPRICE,
  814. CPTRADE_PRESALEGOODSEX.PRESALEDQTY, (CPTRADE_PRESALEGOODSEX.PRESALEQTY - CPTRADE_PRESALEGOODSEX.PRESALEDQTY) ENABLEQTY, CPTRADE_PRESALEGOODSEX.BUYMAXQTY,
  815. HSBY_GOODSEX.VIDEOURLS, HSBY_GOODSEX.PICURLS, HSBY_GOODSEX.DESCPROVINCEID, HSBY_GOODSEX.Desccityid, HSBY_GOODSEX.Goodsdesc,
  816. ENUMDICITEM.ENUMDICNAME CURRENCY, ENUMDICITEM.PARAM2 CURRENCYSIGN,
  817. E1.ENUMDICNAME GOODUNIT,
  818. HSBY_SUPPLIERINFO.VENDORNAME, HSBY_SUPPLIERINFO.VENDORPHONE, HSBY_SUPPLIERINFO.VENDORATTR,
  819. MARKET.TRADEMODE,
  820. USERINFO.CUSTOMERNAME`).
  821. Join("INNER", "CPTRADE_PRESALEGOODSEX", "CPTRADE_PRESALEGOODSEX.GOODSID = GOODS.GOODSID").
  822. Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = CPTRADE_PRESALEGOODSEX.RELATEDGOODSID").
  823. Join("LEFT", "ENUMDICITEM", "ENUMDICITEM.ENUMITEMNAME = GOODS.CURRENCYID and ENUMDICITEM.ENUMDICCODE = 'currency'").
  824. Join("LEFT", "ENUMDICITEM E1", "E1.ENUMITEMNAME = GOODS.GOODUNITID and E1.ENUMDICCODE = 'goodsunit'").
  825. Join("LEFT", "HSBY_SUPPLIERINFO", "HSBY_SUPPLIERINFO.VENDORID = HSBY_GOODSEX.VENDORID").
  826. Join("LEFT", "MARKET", "MARKET.MARKETID = GOODS.MARKETID").
  827. Join("LEFT", "USERINFO", "USERINFO.USERID = CPTRADE_PRESALEGOODSEX.USERID").
  828. Where("GOODS.GOODSID = ?", goodsID)
  829. if err := session.Find(&details); err != nil {
  830. return nil, err
  831. }
  832. // 无目标商品
  833. if len(details) == 0 {
  834. return nil, nil
  835. }
  836. preGoodsDetail := details[0]
  837. // FIXME: - 这里应该使用 Duck Typing,后期再处理
  838. // 计算价格最小变动单位
  839. stepValue := float64(preGoodsDetail.Quoteminunit) * math.Pow(0.1, float64(preGoodsDetail.Decimalplace))
  840. preGoodsDetail.StepValue, _ = strconv.ParseFloat(utils.FormatFloat(stepValue, int(preGoodsDetail.Decimalplace)), 64)
  841. // 计算手数最小变动单位,一级市场固定为1
  842. preGoodsDetail.LotSize = 1
  843. // 获取购买上限
  844. if accountID != 0 {
  845. buyMaxQty, err := GetCPTradeBuyLimit(goodsID, accountID)
  846. if err != nil {
  847. return nil, err
  848. }
  849. preGoodsDetail.Buymaxqty = buyMaxQty
  850. }
  851. return &preGoodsDetail, nil
  852. }
  853. // HsbySellMyDetail "我的闲置"单据信息(发布中 - 二级市场卖挂,3:委托成功、7:部分成交; 已完成 - 二级市场成交单,包括历史数据)
  854. type HsbySellMyDetail struct {
  855. Orderid string `json:"orderid" xorm:"'ORDERID'" binding:"required"` // 单号(发布中 - 委托单号;已完成 - 成交单号)
  856. Marketid int32 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 市场ID
  857. Goodsid int32 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID
  858. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'" binding:"required"` // 账户ID[报价币种]
  859. Buyorsell int32 `json:"buyorsell" xorm:"'BUYORSELL'" binding:"required"` // 买卖 - 0:买 1:卖
  860. Price float64 `json:"price" xorm:"'PRICE'"` // 价格
  861. Time time.Time `json:"time" xorm:"'TIME'" binding:"required"` // 时间
  862. Qty int64 `json:"qty" xorm:"'QTY'"` // 数量
  863. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  864. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  865. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  866. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  867. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
  868. Trademode uint32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  869. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  870. Vendorname string `json:"vendorname" xorm:"'VENDORNAME'"` // 供应商名称
  871. OrderType int32 `json:"ordertype" xorm:"'ORDERTYPE'"` // 单据类型:0 - 发布中, 1 - 已完成
  872. }
  873. // GetHsbySellMyOrderDetails 获取"我的闲置 - 发布中"单据信息
  874. // 输入 accountIDs string 资金账户列表
  875. // 输出 []HsbySellMyDetail "我的闲置 - 发布中"单据信息
  876. // 输出 error error
  877. func GetHsbySellMyOrderDetails(accountIDs string) ([]HsbySellMyDetail, error) {
  878. // 获取市场信息
  879. markets, err := GetMarkets()
  880. if err != nil {
  881. return nil, err
  882. }
  883. engine := db.GetEngine()
  884. marketIDs := "" // 我的闲置-发布中: 二级市场卖挂牌、三级商城
  885. for _, v := range markets {
  886. if v.Trademode == 16 || v.Trademode == 70 {
  887. if len(marketIDs) == 0 {
  888. marketIDs = strconv.Itoa(int(v.Marketid))
  889. } else {
  890. marketIDs += "," + strconv.Itoa(int(v.Marketid))
  891. }
  892. }
  893. }
  894. orderDetails := make([]HsbySellMyDetail, 0)
  895. // “我的闲置 - 发布中”都是卖挂委托
  896. session := engine.Table("TRADE_ORDERDETAIL").
  897. Select(`to_char(TRADE_ORDERDETAIL.ORDERID) ORDERID,
  898. TRADE_ORDERDETAIL.MARKETID, TRADE_ORDERDETAIL.GOODSID, TRADE_ORDERDETAIL.ACCOUNTID, TRADE_ORDERDETAIL.BUYORSELL,
  899. TRADE_ORDERDETAIL.ORDERPRICE PRICE, TRADE_ORDERDETAIL.ORDERTIME TIME,
  900. (TRADE_ORDERDETAIL.ORDERQTY - TRADE_ORDERDETAIL.TRADEQTY - TRADE_ORDERDETAIL.CANCELQTY) QTY,
  901. GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE, GOODS.AGREEUNIT,
  902. HSBY_GOODSEX.PICURLS,
  903. MARKET.TRADEMODE,
  904. ENUMDICITEM.PARAM2 CURRENCYSIGN,
  905. HSBY_SUPPLIERINFO.VENDORNAME,
  906. 0 ORDERTYPE`).
  907. Join("LEFT", "GOODS", "GOODS.GOODSID = TRADE_ORDERDETAIL.GOODSID").
  908. Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = GOODS.GOODSID").
  909. Join("LEFT", "ENUMDICITEM", "GOODS.CURRENCYID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'currency'").
  910. Join("LEFT", "MARKET", "MARKET.MARKETID = TRADE_ORDERDETAIL.MARKETID").
  911. Join("LEFT", "HSBY_SUPPLIERINFO", "HSBY_SUPPLIERINFO.VENDORID = HSBY_GOODSEX.VENDORID").
  912. Where(fmt.Sprintf(`TRADE_ORDERDETAIL.BUYORSELL = 1 and TRADE_ORDERDETAIL.LISTINGSELECTTYPE = 1 and (TRADE_ORDERDETAIL.ORDERSTATUS = 3 or TRADE_ORDERDETAIL.ORDERSTATUS = 7)
  913. and TRADE_ORDERDETAIL.ACCOUNTID in (%s)`, accountIDs)).
  914. And(fmt.Sprintf("TRADE_ORDERDETAIL.MARKETID in (%s)", marketIDs))
  915. if err := session.Find(&orderDetails); err != nil {
  916. return nil, err
  917. }
  918. return orderDetails, nil
  919. }
  920. // GetHsbySellMyTradeDetails 获取"我的闲置 - 已完成"单据信息
  921. // 输入 accountIDs string 资金账户列表
  922. // 输出 []HsbySellMyDetail "我的闲置 - 已完成"单据信息
  923. // 输出 error error
  924. func GetHsbySellMyTradeDetails(accountIDs string) ([]HsbySellMyDetail, error) {
  925. // 获取市场信息
  926. markets, err := GetMarkets()
  927. if err != nil {
  928. return nil, err
  929. }
  930. engine := db.GetEngine()
  931. marketIDs := "" // 我的闲置-发布中: 二级市场卖方向成交单(包括历史成交单)
  932. // 默认取 TradeMode = 16
  933. for _, v := range markets {
  934. if v.Trademode == 16 || v.Trademode == 70 {
  935. if len(marketIDs) == 0 {
  936. marketIDs = strconv.Itoa(int(v.Marketid))
  937. } else {
  938. marketIDs += "," + strconv.Itoa(int(v.Marketid))
  939. }
  940. }
  941. }
  942. orders := make([]HsbySellMyDetail, 0)
  943. // 当前成交单
  944. curOrders := make([]HsbySellMyDetail, 0)
  945. if err := engine.Table("TRADE_TRADEDETAIL").
  946. Select(`to_char(TRADE_TRADEDETAIL.TRADEID) ORDERID,
  947. TRADE_TRADEDETAIL.MARKETID, TRADE_TRADEDETAIL.GOODSID, TRADE_TRADEDETAIL.ACCOUNTID, TRADE_TRADEDETAIL.BUYORSELL,
  948. TRADE_TRADEDETAIL.TRADEPRICE PRICE, TRADE_TRADEDETAIL.TRADEQTY QTY, TRADE_TRADEDETAIL.TRADETIME TIME, TRADE_TRADEDETAIL.TRADEAMOUNT AMOUNT,
  949. GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE, GOODS.AGREEUNIT,
  950. HSBY_GOODSEX.PICURLS,
  951. MARKET.TRADEMODE,
  952. ENUMDICITEM.PARAM2 CURRENCYSIGN,
  953. HSBY_SUPPLIERINFO.VENDORNAME,
  954. 1 ORDERTYPE`).
  955. Join("LEFT", "GOODS", "GOODS.GOODSID = TRADE_TRADEDETAIL.GOODSID").
  956. Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = GOODS.GOODSID").
  957. Join("LEFT", "ENUMDICITEM", "GOODS.CURRENCYID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'currency'").
  958. Join("LEFT", "MARKET", "MARKET.MARKETID = TRADE_TRADEDETAIL.MARKETID").
  959. Join("LEFT", "HSBY_SUPPLIERINFO", "HSBY_SUPPLIERINFO.VENDORID = HSBY_GOODSEX.VENDORID").
  960. Where(fmt.Sprintf(`TRADE_TRADEDETAIL.BUYORSELL = 1 and TRADE_TRADEDETAIL.TRADETYPE in (1,24)
  961. and TRADE_TRADEDETAIL.ACCOUNTID in (%s)`, accountIDs)).
  962. And(fmt.Sprintf("TRADE_TRADEDETAIL.MARKETID in (%s)", marketIDs)).Find(&curOrders); err != nil {
  963. return nil, err
  964. }
  965. if len(curOrders) > 0 {
  966. orders = append(orders, curOrders...)
  967. }
  968. // 历史成交单
  969. hisOrders := make([]HsbySellMyDetail, 0)
  970. if err := engine.Table("HIS_TRADE_TRADEDETAIL").
  971. Select(`to_char(HIS_TRADE_TRADEDETAIL.TRADEID) ORDERID,
  972. HIS_TRADE_TRADEDETAIL.MARKETID, HIS_TRADE_TRADEDETAIL.GOODSID, HIS_TRADE_TRADEDETAIL.ACCOUNTID, HIS_TRADE_TRADEDETAIL.BUYORSELL,
  973. HIS_TRADE_TRADEDETAIL.TRADEPRICE PRICE, HIS_TRADE_TRADEDETAIL.TRADEQTY QTY, HIS_TRADE_TRADEDETAIL.TRADETIME TIME, HIS_TRADE_TRADEDETAIL.TRADEAMOUNT AMOUNT,
  974. GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE, GOODS.AGREEUNIT,
  975. HSBY_GOODSEX.PICURLS,
  976. MARKET.TRADEMODE,
  977. ENUMDICITEM.PARAM2 CURRENCYSIGN,
  978. HSBY_SUPPLIERINFO.VENDORNAME,
  979. 1 ORDERTYPE`).
  980. Join("LEFT", "GOODS", "GOODS.GOODSID = HIS_TRADE_TRADEDETAIL.GOODSID").
  981. Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = GOODS.GOODSID").
  982. Join("LEFT", "ENUMDICITEM", "GOODS.CURRENCYID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'currency'").
  983. Join("LEFT", "MARKET", "MARKET.MARKETID = HIS_TRADE_TRADEDETAIL.MARKETID").
  984. Join("LEFT", "HSBY_SUPPLIERINFO", "HSBY_SUPPLIERINFO.VENDORID = HSBY_GOODSEX.VENDORID").
  985. Where(fmt.Sprintf(`HIS_TRADE_TRADEDETAIL.BUYORSELL = 1 and HIS_TRADE_TRADEDETAIL.TRADETYPE in (1,24) and HIS_TRADE_TRADEDETAIL.ISVALIDDATA = 1
  986. and HIS_TRADE_TRADEDETAIL.ACCOUNTID in (%s)`, accountIDs)).
  987. And(fmt.Sprintf("HIS_TRADE_TRADEDETAIL.MARKETID in (%s)", marketIDs)).Find(&hisOrders); err != nil {
  988. return nil, err
  989. }
  990. if len(hisOrders) > 0 {
  991. orders = append(orders, hisOrders...)
  992. }
  993. return orders, nil
  994. }
  995. // HsbyMyPackage 我的包裹信息
  996. type HsbyMyPackage struct {
  997. Takeorderid string `json:"takeorderid" xorm:"'TAKEORDERID'" binding:"required"` // 提货单号(905+Unix秒时间戳(10位)+xxxxxx)
  998. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'"` // 账户ID
  999. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'"` // 商品ID
  1000. Userid int64 `json:"userid" xorm:"'USERID'"` // 用户ID
  1001. Qty float64 `json:"qty" xorm:"'QTY'"` // 提货数量
  1002. Reqtime time.Time `json:"reqtime" xorm:"'REQTIME'"` // 更新时间
  1003. Recivername string `json:"recivername" xorm:"'RECIVERNAME'"` // 提货人姓名
  1004. Cardtypeid int32 `json:"cardtypeid" xorm:"'CARDTYPEID'"` // 提货人证件类型
  1005. Cardnum string `json:"cardnum" xorm:"'CARDNUM'"` // 提货人证件号码
  1006. Phonenum string `json:"phonenum" xorm:"'PHONENUM'"` // 提货人联系方式
  1007. Takemode int32 `json:"takemode" xorm:"'TAKEMODE'"` // 提货方式 - 2:自提 3:配送
  1008. Address string `json:"address" xorm:"'ADDRESS'"` // 提货人详细地址
  1009. Takeremark string `json:"takeremark" xorm:"'TAKEREMARK'"` // 提货备注
  1010. Takeorderstatus int32 `json:"takeorderstatus" xorm:"'TAKEORDERSTATUS'"` // 提货状态 - 1:待发货 2:已发货 3:已收货
  1011. Auditer int32 `json:"auditer" xorm:"'AUDITER'"` // 审核人
  1012. Audittime time.Time `json:"audittime" xorm:"'AUDITTIME'"` // 审核时间
  1013. Checkremark string `json:"checkremark" xorm:"'CHECKREMARK'"` // 审核备注
  1014. Tradedate string `json:"tradedate" xorm:"'TRADEDATE'"` // 交易日(yyyyMMdd)
  1015. Marketid int32 `json:"marketid" xorm:"'MARKETID'"` // 市场ID
  1016. Handlestatus int32 `json:"handlestatus" xorm:"'HANDLESTATUS'"` // 处理状态
  1017. Amount float64 `json:"amount" xorm:"'AMOUNT'"` // 提货金额
  1018. Averageprice float64 `json:"averageprice" xorm:"'AVERAGEPRICE'"` // 均价
  1019. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  1020. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  1021. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  1022. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  1023. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
  1024. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  1025. Vendorname string `json:"vendorname" xorm:"'VENDORNAME'"` // 供应商名称
  1026. Trademode uint32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  1027. }
  1028. // GetHsbyMyPackages 获取我的包裹信息
  1029. // 输入 accountIDs string 资金账户列表
  1030. // 输入 takeOrderStatus int 提货状态 - 1:待发货 2:已发货 3:已收货
  1031. // 输出 []HsbyMyPackage 我的包裹信息
  1032. // 输出 error error
  1033. func GetHsbyMyPackages(accountIDs string, takeOrderStatus int) ([]HsbyMyPackage, error) {
  1034. engine := db.GetEngine()
  1035. myPackages := make([]HsbyMyPackage, 0)
  1036. session := engine.Table("TRADE_GOODSPICKUP").
  1037. Select(`to_char(TRADE_GOODSPICKUP.TAKEORDERID) TAKEORDERID, (DIVISION.PATHNAME || TRADE_GOODSPICKUP.ADDRESS) ADDRESS, TRADE_GOODSPICKUP.*,
  1038. (TRADE_GOODSPICKUP.AMOUNT/TRADE_GOODSPICKUP.QTY/GOODS.AGREEUNIT) AVERAGEPRICE,
  1039. GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE, GOODS.AGREEUNIT,
  1040. HSBY_GOODSEX.PICURLS,
  1041. ENUMDICITEM.PARAM2 CURRENCYSIGN,
  1042. HSBY_SUPPLIERINFO.VENDORNAME,
  1043. M.TRADEMODE`).
  1044. Join("LEFT", "GOODS", "GOODS.GOODSID = TRADE_GOODSPICKUP.GOODSID").
  1045. Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = GOODS.GOODSID").
  1046. Join("LEFT", "ENUMDICITEM", "GOODS.CURRENCYID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'currency'").
  1047. Join("LEFT", "HSBY_SUPPLIERINFO", "HSBY_SUPPLIERINFO.VENDORID = HSBY_GOODSEX.VENDORID").
  1048. Join("LEFT", "DIVISION", "DIVISION.AUTOID = TRADE_GOODSPICKUP.DISTRICTID").
  1049. Join("LEFT", "MARKET M", "M.MARKETID = GOODS.MARKETID").
  1050. Where(fmt.Sprintf("TRADE_GOODSPICKUP.ACCOUNTID in (%s)", accountIDs))
  1051. if takeOrderStatus > 0 {
  1052. session = session.And("TAKEORDERSTATUS = ?", takeOrderStatus)
  1053. }
  1054. if err := session.Find(&myPackages); err != nil {
  1055. return nil, err
  1056. }
  1057. // FIXME:- 目前暂时在服务端对手机号码进行解密
  1058. key, _ := hex.DecodeString(utils.AESSecretKey)
  1059. for i := range myPackages {
  1060. myPackage := &myPackages[i]
  1061. if len(myPackage.Phonenum) > 0 {
  1062. // 解密手机号码
  1063. if phonenum, err := hex.DecodeString(myPackage.Phonenum); err == nil { // hex -> []byte
  1064. if mobile, err := utils.AESDecrypt(phonenum, key); err == nil {
  1065. myPackage.Phonenum = string(mobile)
  1066. }
  1067. }
  1068. }
  1069. }
  1070. return myPackages, nil
  1071. }
  1072. // SetHsbyMyPackagesStatus 设置我的包裹提货状态
  1073. func SetHsbyMyPackagesStatus(takeOrderID string, accountID, status int) error {
  1074. engine := db.GetEngine()
  1075. sql := fmt.Sprintf("update TRADE_GOODSPICKUP set TAKEORDERSTATUS = %d where TAKEORDERID = %s and ACCOUNTID = %d", status, takeOrderID, accountID)
  1076. _, err := engine.Exec(sql)
  1077. return err
  1078. }
  1079. // GetHsbyProvincesAndCities 获取省市信息数组
  1080. // 参数 provinceID int 省ID,选填
  1081. // 返回 []Division 枚举信息数组
  1082. // 返回 error error
  1083. func GetHsbyProvincesAndCities(provinceID int) ([]Division, error) {
  1084. engine := db.GetEngine()
  1085. divisions := make([]Division, 0)
  1086. session := engine.Where("DIVISIONLEVEL = 'province' or DIVISIONLEVEL = 'city'").
  1087. And(`AUTOID in (
  1088. (select DESCPROVINCEID AUTOID from HSBY_GOODSEX inner join GOODS on GOODS.GOODSID = HSBY_GOODSEX.GOODSID and GOODS.GOODSSTATUS in (2,3))
  1089. union all
  1090. (select DESCCITYID AUTOID from HSBY_GOODSEX inner join GOODS on GOODS.GOODSID = HSBY_GOODSEX.GOODSID and GOODS.GOODSSTATUS in (2,3))
  1091. )`)
  1092. if provinceID > 0 {
  1093. session = session.And("AUTOID = ?", provinceID)
  1094. }
  1095. if err := session.Find(&divisions); err != nil {
  1096. return nil, err
  1097. }
  1098. return divisions, nil
  1099. }
  1100. // HsbyBuyMyTradeDetail "我的订单 - 已完成"单据信息(一二级市场成交单,包括历史数据)
  1101. type HsbyBuyMyTradeDetail struct {
  1102. Orderid string `json:"orderid" xorm:"'ORDERID'" binding:"required"` // 单号(成交单号)
  1103. Marketid int32 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 市场ID
  1104. Goodsid int32 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID
  1105. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'" binding:"required"` // 账户ID[报价币种]
  1106. Buyorsell int32 `json:"buyorsell" xorm:"'BUYORSELL'" binding:"required"` // 买卖 - 0:买 1:卖
  1107. Price float64 `json:"price" xorm:"'PRICE'"` // 价格
  1108. Qty int64 `json:"qty" xorm:"'QTY'" binding:"required"` // 数量
  1109. Time time.Time `json:"time" xorm:"'TIME'" binding:"required"` // 时间
  1110. Amount float64 `json:"amount" xorm:"'AMOUNT'"` // 金额 = 价格 * 数量 * 合约单位
  1111. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  1112. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  1113. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  1114. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  1115. Picurls1 string `json:"picurls1" xorm:"'PICURLS1'"` // 预售商品介绍图片[多张用逗号分隔]
  1116. Picurls2 string `json:"picurls2" xorm:"'PICURLS2'"` // 挂牌商品介绍图片[多张用逗号分隔]
  1117. Trademode uint32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  1118. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  1119. Vendorname1 string `json:"vendorname1" xorm:"'VENDORNAME1'"` // 预售商品供应商名称
  1120. Vendorname2 string `json:"vendorname2" xorm:"'VENDORNAME2'"` // 挂牌商品供应商名称
  1121. }
  1122. // GetHsbyBuyMyTradeDetails 获取"我的订单 - 已完成"单据信息(一二级市场成交单,包括历史数据)
  1123. // 输入 accountIDs string 资金账户列表
  1124. // 输出 []HsbyBuyMyTradeDetail "我的订单 - 已完成"单据信息
  1125. // 输出 error error
  1126. func GetHsbyBuyMyTradeDetails(accountIDs string) ([]HsbyBuyMyTradeDetail, error) {
  1127. // 获取市场信息
  1128. markets, err := GetMarkets()
  1129. if err != nil {
  1130. return nil, err
  1131. }
  1132. engine := db.GetEngine()
  1133. marketIDs := "" // 我的订单包括一二级市场卖方向成交单(包括历史成交单)
  1134. // 默认取 TradeMode = 16
  1135. for _, v := range markets {
  1136. if v.Trademode == 16 || v.Trademode == 71 || v.Trademode == 70 {
  1137. if len(marketIDs) == 0 {
  1138. marketIDs = strconv.Itoa(int(v.Marketid))
  1139. } else {
  1140. marketIDs += "," + strconv.Itoa(int(v.Marketid))
  1141. }
  1142. }
  1143. }
  1144. orders := make([]HsbyBuyMyTradeDetail, 0)
  1145. // 当前成交单
  1146. curOrders := make([]HsbyBuyMyTradeDetail, 0)
  1147. if err := engine.Table("TRADE_TRADEDETAIL").
  1148. Select(`to_char(TRADE_TRADEDETAIL.TRADEID) ORDERID,
  1149. TRADE_TRADEDETAIL.MARKETID, TRADE_TRADEDETAIL.GOODSID, TRADE_TRADEDETAIL.ACCOUNTID, TRADE_TRADEDETAIL.BUYORSELL,
  1150. TRADE_TRADEDETAIL.TRADEPRICE PRICE, TRADE_TRADEDETAIL.TRADEQTY QTY, TRADE_TRADEDETAIL.TRADETIME TIME, TRADE_TRADEDETAIL.TRADEAMOUNT AMOUNT,
  1151. GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE, GOODS.AGREEUNIT,
  1152. HG1.PICURLS PICURLS1, HG2.PICURLS PICURLS2,
  1153. MARKET.TRADEMODE,
  1154. ENUMDICITEM.PARAM2 CURRENCYSIGN,
  1155. HS1.VENDORNAME VENDORNAME1, HS2.VENDORNAME VENDORNAME2`).
  1156. Join("LEFT", "GOODS", "GOODS.GOODSID = TRADE_TRADEDETAIL.GOODSID").
  1157. Join("LEFT", "CPTRADE_PRESALEGOODSEX", "CPTRADE_PRESALEGOODSEX.GOODSID = TRADE_TRADEDETAIL.GOODSID").
  1158. Join("LEFT", "HSBY_GOODSEX HG1", "HG1.GOODSID = CPTRADE_PRESALEGOODSEX.RELATEDGOODSID").
  1159. Join("LEFT", "HSBY_GOODSEX HG2", "HG2.GOODSID = GOODS.GOODSID").
  1160. Join("LEFT", "ENUMDICITEM", "GOODS.CURRENCYID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'currency'").
  1161. Join("LEFT", "MARKET", "MARKET.MARKETID = TRADE_TRADEDETAIL.MARKETID").
  1162. Join("LEFT", "HSBY_SUPPLIERINFO HS1", "HS1.VENDORID = HG1.VENDORID").
  1163. Join("LEFT", "HSBY_SUPPLIERINFO HS2", "HS2.VENDORID = HG2.VENDORID").
  1164. Where(fmt.Sprintf(`TRADE_TRADEDETAIL.BUYORSELL = 0 and TRADE_TRADEDETAIL.TRADETYPE in (1,24)
  1165. and TRADE_TRADEDETAIL.ACCOUNTID in (%s)`, accountIDs)).
  1166. And(fmt.Sprintf("TRADE_TRADEDETAIL.MARKETID in (%s)", marketIDs)).Find(&curOrders); err != nil {
  1167. return nil, err
  1168. }
  1169. if len(curOrders) > 0 {
  1170. orders = append(orders, curOrders...)
  1171. }
  1172. // 历史成交单
  1173. hisOrders := make([]HsbyBuyMyTradeDetail, 0)
  1174. if err := engine.Table("HIS_TRADE_TRADEDETAIL").
  1175. Select(`to_char(HIS_TRADE_TRADEDETAIL.TRADEID) ORDERID,
  1176. HIS_TRADE_TRADEDETAIL.MARKETID, HIS_TRADE_TRADEDETAIL.GOODSID, HIS_TRADE_TRADEDETAIL.ACCOUNTID, HIS_TRADE_TRADEDETAIL.BUYORSELL,
  1177. HIS_TRADE_TRADEDETAIL.TRADEPRICE PRICE, HIS_TRADE_TRADEDETAIL.TRADEQTY QTY, HIS_TRADE_TRADEDETAIL.TRADETIME TIME, HIS_TRADE_TRADEDETAIL.TRADEAMOUNT AMOUNT,
  1178. GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE, GOODS.AGREEUNIT,
  1179. HG1.PICURLS PICURLS1, HG2.PICURLS PICURLS2,
  1180. MARKET.TRADEMODE,
  1181. ENUMDICITEM.PARAM2 CURRENCYSIGN,
  1182. HS1.VENDORNAME VENDORNAME1, HS2.VENDORNAME VENDORNAME2`).
  1183. Join("LEFT", "GOODS", "GOODS.GOODSID = HIS_TRADE_TRADEDETAIL.GOODSID").
  1184. Join("LEFT", "CPTRADE_PRESALEGOODSEX", "CPTRADE_PRESALEGOODSEX.GOODSID = HIS_TRADE_TRADEDETAIL.GOODSID").
  1185. Join("LEFT", "HSBY_GOODSEX HG1", "HG1.GOODSID = CPTRADE_PRESALEGOODSEX.RELATEDGOODSID").
  1186. Join("LEFT", "HSBY_GOODSEX HG2", "HG2.GOODSID = GOODS.GOODSID").
  1187. Join("LEFT", "ENUMDICITEM", "GOODS.CURRENCYID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'currency'").
  1188. Join("LEFT", "MARKET", "MARKET.MARKETID = HIS_TRADE_TRADEDETAIL.MARKETID").
  1189. Join("LEFT", "HSBY_SUPPLIERINFO HS1", "HS1.VENDORID = HG1.VENDORID").
  1190. Join("LEFT", "HSBY_SUPPLIERINFO HS2", "HS2.VENDORID = HG2.VENDORID").
  1191. Where(fmt.Sprintf(`HIS_TRADE_TRADEDETAIL.BUYORSELL = 0 and HIS_TRADE_TRADEDETAIL.TRADETYPE in (1,24) and HIS_TRADE_TRADEDETAIL.ISVALIDDATA = 1
  1192. and HIS_TRADE_TRADEDETAIL.ACCOUNTID in (%s)`, accountIDs)).
  1193. And(fmt.Sprintf("HIS_TRADE_TRADEDETAIL.MARKETID in (%s)", marketIDs)).Find(&hisOrders); err != nil {
  1194. return nil, err
  1195. }
  1196. if len(hisOrders) > 0 {
  1197. orders = append(orders, hisOrders...)
  1198. }
  1199. return orders, nil
  1200. }
  1201. // HsbyBuyMyPayOrder "我的订单 - 待付款"单据信息(一二级市场待付款信息)
  1202. type HsbyBuyMyPayOrder struct {
  1203. Tradeid string `json:"tradeid" xorm:"'TRADEIDSTR'" binding:"required"` // 成交单号(101+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  1204. Tradedate string `json:"tradedate" xorm:"'TRADEDATE'"` // 交易日(yyyyMMdd)
  1205. Marketid int32 `json:"marketid" xorm:"'MARKETID'"` // 市场ID
  1206. Goodsid int32 `json:"goodsid" xorm:"'GOODSID'"` // 商品ID
  1207. Buyorderid string `json:"buyorderid" xorm:"'BUYORDERIDSTR'"` // 买方委托单号
  1208. Buyaccountid int64 `json:"buyaccountid" xorm:"'BUYACCOUNTID'"` // 买方账号ID[报价币种]
  1209. Sellorderid string `json:"sellorderid" xorm:"'SELLORDERIDSTR'"` // 卖方委托单号
  1210. Sellaccountid int64 `json:"sellaccountid" xorm:"'SELLACCOUNTID'"` // 卖方账号ID[报价币种]
  1211. Tradeamount float64 `json:"tradeamount" xorm:"'TRADEAMOUNT'"` // 成交金额
  1212. Tradecharge float64 `json:"tradecharge" xorm:"'TRADECHARGE'"` // 成交手续费(买方)
  1213. Payflag int32 `json:"payflag" xorm:"'PAYFLAG'"` // 付款标识 - 1:未支付 2:已支付 3:已过期 4:已撤销 5:结算过期 6:预售终止
  1214. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  1215. Paytime time.Time `json:"paytime" xorm:"'PAYTIME'"` // 付款时间
  1216. Paylimitedtime time.Time `json:"paylimitedtime" xorm:"'PAYLIMITEDTIME'"` // 支付期限
  1217. Offamount float64 `json:"offamount" xorm:"'OFFAMOUNT'"` // 优惠金额
  1218. Tradeprice float64 `json:"tradeprice" xorm:"'TRADEPRICE'"` // 成交价格
  1219. Tradeqty int64 `json:"tradeqty" xorm:"'TRADEQTY'"` // 成交数量
  1220. Payamount float64 `json:"payamount" xorm:"'PAYAMOUNT'"` // 支付金额 = TradeAmount + TradeCharge
  1221. OriginalAmount float64 `json:"originalamount" xorm:"ORIGINALAMOUNT"` // 原金额 = TradeAmount + TradeCharge + OffAmount
  1222. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  1223. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  1224. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  1225. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  1226. Picurls1 string `json:"picurls1" xorm:"'PICURLS1'"` // 预售商品介绍图片[多张用逗号分隔]
  1227. Picurls2 string `json:"picurls2" xorm:"'PICURLS2'"` // 挂牌商品介绍图片[多张用逗号分隔]
  1228. Trademode uint32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  1229. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  1230. Vendorname1 string `json:"vendorname1" xorm:"'VENDORNAME1'"` // 预售商品供应商名称
  1231. Vendorname2 string `json:"vendorname2" xorm:"'VENDORNAME2'"` // 挂牌商品供应商名称
  1232. }
  1233. // GetHsbyBuyMyPayOrders 获取待付款信息
  1234. func GetHsbyBuyMyPayOrders(accountIDs string, buyOrderID, sellOrderID int) ([]HsbyBuyMyPayOrder, error) {
  1235. // 获取市场信息
  1236. markets, err := GetMarkets()
  1237. if err != nil {
  1238. return nil, err
  1239. }
  1240. engine := db.GetEngine()
  1241. marketIDs := "" // 我的订单包括一二级市场卖方向成交单
  1242. // 默认取 TradeMode = 16
  1243. for _, v := range markets {
  1244. if v.Trademode == 16 || v.Trademode == 71 || v.Trademode == 70 {
  1245. if len(marketIDs) == 0 {
  1246. marketIDs = strconv.Itoa(int(v.Marketid))
  1247. } else {
  1248. marketIDs += "," + strconv.Itoa(int(v.Marketid))
  1249. }
  1250. }
  1251. }
  1252. orders := make([]HsbyBuyMyPayOrder, 0)
  1253. session := engine.Table("TRADE_PAYORDER TP").
  1254. Select(`to_char(TP.TRADEID) TRADEIDSTR, to_char(TP.BUYORDERID) BUYORDERIDSTR, to_char(TP.SELLORDERID) SELLORDERIDSTR, TP.*, (TP.TRADEAMOUNT + NVL(TP.TRADECHARGE,0) + NVL(TP.OFFAMOUNT,0)) ORIGINALAMOUNT,
  1255. GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE, GOODS.AGREEUNIT,
  1256. HG1.PICURLS PICURLS1, HG2.PICURLS PICURLS2,
  1257. MARKET.TRADEMODE,
  1258. ENUMDICITEM.PARAM2 CURRENCYSIGN,
  1259. HS1.VENDORNAME VENDORNAME1, HS2.VENDORNAME VENDORNAME2`).
  1260. Join("LEFT", "GOODS", "GOODS.GOODSID = TP.GOODSID").
  1261. Join("LEFT", "CPTRADE_PRESALEGOODSEX CP", "CP.GOODSID = TP.GOODSID").
  1262. Join("LEFT", "HSBY_GOODSEX HG1", "HG1.GOODSID = CP.RELATEDGOODSID").
  1263. Join("LEFT", "HSBY_GOODSEX HG2", "HG2.GOODSID = GOODS.GOODSID").
  1264. Join("LEFT", "ENUMDICITEM", "GOODS.CURRENCYID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'currency'").
  1265. Join("LEFT", "MARKET", "MARKET.MARKETID = TP.MARKETID").
  1266. Join("LEFT", "HSBY_SUPPLIERINFO HS1", "HS1.VENDORID = HG1.VENDORID").
  1267. Join("LEFT", "HSBY_SUPPLIERINFO HS2", "HS2.VENDORID = HG2.VENDORID").
  1268. Where(fmt.Sprintf(`TP.PAYFLAG = 1 and TP.BUYACCOUNTID in (%s)`, accountIDs)).
  1269. And(fmt.Sprintf("TP.MARKETID in (%s)", marketIDs))
  1270. if buyOrderID != 0 {
  1271. session = session.And("TP.BUYORDERID = ?", buyOrderID)
  1272. }
  1273. if sellOrderID != 0 {
  1274. session = session.And("TP.SELLORDERID = ?", sellOrderID)
  1275. }
  1276. if err := session.Find(&orders); err != nil {
  1277. return nil, err
  1278. }
  1279. return orders, nil
  1280. }
  1281. // HsbyMarketInfo 海商报业相关市场信息
  1282. type HsbyMarketInfo struct {
  1283. Marketid int32 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 市场ID正常5位,前三位固定:两位表示交易模式, 一位表示交易属性(1:收益权,2:所有权) 其它特殊市场:0-系统 1-交割服务 2-账户服务3-履约服务 4-仓单服务 5-积分服务 6-银行服务
  1284. Marketname string `json:"marketname" xorm:"'MARKETNAME'"` // 市场名称
  1285. Trademode int32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  1286. Marketstatus int32 `json:"marketstatus" xorm:"'MARKETSTATUS'" binding:"required"` // 生效状态(ValidStatus枚举): 1:待生效 2:正常 3:注销
  1287. }
  1288. // GetHsbyMarketInfos 获取海商报业相关市场信息
  1289. func GetHsbyMarketInfos() ([]HsbyMarketInfo, error) {
  1290. engine := db.GetEngine()
  1291. markets := make([]HsbyMarketInfo, 0)
  1292. if err := engine.Table("MARKET").Where("TRADEMODE in (71,16,70)").Find(&markets); err != nil {
  1293. return nil, err
  1294. }
  1295. return markets, nil
  1296. }
  1297. // HsbySellCollectionOrder 我的闲置中收款信息
  1298. type HsbySellCollectionOrder struct {
  1299. Tradeid string `json:"tradeid" xorm:"'TRADEIDSTR'" binding:"required"` // 成交单号(101+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  1300. Tradedate string `json:"tradedate" xorm:"'TRADEDATE'"` // 交易日(yyyyMMdd)
  1301. Marketid int32 `json:"marketid" xorm:"'MARKETID'"` // 市场ID
  1302. Goodsid int32 `json:"goodsid" xorm:"'GOODSID'"` // 商品ID
  1303. Buyorderid string `json:"buyorderid" xorm:"'BUYORDERIDSTR'"` // 买方委托单号
  1304. Buyaccountid int64 `json:"buyaccountid" xorm:"'BUYACCOUNTID'"` // 买方账号ID[报价币种]
  1305. Sellorderid string `json:"sellorderid" xorm:"'SELLORDERIDSTR'"` // 卖方委托单号
  1306. Sellaccountid int64 `json:"sellaccountid" xorm:"'SELLACCOUNTID'"` // 卖方账号ID[报价币种]
  1307. Tradeamount float64 `json:"tradeamount" xorm:"'TRADEAMOUNT'"` // 成交金额
  1308. Tradecharge float64 `json:"tradecharge" xorm:"'TRADECHARGE'"` // 成交手续费(买方)
  1309. Payflag int32 `json:"payflag" xorm:"'PAYFLAG'"` // 付款标识 - 1:未支付 2:已支付 3:已过期 4:已撤销 5:结算过期 6:预售终止
  1310. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  1311. Paytime time.Time `json:"paytime" xorm:"'PAYTIME'"` // 付款时间
  1312. Paylimitedtime time.Time `json:"paylimitedtime" xorm:"'PAYLIMITEDTIME'"` // 支付期限
  1313. Offamount float64 `json:"offamount" xorm:"'OFFAMOUNT'"` // 优惠金额
  1314. Tradeprice float64 `json:"tradeprice" xorm:"'TRADEPRICE'"` // 成交价格
  1315. Tradeqty int64 `json:"tradeqty" xorm:"'TRADEQTY'"` // 成交数量
  1316. Payamount float64 `json:"payamount" xorm:"'PAYAMOUNT'"` // 支付金额 = TradeAmount + TradeCharge - OffAmount
  1317. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  1318. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  1319. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  1320. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  1321. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 商品介绍图片[多张用逗号分隔]
  1322. Trademode uint32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  1323. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  1324. }
  1325. // GetHsbySellCollectionOrders 获取我的闲置中待收款信息
  1326. func GetHsbySellCollectionOrders(accountIDs string) ([]HsbySellCollectionOrder, error) {
  1327. // 获取市场信息
  1328. markets, err := GetMarkets()
  1329. if err != nil {
  1330. return nil, err
  1331. }
  1332. engine := db.GetEngine()
  1333. marketIDs := ""
  1334. for _, v := range markets {
  1335. if v.Trademode == 16 || v.Trademode == 70 {
  1336. if len(marketIDs) == 0 {
  1337. marketIDs = strconv.Itoa(int(v.Marketid))
  1338. } else {
  1339. marketIDs += "," + strconv.Itoa(int(v.Marketid))
  1340. }
  1341. }
  1342. }
  1343. orders := make([]HsbySellCollectionOrder, 0)
  1344. session := engine.Table("TRADE_PAYORDER TP").
  1345. Select(`to_char(TP.TRADEID) TRADEIDSTR, to_char(TP.BUYORDERID) BUYORDERIDSTR, to_char(TP.SELLORDERID) SELLORDERIDSTR, TP.*,
  1346. G.GOODSCODE, G.GOODSNAME, G.DECIMALPLACE, G.AGREEUNIT,
  1347. HG.PICURLS,
  1348. M.TRADEMODE,
  1349. E.PARAM2 CURRENCYSIGN`).
  1350. Join("LEFT", "GOODS G", "G.GOODSID = TP.GOODSID").
  1351. Join("LEFT", "HSBY_GOODSEX HG", "HG.GOODSID = G.GOODSID").
  1352. Join("LEFT", "ENUMDICITEM E", "G.CURRENCYID = E.ENUMITEMNAME and E.ENUMDICCODE = 'currency'").
  1353. Join("LEFT", "MARKET M", "M.MARKETID = TP.MARKETID").
  1354. Join("LEFT", "HSBY_SUPPLIERINFO HS", "HS.VENDORID = HG.VENDORID").
  1355. Where(fmt.Sprintf(`TP.PAYFLAG = 1 and TP.SELLACCOUNTID in (%s)`, accountIDs)).
  1356. And(fmt.Sprintf("TP.MARKETID in (%s)", marketIDs))
  1357. if err := session.Find(&orders); err != nil {
  1358. return nil, err
  1359. }
  1360. return orders, nil
  1361. }
  1362. // HsbyMarketGoods 特卖商城商品(三级市场商场)
  1363. type HsbyMarketGoods struct {
  1364. Orderid string `json:"orderid" xorm:"'ORDERIDSTR'" binding:"required"` // 委托单号(100+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  1365. Marketid int32 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 市场ID
  1366. Goodsid int32 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID
  1367. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'" binding:"required"` // 账户ID[报价币种]
  1368. Buyorsell int32 `json:"buyorsell" xorm:"'BUYORSELL'" binding:"required"` // 买卖 - 0:买 1:卖
  1369. Orderprice float64 `json:"orderprice" xorm:"'ORDERPRICE'"` // 委托价格
  1370. Orderstatus int32 `json:"orderstatus" xorm:"'ORDERSTATUS'"` // 委托状态 - 1: 委托请求 2:待冻结 3:委托成功 4: 委托失败 5:配对成功 6: 已撤销 7:部分成交 8:已成交 9:部成部撤 10:成交失败 11:已拒绝 12:经过摘牌(先摘后挂专用-先摘后挂已摘过) 13:冻结成功(通道交易专用) 14:通道已撤 15:通道部成部撤 16:成交失败违约(荷兰式竞拍专用)
  1371. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  1372. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  1373. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  1374. Quoteminunit int64 `json:"quoteminunit" xorm:"'QUOTEMINUNIT'"` // 行情最小变动单位 [整数,报价小数位一起使用]
  1375. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  1376. Hotindex int32 `json:"hotindex" xorm:"'HOTINDEX'"` // 景点热度
  1377. Videourls string `json:"videourls" xorm:"'VIDEOURLS'"` // 介绍视频[多张用逗号分隔]
  1378. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
  1379. Categoryid int32 `json:"categoryid" xorm:"'CATEGORYID'"` // 类别ID(WRCATEGORY)
  1380. Goodsprice float64 `json:"goodsprice" xorm:"'GOODSPRICE'"` // 商品价格
  1381. Currency string `json:"currency" xorm:"'CURRENCY'"` // 货币
  1382. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  1383. Trademode int32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  1384. Customername string `json:"customername" xorm:"'CUSTOMERNAME'"` // 卖家名称
  1385. HasCoupon bool `json:"hascoupon" xorm:"-"` // 是否可用优惠卷
  1386. SellUserID int `json:"sellUserID" xorm:"-"` // 卖方UserID
  1387. }
  1388. // GetHsbyMarketGoodsesByVisitor 游客获取商城商品列表(三级商城)
  1389. func GetHsbyMarketGoodsesByVisitor(marketIDs string, categoryID int, goodsIDs string) ([]HsbyMarketGoods, error) {
  1390. engine := db.GetEngine()
  1391. orders := make([]HsbyMarketGoods, 0)
  1392. session := engine.Table("GOODS G").
  1393. Select(`'1' ORDERIDSTR, 2 ACCOUNTID, 0 BUYORSELL,
  1394. G.GOODSID, G.MARKETID, G.GOODSCODE, G.GOODSNAME, G.DECIMALPLACE, G.QUOTEMINUNIT, G.AGREEUNIT,
  1395. GX.HOTINDEX, GX.PICURLS, GX.CATEGORYID, GX.GOODSDESC, GX.GOODSPRICE,
  1396. E.ENUMDICNAME CURRENCY, E.PARAM2 CURRENCYSIGN,
  1397. M.TRADEMODE`).
  1398. Join("LEFT", "HSBY_GOODSEX GX", "GX.GOODSID = G.GOODSID").
  1399. Join("LEFT", "ENUMDICITEM E", "E.ENUMITEMNAME = G.CURRENCYID and E.ENUMDICCODE = 'currency'").
  1400. Join("LEFT", "MARKET M", "M.MARKETID = G.MARKETID").
  1401. Where(fmt.Sprintf("G.GOODSSTATUS = 3 and G.MARKETID in (%s)", marketIDs))
  1402. if categoryID != 0 {
  1403. session = session.And("GX.CATEGORYID = ?", categoryID)
  1404. }
  1405. if len(goodsIDs) > 0 {
  1406. session = session.And(fmt.Sprintf("G.GOODSID in (%s)", goodsIDs))
  1407. }
  1408. if err := session.Find(&orders); err != nil {
  1409. return nil, err
  1410. }
  1411. return orders, nil
  1412. }
  1413. // GetHsbyMarketGoodses 获取商城商品列表(三级商城)
  1414. func GetHsbyMarketGoodses(marketIDs string, accountID, categoryID int, goodsIDs string, couponTypeID int) ([]HsbyMarketGoods, error) {
  1415. engine := db.GetEngine()
  1416. // 新需求:当账号登录后传入accountID时,只显示此账户所属会员下面的商城商品(注意会员账号的所属会员就是自己)
  1417. // 获取accountID对应账户的所属会员UserID
  1418. var memberUserIDs []string
  1419. if err := engine.Table("USERACCOUNT U").
  1420. Select("to_char(U.MEMBERUSERID) MEMBERUSERID").
  1421. Join("INNER", "TAACCOUNT TA", "TA.RELATEDUSERID = U.USERID").
  1422. Where("TA.ACCOUNTID = ?", accountID).
  1423. Find(&memberUserIDs); err != nil {
  1424. return nil, err
  1425. }
  1426. // 获取此会员下所有的资金账户
  1427. var memberAccountIDs []string
  1428. if err := engine.Table("TAACCOUNT").
  1429. Select("to_char(ACCOUNTID) ACCOUNTID").
  1430. Where(fmt.Sprintf("RELATEDUSERID in (%s)", strings.Join(memberUserIDs, ","))).
  1431. Find(&memberAccountIDs); err != nil {
  1432. fmt.Println(err.Error())
  1433. return nil, err
  1434. }
  1435. // 获取优惠卷类型信息
  1436. var couponType Coupontype
  1437. if _, err := engine.Where("ISVALID = 1 and COUPONTYPEID = ?", couponTypeID).Get(&couponType); err != nil {
  1438. return nil, err
  1439. }
  1440. orders := make([]HsbyMarketGoods, 0)
  1441. // 与挂牌点选不一样的是商城是以委托单为主表;已经卖完的委托单不显示
  1442. session := engine.Table("TRADE_ORDERDETAIL T").
  1443. Select(`to_char(T.ORDERID) ORDERIDSTR, T.*,
  1444. G.GOODSCODE, G.GOODSNAME, G.DECIMALPLACE, G.QUOTEMINUNIT, G.AGREEUNIT,
  1445. GX.HOTINDEX, GX.PICURLS, GX.CATEGORYID, GX.GOODSDESC, GX.GOODSPRICE,
  1446. E.ENUMDICNAME CURRENCY, E.PARAM2 CURRENCYSIGN,
  1447. M.TRADEMODE,
  1448. U.CUSTOMERNAME`).
  1449. Join("LEFT", "GOODS G", "G.GOODSID = T.GOODSID").
  1450. Join("LEFT", "HSBY_GOODSEX GX", "GX.GOODSID = T.GOODSID").
  1451. Join("LEFT", "ENUMDICITEM E", "E.ENUMITEMNAME = G.CURRENCYID and E.ENUMDICCODE = 'currency'").
  1452. Join("LEFT", "MARKET M", "M.MARKETID = T.MARKETID").
  1453. Join("LEFT", "TAACCOUNT TA", "TA.ACCOUNTID = T.ACCOUNTID").
  1454. Join("LEFT", "USERINFO U", "U.USERID = TA.RELATEDUSERID").
  1455. Where(fmt.Sprintf("T.MARKETID in (%s)", marketIDs)).
  1456. And("T.ORDERSTATUS in (3,7) and T.BUYORSELL = 1 and (T.ORDERQTY - T.TRADEQTY - T.CANCELQTY) > 0").
  1457. And(fmt.Sprintf("T.ACCOUNTID in (%s)", strings.Join(memberAccountIDs, ",")))
  1458. if categoryID != 0 {
  1459. session = session.And("GX.CATEGORYID = ?", categoryID)
  1460. }
  1461. if len(goodsIDs) > 0 {
  1462. session = session.And(fmt.Sprintf("G.GOODSID in (%s)", goodsIDs))
  1463. }
  1464. if couponTypeID > 0 {
  1465. if couponType.Coupontypeid == 0 {
  1466. // 没有查询到对应的优惠卷,直接返回空数组
  1467. return make([]HsbyMarketGoods, 0), nil
  1468. }
  1469. // 优惠卷特定商品
  1470. if couponType.Limitedflag == 1 {
  1471. // 去掉头尾逗号
  1472. limitedGoodsIDs := couponType.Limitedgoodsids
  1473. if strings.HasPrefix(limitedGoodsIDs, ",") && strings.HasSuffix(limitedGoodsIDs, ",") {
  1474. limitedGoodsIDs = limitedGoodsIDs[1 : len(limitedGoodsIDs)-1]
  1475. }
  1476. session = session.And(fmt.Sprintf("T.GOODSID in (%s)", limitedGoodsIDs))
  1477. }
  1478. // 优惠卷特定卖家
  1479. if couponType.Isgeneral == 0 {
  1480. // 去掉头尾逗号
  1481. userScope := couponType.Userscope
  1482. if strings.HasPrefix(userScope, ",") && strings.HasSuffix(userScope, ",") {
  1483. userScope = userScope[1 : len(userScope)-1]
  1484. }
  1485. // 查询对应的卖家资金账户信息
  1486. taAccounts := make([]Taaccount, 0)
  1487. if err := engine.Where(fmt.Sprintf("RELATEDUSERID in (%s)", userScope)).Find(&taAccounts); err != nil {
  1488. return nil, err
  1489. }
  1490. sellAccountIDs := ""
  1491. for _, v := range taAccounts {
  1492. if len(sellAccountIDs) == 0 {
  1493. sellAccountIDs = strconv.Itoa(int(v.Accountid))
  1494. } else {
  1495. sellAccountIDs += "," + strconv.Itoa(int(v.Accountid))
  1496. }
  1497. }
  1498. session = session.And(fmt.Sprintf("T.ACCOUNTID in (%s)", sellAccountIDs))
  1499. }
  1500. }
  1501. if err := session.Find(&orders); err != nil {
  1502. return nil, err
  1503. }
  1504. // 获取当前账户的优惠卷
  1505. type myCouponPosition struct {
  1506. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'" binding:"required"` // 资金账户ID
  1507. Coupontypeid int32 `json:"coupontypeid" xorm:"'COUPONTYPEID'" binding:"required"` // 优惠券类型ID
  1508. Curqty int64 `json:"curqty" xorm:"'CURQTY'"` // 期末数量
  1509. Curfreezeqty int64 `json:"curfreezeqty" xorm:"'CURFREEZEQTY'"` // 期末冻结数量
  1510. Limitedflag int32 `json:"limitedflag" xorm:"'LIMITEDFLAG'"` // 是否指定商品 - 0:不限 1:限制
  1511. Limitedgoodsids string `json:"limitedgoodsids" xorm:"'LIMITEDGOODSIDS'"` // 指定商品IDs[逗号分隔,前后加逗号]
  1512. Isgeneral int32 `json:"isgeneral" xorm:"'ISGENERAL'"` // 是否通用券 - 0:否 1:是
  1513. Userscope string `json:"userscope" xorm:"'USERSCOPE'"` // 卖家范围(用户ID,逗号分隔,前后加逗号) [IsGeneral =0时使用]
  1514. }
  1515. myCouponPositions := make([]myCouponPosition, 0)
  1516. if accountID != 0 {
  1517. if err := engine.Table("COUPONPOSITION C").
  1518. Select(`C.ACCOUNTID, C.COUPONTYPEID, C.CURQTY, C.CURFREEZEQTY,
  1519. CT.LIMITEDFLAG, CT.LIMITEDGOODSIDS, CT.ISGENERAL, CT.USERSCOPE`).
  1520. Join("INNER", "COUPONTYPE CT", "CT.COUPONTYPEID = C.COUPONTYPEID").
  1521. Where("C.ACCOUNTID = ?", accountID).And("(C.CURQTY - C.CURFREEZEQTY) > 0").Find(&myCouponPositions); err != nil {
  1522. return nil, err
  1523. }
  1524. }
  1525. // 是否有优惠卷可用
  1526. if len(orders) > 0 && len(myCouponPositions) > 0 {
  1527. for _, coupon := range myCouponPositions {
  1528. if coupon.Curqty <= 0 {
  1529. continue
  1530. }
  1531. if coupon.Limitedflag == 0 && coupon.Isgeneral == 1 {
  1532. // 有不指定商品的通用卷则所有委托单都可以用卷
  1533. for i := range orders {
  1534. order := &orders[i]
  1535. order.HasCoupon = true
  1536. }
  1537. break
  1538. } else {
  1539. for i := range orders {
  1540. order := &orders[i]
  1541. // 获取卖家UserID
  1542. userInfo, err := GetUserInfoByAccountID(int(order.Accountid))
  1543. if err != nil {
  1544. continue
  1545. }
  1546. order.SellUserID = int(userInfo.Userid)
  1547. // order.Customername = userInfo.Customername
  1548. tmpGoodsID := fmt.Sprintf(",%d,", order.Goodsid)
  1549. tmpUserID := fmt.Sprintf(",%d,", userInfo.Userid)
  1550. // 优惠卷是否可用于商品
  1551. isRightGoods := false
  1552. if coupon.Limitedflag == 0 {
  1553. isRightGoods = true
  1554. } else {
  1555. if strings.Contains(coupon.Limitedgoodsids, tmpGoodsID) {
  1556. isRightGoods = true
  1557. }
  1558. }
  1559. // 优惠卷是否可用于卖家
  1560. isRightAccount := false
  1561. if coupon.Isgeneral == 1 {
  1562. isRightAccount = true
  1563. } else {
  1564. if strings.Contains(coupon.Userscope, tmpUserID) {
  1565. isRightAccount = true
  1566. }
  1567. }
  1568. if isRightGoods && isRightAccount {
  1569. order.HasCoupon = true
  1570. }
  1571. }
  1572. }
  1573. }
  1574. }
  1575. return orders, nil
  1576. }
  1577. // HsbyMarketGoodsDetail 特卖商城商品(三级市场商场)
  1578. type HsbyMarketGoodsDetail struct {
  1579. Orderid string `json:"orderid" xorm:"'ORDERIDSTR'" binding:"required"` // 委托单号(100+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  1580. Marketid int32 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 市场ID
  1581. Goodsid int32 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID
  1582. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'" binding:"required"` // 账户ID[报价币种]
  1583. Buyorsell int32 `json:"buyorsell" xorm:"'BUYORSELL'" binding:"required"` // 买卖 - 0:买 1:卖
  1584. Orderprice float64 `json:"orderprice" xorm:"'ORDERPRICE'"` // 委托价格
  1585. Orderqty int64 `json:"orderqty" xorm:"'ORDERQTY'" binding:"required"` // 委托数量
  1586. Tradeqty int64 `json:"tradeqty" xorm:"'TRADEQTY'"` // 成交数量
  1587. Cancelqty int64 `json:"cancelqty" xorm:"'CANCELQTY'"` // 撤单数量
  1588. Orderstatus int32 `json:"orderstatus" xorm:"'ORDERSTATUS'"` // 委托状态 - 1: 委托请求 2:待冻结 3:委托成功 4: 委托失败 5:配对成功 6: 已撤销 7:部分成交 8:已成交 9:部成部撤 10:成交失败 11:已拒绝 12:经过摘牌(先摘后挂专用-先摘后挂已摘过) 13:冻结成功(通道交易专用) 14:通道已撤 15:通道部成部撤 16:成交失败违约(荷兰式竞拍专用)
  1589. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  1590. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  1591. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  1592. Quoteminunit int64 `json:"quoteminunit" xorm:"'QUOTEMINUNIT'"` // 行情最小变动单位 [整数,报价小数位一起使用]
  1593. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  1594. Hotindex int32 `json:"hotindex" xorm:"'HOTINDEX'"` // 景点热度
  1595. Videourls string `json:"videourls" xorm:"'VIDEOURLS'"` // 介绍视频[多张用逗号分隔]
  1596. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
  1597. Categoryid int32 `json:"categoryid" xorm:"'CATEGORYID'"` // 类别ID(WRCATEGORY)
  1598. Goodsdesc string `json:"goodsdesc" xorm:"'GOODSDESC'"` // 商品详情
  1599. Goodsprice float64 `json:"goodsprice" xorm:"'GOODSPRICE'"` // 商品价格
  1600. Currency string `json:"currency" xorm:"'CURRENCY'"` // 货币
  1601. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  1602. Trademode int32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  1603. Vendorname string `json:"vendorname" xorm:"'VENDORNAME'"` // 供应商名称
  1604. Vendorattr string `json:"vendorattr" xorm:"'VENDORATTR'"` // 供应商附件(多张,逗号分隔)
  1605. Vendorphone string `json:"vendorphone" xorm:"'VENDORPHONE'"` // 供应商客服电话
  1606. Customername string `json:"customername" xorm:"'CUSTOMERNAME'"` // 卖家名称
  1607. SellUserID int `json:"sellUserID" xorm:"SELLUSERID"` // 卖方UserID
  1608. LotSize int `json:"lotsize" xorm:"-"` // 手数最小变动单位
  1609. Buymaxqty int `json:"buymaxqty" xorm:"'-'"` // 购买上限 [71] - 0为不限
  1610. }
  1611. // GetHsbyMarketGoodsDetailByVisitor 游客获取商城商品详情(三级商城)
  1612. func GetHsbyMarketGoodsDetailByVisitor(goodsID int) (*HsbyMarketGoodsDetail, error) {
  1613. engine := db.GetEngine()
  1614. orders := make([]HsbyMarketGoodsDetail, 0)
  1615. // 游客商城商品以商品表为主表
  1616. session := engine.Table("GOODS G").
  1617. Select(`'1' ORDERIDSTR, 1 ACCOUNTID, 1 BUYORSELL, 1 ORDERQTY,
  1618. G.GOODSCODE, G.GOODSNAME, G.DECIMALPLACE, G.QUOTEMINUNIT, G.AGREEUNIT, G.MARKETID, G.GOODSID,
  1619. GX.HOTINDEX, GX.VIDEOURLS, GX.PICURLS, GX.CATEGORYID, GX.GOODSDESC, GX.GOODSPRICE,
  1620. E.ENUMDICNAME CURRENCY, E.PARAM2 CURRENCYSIGN,
  1621. M.TRADEMODE,
  1622. H.VENDORNAME, H.VENDORATTR, H.VENDORPHONE`).
  1623. Join("LEFT", "HSBY_GOODSEX GX", "GX.GOODSID = G.GOODSID").
  1624. Join("LEFT", "ENUMDICITEM E", "E.ENUMITEMNAME = G.CURRENCYID and E.ENUMDICCODE = 'currency'").
  1625. Join("LEFT", "MARKET M", "M.MARKETID = G.MARKETID").
  1626. Join("LEFT", "HSBY_SUPPLIERINFO H", "H.VENDORID = GX.VENDORID").
  1627. Where("G.GOODSID = ?", goodsID)
  1628. if err := session.Find(&orders); err != nil {
  1629. return nil, err
  1630. }
  1631. // 无目标商品
  1632. if len(orders) == 0 {
  1633. return nil, nil
  1634. }
  1635. hsbyMarketGoodsDetail := orders[0]
  1636. // 最小交易手数在上层进行设置,这里暂设置为1
  1637. hsbyMarketGoodsDetail.LotSize = 1
  1638. return &hsbyMarketGoodsDetail, nil
  1639. }
  1640. // GetHsbyMarketGoodsDetail 获取商城商品详情(三级商城)
  1641. func GetHsbyMarketGoodsDetail(orderID, accountID int) (*HsbyMarketGoodsDetail, error) {
  1642. engine := db.GetEngine()
  1643. orders := make([]HsbyMarketGoodsDetail, 0)
  1644. // 与挂牌点选不一样的是商城是以委托单为主表
  1645. session := engine.Table("TRADE_ORDERDETAIL T").
  1646. Select(`to_char(T.ORDERID) ORDERIDSTR, T.*,
  1647. G.GOODSCODE, G.GOODSNAME, G.DECIMALPLACE, G.QUOTEMINUNIT, G.AGREEUNIT,
  1648. GX.HOTINDEX, GX.VIDEOURLS, GX.PICURLS, GX.CATEGORYID, GX.GOODSDESC, GX.GOODSPRICE,
  1649. E.ENUMDICNAME CURRENCY, E.PARAM2 CURRENCYSIGN,
  1650. M.TRADEMODE,
  1651. H.VENDORNAME, H.VENDORATTR, H.VENDORPHONE,
  1652. U.USERID SELLUSERID, U.CUSTOMERNAME`).
  1653. Join("LEFT", "GOODS G", "G.GOODSID = T.GOODSID").
  1654. Join("LEFT", "HSBY_GOODSEX GX", "GX.GOODSID = T.GOODSID").
  1655. Join("LEFT", "ENUMDICITEM E", "E.ENUMITEMNAME = G.CURRENCYID and E.ENUMDICCODE = 'currency'").
  1656. Join("LEFT", "MARKET M", "M.MARKETID = T.MARKETID").
  1657. Join("LEFT", "HSBY_SUPPLIERINFO H", "H.VENDORID = GX.VENDORID").
  1658. Join("LEFT", "TAACCOUNT TA", "TA.ACCOUNTID = T.ACCOUNTID").
  1659. Join("LEFT", "USERINFO U", "U.USERID = TA.RELATEDUSERID").
  1660. Where("T.ORDERID = ?", orderID)
  1661. if err := session.Find(&orders); err != nil {
  1662. return nil, err
  1663. }
  1664. // 无目标商品
  1665. if len(orders) == 0 {
  1666. return nil, nil
  1667. }
  1668. hsbyMarketGoodsDetail := orders[0]
  1669. // 最小交易手数在上层进行设置,这里暂设置为1
  1670. hsbyMarketGoodsDetail.LotSize = 1
  1671. return &hsbyMarketGoodsDetail, nil
  1672. }
  1673. // MyCoupon 我的优惠卷
  1674. type MyCoupon struct {
  1675. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'" binding:"required"` // 资金账户ID
  1676. Coupontypeid string `json:"coupontypeid" xorm:"'COUPONTYPEIDSTR'" binding:"required"` // 优惠券类型ID
  1677. Userid int64 `json:"userid" xorm:"'USERID'"` // 用户ID
  1678. Oriqty int64 `json:"oriqty" xorm:"'ORIQTY'"` // 期初数量
  1679. Orifreezeqty int64 `json:"orifreezeqty" xorm:"'ORIFREEZEQTY'"` // 期初冻结数量
  1680. Curqty int64 `json:"curqty" xorm:"'CURQTY'"` // 期末数量
  1681. Curfreezeqty int64 `json:"curfreezeqty" xorm:"'CURFREEZEQTY'"` // 期末冻结数量
  1682. Todayincrease int64 `json:"todayincrease" xorm:"'TODAYINCREASE'"` // 今日增加
  1683. Todaydecrease int64 `json:"todaydecrease" xorm:"'TODAYDECREASE'"` // 今日减少
  1684. Areauserid int64 `json:"areauserid" xorm:"'AREAUSERID'"` // 所属机构
  1685. Couponname string `json:"couponname" xorm:"'COUPONNAME'"` // 优惠券名称
  1686. Couponcategroy int32 `json:"couponcategroy" xorm:"'COUPONCATEGROY'"` // 种类 - 1:现金券 2:折扣券 3:折扣券(单张)
  1687. Conditionvalue float64 `json:"conditionvalue" xorm:"'CONDITIONVALUE'"` // 条件阈值(可为0)
  1688. Couponvalue float64 `json:"couponvalue" xorm:"'COUPONVALUE'"` // 面值[1:现金券 - 抵扣值 2:折扣券-折扣值]
  1689. Limitedflag int32 `json:"limitedflag" xorm:"'LIMITEDFLAG'"` // 是否指定商品 - 0:不限 1:限制
  1690. Limitedgoodsids string `json:"limitedgoodsids" xorm:"'LIMITEDGOODSIDS'"` // 指定商品IDs[逗号分隔,前后加逗号]
  1691. Isgeneral int32 `json:"isgeneral" xorm:"'ISGENERAL'"` // 是否通用券 - 0:否 1:是
  1692. Userscope string `json:"userscope" xorm:"'USERSCOPE'"` // 卖家范围(用户ID,逗号分隔,前后加逗号) [IsGeneral =0时使用]
  1693. IsUnusable bool `json:"isunusable" xorm:"-"` // 是否不可用
  1694. ReasonType int `json:"reasontype"` // 不可用原因 - 0:未确认 1:不可用于此商品 2:不可用于此卖家
  1695. }
  1696. // GetMyCoupons 获取我的优惠卷信息
  1697. func GetMyCoupons(accountIDs string, goodsID, sellUserID int) ([]MyCoupon, error) {
  1698. engine := db.GetEngine()
  1699. myCoupons := make([]MyCoupon, 0)
  1700. session := engine.Table("COUPONPOSITION CP").
  1701. Select("to_char(CP.COUPONTYPEID) COUPONTYPEIDSTR, CP.*").
  1702. Join("INNER", "COUPONTYPE CT", "CT.COUPONTYPEID = CP.COUPONTYPEID").
  1703. Where(fmt.Sprintf("CP.ACCOUNTID in (%s)", accountIDs))
  1704. if err := session.Find(&myCoupons); err != nil {
  1705. return nil, err
  1706. }
  1707. // 如果传入了商品ID和卖方UserID,则判断优惠卷是否可用
  1708. if goodsID != 0 && sellUserID != 0 && len(myCoupons) > 0 {
  1709. for i := range myCoupons {
  1710. myCoupon := &myCoupons[i]
  1711. // 优惠卷是否可用于商品
  1712. isRightGoods := false
  1713. if myCoupon.Limitedflag == 0 {
  1714. isRightGoods = true
  1715. } else {
  1716. if strings.Contains(myCoupon.Limitedgoodsids, fmt.Sprintf(",%d,", goodsID)) {
  1717. isRightGoods = true
  1718. }
  1719. }
  1720. // 优惠卷是否可用于卖家
  1721. isRightAccount := false
  1722. if myCoupon.Isgeneral == 1 {
  1723. isRightAccount = true
  1724. } else {
  1725. if strings.Contains(myCoupon.Userscope, fmt.Sprintf(",%d,", sellUserID)) {
  1726. isRightAccount = true
  1727. }
  1728. }
  1729. if !isRightGoods {
  1730. myCoupon.IsUnusable = true
  1731. myCoupon.ReasonType = 1
  1732. }
  1733. if !isRightAccount {
  1734. myCoupon.IsUnusable = true
  1735. myCoupon.ReasonType = 2
  1736. }
  1737. }
  1738. }
  1739. return myCoupons, nil
  1740. }
  1741. // MyCouponHold 我的优惠卷持仓
  1742. type MyCouponHold struct {
  1743. Couponholdid string `json:"couponholdid" xorm:"'COUPONHOLDIDSTR'" binding:"required"` // 优惠券持仓ID(229+Unix秒时间戳(10位)+xxxxxx)
  1744. Giveapplyid int64 `json:"giveapplyid" xorm:"'GIVEAPPLYID'"` // 发放申请ID(SEQ_COUPONGIVEAPPLY)
  1745. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'"` // 资金账户ID
  1746. Coupontypeid string `json:"coupontypeid" xorm:"'COUPONTYPEIDSTR'"` // 优惠券类型ID - SEQ_COUPONTYPE
  1747. Couponcategroy int32 `json:"couponcategroy" xorm:"'COUPONCATEGROY'"` // 种类 - 1:现金券 2:折扣券 3:折扣券(单个商品)
  1748. Conditionvalue float64 `json:"conditionvalue" xorm:"'CONDITIONVALUE'"` // 条件阈值(可为0)
  1749. Couponvalue float64 `json:"couponvalue" xorm:"'COUPONVALUE'"` // 面值[1:现金券 - 抵扣值 2:折扣券-折扣值]
  1750. Limitedflag int32 `json:"limitedflag" xorm:"'LIMITEDFLAG'"` // 是否指定商品 - 0:不限 1:限制
  1751. Limitedgoodsids string `json:"limitedgoodsids" xorm:"'LIMITEDGOODSIDS'"` // 指定商品IDs[逗号分隔]
  1752. Isgeneral int32 `json:"isgeneral" xorm:"'ISGENERAL'"` // 是否通用券 - 0:否 1:是
  1753. Userscope string `json:"userscope" xorm:"'USERSCOPE'"` // 卖家范围(用户ID,逗号分隔) [IsGeneral =0时使用]
  1754. Userid int64 `json:"userid" xorm:"'USERID'"` // 用户ID
  1755. Qty int64 `json:"qty" xorm:"'QTY'"` // 数量(按1平铺)
  1756. Startdate time.Time `json:"startdate" xorm:"'STARTDATE'"` // 开始日期
  1757. Holdstatus int32 `json:"holdstatus" xorm:"'HOLDSTATUS'"` // 持仓状态 - 1:未生效 2:已生效 3:已使用 4:已过期
  1758. Enddate time.Time `json:"enddate" xorm:"'ENDDATE'"` // 结束日期
  1759. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  1760. Couponname string `json:"couponname" xorm:"'COUPONNAME'"` // 优惠券名称
  1761. }
  1762. // GetMyCouponHolds 获取优惠卷明细
  1763. func GetMyCouponHolds(accountIDs string, holdStatus string) ([]MyCouponHold, error) {
  1764. engine := db.GetEngine()
  1765. myCouponHolds := make([]MyCouponHold, 0)
  1766. session := engine.Table("COUPONHOLD CH").
  1767. Select(`to_char(CH.COUPONHOLDID) COUPONHOLDIDSTR, to_char(CH.COUPONTYPEID) COUPONTYPEIDSTR, CH.*, CT.COUPONNAME`).
  1768. Join("INNER", "COUPONTYPE CT", "CT.COUPONTYPEID = CH.COUPONTYPEID").
  1769. Where(fmt.Sprintf("CH.ACCOUNTID in (%s)", accountIDs))
  1770. if len(holdStatus) > 0 {
  1771. session = session.And(fmt.Sprintf("CH.HOLDSTATUS in (%s)", holdStatus))
  1772. }
  1773. if err := session.Find(&myCouponHolds); err != nil {
  1774. return nil, err
  1775. }
  1776. // 如果指定查询已过期的优惠卷,则还需要查询历史表
  1777. if holdStatus == "4" {
  1778. myHisCouponHolds := make([]MyCouponHold, 0)
  1779. if err := engine.Table("HIS_COUPONHOLD CH").
  1780. Select(`to_char(CH.COUPONHOLDID) COUPONHOLDIDSTR, to_char(CH.COUPONTYPEID) COUPONTYPEIDSTR, CH.*, CT.COUPONNAME`).
  1781. Join("INNER", "COUPONTYPE CT", "CT.COUPONTYPEID = CH.COUPONTYPEID").
  1782. Where(fmt.Sprintf("CH.ISVALIDDATA = 1 and CH.HOLDSTATUS = 4 and CH.ACCOUNTID in (%s)", accountIDs)).
  1783. Find(&myHisCouponHolds); err != nil {
  1784. return nil, err
  1785. }
  1786. myCouponHolds = append(myCouponHolds, myHisCouponHolds...)
  1787. }
  1788. return myCouponHolds, nil
  1789. }
  1790. // MyUsedCoupon 已使用优惠卷
  1791. type MyUsedCoupon struct {
  1792. Orderid string `json:"orderid" xorm:"'ORDERIDSTR'" binding:"required"` // 委托单号(100+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  1793. Coupontypeid string `json:"coupontypeid" xorm:"'COUPONTYPEIDSTR'" binding:"required"` // 优惠券类型ID(买方)
  1794. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'"` // 资金账户ID(买方)
  1795. Usedqty int64 `json:"usedqty" xorm:"'USEDQTY'"` // 使用数量
  1796. Couponcategroy int32 `json:"couponcategroy" xorm:"'COUPONCATEGROY'"` // 种类 - 1:现金券 2:折扣券
  1797. Conditionvalue float64 `json:"conditionvalue" xorm:"'CONDITIONVALUE_TC'"` // 条件阈值(可为0)
  1798. Couponvalue float64 `json:"couponvalue" xorm:"'COUPONVALUE'"` // 面值[1:现金券 - 抵扣值 2:折扣券-折扣值(0-100)]
  1799. Sellaccountid int64 `json:"sellaccountid" xorm:"'SELLACCOUNTID'"` // 资金账户ID(卖方)
  1800. Marketid int32 `json:"marketid" xorm:"'MARKETID'"` // 市场ID
  1801. Goodsid int32 `json:"goodsid" xorm:"'GOODSID'"` // 商品ID
  1802. Tradeid string `json:"tradeid" xorm:"'TRADEIDSTR'"` // 成交单号(101+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  1803. Tradeamount float64 `json:"tradeamount" xorm:"'TRADEAMOUNT'"` // 成交金额
  1804. Offamount float64 `json:"offamount" xorm:"'OFFAMOUNT'"` // 优惠金额
  1805. Handlestatus int32 `json:"handlestatus" xorm:"'HANDLESTATUS'"` // 处理状态
  1806. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  1807. Couponname string `json:"couponname" xorm:"'COUPONNAME'"` // 优惠券名称
  1808. }
  1809. // GetMyUsedCoupon 获取已使用优惠卷
  1810. func GetMyUsedCoupon(accountIDs string) ([]MyUsedCoupon, error) {
  1811. engine := db.GetEngine()
  1812. myUsedCoupons := make([]MyUsedCoupon, 0)
  1813. if err := engine.Table("TRADE_ORDERCOUPON T").
  1814. Select(`to_char(T.ORDERID) ORDERIDSTR, to_char(T.COUPONTYPEID) COUPONTYPEIDSTR, to_char(T.TRADEID) TRADEIDSTR, T.*,
  1815. C.COUPONNAME, C.CONDITIONVALUE CONDITIONVALUE_TC`).
  1816. Join("INNER", "COUPONTYPE C", "C.COUPONTYPEID = T.COUPONTYPEID").
  1817. Where(fmt.Sprintf("T.ACCOUNTID in (%s)", accountIDs)).
  1818. Desc("T.CREATETIME").
  1819. Find(&myUsedCoupons); err != nil {
  1820. return nil, err
  1821. }
  1822. return myUsedCoupons, nil
  1823. }
  1824. // GetClientFixedADConfigs 获取终端固定广告配置
  1825. func GetClientFixedADConfigs() ([]Clientfixedadconfig, error) {
  1826. engine := db.GetEngine()
  1827. clientFixedADConfigs := make([]Clientfixedadconfig, 0)
  1828. if err := engine.Where("ISSHOW = 1").Find(&clientFixedADConfigs); err != nil {
  1829. return nil, err
  1830. }
  1831. return clientFixedADConfigs, nil
  1832. }