hsby.go 69 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299
  1. package models
  2. import (
  3. "encoding/hex"
  4. "fmt"
  5. "math"
  6. "mtp2_if/db"
  7. "mtp2_if/utils"
  8. "strconv"
  9. "time"
  10. )
  11. // Hsbygoodsex 商品扩展表
  12. type Hsbygoodsex struct {
  13. Goodsid int32 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商 品ID
  14. Hotindex int32 `json:"hotindex" xorm:"'HOTINDEX'"` // 景点热度
  15. Descprovinceid int64 `json:"descprovinceid" xorm:"'DESCPROVINCEID'"` // 目的地(省)
  16. Desccityid int64 `json:"desccityid" xorm:"'DESCCITYID'"` // 目的地(市)
  17. Vendorid int32 `json:"vendorid" xorm:"'VENDORID'"` // 供应商ID
  18. Goodsdesc string `json:"goodsdesc" xorm:"'GOODSDESC'"` // 商品详情
  19. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  20. Creatorid int64 `json:"creatorid" xorm:"'CREATORID'"` // 创建人
  21. Modifierid int64 `json:"modifierid" xorm:"'MODIFIERID'"` // 修改人
  22. Modifytime time.Time `json:"modifytime" xorm:"'MODIFYTIME'"` // 修改时间
  23. Memberratio float64 `json:"memberratio" xorm:"'MEMBERRATIO'"` // 会员货款比例 [71]
  24. Videourls string `json:"videourls" xorm:"'VIDEOURLS'"` // 介绍视频[多张用逗号分隔]
  25. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
  26. }
  27. // TableName is HSBY_GOODSEX
  28. func (Hsbygoodsex) TableName() string {
  29. return "HSBY_GOODSEX"
  30. }
  31. // Hsbysupplierinfo 供应商表
  32. type Hsbysupplierinfo struct {
  33. Vendorid int32 `json:"vendorid" xorm:"'VENDORID'" binding:"required"` // 供应商ID(SEQ_HSBY_SUPPLIERINFO)
  34. Vendorname string `json:"vendorname" xorm:"'VENDORNAME'"` // 名称描述客服电话名称
  35. Vendordesc string `json:"vendordesc" xorm:"'VENDORDESC'"` // 描述
  36. Vendorphone string `json:"vendorphone" xorm:"'VENDORPHONE'"` // 客服电话
  37. Vendorattr string `json:"vendorattr" xorm:"'VENDORATTR'"` // 附件(多张,逗号分隔)
  38. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  39. Creatorid int64 `json:"creatorid" xorm:"'CREATORID'"` // 创建人
  40. Modifierid int64 `json:"modifierid" xorm:"'MODIFIERID'"` // 修改人
  41. Modifytime time.Time `json:"modifytime" xorm:"'MODIFYTIME'"` // 修改时间
  42. }
  43. // TableName is HSBY_SUPPLIERINFO
  44. func (Hsbysupplierinfo) TableName() string {
  45. return "HSBY_SUPPLIERINFO"
  46. }
  47. // Tradepayorder 交易待付款表
  48. type Tradepayorder struct {
  49. Tradeid int64 `json:"tradeid" xorm:"'TRADEID'" binding:"required"` // 成交单号(101+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  50. Tradedate string `json:"tradedate" xorm:"'TRADEDATE'"` // 交易日(yyyyMMdd)
  51. Marketid int32 `json:"marketid" xorm:"'MARKETID'"` // 市场ID
  52. Goodsid int32 `json:"goodsid" xorm:"'GOODSID'"` // 商品ID
  53. Buyorderid int64 `json:"buyorderid" xorm:"'BUYORDERID'"` // 买方委托单号
  54. Buyaccountid int64 `json:"buyaccountid" xorm:"'BUYACCOUNTID'"` // 买方账号ID[报价币种]
  55. Sellorderid int64 `json:"sellorderid" xorm:"'SELLORDERID'"` // 卖方委托单号
  56. Sellaccountid int64 `json:"sellaccountid" xorm:"'SELLACCOUNTID'"` // 卖方账号ID[报价币种]
  57. Tradeamount float64 `json:"tradeamount" xorm:"'TRADEAMOUNT'"` // 成交金额
  58. Tradecharge float64 `json:"tradecharge" xorm:"'TRADECHARGE'"` // 成交手续费(买方)
  59. Payflag int32 `json:"payflag" xorm:"'PAYFLAG'"` // 付款标识 - 1:未支付 2:已支付 3:已过期 4:已撤销 5:结算过期 6:预售终止
  60. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  61. Paytime time.Time `json:"paytime" xorm:"'PAYTIME'"` // 付款时间
  62. Paylimitedtime time.Time `json:"paylimitedtime" xorm:"'PAYLIMITEDTIME'"` // 支付期限
  63. Offamount float64 `json:"offamount" xorm:"'OFFAMOUNT'"` // 优惠金额
  64. Tradeprice float64 `json:"tradeprice" xorm:"'TRADEPRICE'"` // 成交价格
  65. Tradeqty int64 `json:"tradeqty" xorm:"'TRADEQTY'"` // 成交数量
  66. Payamount float64 `json:"payamount" xorm:"'PAYAMOUNT'"` // 支付金额 = TradeAmount + TradeCharge - OffAmount
  67. }
  68. // TableName is TRADE_PAYORDER
  69. func (Tradepayorder) TableName() string {
  70. return "TRADE_PAYORDER"
  71. }
  72. // HsbyTopGoods 热卖商品(二级市场挂牌点选)
  73. type HsbyTopGoods struct {
  74. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID(自增ID SEQ_GOODS)
  75. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  76. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  77. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  78. Marketid int64 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 所属市场ID
  79. Quoteminunit int64 `json:"quoteminunit" xorm:"'QUOTEMINUNIT'"` // 行情最小变动单位 [整数,报价小数位一起使用]
  80. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  81. Hotindex int32 `json:"hotindex" xorm:"'HOTINDEX'"` // 景点热度
  82. Videourls string `json:"videourls" xorm:"'VIDEOURLS'"` // 介绍视频[多张用逗号分隔]
  83. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
  84. Currency string `json:"currency" xorm:"'CURRENCY'"` // 货币
  85. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  86. Trademode int32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  87. Last float64 `json:"last" xorm:"-"` // 现价
  88. }
  89. // GetHsbyTopGoodses 获取热门商品列表
  90. // 参数 marketIDs string 所属市场ID列表, 格式 1,2,3
  91. // 参数 descProvinceID int 目标省ID
  92. // 参数 descCityID int 目标城市ID
  93. // 返回 []TopGoods 热门商品列表
  94. // 返回 error error
  95. func GetHsbyTopGoodses(marketIDs string, descProvinceID, descCityID int) ([]HsbyTopGoods, error) {
  96. // 热门商品为二级市场(挂牌点选)下的商品信息
  97. engine := db.GetEngine()
  98. topGoodses := make([]HsbyTopGoods, 0)
  99. // 获取挂牌商品信息,以及扩展表信息
  100. session := engine.Table("GOODS").
  101. Select(`GOODS.*,
  102. HSBY_GOODSEX.HOTINDEX, HSBY_GOODSEX.VIDEOURLS, HSBY_GOODSEX.PICURLS,
  103. ENUMDICITEM.ENUMDICNAME CURRENCY, ENUMDICITEM.PARAM2 CURRENCYSIGN,
  104. MARKET.TRADEMODE`).
  105. Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = GOODS.GOODSID").
  106. Join("LEFT", "ENUMDICITEM", "ENUMDICITEM.ENUMITEMNAME = GOODS.CURRENCYID and ENUMDICITEM.ENUMDICCODE = 'currency'").
  107. Join("LEFT", "MARKET", "MARKET.MARKETID = GOODS.MARKETID").
  108. Where(fmt.Sprintf("GOODS.GOODSSTATUS = 3 and GOODS.MARKETID in (%s)", marketIDs)) // 二级市场只获取 3:上市 状态的商品
  109. if descProvinceID > 0 {
  110. session = session.And("HSBY_GOODSEX.DESCPROVINCEID = ?", descProvinceID)
  111. }
  112. if descCityID > 0 {
  113. session = session.And("HSBY_GOODSEX.DESCCITYID = ?", descCityID)
  114. }
  115. if err := session.Find(&topGoodses); err != nil {
  116. return nil, err
  117. }
  118. if len(topGoodses) == 0 {
  119. // 无数据
  120. return topGoodses, nil
  121. }
  122. // 获取商品ID列表
  123. goodsCodes := ""
  124. for _, v := range topGoodses {
  125. if len(goodsCodes) == 0 {
  126. goodsCodes = v.Goodscode
  127. } else {
  128. goodsCodes += "," + v.Goodscode
  129. }
  130. }
  131. // 获取商品现价
  132. quoteDays, err := GetQuoteDays(goodsCodes)
  133. if err != nil {
  134. return nil, err
  135. }
  136. for i, g := range topGoodses {
  137. topGoods := &topGoodses[i]
  138. // FIXME: - 这里应该使用 Duck Typing,后期再处理
  139. // 计算最小变动单位
  140. // lotSize := float64(topGoods.Quoteminunit) * math.Pow(0.1, float64(topGoods.Decimalplace))
  141. // topGoods.LotSize, _ = strconv.ParseFloat(utils.FormatFloat(lotSize, int(topGoods.Decimalplace)), 64)
  142. for _, q := range quoteDays {
  143. if g.Goodscode == q.Goodscode {
  144. if q.Last != 0 {
  145. topGoods.Last = utils.IntToFloat64(int(q.Last), int(g.Decimalplace))
  146. }
  147. // 没有现价则尝试用昨结
  148. if topGoods.Last == 0 && q.Presettle != 0 {
  149. topGoods.Last = utils.IntToFloat64(int(q.Presettle), int(g.Decimalplace))
  150. }
  151. continue
  152. }
  153. }
  154. }
  155. return topGoodses, nil
  156. }
  157. // HsbyListingGoodsDetail 二级市场(挂牌点选)商品信息详情
  158. type HsbyListingGoodsDetail struct {
  159. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID(自增ID SEQ_GOODS)
  160. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  161. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  162. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  163. Marketid int64 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 所属市场ID
  164. Quoteminunit int64 `json:"quoteminunit" xorm:"'QUOTEMINUNIT'"` // 行情最小变动单位 [整数,报价小数位一起使用]
  165. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  166. Hotindex int32 `json:"hotindex" xorm:"'HOTINDEX'"` // 景点热度
  167. Videourls string `json:"videourls" xorm:"'VIDEOURLS'"` // 介绍视频[多张用逗号分隔]
  168. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
  169. Descprovinceid int64 `json:"descprovinceid" xorm:"'DESCPROVINCEID'"` // 目的地(省)ID
  170. Desccityid int64 `json:"desccityid" xorm:"'DESCCITYID'"` // 目的地(市)ID
  171. Goodsdesc string `json:"goodsdesc" xorm:"'GOODSDESC'"` // 商品详情
  172. Currency string `json:"currency" xorm:"'CURRENCY'"` // 货币
  173. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  174. Vendorname string `json:"vendorname" xorm:"'VENDORNAME'"` // 供应商名称
  175. Vendorphone string `json:"vendorphone" xorm:"'VENDORPHONE'"` // 供应商客服电话
  176. Vendorattr string `json:"vendorattr" xorm:"'VENDORATTR'"` // 供应商附件(多张,逗号分隔)
  177. Trademode int32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  178. Last float64 `json:"last" xorm:"-"` // 现价
  179. Limitup float64 `json:"limitup" xorm:"-"` // 涨停价
  180. Limitdown float64 `json:"limitdown" xorm:"-"` // 跌停价
  181. StepValue float64 `json:"stepvalue" xorm:"-"` // 价格最小变动单位
  182. LotSize int `json:"lotsize" xorm:"-"` // 手数最小变动单位
  183. }
  184. // GetHsbyListingGoodsDetail 获取二级市场(挂牌点选)商品信息详情
  185. // 参数 goodsID int 目标商品ID
  186. // 返回 *HsbyListingGoodsDetail 二级市场(挂牌点选)商品信息详情,查询无结果返回nil
  187. // 返回 error error
  188. func GetHsbyListingGoodsDetail(goodsID int) (*HsbyListingGoodsDetail, error) {
  189. engine := db.GetEngine()
  190. details := make([]HsbyListingGoodsDetail, 0)
  191. // 获取挂牌商品信息,以及扩展表信息
  192. // FIXME: - 这里使用Get方法,会造成SQL语句的嵌套出错,后期再研究
  193. session := engine.Table("GOODS").
  194. Select(`GOODS.GOODSID, GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE, GOODS.MARKETID, GOODS.QUOTEMINUNIT, GOODS.AGREEUNIT,
  195. HSBY_GOODSEX.HOTINDEX, HSBY_GOODSEX.VIDEOURLS, HSBY_GOODSEX.PICURLS, HSBY_GOODSEX.DESCPROVINCEID, HSBY_GOODSEX.Desccityid, HSBY_GOODSEX.Goodsdesc,
  196. ENUMDICITEM.ENUMDICNAME CURRENCY, ENUMDICITEM.PARAM2 CURRENCYSIGN,
  197. HSBY_SUPPLIERINFO.VENDORNAME, HSBY_SUPPLIERINFO.VENDORPHONE, HSBY_SUPPLIERINFO.VENDORATTR,
  198. MARKET.TRADEMODE`).
  199. Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = GOODS.GOODSID").
  200. Join("LEFT", "ENUMDICITEM", "ENUMDICITEM.ENUMITEMNAME = GOODS.CURRENCYID and ENUMDICITEM.ENUMDICCODE = 'currency'").
  201. Join("LEFT", "HSBY_SUPPLIERINFO", "HSBY_SUPPLIERINFO.VENDORID = HSBY_GOODSEX.VENDORID").
  202. Join("LEFT", "MARKET", "MARKET.MARKETID = GOODS.MARKETID").
  203. Where("GOODS.GOODSID = ?", goodsID)
  204. if err := session.Find(&details); err != nil {
  205. return nil, err
  206. }
  207. // 无目标商品
  208. if len(details) == 0 {
  209. return nil, nil
  210. }
  211. hsbyListingGoodsDetail := details[0]
  212. // 获取商品现价和涨跌停价
  213. quoteDays, err := GetQuoteDays(hsbyListingGoodsDetail.Goodscode)
  214. if err != nil {
  215. return nil, err
  216. }
  217. if len(quoteDays) > 0 {
  218. if quoteDays[0].Last != 0 {
  219. hsbyListingGoodsDetail.Last = utils.IntToFloat64(int(quoteDays[0].Last), int(hsbyListingGoodsDetail.Decimalplace))
  220. }
  221. // 没有现价则尝试用昨结
  222. if hsbyListingGoodsDetail.Last == 0 && quoteDays[0].Presettle != 0 {
  223. hsbyListingGoodsDetail.Last = utils.IntToFloat64(int(quoteDays[0].Presettle), int(hsbyListingGoodsDetail.Decimalplace))
  224. }
  225. if quoteDays[0].Limitup != 0 {
  226. hsbyListingGoodsDetail.Limitup = utils.IntToFloat64(int(quoteDays[0].Limitup), int(hsbyListingGoodsDetail.Decimalplace))
  227. }
  228. if quoteDays[0].Limitdown != 0 {
  229. hsbyListingGoodsDetail.Limitdown = utils.IntToFloat64(int(quoteDays[0].Limitdown), int(hsbyListingGoodsDetail.Decimalplace))
  230. }
  231. }
  232. // 计算价格最小变动单位
  233. stepValue := float64(hsbyListingGoodsDetail.Quoteminunit) * math.Pow(0.1, float64(hsbyListingGoodsDetail.Decimalplace))
  234. hsbyListingGoodsDetail.StepValue, _ = strconv.ParseFloat(utils.FormatFloat(stepValue, int(hsbyListingGoodsDetail.Decimalplace)), 64)
  235. // 计算手数最小变动单位
  236. hsbyListingGoodsDetail.LotSize = 1
  237. return &hsbyListingGoodsDetail, nil
  238. }
  239. // HsbyGoodsOrderDetail 二级市场挂牌商品当前可摘委托单信息
  240. type HsbyGoodsOrderDetail struct {
  241. Orderid string `json:"orderid" xorm:"'ORDERID'" binding:"required"` // 委托单号(100+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  242. Buyorsell int32 `json:"buyorsell" xorm:"'BUYORSELL'" binding:"required"` // 买卖 - 0:买 1:卖
  243. Ordertime time.Time `json:"ordertime" xorm:"'ORDERTIME'" binding:"required"` // 委托时间
  244. Orderprice float64 `json:"orderprice" xorm:"'ORDERPRICE'"` // 委托价格
  245. Enableqty int64 `json:"enableqty" xorm:"ENABLEQTY"` // 可用数量
  246. Customername string `json:"customername" xorm:"'CUSTOMERNAME'"` // 客户名称(企业名称),已脱敏
  247. Currencysign string `json:"currencysign" xorm:"-"` // 货币符号
  248. Goodunit string `json:"goodunit" xorm:"-"` // 报价单位
  249. }
  250. // GetHsbyGoodsOrderDetails 获取二级市场(挂牌点选)商品对应的挂牌委托单信息
  251. // 输入 goodsID int 商品ID
  252. // 输入 buyOrSell int 挂牌委托单方向(对手单方向),0:买 1:卖
  253. // 输入 price float64 参考价格。买方向委托单则价格小于等于(站在摘牌人的角度);卖方向委托单则价格大于等于
  254. // 输出 []HsbyGoodsOrderDetail 商品对应的挂牌委托单信息
  255. // 输出 error error
  256. func GetHsbyGoodsOrderDetails(goodsID, buyOrSell int, price float64, accountIDs string) ([]HsbyGoodsOrderDetail, error) {
  257. engine := db.GetEngine()
  258. // 获取与目标商品相关的挂牌委托单信息(ListingSelectType = 1 or 3; OrderStatus =3 or 7)
  259. hsbyGoodsOrderDetails := make([]HsbyGoodsOrderDetail, 0)
  260. session := engine.Table("TRADE_ORDERDETAIL").
  261. 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,
  262. substr(USERINFO.CUSTOMERNAME,0,1)||'****' as CUSTOMERNAME`).
  263. Join("LEFT", "TAACCOUNT", "TAACCOUNT.ACCOUNTID = TRADE_ORDERDETAIL.ACCOUNTID").
  264. Join("LEFT", "USERINFO", "USERINFO.USERID = TAACCOUNT.RELATEDUSERID").
  265. Where("(TRADE_ORDERDETAIL.LISTINGSELECTTYPE = 1 or TRADE_ORDERDETAIL.LISTINGSELECTTYPE = 3) and (TRADE_ORDERDETAIL.ORDERSTATUS = 3 or TRADE_ORDERDETAIL.ORDERSTATUS = 7)").
  266. And("TRADE_ORDERDETAIL.GOODSID = ?", goodsID).
  267. And("TRADE_ORDERDETAIL.BUYORSELL = ?", buyOrSell)
  268. if len(accountIDs) > 0 {
  269. session = session.And(fmt.Sprintf("TRADE_ORDERDETAIL.ACCOUNTID not in (%s)", accountIDs))
  270. }
  271. if price > 0 {
  272. if buyOrSell == 0 {
  273. // 对手单买方向委托单则价格大于等于(站在摘牌人的角度,摘牌方面是卖,我的闲置下单)
  274. session = session.And("TRADE_ORDERDETAIL.ORDERPRICE >= ?", price)
  275. } else {
  276. // 对手单卖方向委托单则价格小于等于(站在摘牌人的角度,摘牌方面是买,热门商品下单)
  277. session = session.And("TRADE_ORDERDETAIL.ORDERPRICE <= ?", price)
  278. }
  279. }
  280. if err := session.Find(&hsbyGoodsOrderDetails); err != nil {
  281. return nil, err
  282. }
  283. // 获取商品货币符号和报价单位
  284. goods, err := GetGoods(goodsID)
  285. if err != nil {
  286. return nil, err
  287. }
  288. currencyEnums, err := GetEnumDicItem("currency", int(goods.Currencyid))
  289. if err != nil {
  290. return nil, err
  291. }
  292. currencysign := ""
  293. if len(currencyEnums) > 0 {
  294. currencysign = currencyEnums[0].Param2
  295. }
  296. goodsUnitEnums, err := GetEnumDicItem("goodsunit", int(goods.Goodunitid))
  297. if err != nil {
  298. return nil, err
  299. }
  300. goodsUnit := ""
  301. if len(goodsUnitEnums) > 0 {
  302. goodsUnit = goodsUnitEnums[0].Enumdicname
  303. }
  304. for i := range hsbyGoodsOrderDetails {
  305. orderDetail := &hsbyGoodsOrderDetails[i]
  306. // 设置货币符号和报价单位
  307. orderDetail.Currencysign = currencysign
  308. orderDetail.Goodunit = goodsUnit
  309. }
  310. return hsbyGoodsOrderDetails, nil
  311. }
  312. // HybsMyBuyOrderDetail 我的订单(一二级市场的买方向委托单)
  313. type HybsMyBuyOrderDetail struct {
  314. Orderid string `json:"orderid" xorm:"'ORDERID'" binding:"required"` // 委托单号(100+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  315. Marketid int32 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 市场ID
  316. Goodsid int32 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID
  317. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'" binding:"required"` // 账户ID[报价币种]
  318. Buyorsell int32 `json:"buyorsell" xorm:"'BUYORSELL'" binding:"required"` // 买卖 - 0:买 1:卖
  319. Orderprice float64 `json:"orderprice" xorm:"'ORDERPRICE'"` // 委托价格
  320. Orderqty int64 `json:"orderqty" xorm:"'ORDERQTY'" binding:"required"` // 委托数量
  321. Tradeqty int64 `json:"tradeqty" xorm:"'TRADEQTY'"` // 成交数量
  322. Cancelqty int64 `json:"cancelqty" xorm:"'CANCELQTY'"` // 撤单数量
  323. Ordertime time.Time `json:"ordertime" xorm:"'ORDERTIME'" binding:"required"` // 委托时间
  324. Listingselecttype int32 `json:"listingselecttype" xorm:"'LISTINGSELECTTYPE'"` // 挂牌点选类型 - 1:挂牌 2:摘牌 3:先摘后挂
  325. Orderstatus int32 `json:"orderstatus" xorm:"'ORDERSTATUS'"` // 委托状态 - 1: 委托请求 2:待冻结 3:委托成功 4: 委托失败 5:配对成功 6: 已撤销 7:部分成交 8:已成交 9:部成部撤 10:成交失败 11:已拒绝 12:经过摘牌(先摘后挂专用-先摘后挂已摘过) 13:冻结成功(通道交易专用) 14:通道已撤 15:通道部成部撤 16:成交失败违约(荷兰式竞拍专用)
  326. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  327. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  328. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  329. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  330. Picurls1 string `json:"picurls1" xorm:"'PICURLS1'"` // 预售商品介绍图片[多张用逗号分隔]
  331. Picurls2 string `json:"picurls2" xorm:"'PICURLS2'"` // 挂牌商品介绍图片[多张用逗号分隔]
  332. Trademode uint32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  333. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  334. Vendorname1 string `json:"vendorname1" xorm:"'VENDORNAME1'"` // 预售商品供应商名称
  335. Vendorname2 string `json:"vendorname2" xorm:"'VENDORNAME2'"` // 挂牌商品供应商名称
  336. MyBuyStatus int `json:"mybuystatus" xorm:"-"` // "我的订单"显示状态- 1:抢购中 2:求购中 3:已完成 4:已撤消 5:委托失败
  337. Orderamount float64 `json:"orderamount" xorm:"-"` // 委托金额
  338. }
  339. // GetHsbyBuyMyOrderDetails 获取“我的订单”数据(包括一二级市场)
  340. // 输入 accountIDs string 资金账户列表
  341. // 输入 myBuyStatus int "我的订单"状态, 1:抢购中 2:求购中 3:已完成
  342. // 输出 []HybsMyBuyOrderDetail “我的订单”数据
  343. // 输出 error error
  344. func GetHsbyBuyMyOrderDetails(accountIDs string, myBuyStatus int) ([]HybsMyBuyOrderDetail, error) {
  345. // 获取市场信息
  346. markets, err := GetMarkets()
  347. if err != nil {
  348. return nil, err
  349. }
  350. engine := db.GetEngine()
  351. // 委托状态
  352. orderStatus := "0" // 单据状态,为0的时候查询全部
  353. marketIDs := "" // 我的订单包括一二级市场的单据
  354. switch myBuyStatus {
  355. case 1: // 抢购中 (一级市场)
  356. // 获取市场ID
  357. for _, v := range markets {
  358. if v.Trademode == 71 { // 预售挂牌
  359. if len(marketIDs) == 0 {
  360. marketIDs = strconv.Itoa(int(v.Marketid))
  361. } else {
  362. marketIDs += "," + strconv.Itoa(int(v.Marketid))
  363. }
  364. }
  365. }
  366. orderStatus = "3,7"
  367. case 2: // 求购中(二级市场)
  368. // 获取市场ID
  369. for _, v := range markets {
  370. if v.Trademode == 16 { // 挂牌点选
  371. if len(marketIDs) == 0 {
  372. marketIDs = strconv.Itoa(int(v.Marketid))
  373. } else {
  374. marketIDs += "," + strconv.Itoa(int(v.Marketid))
  375. }
  376. }
  377. }
  378. orderStatus = "3,7"
  379. case 3: // 已完成
  380. orderStatus = "8,9"
  381. }
  382. // 默认取 TradeMode = 16 or 71 的市场
  383. if len(marketIDs) == 0 {
  384. for _, v := range markets {
  385. if v.Trademode == 16 || v.Trademode == 71 {
  386. if len(marketIDs) == 0 {
  387. marketIDs = strconv.Itoa(int(v.Marketid))
  388. } else {
  389. marketIDs += "," + strconv.Itoa(int(v.Marketid))
  390. }
  391. }
  392. }
  393. }
  394. hybsMyBuyOrderDetails := make([]HybsMyBuyOrderDetail, 0)
  395. // "我的订单"都是买委托
  396. session := engine.Table("TRADE_ORDERDETAIL").
  397. Select(`to_char(TRADE_ORDERDETAIL.ORDERID) ORDERID, TRADE_ORDERDETAIL.*,
  398. GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE, GOODS.AGREEUNIT,
  399. HG1.PICURLS PICURLS1,
  400. HG2.PICURLS PICURLS2,
  401. MARKET.TRADEMODE,
  402. ENUMDICITEM.PARAM2 CURRENCYSIGN,
  403. HS1.VENDORNAME VENDORNAME1,
  404. HS2.VENDORNAME VENDORNAME2`).
  405. Join("LEFT", "GOODS", "GOODS.GOODSID = TRADE_ORDERDETAIL.GOODSID").
  406. Join("LEFT", "CPTRADE_PRESALEGOODSEX", "CPTRADE_PRESALEGOODSEX.GOODSID = TRADE_ORDERDETAIL.GOODSID").
  407. Join("LEFT", "HSBY_GOODSEX HG1", "HG1.GOODSID = CPTRADE_PRESALEGOODSEX.RELATEDGOODSID").
  408. Join("LEFT", "HSBY_GOODSEX HG2", "HG2.GOODSID = GOODS.GOODSID").
  409. Join("LEFT", "ENUMDICITEM", "GOODS.CURRENCYID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'currency'").
  410. Join("LEFT", "MARKET", "MARKET.MARKETID = TRADE_ORDERDETAIL.MARKETID").
  411. Join("LEFT", "HSBY_SUPPLIERINFO HS1", "HS1.VENDORID = HG1.VENDORID").
  412. Join("LEFT", "HSBY_SUPPLIERINFO HS2", "HS2.VENDORID = HG2.VENDORID").
  413. Where(fmt.Sprintf("TRADE_ORDERDETAIL.BUYORSELL = 0 and TRADE_ORDERDETAIL.ACCOUNTID in (%s)", accountIDs)).
  414. And(fmt.Sprintf("TRADE_ORDERDETAIL.MARKETID in (%s)", marketIDs))
  415. // 是否过滤状态(抢购中、求购中、已完成)
  416. if orderStatus != "0" {
  417. session = session.And(fmt.Sprintf("TRADE_ORDERDETAIL.ORDERSTATUS in (%s)", orderStatus))
  418. }
  419. if err := session.Find(&hybsMyBuyOrderDetails); err != nil {
  420. return nil, err
  421. }
  422. // 设置“我的订单”显示状态
  423. for i := range hybsMyBuyOrderDetails {
  424. detail := &hybsMyBuyOrderDetails[i]
  425. // 委托金额 = 委托价格 * 委托数量 * 合约单位
  426. detail.Orderamount = detail.Orderprice * float64(detail.Orderqty) * float64(detail.Agreeunit)
  427. if detail.Trademode == 71 && (detail.Orderstatus == 3 || detail.Orderstatus == 7) {
  428. // 抢购中
  429. detail.MyBuyStatus = 1
  430. } else if detail.Trademode == 16 && (detail.Orderstatus == 3 || detail.Orderstatus == 7) {
  431. // 求购中
  432. detail.MyBuyStatus = 2
  433. } else if detail.Orderstatus == 8 || detail.Orderstatus == 9 {
  434. // 已完成
  435. detail.MyBuyStatus = 3
  436. } else if detail.Orderstatus == 6 {
  437. // 已撤销
  438. detail.MyBuyStatus = 4
  439. } else if detail.Orderstatus == 4 {
  440. // 委托失败
  441. detail.MyBuyStatus = 5
  442. }
  443. }
  444. return hybsMyBuyOrderDetails, nil
  445. }
  446. // HsbyMyGoods 我的商品(买方向持仓)
  447. type HsbyMyGoods struct {
  448. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'" binding:"required"` // 账号Id
  449. Goodsid int32 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品Id
  450. Buycurpositionqty int64 `json:"buycurpositionqty" xorm:"'BUYCURPOSITIONQTY'"` // 买当前持仓总数量
  451. Buycurholderamount float64 `json:"buycurholderamount" xorm:"'BUYCURHOLDERAMOUNT'"` // 买当前持仓总金额[商品币种]
  452. EnableQty int64 `json:"enableqty" xorm:"'ENABLEQTY'"` // 可用数量
  453. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  454. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  455. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  456. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  457. Goodsstatus int64 `json:"goodsstatus" xorm:"'GOODSSTATUS'"` // 商品状态- 1:待审核 2:未上市 3:上市 4:已注销 5:审核拒绝 6:退市 7:待退市
  458. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
  459. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  460. Buyaverageprice float64 `json:"buyaverageprice" xorm:"-"` // 持仓均价
  461. }
  462. // GetHsbyMyGoods 获取“我的商品”信息
  463. // 输入 accountIDs string 资金账户列表,格式 1,2,3
  464. // 输出 []HsbyMyGoods “我的商品”信息
  465. // 输入 error error
  466. func GetHsbyMyGoods(accountIDs string) ([]HsbyMyGoods, error) {
  467. engine := db.GetEngine()
  468. hsbyMyGoodses := make([]HsbyMyGoods, 0)
  469. // 此定制版本,只查询出当前手数(期末)大于0的数据 (TRADEPOSITION.BUYCURPOSITIONQTY > 0)
  470. if err := engine.Table("TRADEPOSITION").
  471. Select(`TRADEPOSITION.*, (TRADEPOSITION.BUYCURPOSITIONQTY - TRADEPOSITION.BUYFROZENQTY - TRADEPOSITION.BUYOTHERFROZENQTY) ENABLEQTY,
  472. GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE, GOODS.AGREEUNIT, GOODS.GOODSSTATUS,
  473. HSBY_GOODSEX.PICURLS,
  474. ENUMDICITEM.PARAM2 CURRENCYSIGN`).
  475. Join("LEFT", "GOODS", "GOODS.GOODSID = TRADEPOSITION.GOODSID").
  476. Join("INNER", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = GOODS.GOODSID").
  477. Join("LEFT", "ENUMDICITEM", "GOODS.CURRENCYID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'currency'").
  478. Where(fmt.Sprintf("TRADEPOSITION.BUYCURPOSITIONQTY > 0 and TRADEPOSITION.ACCOUNTID in (%s)", accountIDs)).Find(&hsbyMyGoodses); err != nil {
  479. return nil, err
  480. }
  481. for i := range hsbyMyGoodses {
  482. myGoods := &hsbyMyGoodses[i]
  483. // 持仓均价
  484. averagePrice := myGoods.Buycurholderamount / float64(myGoods.Buycurpositionqty) / myGoods.Agreeunit
  485. myGoods.Buyaverageprice, _ = strconv.ParseFloat(utils.FormatFloat(averagePrice, int(myGoods.Decimalplace)), 64)
  486. }
  487. return hsbyMyGoodses, nil
  488. }
  489. // HsbyPreGoods 新品上市商品(一级市场产能预售)
  490. type HsbyPreGoods struct {
  491. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID(自增ID SEQ_GOODS)
  492. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  493. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  494. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  495. Marketid int64 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 所属市场ID
  496. Goodsstatus int64 `json:"goodsstatus" xorm:"'GOODSSTATUS'"` // 商品状态- 2:未上市 3:上市
  497. Quoteminunit int64 `json:"quoteminunit" xorm:"'QUOTEMINUNIT'"` // 行情最小变动单位 [整数,报价小数位一起使用]
  498. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  499. Listingdate time.Time `json:"listingdate" xorm:"'LISTINGDATE'"` // 交易开始日期
  500. Lasttradedate time.Time `json:"lasttradedate" xorm:"'LASTTRADEDATE'"` // 最后交易日期(状态:待退市)
  501. Relatedgoodsid int64 `json:"relatedgoodsid" xorm:"'RELATEDGOODSID'"` // 关联交易合约ID
  502. Presaleqty int64 `json:"presaleqty" xorm:"'PRESALEQTY'"` // 预售数量
  503. Refprice float64 `json:"refprice" xorm:"'REFPRICE'"` // 参考价格[一口价]
  504. Presaledqty int64 `json:"presaledqty" xorm:"'PRESALEDQTY'"` // 已预售量(预售结束时更新)
  505. EnableQty int64 `json:"enableqty" xorm:"ENABLEQTY"` // 剩余数量
  506. Currency string `json:"currency" xorm:"'CURRENCY'"` // 货币
  507. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  508. Videourls string `json:"videourls" xorm:"'VIDEOURLS'"` // 介绍视频[多张用逗号分隔]
  509. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
  510. Trademode int32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  511. }
  512. // GetHsbyPreGoodses 获取“新品上市”商品列表(一级市场产能预售)
  513. // 输入 marketIDs string 市场ID列表,格式 1,2,3
  514. // 输入 descProvinceID int 省ID
  515. // 输入 descCityID int 市ID
  516. // 输出 []HsbyPreGoods “新品上市”商品列表
  517. // 输出 error error
  518. func GetHsbyPreGoodses(marketIDs string, descProvinceID, descCityID int) ([]HsbyPreGoods, error) {
  519. engine := db.GetEngine()
  520. // 注意:一级产能预售市场使用的商品实际上是和二级市场有关系的,所以要使用 CPTRADE_PRESALEGOODSEX.RELATEDGOODSID 进行关联
  521. // 注意:CPTRADE_PRESALEGOODSEX 表的开始与结束时间是给大宗用的
  522. preGoodses := make([]HsbyPreGoods, 0)
  523. session := engine.Table("GOODS").
  524. Select(`GOODS.*,
  525. CPTRADE_PRESALEGOODSEX.RELATEDGOODSID, CPTRADE_PRESALEGOODSEX.PRESALEQTY, CPTRADE_PRESALEGOODSEX.REFPRICE,
  526. CPTRADE_PRESALEGOODSEX.PRESALEDQTY, (CPTRADE_PRESALEGOODSEX.PRESALEQTY - CPTRADE_PRESALEGOODSEX.PRESALEDQTY) ENABLEQTY,
  527. ENUMDICITEM.ENUMDICNAME CURRENCY, ENUMDICITEM.PARAM2 CURRENCYSIGN,
  528. HSBY_GOODSEX.VIDEOURLS, HSBY_GOODSEX.PICURLS,
  529. MARKET.TRADEMODE`).
  530. Join("INNER", "CPTRADE_PRESALEGOODSEX", "CPTRADE_PRESALEGOODSEX.GOODSID = GOODS.GOODSID").
  531. Join("LEFT", "ENUMDICITEM", "ENUMDICITEM.ENUMITEMNAME = GOODS.CURRENCYID and ENUMDICITEM.ENUMDICCODE = 'currency'").
  532. Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = CPTRADE_PRESALEGOODSEX.RELATEDGOODSID").
  533. Join("LEFT", "MARKET", "MARKET.MARKETID = GOODS.MARKETID").
  534. Where(fmt.Sprintf("GOODS.GOODSSTATUS in (2,3) and GOODS.MARKETID in (%s)", marketIDs)) // 一级市场获取 2:未上市 3:上市 状态的商品
  535. if descProvinceID > 0 {
  536. session = session.And("HSBY_GOODSEX.DESCPROVINCEID = ?", descProvinceID)
  537. }
  538. if descCityID > 0 {
  539. session = session.And("HSBY_GOODSEX.DESCCITYID = ?", descCityID)
  540. }
  541. if err := session.Find(&preGoodses); err != nil {
  542. return nil, err
  543. }
  544. // for i := range preGoodses {
  545. // preGoods := &preGoodses[i]
  546. // // FIXME: - 这里应该使用 Duck Typing,后期再处理
  547. // // 计算最小变动单位
  548. // lotSize := float64(preGoods.Quoteminunit) * math.Pow(0.1, float64(preGoods.Decimalplace))
  549. // preGoods.LotSize, _ = strconv.ParseFloat(utils.FormatFloat(lotSize, int(preGoods.Decimalplace)), 64)
  550. // }
  551. return preGoodses, nil
  552. }
  553. // HsbyPreGoodsDetail 一级市场(产能预售)商品信息详情
  554. type HsbyPreGoodsDetail struct {
  555. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID(自增ID SEQ_GOODS)
  556. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  557. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  558. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  559. Marketid int64 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 所属市场ID
  560. Goodsstatus int64 `json:"goodsstatus" xorm:"'GOODSSTATUS'"` // 商品状态- 2:未上市 3:上市
  561. Quoteminunit int64 `json:"quoteminunit" xorm:"'QUOTEMINUNIT'"` // 行情最小变动单位 [整数,报价小数位一起使用]
  562. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  563. Listingdate time.Time `json:"listingdate" xorm:"'LISTINGDATE'"` // 交易开始日期
  564. Lasttradedate time.Time `json:"lasttradedate" xorm:"'LASTTRADEDATE'"` // 最后交易日期(状态:待退市)
  565. Relatedgoodsid int64 `json:"relatedgoodsid" xorm:"'RELATEDGOODSID'"` // 关联交易合约ID
  566. Presaleqty int64 `json:"presaleqty" xorm:"'PRESALEQTY'"` // 预售数量
  567. Refprice float64 `json:"refprice" xorm:"'REFPRICE'"` // 参考价格[一口价]
  568. Presaledqty int64 `json:"presaledqty" xorm:"'PRESALEDQTY'"` // 已预售量(预售结束时更新)
  569. EnableQty int64 `json:"enableqty" xorm:"ENABLEQTY"` // 剩余数量
  570. Videourls string `json:"videourls" xorm:"'VIDEOURLS'"` // 介绍视频[多张用逗号分隔]
  571. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
  572. Descprovinceid int64 `json:"descprovinceid" xorm:"'DESCPROVINCEID'"` // 目的地(省)ID
  573. Desccityid int64 `json:"desccityid" xorm:"'DESCCITYID'"` // 目的地(市)ID
  574. Goodsdesc string `json:"goodsdesc" xorm:"'GOODSDESC'"` // 商品详情
  575. Currency string `json:"currency" xorm:"'CURRENCY'"` // 货币
  576. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  577. Goodunit string `json:"goodunit" xorm:"GOODUNIT"` // 报价单位
  578. Vendorname string `json:"vendorname" xorm:"'VENDORNAME'"` // 供应商名称
  579. Vendorphone string `json:"vendorphone" xorm:"'VENDORPHONE'"` // 供应商客服电话
  580. Vendorattr string `json:"vendorattr" xorm:"'VENDORATTR'"` // 供应商附件(多张,逗号分隔)
  581. Trademode int32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  582. Customername string `json:"customername" xorm:"'CUSTOMERNAME'"` // 发行单位
  583. StepValue float64 `json:"stepvalue" xorm:"-"` // 价格最小变动单位
  584. LotSize int `json:"lotsize" xorm:"-"` // 手数最小变动单位
  585. Buymaxqty int `json:"buymaxqty" xorm:"'-'"` // 购买上限 [71] - 0为不限
  586. }
  587. // GetHsbyPreGoodsDetail 获取一级市场(产能预售)商品信息详情
  588. // 参数 goodsID int 目标商品ID
  589. // 返回 *HsbyListingGoodsDetail 二级市场(挂牌点选)商品信息详情,查询无结果返回nil
  590. // 返回 error error
  591. func GetHsbyPreGoodsDetail(goodsID, accountID int) (*HsbyPreGoodsDetail, error) {
  592. engine := db.GetEngine()
  593. details := make([]HsbyPreGoodsDetail, 0)
  594. // 获取挂牌商品信息,以及扩展表信息
  595. // FIXME: - 这里使用Get方法,会造成SQL语句的嵌套出错,后期再研究
  596. session := engine.Table("GOODS").
  597. Select(`GOODS.*,
  598. CPTRADE_PRESALEGOODSEX.RELATEDGOODSID, CPTRADE_PRESALEGOODSEX.PRESALEQTY, CPTRADE_PRESALEGOODSEX.REFPRICE,
  599. CPTRADE_PRESALEGOODSEX.PRESALEDQTY, (CPTRADE_PRESALEGOODSEX.PRESALEQTY - CPTRADE_PRESALEGOODSEX.PRESALEDQTY) ENABLEQTY,
  600. HSBY_GOODSEX.VIDEOURLS, HSBY_GOODSEX.PICURLS, HSBY_GOODSEX.DESCPROVINCEID, HSBY_GOODSEX.Desccityid, HSBY_GOODSEX.Goodsdesc,
  601. ENUMDICITEM.ENUMDICNAME CURRENCY, ENUMDICITEM.PARAM2 CURRENCYSIGN,
  602. E1.ENUMDICNAME GOODUNIT,
  603. HSBY_SUPPLIERINFO.VENDORNAME, HSBY_SUPPLIERINFO.VENDORPHONE, HSBY_SUPPLIERINFO.VENDORATTR,
  604. MARKET.TRADEMODE,
  605. USERINFO.CUSTOMERNAME`).
  606. Join("INNER", "CPTRADE_PRESALEGOODSEX", "CPTRADE_PRESALEGOODSEX.GOODSID = GOODS.GOODSID").
  607. Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = CPTRADE_PRESALEGOODSEX.RELATEDGOODSID").
  608. Join("LEFT", "ENUMDICITEM", "ENUMDICITEM.ENUMITEMNAME = GOODS.CURRENCYID and ENUMDICITEM.ENUMDICCODE = 'currency'").
  609. Join("LEFT", "ENUMDICITEM E1", "E1.ENUMITEMNAME = GOODS.GOODUNITID and E1.ENUMDICCODE = 'goodsunit'").
  610. Join("LEFT", "HSBY_SUPPLIERINFO", "HSBY_SUPPLIERINFO.VENDORID = HSBY_GOODSEX.VENDORID").
  611. Join("LEFT", "MARKET", "MARKET.MARKETID = GOODS.MARKETID").
  612. Join("LEFT", "USERINFO", "USERINFO.USERID = CPTRADE_PRESALEGOODSEX.USERID").
  613. Where("GOODS.GOODSID = ?", goodsID)
  614. if err := session.Find(&details); err != nil {
  615. return nil, err
  616. }
  617. // 无目标商品
  618. if len(details) == 0 {
  619. return nil, nil
  620. }
  621. preGoodsDetail := details[0]
  622. // FIXME: - 这里应该使用 Duck Typing,后期再处理
  623. // 计算价格最小变动单位
  624. stepValue := float64(preGoodsDetail.Quoteminunit) * math.Pow(0.1, float64(preGoodsDetail.Decimalplace))
  625. preGoodsDetail.StepValue, _ = strconv.ParseFloat(utils.FormatFloat(stepValue, int(preGoodsDetail.Decimalplace)), 64)
  626. // 计算手数最小变动单位,一级市场固定为1
  627. preGoodsDetail.LotSize = 1
  628. // 获取购买上限
  629. if accountID != 0 {
  630. buyMaxQty, err := GetCPTradeBuyLimit(goodsID, accountID)
  631. if err != nil {
  632. return nil, err
  633. }
  634. preGoodsDetail.Buymaxqty = buyMaxQty
  635. }
  636. return &preGoodsDetail, nil
  637. }
  638. // HsbySellMyDetail "我的闲置"单据信息(发布中 - 二级市场卖挂,3:委托成功、7:部分成交; 已完成 - 二级市场成交单,包括历史数据)
  639. type HsbySellMyDetail struct {
  640. Orderid string `json:"orderid" xorm:"'ORDERID'" binding:"required"` // 单号(发布中 - 委托单号;已完成 - 成交单号)
  641. Marketid int32 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 市场ID
  642. Goodsid int32 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID
  643. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'" binding:"required"` // 账户ID[报价币种]
  644. Buyorsell int32 `json:"buyorsell" xorm:"'BUYORSELL'" binding:"required"` // 买卖 - 0:买 1:卖
  645. Price float64 `json:"price" xorm:"'PRICE'"` // 价格
  646. Time time.Time `json:"time" xorm:"'TIME'" binding:"required"` // 时间
  647. Orderqty int64 `json:"orderqty" xorm:"'ORDERQTY'" binding:"required"` // 委托数量
  648. Tradeqty int64 `json:"tradeqty" xorm:"'TRADEQTY'"` // 成交数量
  649. Cancelqty int64 `json:"cancelqty" xorm:"'CANCELQTY'"` // 撤单数量
  650. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  651. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  652. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  653. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  654. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
  655. Trademode uint32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  656. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  657. Vendorname string `json:"vendorname" xorm:"'VENDORNAME'"` // 供应商名称
  658. OrderType int32 `json:"ordertype" xorm:"'ORDERTYPE'"` // 单据类型:0 - 发布中, 1 - 已完成
  659. }
  660. // GetHsbySellMyOrderDetails 获取"我的闲置 - 发布中"单据信息
  661. // 输入 accountIDs string 资金账户列表
  662. // 输出 []HsbySellMyDetail "我的闲置 - 发布中"单据信息
  663. // 输出 error error
  664. func GetHsbySellMyOrderDetails(accountIDs string) ([]HsbySellMyDetail, error) {
  665. // 获取市场信息
  666. markets, err := GetMarkets()
  667. if err != nil {
  668. return nil, err
  669. }
  670. engine := db.GetEngine()
  671. marketIDs := "" // 我的闲置-发布中: 二级市场卖挂牌
  672. // 默认取 TradeMode = 16
  673. for _, v := range markets {
  674. if v.Trademode == 16 {
  675. if len(marketIDs) == 0 {
  676. marketIDs = strconv.Itoa(int(v.Marketid))
  677. } else {
  678. marketIDs += "," + strconv.Itoa(int(v.Marketid))
  679. }
  680. }
  681. }
  682. orderDetails := make([]HsbySellMyDetail, 0)
  683. // “我的闲置 - 发布中”都是卖挂委托
  684. session := engine.Table("TRADE_ORDERDETAIL").
  685. Select(`to_char(TRADE_ORDERDETAIL.ORDERID) ORDERID,
  686. TRADE_ORDERDETAIL.MARKETID, TRADE_ORDERDETAIL.GOODSID, TRADE_ORDERDETAIL.ACCOUNTID, TRADE_ORDERDETAIL.BUYORSELL,
  687. TRADE_ORDERDETAIL.ORDERPRICE PRICE, TRADE_ORDERDETAIL.ORDERTIME TIME,
  688. TRADE_ORDERDETAIL.ORDERQTY, TRADE_ORDERDETAIL.TRADEQTY, TRADE_ORDERDETAIL.CANCELQTY,
  689. GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE, GOODS.AGREEUNIT,
  690. HSBY_GOODSEX.PICURLS,
  691. MARKET.TRADEMODE,
  692. ENUMDICITEM.PARAM2 CURRENCYSIGN,
  693. HSBY_SUPPLIERINFO.VENDORNAME,
  694. 0 ORDERTYPE`).
  695. Join("LEFT", "GOODS", "GOODS.GOODSID = TRADE_ORDERDETAIL.GOODSID").
  696. Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = GOODS.GOODSID").
  697. Join("LEFT", "ENUMDICITEM", "GOODS.CURRENCYID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'currency'").
  698. Join("LEFT", "MARKET", "MARKET.MARKETID = TRADE_ORDERDETAIL.MARKETID").
  699. Join("LEFT", "HSBY_SUPPLIERINFO", "HSBY_SUPPLIERINFO.VENDORID = HSBY_GOODSEX.VENDORID").
  700. Where(fmt.Sprintf(`TRADE_ORDERDETAIL.BUYORSELL = 1 and TRADE_ORDERDETAIL.LISTINGSELECTTYPE = 1 and (TRADE_ORDERDETAIL.ORDERSTATUS = 3 or TRADE_ORDERDETAIL.ORDERSTATUS = 7)
  701. and TRADE_ORDERDETAIL.ACCOUNTID in (%s)`, accountIDs)).
  702. And(fmt.Sprintf("TRADE_ORDERDETAIL.MARKETID in (%s)", marketIDs))
  703. if err := session.Find(&orderDetails); err != nil {
  704. return nil, err
  705. }
  706. return orderDetails, nil
  707. }
  708. // GetHsbySellMyTradeDetails 获取"我的闲置 - 已完成"单据信息
  709. // 输入 accountIDs string 资金账户列表
  710. // 输出 []HsbySellMyDetail "我的闲置 - 已完成"单据信息
  711. // 输出 error error
  712. func GetHsbySellMyTradeDetails(accountIDs string) ([]HsbySellMyDetail, error) {
  713. // 获取市场信息
  714. markets, err := GetMarkets()
  715. if err != nil {
  716. return nil, err
  717. }
  718. engine := db.GetEngine()
  719. marketIDs := "" // 我的闲置-发布中: 二级市场卖方向成交单(包括历史成交单)
  720. // 默认取 TradeMode = 16
  721. for _, v := range markets {
  722. if v.Trademode == 16 {
  723. if len(marketIDs) == 0 {
  724. marketIDs = strconv.Itoa(int(v.Marketid))
  725. } else {
  726. marketIDs += "," + strconv.Itoa(int(v.Marketid))
  727. }
  728. }
  729. }
  730. orders := make([]HsbySellMyDetail, 0)
  731. // 当前成交单
  732. curOrders := make([]HsbySellMyDetail, 0)
  733. if err := engine.Table("TRADE_TRADEDETAIL").
  734. Select(`to_char(TRADE_TRADEDETAIL.TRADEID) ORDERID,
  735. TRADE_TRADEDETAIL.MARKETID, TRADE_TRADEDETAIL.GOODSID, TRADE_TRADEDETAIL.ACCOUNTID, TRADE_TRADEDETAIL.BUYORSELL,
  736. TRADE_TRADEDETAIL.TRADEPRICE PRICE, TRADE_TRADEDETAIL.TRADEQTY QTY, TRADE_TRADEDETAIL.TRADETIME TIME, TRADE_TRADEDETAIL.TRADEAMOUNT AMOUNT,
  737. GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE, GOODS.AGREEUNIT,
  738. HSBY_GOODSEX.PICURLS,
  739. MARKET.TRADEMODE,
  740. ENUMDICITEM.PARAM2 CURRENCYSIGN,
  741. HSBY_SUPPLIERINFO.VENDORNAME,
  742. 1 ORDERTYPE`).
  743. Join("LEFT", "GOODS", "GOODS.GOODSID = TRADE_TRADEDETAIL.GOODSID").
  744. Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = GOODS.GOODSID").
  745. Join("LEFT", "ENUMDICITEM", "GOODS.CURRENCYID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'currency'").
  746. Join("LEFT", "MARKET", "MARKET.MARKETID = TRADE_TRADEDETAIL.MARKETID").
  747. Join("LEFT", "HSBY_SUPPLIERINFO", "HSBY_SUPPLIERINFO.VENDORID = HSBY_GOODSEX.VENDORID").
  748. Where(fmt.Sprintf(`TRADE_TRADEDETAIL.BUYORSELL = 1
  749. and TRADE_TRADEDETAIL.ACCOUNTID in (%s)`, accountIDs)).
  750. And(fmt.Sprintf("TRADE_TRADEDETAIL.MARKETID in (%s)", marketIDs)).Find(&curOrders); err != nil {
  751. return nil, err
  752. }
  753. if len(curOrders) > 0 {
  754. orders = append(orders, curOrders...)
  755. }
  756. // 历史成交单
  757. hisOrders := make([]HsbySellMyDetail, 0)
  758. if err := engine.Table("HIS_TRADE_TRADEDETAIL").
  759. Select(`to_char(HIS_TRADE_TRADEDETAIL.TRADEID) ORDERID,
  760. HIS_TRADE_TRADEDETAIL.MARKETID, HIS_TRADE_TRADEDETAIL.GOODSID, HIS_TRADE_TRADEDETAIL.ACCOUNTID, HIS_TRADE_TRADEDETAIL.BUYORSELL,
  761. HIS_TRADE_TRADEDETAIL.TRADEPRICE PRICE, HIS_TRADE_TRADEDETAIL.TRADEQTY QTY, HIS_TRADE_TRADEDETAIL.TRADETIME TIME, HIS_TRADE_TRADEDETAIL.TRADEAMOUNT AMOUNT,
  762. GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE, GOODS.AGREEUNIT,
  763. HSBY_GOODSEX.PICURLS,
  764. MARKET.TRADEMODE,
  765. ENUMDICITEM.PARAM2 CURRENCYSIGN,
  766. HSBY_SUPPLIERINFO.VENDORNAME,
  767. 1 ORDERTYPE`).
  768. Join("LEFT", "GOODS", "GOODS.GOODSID = HIS_TRADE_TRADEDETAIL.GOODSID").
  769. Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = GOODS.GOODSID").
  770. Join("LEFT", "ENUMDICITEM", "GOODS.CURRENCYID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'currency'").
  771. Join("LEFT", "MARKET", "MARKET.MARKETID = HIS_TRADE_TRADEDETAIL.MARKETID").
  772. Join("LEFT", "HSBY_SUPPLIERINFO", "HSBY_SUPPLIERINFO.VENDORID = HSBY_GOODSEX.VENDORID").
  773. Where(fmt.Sprintf(`HIS_TRADE_TRADEDETAIL.BUYORSELL = 1 and HIS_TRADE_TRADEDETAIL.ISVALIDDATA = 1
  774. and HIS_TRADE_TRADEDETAIL.ACCOUNTID in (%s)`, accountIDs)).
  775. And(fmt.Sprintf("HIS_TRADE_TRADEDETAIL.MARKETID in (%s)", marketIDs)).Find(&hisOrders); err != nil {
  776. return nil, err
  777. }
  778. if len(hisOrders) > 0 {
  779. orders = append(orders, hisOrders...)
  780. }
  781. return orders, nil
  782. }
  783. // HsbyMyPackage 我的包裹信息
  784. type HsbyMyPackage struct {
  785. Takeorderid string `json:"takeorderid" xorm:"'TAKEORDERID'" binding:"required"` // 提货单号(905+Unix秒时间戳(10位)+xxxxxx)
  786. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'"` // 账户ID
  787. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'"` // 商品ID
  788. Userid int64 `json:"userid" xorm:"'USERID'"` // 用户ID
  789. Qty float64 `json:"qty" xorm:"'QTY'"` // 提货数量
  790. Reqtime time.Time `json:"reqtime" xorm:"'REQTIME'"` // 更新时间
  791. Recivername string `json:"recivername" xorm:"'RECIVERNAME'"` // 提货人姓名
  792. Cardtypeid int32 `json:"cardtypeid" xorm:"'CARDTYPEID'"` // 提货人证件类型
  793. Cardnum string `json:"cardnum" xorm:"'CARDNUM'"` // 提货人证件号码
  794. Phonenum string `json:"phonenum" xorm:"'PHONENUM'"` // 提货人联系方式
  795. Takemode int32 `json:"takemode" xorm:"'TAKEMODE'"` // 提货方式 - 2:自提 3:配送
  796. Address string `json:"address" xorm:"'ADDRESS'"` // 提货人详细地址
  797. Takeremark string `json:"takeremark" xorm:"'TAKEREMARK'"` // 提货备注
  798. Takeorderstatus int32 `json:"takeorderstatus" xorm:"'TAKEORDERSTATUS'"` // 提货状态 - 1:待发货 2:已发货 3:已收货
  799. Auditer int32 `json:"auditer" xorm:"'AUDITER'"` // 审核人
  800. Audittime time.Time `json:"audittime" xorm:"'AUDITTIME'"` // 审核时间
  801. Checkremark string `json:"checkremark" xorm:"'CHECKREMARK'"` // 审核备注
  802. Tradedate string `json:"tradedate" xorm:"'TRADEDATE'"` // 交易日(yyyyMMdd)
  803. Marketid int32 `json:"marketid" xorm:"'MARKETID'"` // 市场ID
  804. Handlestatus int32 `json:"handlestatus" xorm:"'HANDLESTATUS'"` // 处理状态
  805. Amount float64 `json:"amount" xorm:"'AMOUNT'"` // 提货金额
  806. Averageprice float64 `json:"averageprice" xorm:"'AVERAGEPRICE'"` // 均价
  807. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  808. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  809. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  810. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  811. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
  812. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  813. Vendorname string `json:"vendorname" xorm:"'VENDORNAME'"` // 供应商名称
  814. }
  815. // GetHsbyMyPackages 获取我的包裹信息
  816. // 输入 accountIDs string 资金账户列表
  817. // 输入 takeOrderStatus int 提货状态 - 1:待发货 2:已发货 3:已收货
  818. // 输出 []HsbyMyPackage 我的包裹信息
  819. // 输出 error error
  820. func GetHsbyMyPackages(accountIDs string, takeOrderStatus int) ([]HsbyMyPackage, error) {
  821. engine := db.GetEngine()
  822. myPackages := make([]HsbyMyPackage, 0)
  823. session := engine.Table("TRADE_GOODSPICKUP").
  824. Select(`to_char(TRADE_GOODSPICKUP.TAKEORDERID) TAKEORDERID, (DIVISION.PATHNAME || TRADE_GOODSPICKUP.ADDRESS) ADDRESS, TRADE_GOODSPICKUP.*,
  825. (TRADE_GOODSPICKUP.AMOUNT/TRADE_GOODSPICKUP.QTY/GOODS.AGREEUNIT) AVERAGEPRICE,
  826. GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE, GOODS.AGREEUNIT,
  827. HSBY_GOODSEX.PICURLS,
  828. ENUMDICITEM.PARAM2 CURRENCYSIGN,
  829. HSBY_SUPPLIERINFO.VENDORNAME`).
  830. Join("LEFT", "GOODS", "GOODS.GOODSID = TRADE_GOODSPICKUP.GOODSID").
  831. Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = GOODS.GOODSID").
  832. Join("LEFT", "ENUMDICITEM", "GOODS.CURRENCYID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'currency'").
  833. Join("LEFT", "HSBY_SUPPLIERINFO", "HSBY_SUPPLIERINFO.VENDORID = HSBY_GOODSEX.VENDORID").
  834. Join("LEFT", "DIVISION", "DIVISION.AUTOID = TRADE_GOODSPICKUP.DISTRICTID").
  835. Where(fmt.Sprintf("TRADE_GOODSPICKUP.ACCOUNTID in (%s)", accountIDs))
  836. if takeOrderStatus > 0 {
  837. session = session.And("TAKEORDERSTATUS = ?", takeOrderStatus)
  838. }
  839. if err := session.Find(&myPackages); err != nil {
  840. return nil, err
  841. }
  842. // FIXME:- 目前暂时在服务端对手机号码进行解密
  843. key, _ := hex.DecodeString(utils.AESSecretKey)
  844. for i := range myPackages {
  845. myPackage := &myPackages[i]
  846. // 解密手机号码
  847. if phonenum, err := hex.DecodeString(myPackage.Phonenum); err == nil { // hex -> []byte
  848. if mobile, err := utils.AESDecrypt(phonenum, key); err == nil {
  849. myPackage.Phonenum = string(mobile)
  850. }
  851. }
  852. }
  853. return myPackages, nil
  854. }
  855. // SetHsbyMyPackagesStatus 设置我的包裹提货状态
  856. func SetHsbyMyPackagesStatus(takeOrderID string, accountID, status int) error {
  857. engine := db.GetEngine()
  858. sql := fmt.Sprintf("update TRADE_GOODSPICKUP set TAKEORDERSTATUS = %d where TAKEORDERID = %s and ACCOUNTID = %d", status, takeOrderID, accountID)
  859. _, err := engine.Exec(sql)
  860. return err
  861. }
  862. // GetHsbyProvincesAndCities 获取省市信息数组
  863. // 参数 provinceID int 省ID,选填
  864. // 返回 []Division 枚举信息数组
  865. // 返回 error error
  866. func GetHsbyProvincesAndCities(provinceID int) ([]Division, error) {
  867. engine := db.GetEngine()
  868. divisions := make([]Division, 0)
  869. session := engine.Where("DIVISIONLEVEL = 'province' or DIVISIONLEVEL = 'city'").
  870. And(`AUTOID in (
  871. (select DESCPROVINCEID AUTOID from HSBY_GOODSEX inner join GOODS on GOODS.GOODSID = HSBY_GOODSEX.GOODSID and GOODS.GOODSSTATUS in (2,3))
  872. union all
  873. (select DESCCITYID AUTOID from HSBY_GOODSEX inner join GOODS on GOODS.GOODSID = HSBY_GOODSEX.GOODSID and GOODS.GOODSSTATUS in (2,3))
  874. )`)
  875. if provinceID > 0 {
  876. session = session.And("AUTOID = ?", provinceID)
  877. }
  878. if err := session.Find(&divisions); err != nil {
  879. return nil, err
  880. }
  881. return divisions, nil
  882. }
  883. // HsbyBuyMyTradeDetail "我的订单 - 已完成"单据信息(一二级市场成交单,包括历史数据)
  884. type HsbyBuyMyTradeDetail struct {
  885. Orderid string `json:"orderid" xorm:"'ORDERID'" binding:"required"` // 单号(成交单号)
  886. Marketid int32 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 市场ID
  887. Goodsid int32 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID
  888. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'" binding:"required"` // 账户ID[报价币种]
  889. Buyorsell int32 `json:"buyorsell" xorm:"'BUYORSELL'" binding:"required"` // 买卖 - 0:买 1:卖
  890. Price float64 `json:"price" xorm:"'PRICE'"` // 价格
  891. Qty int64 `json:"qty" xorm:"'QTY'" binding:"required"` // 数量
  892. Time time.Time `json:"time" xorm:"'TIME'" binding:"required"` // 时间
  893. Amount float64 `json:"amount" xorm:"'AMOUNT'"` // 金额 = 价格 * 数量 * 合约单位
  894. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  895. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  896. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  897. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  898. Picurls1 string `json:"picurls1" xorm:"'PICURLS1'"` // 预售商品介绍图片[多张用逗号分隔]
  899. Picurls2 string `json:"picurls2" xorm:"'PICURLS2'"` // 挂牌商品介绍图片[多张用逗号分隔]
  900. Trademode uint32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  901. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  902. Vendorname1 string `json:"vendorname1" xorm:"'VENDORNAME1'"` // 预售商品供应商名称
  903. Vendorname2 string `json:"vendorname2" xorm:"'VENDORNAME2'"` // 挂牌商品供应商名称
  904. }
  905. // GetHsbyBuyMyTradeDetails 获取"我的订单 - 已完成"单据信息(一二级市场成交单,包括历史数据)
  906. // 输入 accountIDs string 资金账户列表
  907. // 输出 []HsbyBuyMyTradeDetail "我的订单 - 已完成"单据信息
  908. // 输出 error error
  909. func GetHsbyBuyMyTradeDetails(accountIDs string) ([]HsbyBuyMyTradeDetail, error) {
  910. // 获取市场信息
  911. markets, err := GetMarkets()
  912. if err != nil {
  913. return nil, err
  914. }
  915. engine := db.GetEngine()
  916. marketIDs := "" // 我的订单包括一二级市场卖方向成交单(包括历史成交单)
  917. // 默认取 TradeMode = 16
  918. for _, v := range markets {
  919. if v.Trademode == 16 || v.Trademode == 71 {
  920. if len(marketIDs) == 0 {
  921. marketIDs = strconv.Itoa(int(v.Marketid))
  922. } else {
  923. marketIDs += "," + strconv.Itoa(int(v.Marketid))
  924. }
  925. }
  926. }
  927. orders := make([]HsbyBuyMyTradeDetail, 0)
  928. // 当前成交单
  929. curOrders := make([]HsbyBuyMyTradeDetail, 0)
  930. if err := engine.Table("TRADE_TRADEDETAIL").
  931. Select(`to_char(TRADE_TRADEDETAIL.TRADEID) ORDERID,
  932. TRADE_TRADEDETAIL.MARKETID, TRADE_TRADEDETAIL.GOODSID, TRADE_TRADEDETAIL.ACCOUNTID, TRADE_TRADEDETAIL.BUYORSELL,
  933. TRADE_TRADEDETAIL.TRADEPRICE PRICE, TRADE_TRADEDETAIL.TRADEQTY QTY, TRADE_TRADEDETAIL.TRADETIME TIME, TRADE_TRADEDETAIL.TRADEAMOUNT AMOUNT,
  934. GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE, GOODS.AGREEUNIT,
  935. HG1.PICURLS PICURLS1, HG2.PICURLS PICURLS2,
  936. MARKET.TRADEMODE,
  937. ENUMDICITEM.PARAM2 CURRENCYSIGN,
  938. HS1.VENDORNAME VENDORNAME1, HS2.VENDORNAME VENDORNAME2`).
  939. Join("LEFT", "GOODS", "GOODS.GOODSID = TRADE_TRADEDETAIL.GOODSID").
  940. Join("LEFT", "CPTRADE_PRESALEGOODSEX", "CPTRADE_PRESALEGOODSEX.GOODSID = TRADE_TRADEDETAIL.GOODSID").
  941. Join("LEFT", "HSBY_GOODSEX HG1", "HG1.GOODSID = CPTRADE_PRESALEGOODSEX.RELATEDGOODSID").
  942. Join("LEFT", "HSBY_GOODSEX HG2", "HG2.GOODSID = GOODS.GOODSID").
  943. Join("LEFT", "ENUMDICITEM", "GOODS.CURRENCYID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'currency'").
  944. Join("LEFT", "MARKET", "MARKET.MARKETID = TRADE_TRADEDETAIL.MARKETID").
  945. Join("LEFT", "HSBY_SUPPLIERINFO HS1", "HS1.VENDORID = HG1.VENDORID").
  946. Join("LEFT", "HSBY_SUPPLIERINFO HS2", "HS2.VENDORID = HG2.VENDORID").
  947. Where(fmt.Sprintf(`TRADE_TRADEDETAIL.BUYORSELL = 0
  948. and TRADE_TRADEDETAIL.ACCOUNTID in (%s)`, accountIDs)).
  949. And(fmt.Sprintf("TRADE_TRADEDETAIL.MARKETID in (%s)", marketIDs)).Find(&curOrders); err != nil {
  950. return nil, err
  951. }
  952. if len(curOrders) > 0 {
  953. orders = append(orders, curOrders...)
  954. }
  955. // 历史成交单
  956. hisOrders := make([]HsbyBuyMyTradeDetail, 0)
  957. if err := engine.Table("HIS_TRADE_TRADEDETAIL").
  958. Select(`to_char(HIS_TRADE_TRADEDETAIL.TRADEID) ORDERID,
  959. HIS_TRADE_TRADEDETAIL.MARKETID, HIS_TRADE_TRADEDETAIL.GOODSID, HIS_TRADE_TRADEDETAIL.ACCOUNTID, HIS_TRADE_TRADEDETAIL.BUYORSELL,
  960. HIS_TRADE_TRADEDETAIL.TRADEPRICE PRICE, HIS_TRADE_TRADEDETAIL.TRADEQTY QTY, HIS_TRADE_TRADEDETAIL.TRADETIME TIME, HIS_TRADE_TRADEDETAIL.TRADEAMOUNT AMOUNT,
  961. GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE, GOODS.AGREEUNIT,
  962. HG1.PICURLS PICURLS1, HG2.PICURLS PICURLS2,
  963. MARKET.TRADEMODE,
  964. ENUMDICITEM.PARAM2 CURRENCYSIGN,
  965. HS1.VENDORNAME VENDORNAME1, HS2.VENDORNAME VENDORNAME2`).
  966. Join("LEFT", "GOODS", "GOODS.GOODSID = HIS_TRADE_TRADEDETAIL.GOODSID").
  967. Join("LEFT", "CPTRADE_PRESALEGOODSEX", "CPTRADE_PRESALEGOODSEX.GOODSID = HIS_TRADE_TRADEDETAIL.GOODSID").
  968. Join("LEFT", "HSBY_GOODSEX HG1", "HG1.GOODSID = CPTRADE_PRESALEGOODSEX.RELATEDGOODSID").
  969. Join("LEFT", "HSBY_GOODSEX HG2", "HG2.GOODSID = GOODS.GOODSID").
  970. Join("LEFT", "ENUMDICITEM", "GOODS.CURRENCYID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'currency'").
  971. Join("LEFT", "MARKET", "MARKET.MARKETID = HIS_TRADE_TRADEDETAIL.MARKETID").
  972. Join("LEFT", "HSBY_SUPPLIERINFO HS1", "HS1.VENDORID = HG1.VENDORID").
  973. Join("LEFT", "HSBY_SUPPLIERINFO HS2", "HS2.VENDORID = HG2.VENDORID").
  974. Where(fmt.Sprintf(`HIS_TRADE_TRADEDETAIL.BUYORSELL = 0 and HIS_TRADE_TRADEDETAIL.ISVALIDDATA = 1
  975. and HIS_TRADE_TRADEDETAIL.ACCOUNTID in (%s)`, accountIDs)).
  976. And(fmt.Sprintf("HIS_TRADE_TRADEDETAIL.MARKETID in (%s)", marketIDs)).Find(&hisOrders); err != nil {
  977. return nil, err
  978. }
  979. if len(hisOrders) > 0 {
  980. orders = append(orders, hisOrders...)
  981. }
  982. return orders, nil
  983. }
  984. // HsbyBuyMyPayOrder "我的订单 - 待付款"单据信息(一二级市场待付款信息)
  985. type HsbyBuyMyPayOrder struct {
  986. Tradeid string `json:"tradeid" xorm:"'TRADEIDSTR'" binding:"required"` // 成交单号(101+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  987. Tradedate string `json:"tradedate" xorm:"'TRADEDATE'"` // 交易日(yyyyMMdd)
  988. Marketid int32 `json:"marketid" xorm:"'MARKETID'"` // 市场ID
  989. Goodsid int32 `json:"goodsid" xorm:"'GOODSID'"` // 商品ID
  990. Buyorderid string `json:"buyorderid" xorm:"'BUYORDERIDSTR'"` // 买方委托单号
  991. Buyaccountid int64 `json:"buyaccountid" xorm:"'BUYACCOUNTID'"` // 买方账号ID[报价币种]
  992. Sellorderid string `json:"sellorderid" xorm:"'SELLORDERIDSTR'"` // 卖方委托单号
  993. Sellaccountid int64 `json:"sellaccountid" xorm:"'SELLACCOUNTID'"` // 卖方账号ID[报价币种]
  994. Tradeamount float64 `json:"tradeamount" xorm:"'TRADEAMOUNT'"` // 成交金额
  995. Tradecharge float64 `json:"tradecharge" xorm:"'TRADECHARGE'"` // 成交手续费(买方)
  996. Payflag int32 `json:"payflag" xorm:"'PAYFLAG'"` // 付款标识 - 1:未支付 2:已支付 3:已过期 4:已撤销 5:结算过期 6:预售终止
  997. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  998. Paytime time.Time `json:"paytime" xorm:"'PAYTIME'"` // 付款时间
  999. Paylimitedtime time.Time `json:"paylimitedtime" xorm:"'PAYLIMITEDTIME'"` // 支付期限
  1000. Offamount float64 `json:"offamount" xorm:"'OFFAMOUNT'"` // 优惠金额
  1001. Tradeprice float64 `json:"tradeprice" xorm:"'TRADEPRICE'"` // 成交价格
  1002. Tradeqty int64 `json:"tradeqty" xorm:"'TRADEQTY'"` // 成交数量
  1003. Payamount float64 `json:"payamount" xorm:"'PAYAMOUNT'"` // 支付金额 = TradeAmount + TradeCharge - OffAmount
  1004. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  1005. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  1006. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  1007. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  1008. Picurls1 string `json:"picurls1" xorm:"'PICURLS1'"` // 预售商品介绍图片[多张用逗号分隔]
  1009. Picurls2 string `json:"picurls2" xorm:"'PICURLS2'"` // 挂牌商品介绍图片[多张用逗号分隔]
  1010. Trademode uint32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  1011. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  1012. Vendorname1 string `json:"vendorname1" xorm:"'VENDORNAME1'"` // 预售商品供应商名称
  1013. Vendorname2 string `json:"vendorname2" xorm:"'VENDORNAME2'"` // 挂牌商品供应商名称
  1014. }
  1015. // GetHsbyBuyMyPayOrders 获取待付款信息
  1016. func GetHsbyBuyMyPayOrders(accountIDs string, buyOrderID, sellOrderID int) ([]HsbyBuyMyPayOrder, error) {
  1017. // 获取市场信息
  1018. markets, err := GetMarkets()
  1019. if err != nil {
  1020. return nil, err
  1021. }
  1022. engine := db.GetEngine()
  1023. marketIDs := "" // 我的订单包括一二级市场卖方向成交单
  1024. // 默认取 TradeMode = 16
  1025. for _, v := range markets {
  1026. if v.Trademode == 16 || v.Trademode == 71 {
  1027. if len(marketIDs) == 0 {
  1028. marketIDs = strconv.Itoa(int(v.Marketid))
  1029. } else {
  1030. marketIDs += "," + strconv.Itoa(int(v.Marketid))
  1031. }
  1032. }
  1033. }
  1034. orders := make([]HsbyBuyMyPayOrder, 0)
  1035. session := engine.Table("TRADE_PAYORDER TP").
  1036. Select(`to_char(TP.TRADEID) TRADEIDSTR, to_char(TP.BUYORDERID) BUYORDERIDSTR, to_char(TP.SELLORDERID) SELLORDERIDSTR, TP.*,
  1037. GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE, GOODS.AGREEUNIT,
  1038. HG1.PICURLS PICURLS1, HG2.PICURLS PICURLS2,
  1039. MARKET.TRADEMODE,
  1040. ENUMDICITEM.PARAM2 CURRENCYSIGN,
  1041. HS1.VENDORNAME VENDORNAME1, HS2.VENDORNAME VENDORNAME2`).
  1042. Join("LEFT", "GOODS", "GOODS.GOODSID = TP.GOODSID").
  1043. Join("LEFT", "CPTRADE_PRESALEGOODSEX CP", "CP.GOODSID = TP.GOODSID").
  1044. Join("LEFT", "HSBY_GOODSEX HG1", "HG1.GOODSID = CP.RELATEDGOODSID").
  1045. Join("LEFT", "HSBY_GOODSEX HG2", "HG2.GOODSID = GOODS.GOODSID").
  1046. Join("LEFT", "ENUMDICITEM", "GOODS.CURRENCYID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'currency'").
  1047. Join("LEFT", "MARKET", "MARKET.MARKETID = TP.MARKETID").
  1048. Join("LEFT", "HSBY_SUPPLIERINFO HS1", "HS1.VENDORID = HG1.VENDORID").
  1049. Join("LEFT", "HSBY_SUPPLIERINFO HS2", "HS2.VENDORID = HG2.VENDORID").
  1050. Where(fmt.Sprintf(`TP.PAYFLAG = 1 and TP.BUYACCOUNTID in (%s)`, accountIDs)).
  1051. And(fmt.Sprintf("TP.MARKETID in (%s)", marketIDs))
  1052. if buyOrderID != 0 {
  1053. session = session.And("TP.BUYORDERID = ?", buyOrderID)
  1054. }
  1055. if sellOrderID != 0 {
  1056. session = session.And("TP.SELLORDERID = ?", sellOrderID)
  1057. }
  1058. if err := session.Find(&orders); err != nil {
  1059. return nil, err
  1060. }
  1061. return orders, nil
  1062. }
  1063. // HsbyMarketInfo 海商报业相关市场信息
  1064. type HsbyMarketInfo struct {
  1065. Marketid int32 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 市场ID正常5位,前三位固定:两位表示交易模式, 一位表示交易属性(1:收益权,2:所有权) 其它特殊市场:0-系统 1-交割服务 2-账户服务3-履约服务 4-仓单服务 5-积分服务 6-银行服务
  1066. Marketname string `json:"marketname" xorm:"'MARKETNAME'"` // 市场名称
  1067. Trademode int32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  1068. }
  1069. // GetHsbyMarketInfos 获取海商报业相关市场信息
  1070. func GetHsbyMarketInfos() ([]HsbyMarketInfo, error) {
  1071. engine := db.GetEngine()
  1072. markets := make([]HsbyMarketInfo, 0)
  1073. if err := engine.Table("MARKET").Where("TRADEMODE in (71,16,70)").Find(&markets); err != nil {
  1074. return nil, err
  1075. }
  1076. return markets, nil
  1077. }
  1078. // HsbySellCollectionOrder 我的闲置中收款信息
  1079. type HsbySellCollectionOrder struct {
  1080. Tradeid string `json:"tradeid" xorm:"'TRADEIDSTR'" binding:"required"` // 成交单号(101+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  1081. Tradedate string `json:"tradedate" xorm:"'TRADEDATE'"` // 交易日(yyyyMMdd)
  1082. Marketid int32 `json:"marketid" xorm:"'MARKETID'"` // 市场ID
  1083. Goodsid int32 `json:"goodsid" xorm:"'GOODSID'"` // 商品ID
  1084. Buyorderid string `json:"buyorderid" xorm:"'BUYORDERIDSTR'"` // 买方委托单号
  1085. Buyaccountid int64 `json:"buyaccountid" xorm:"'BUYACCOUNTID'"` // 买方账号ID[报价币种]
  1086. Sellorderid string `json:"sellorderid" xorm:"'SELLORDERIDSTR'"` // 卖方委托单号
  1087. Sellaccountid int64 `json:"sellaccountid" xorm:"'SELLACCOUNTID'"` // 卖方账号ID[报价币种]
  1088. Tradeamount float64 `json:"tradeamount" xorm:"'TRADEAMOUNT'"` // 成交金额
  1089. Tradecharge float64 `json:"tradecharge" xorm:"'TRADECHARGE'"` // 成交手续费(买方)
  1090. Payflag int32 `json:"payflag" xorm:"'PAYFLAG'"` // 付款标识 - 1:未支付 2:已支付 3:已过期 4:已撤销 5:结算过期 6:预售终止
  1091. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  1092. Paytime time.Time `json:"paytime" xorm:"'PAYTIME'"` // 付款时间
  1093. Paylimitedtime time.Time `json:"paylimitedtime" xorm:"'PAYLIMITEDTIME'"` // 支付期限
  1094. Offamount float64 `json:"offamount" xorm:"'OFFAMOUNT'"` // 优惠金额
  1095. Tradeprice float64 `json:"tradeprice" xorm:"'TRADEPRICE'"` // 成交价格
  1096. Tradeqty int64 `json:"tradeqty" xorm:"'TRADEQTY'"` // 成交数量
  1097. Payamount float64 `json:"payamount" xorm:"'PAYAMOUNT'"` // 支付金额 = TradeAmount + TradeCharge - OffAmount
  1098. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  1099. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  1100. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  1101. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  1102. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 商品介绍图片[多张用逗号分隔]
  1103. Trademode uint32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  1104. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  1105. }
  1106. // GetHsbySellCollectionOrders 获取我的闲置中待收款信息
  1107. func GetHsbySellCollectionOrders(accountIDs string) ([]HsbySellCollectionOrder, error) {
  1108. // 获取市场信息
  1109. markets, err := GetMarkets()
  1110. if err != nil {
  1111. return nil, err
  1112. }
  1113. engine := db.GetEngine()
  1114. marketIDs := ""
  1115. // 默认取 TradeMode = 16
  1116. for _, v := range markets {
  1117. if v.Trademode == 16 {
  1118. if len(marketIDs) == 0 {
  1119. marketIDs = strconv.Itoa(int(v.Marketid))
  1120. } else {
  1121. marketIDs += "," + strconv.Itoa(int(v.Marketid))
  1122. }
  1123. }
  1124. }
  1125. orders := make([]HsbySellCollectionOrder, 0)
  1126. session := engine.Table("TRADE_PAYORDER TP").
  1127. Select(`to_char(TP.TRADEID) TRADEIDSTR, to_char(TP.BUYORDERID) BUYORDERIDSTR, to_char(TP.SELLORDERID) SELLORDERIDSTR, TP.*,
  1128. G.GOODSCODE, G.GOODSNAME, G.DECIMALPLACE, G.AGREEUNIT,
  1129. HG.PICURLS,
  1130. M.TRADEMODE,
  1131. E.PARAM2 CURRENCYSIGN`).
  1132. Join("LEFT", "GOODS G", "G.GOODSID = TP.GOODSID").
  1133. Join("LEFT", "HSBY_GOODSEX HG", "HG.GOODSID = G.GOODSID").
  1134. Join("LEFT", "ENUMDICITEM E", "G.CURRENCYID = E.ENUMITEMNAME and E.ENUMDICCODE = 'currency'").
  1135. Join("LEFT", "MARKET M", "M.MARKETID = TP.MARKETID").
  1136. Join("LEFT", "HSBY_SUPPLIERINFO HS", "HS.VENDORID = HG.VENDORID").
  1137. Where(fmt.Sprintf(`TP.PAYFLAG = 1 and TP.SELLACCOUNTID in (%s)`, accountIDs)).
  1138. And(fmt.Sprintf("TP.MARKETID in (%s)", marketIDs))
  1139. if err := session.Find(&orders); err != nil {
  1140. return nil, err
  1141. }
  1142. return orders, nil
  1143. }