hsby.go 108 KB

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