hsby.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. package models
  2. import (
  3. "mtp2_if/db"
  4. "mtp2_if/utils"
  5. "time"
  6. )
  7. // Hsbygoodsex 商品扩展表
  8. type Hsbygoodsex struct {
  9. Goodsid int32 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商 品ID
  10. Hotindex int32 `json:"hotindex" xorm:"'HOTINDEX'"` // 景点热度
  11. Descprovinceid int64 `json:"descprovinceid" xorm:"'DESCPROVINCEID'"` // 目的地(省)
  12. Desccityid int64 `json:"desccityid" xorm:"'DESCCITYID'"` // 目的地(市)
  13. Vendorid int32 `json:"vendorid" xorm:"'VENDORID'"` // 供应商ID
  14. Goodsdesc string `json:"goodsdesc" xorm:"'GOODSDESC'"` // 商品详情
  15. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  16. Creatorid int64 `json:"creatorid" xorm:"'CREATORID'"` // 创建人
  17. Modifierid int64 `json:"modifierid" xorm:"'MODIFIERID'"` // 修改人
  18. Modifytime time.Time `json:"modifytime" xorm:"'MODIFYTIME'"` // 修改时间
  19. Memberratio float64 `json:"memberratio" xorm:"'MEMBERRATIO'"` // 会员货款比例 [71]
  20. Videourls string `json:"videourls" xorm:"'VIDEOURLS'"` // 介绍视频[多张用逗号分隔]
  21. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
  22. }
  23. // Hsbysupplierinfo 供应商表
  24. type Hsbysupplierinfo struct {
  25. Vendorid int32 `json:"vendorid" xorm:"'VENDORID'" binding:"required"` // 供应商ID(SEQ_HSBY_SUPPLIERINFO)
  26. Vendorname string `json:"vendorname" xorm:"'VENDORNAME'"` // 名称描述客服电话名称
  27. Vendordesc string `json:"vendordesc" xorm:"'VENDORDESC'"` // 描述
  28. Vendorphone string `json:"vendorphone" xorm:"'VENDORPHONE'"` // 客服电话
  29. Vendorattr string `json:"vendorattr" xorm:"'VENDORATTR'"` // 附件(多张,逗号分隔)
  30. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  31. Creatorid int64 `json:"creatorid" xorm:"'CREATORID'"` // 创建人
  32. Modifierid int64 `json:"modifierid" xorm:"'MODIFIERID'"` // 修改人
  33. Modifytime time.Time `json:"modifytime" xorm:"'MODIFYTIME'"` // 修改时间
  34. }
  35. // TableName is HSBY_SUPPLIERINFO
  36. func (Hsbysupplierinfo) TableName() string {
  37. return "HSBY_SUPPLIERINFO"
  38. }
  39. // TableName is HSBY_GOODSEX
  40. func (Hsbygoodsex) TableName() string {
  41. return "HSBY_GOODSEX"
  42. }
  43. // HsbyTopGoods 热门商品列表
  44. type HsbyTopGoods struct {
  45. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID(自增ID SEQ_GOODS)
  46. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  47. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  48. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  49. Hotindex int32 `json:"hotindex" xorm:"'HOTINDEX'"` // 景点热度
  50. Videourls string `json:"videourls" xorm:"'VIDEOURLS'"` // 介绍视频[多张用逗号分隔]
  51. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
  52. Currency string `json:"currency" xorm:"'CURRENCY'"` // 货币
  53. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  54. Last float64 `json:"last" xorm:"-"` // 现价
  55. }
  56. // GetHsbyTopGoods 获取热门商品列表
  57. // 参数 marketID int 所属市场ID
  58. // 参数 descProvinceID int 目标省ID
  59. // 参数 descCityID int 目标城市ID
  60. // 返回 []TopGoods 热门商品列表
  61. // 返回 error error
  62. func GetHsbyTopGoods(marketID int, descProvinceID int, descCityID int) ([]HsbyTopGoods, error) {
  63. // 热门商品为二级市场(挂牌点选)下的商品信息
  64. engine := db.GetEngine()
  65. topGoodses := make([]HsbyTopGoods, 0)
  66. // 获取挂牌商品信息,以及扩展表信息
  67. session := engine.Table("GOODS").
  68. Select(`GOODS.*,
  69. HSBY_GOODSEX.HOTINDEX, HSBY_GOODSEX.VIDEOURLS, HSBY_GOODSEX.PICURLS,
  70. ENUMDICITEM.ENUMDICNAME CURRENCY, ENUMDICITEM.PARAM2 CURRENCYSIGN`).
  71. Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = GOODS.GOODSID").
  72. Join("LEFT", "ENUMDICITEM", "ENUMDICITEM.ENUMITEMNAME = GOODS.CURRENCYID and ENUMDICITEM.ENUMDICCODE = 'currency'").
  73. Where("GOODS.MARKETID = ?", marketID)
  74. if descProvinceID > 0 {
  75. session = session.And("HSBY_GOODSEX.DESCPROVINCEID = ?", descProvinceID)
  76. }
  77. if descCityID > 0 {
  78. session = session.And("HSBY_GOODSEX.DESCCITYID = ?", descCityID)
  79. }
  80. if err := session.Find(&topGoodses); err != nil {
  81. return nil, err
  82. }
  83. if len(topGoodses) == 0 {
  84. // 无数据
  85. return topGoodses, nil
  86. }
  87. // 获取商品ID列表
  88. goodsCodes := ""
  89. for _, v := range topGoodses {
  90. if len(goodsCodes) == 0 {
  91. goodsCodes = v.Goodscode
  92. } else {
  93. goodsCodes += "," + v.Goodscode
  94. }
  95. }
  96. // 获取商品现价
  97. quoteDays, err := GetQuoteDays(goodsCodes)
  98. if err != nil {
  99. return nil, err
  100. }
  101. for i, g := range topGoodses {
  102. for _, q := range quoteDays {
  103. if g.Goodscode == q.Goodscode {
  104. if q.Last != 0 {
  105. topGoods := &topGoodses[i]
  106. topGoods.Last = utils.IntToFloat64(int(q.Last), int(g.Decimalplace))
  107. }
  108. continue
  109. }
  110. }
  111. }
  112. return topGoodses, nil
  113. }
  114. // HsbyListingGoodsDetail 二级市场(挂牌点选)商品信息详情
  115. type HsbyListingGoodsDetail struct {
  116. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID(自增ID SEQ_GOODS)
  117. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  118. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  119. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  120. Hotindex int32 `json:"hotindex" xorm:"'HOTINDEX'"` // 景点热度
  121. Videourls string `json:"videourls" xorm:"'VIDEOURLS'"` // 介绍视频[多张用逗号分隔]
  122. Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
  123. Descprovinceid int64 `json:"descprovinceid" xorm:"'DESCPROVINCEID'"` // 目的地(省)ID
  124. Desccityid int64 `json:"desccityid" xorm:"'DESCCITYID'"` // 目的地(市)ID
  125. Goodsdesc string `json:"goodsdesc" xorm:"'GOODSDESC'"` // 商品详情
  126. Currency string `json:"currency" xorm:"'CURRENCY'"` // 货币
  127. Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
  128. Vendorname string `json:"vendorname" xorm:"'VENDORNAME'"` // 供应商名称
  129. Last float64 `json:"last" xorm:"-"` // 现价
  130. }
  131. // GetHsbyListingGoodsDetail 获取二级市场(挂牌点选)商品信息详情
  132. // 参数 goodsID int 目标商品ID
  133. // 返回 *HsbyListingGoodsDetail 二级市场(挂牌点选)商品信息详情,查询无结果返回nil
  134. // 返回 error error
  135. func GetHsbyListingGoodsDetail(goodsID int) (*HsbyListingGoodsDetail, error) {
  136. engine := db.GetEngine()
  137. details := make([]HsbyListingGoodsDetail, 0)
  138. // 获取挂牌商品信息,以及扩展表信息
  139. // FIXME: - 这里使用Get方法,会造成SQL语句的嵌套出错,后期再研究
  140. session := engine.Table("GOODS").
  141. Select(`GOODS.GOODSID, GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE,
  142. HSBY_GOODSEX.HOTINDEX, HSBY_GOODSEX.VIDEOURLS, HSBY_GOODSEX.PICURLS, HSBY_GOODSEX.DESCPROVINCEID, HSBY_GOODSEX.Desccityid, HSBY_GOODSEX.Goodsdesc,
  143. ENUMDICITEM.ENUMDICNAME CURRENCY, ENUMDICITEM.PARAM2 CURRENCYSIGN,
  144. HSBY_SUPPLIERINFO.VENDORNAME`).
  145. Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = GOODS.GOODSID").
  146. Join("LEFT", "ENUMDICITEM", "ENUMDICITEM.ENUMITEMNAME = GOODS.CURRENCYID and ENUMDICITEM.ENUMDICCODE = 'currency'").
  147. Join("LEFT", "HSBY_SUPPLIERINFO", "HSBY_SUPPLIERINFO.VENDORID = HSBY_GOODSEX.VENDORID").
  148. Where("GOODS.GOODSID = ?", goodsID)
  149. if err := session.Find(&details); err != nil {
  150. return nil, err
  151. }
  152. // 无目标商品
  153. if len(details) == 0 {
  154. return nil, nil
  155. }
  156. hsbyListingGoodsDetail := details[0]
  157. // 获取商品现价
  158. quoteDays, err := GetQuoteDays(hsbyListingGoodsDetail.Goodscode)
  159. if err != nil {
  160. return nil, err
  161. }
  162. if len(quoteDays) > 0 {
  163. if quoteDays[0].Last != 0 {
  164. hsbyListingGoodsDetail.Last = utils.IntToFloat64(int(quoteDays[0].Last), int(hsbyListingGoodsDetail.Decimalplace))
  165. }
  166. }
  167. return &hsbyListingGoodsDetail, nil
  168. }
  169. // HsbyGoodsOrderDetail 二级市场挂牌商品当前可摘委托单信息
  170. type HsbyGoodsOrderDetail struct {
  171. Orderid int64 `json:"orderid" xorm:"'ORDERID'" binding:"required"` // 委托单号(100+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  172. Buyorsell int32 `json:"buyorsell" xorm:"'BUYORSELL'" binding:"required"` // 买卖 - 0:买 1:卖
  173. Ordertime time.Time `json:"ordertime" xorm:"'ORDERTIME'" binding:"required"` // 委托时间
  174. Orderprice float64 `json:"orderprice" xorm:"'ORDERPRICE'"` // 委托价格
  175. Enableqty int64 `json:"enableqty" xorm:"ENABLEQTY"` // 可用数量
  176. Customername string `json:"customername" xorm:"'CUSTOMERNAME'"` // 客户名称(企业名称),已脱敏
  177. Currencysign string `json:"currencysign" xorm:"-"` // 货币符号
  178. Goodunit string `json:"goodunit" xorm:"-"` // 报价单位
  179. }
  180. // GetHsbyGoodsOrderDetails 获取二级市场(挂牌点选)商品对应的挂牌委托单信息
  181. // 参数 goodsID int 商品ID
  182. // 返回 []HsbyGoodsOrderDetail 转让(卖出)挂牌委托单
  183. // 返回 []HsbyGoodsOrderDetail 求购(买入)挂牌委托单
  184. // 返回 error error
  185. func GetHsbyGoodsOrderDetails(goodsID int) ([]HsbyGoodsOrderDetail, []HsbyGoodsOrderDetail, error) {
  186. engine := db.GetEngine()
  187. // 获取与目标商品相关的挂牌委托单信息(ListingSelectType = 1 or 3; OrderStatus =3 or 7)
  188. hsbyGoodsOrderDetails := make([]HsbyGoodsOrderDetail, 0)
  189. if err := engine.Table("TRADE_ORDERDETAIL").
  190. Select(`TRADE_ORDERDETAIL.ORDERID, TRADE_ORDERDETAIL.BUYORSELL, TRADE_ORDERDETAIL.ORDERTIME, TRADE_ORDERDETAIL.ORDERPRICE, (TRADE_ORDERDETAIL.ORDERQTY - TRADE_ORDERDETAIL.TRADEQTY - TRADE_ORDERDETAIL.CANCELQTY) ENABLEQTY,
  191. substr(USERINFO.CUSTOMERNAME,0,1)||'****' as CUSTOMERNAME`).
  192. Join("LEFT", "TAACCOUNT", "TAACCOUNT.ACCOUNTID = TRADE_ORDERDETAIL.ACCOUNTID").
  193. Join("LEFT", "USERINFO", "USERINFO.USERID = TAACCOUNT.RELATEDUSERID").
  194. Where("(TRADE_ORDERDETAIL.LISTINGSELECTTYPE = 1 or TRADE_ORDERDETAIL.LISTINGSELECTTYPE = 3) and (TRADE_ORDERDETAIL.ORDERSTATUS = 3 or TRADE_ORDERDETAIL.ORDERSTATUS = 7)").
  195. And("TRADE_ORDERDETAIL.GOODSID = ?", goodsID).Find(&hsbyGoodsOrderDetails); err != nil {
  196. return nil, nil, err
  197. }
  198. sellOrderDetails := make([]HsbyGoodsOrderDetail, 0)
  199. buyOrderDetails := make([]HsbyGoodsOrderDetail, 0)
  200. if len(hsbyGoodsOrderDetails) == 0 {
  201. // 无数据
  202. return sellOrderDetails, buyOrderDetails, nil
  203. }
  204. // 获取商品货币符号和报价单位
  205. goods, err := GetGoods(goodsID)
  206. if err != nil {
  207. return nil, nil, err
  208. }
  209. currencyEnums, err := GetEnumDicItem("currency", int(goods.Currencyid))
  210. if err != nil {
  211. return nil, nil, err
  212. }
  213. currencysign := ""
  214. if len(currencyEnums) > 0 {
  215. currencysign = currencyEnums[0].Param2
  216. }
  217. goodsUnitEnums, err := GetEnumDicItem("goodsunit", int(goods.Goodunitid))
  218. if err != nil {
  219. return nil, nil, err
  220. }
  221. goodsUnit := ""
  222. if len(goodsUnitEnums) > 0 {
  223. goodsUnit = goodsUnitEnums[0].Enumdicname
  224. }
  225. for i := range hsbyGoodsOrderDetails {
  226. orderDetail := &hsbyGoodsOrderDetails[i]
  227. // 设置货币符号和报价单位
  228. orderDetail.Currencysign = currencysign
  229. orderDetail.Goodunit = goodsUnit
  230. // 分解转让(卖)和求购(买)单
  231. if orderDetail.Buyorsell == 1 {
  232. sellOrderDetails = append(sellOrderDetails, *orderDetail)
  233. }
  234. if orderDetail.Buyorsell == 0 {
  235. buyOrderDetails = append(buyOrderDetails, *orderDetail)
  236. }
  237. }
  238. return sellOrderDetails, buyOrderDetails, nil
  239. }