| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394 |
- package models
- import (
- "fmt"
- "mtp2_if/db"
- "mtp2_if/utils"
- "time"
- )
- // Hsbygoodsex 商品扩展表
- type Hsbygoodsex struct {
- Goodsid int32 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商 品ID
- Hotindex int32 `json:"hotindex" xorm:"'HOTINDEX'"` // 景点热度
- Descprovinceid int64 `json:"descprovinceid" xorm:"'DESCPROVINCEID'"` // 目的地(省)
- Desccityid int64 `json:"desccityid" xorm:"'DESCCITYID'"` // 目的地(市)
- Vendorid int32 `json:"vendorid" xorm:"'VENDORID'"` // 供应商ID
- Goodsdesc string `json:"goodsdesc" xorm:"'GOODSDESC'"` // 商品详情
- Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
- Creatorid int64 `json:"creatorid" xorm:"'CREATORID'"` // 创建人
- Modifierid int64 `json:"modifierid" xorm:"'MODIFIERID'"` // 修改人
- Modifytime time.Time `json:"modifytime" xorm:"'MODIFYTIME'"` // 修改时间
- Memberratio float64 `json:"memberratio" xorm:"'MEMBERRATIO'"` // 会员货款比例 [71]
- Videourls string `json:"videourls" xorm:"'VIDEOURLS'"` // 介绍视频[多张用逗号分隔]
- Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
- }
- // TableName is HSBY_GOODSEX
- func (Hsbygoodsex) TableName() string {
- return "HSBY_GOODSEX"
- }
- // Hsbysupplierinfo 供应商表
- type Hsbysupplierinfo struct {
- Vendorid int32 `json:"vendorid" xorm:"'VENDORID'" binding:"required"` // 供应商ID(SEQ_HSBY_SUPPLIERINFO)
- Vendorname string `json:"vendorname" xorm:"'VENDORNAME'"` // 名称描述客服电话名称
- Vendordesc string `json:"vendordesc" xorm:"'VENDORDESC'"` // 描述
- Vendorphone string `json:"vendorphone" xorm:"'VENDORPHONE'"` // 客服电话
- Vendorattr string `json:"vendorattr" xorm:"'VENDORATTR'"` // 附件(多张,逗号分隔)
- Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
- Creatorid int64 `json:"creatorid" xorm:"'CREATORID'"` // 创建人
- Modifierid int64 `json:"modifierid" xorm:"'MODIFIERID'"` // 修改人
- Modifytime time.Time `json:"modifytime" xorm:"'MODIFYTIME'"` // 修改时间
- }
- // TableName is HSBY_SUPPLIERINFO
- func (Hsbysupplierinfo) TableName() string {
- return "HSBY_SUPPLIERINFO"
- }
- // HsbyTopGoods 热门商品列表
- type HsbyTopGoods struct {
- Goodsid int64 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID(自增ID SEQ_GOODS)
- Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
- Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
- Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
- Marketid int64 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 所属市场ID
- Hotindex int32 `json:"hotindex" xorm:"'HOTINDEX'"` // 景点热度
- Videourls string `json:"videourls" xorm:"'VIDEOURLS'"` // 介绍视频[多张用逗号分隔]
- Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
- Currency string `json:"currency" xorm:"'CURRENCY'"` // 货币
- Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
- Last float64 `json:"last" xorm:"-"` // 现价
- }
- // GetHsbyTopGoods 获取热门商品列表
- // 参数 marketID int 所属市场ID
- // 参数 descProvinceID int 目标省ID
- // 参数 descCityID int 目标城市ID
- // 返回 []TopGoods 热门商品列表
- // 返回 error error
- func GetHsbyTopGoods(marketID int, descProvinceID int, descCityID int) ([]HsbyTopGoods, error) {
- // 热门商品为二级市场(挂牌点选)下的商品信息
- engine := db.GetEngine()
- topGoodses := make([]HsbyTopGoods, 0)
- // 获取挂牌商品信息,以及扩展表信息
- session := engine.Table("GOODS").
- Select(`GOODS.*,
- HSBY_GOODSEX.HOTINDEX, HSBY_GOODSEX.VIDEOURLS, HSBY_GOODSEX.PICURLS,
- ENUMDICITEM.ENUMDICNAME CURRENCY, ENUMDICITEM.PARAM2 CURRENCYSIGN`).
- Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = GOODS.GOODSID").
- Join("LEFT", "ENUMDICITEM", "ENUMDICITEM.ENUMITEMNAME = GOODS.CURRENCYID and ENUMDICITEM.ENUMDICCODE = 'currency'").
- Where("GOODS.MARKETID = ?", marketID)
- if descProvinceID > 0 {
- session = session.And("HSBY_GOODSEX.DESCPROVINCEID = ?", descProvinceID)
- }
- if descCityID > 0 {
- session = session.And("HSBY_GOODSEX.DESCCITYID = ?", descCityID)
- }
- if err := session.Find(&topGoodses); err != nil {
- return nil, err
- }
- if len(topGoodses) == 0 {
- // 无数据
- return topGoodses, nil
- }
- // 获取商品ID列表
- goodsCodes := ""
- for _, v := range topGoodses {
- if len(goodsCodes) == 0 {
- goodsCodes = v.Goodscode
- } else {
- goodsCodes += "," + v.Goodscode
- }
- }
- // 获取商品现价
- quoteDays, err := GetQuoteDays(goodsCodes)
- if err != nil {
- return nil, err
- }
- for i, g := range topGoodses {
- for _, q := range quoteDays {
- if g.Goodscode == q.Goodscode {
- if q.Last != 0 {
- topGoods := &topGoodses[i]
- topGoods.Last = utils.IntToFloat64(int(q.Last), int(g.Decimalplace))
- }
- continue
- }
- }
- }
- return topGoodses, nil
- }
- // HsbyListingGoodsDetail 二级市场(挂牌点选)商品信息详情
- type HsbyListingGoodsDetail struct {
- Goodsid int64 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID(自增ID SEQ_GOODS)
- Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
- Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
- Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
- Marketid int64 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 所属市场ID
- Hotindex int32 `json:"hotindex" xorm:"'HOTINDEX'"` // 景点热度
- Videourls string `json:"videourls" xorm:"'VIDEOURLS'"` // 介绍视频[多张用逗号分隔]
- Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
- Descprovinceid int64 `json:"descprovinceid" xorm:"'DESCPROVINCEID'"` // 目的地(省)ID
- Desccityid int64 `json:"desccityid" xorm:"'DESCCITYID'"` // 目的地(市)ID
- Goodsdesc string `json:"goodsdesc" xorm:"'GOODSDESC'"` // 商品详情
- Currency string `json:"currency" xorm:"'CURRENCY'"` // 货币
- Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
- Vendorname string `json:"vendorname" xorm:"'VENDORNAME'"` // 供应商名称
- Vendorphone string `json:"vendorphone" xorm:"'VENDORPHONE'"` // 供应商客服电话
- Vendorattr string `json:"vendorattr" xorm:"'VENDORATTR'"` // 供应商附件(多张,逗号分隔)
- Last float64 `json:"last" xorm:"-"` // 现价
- }
- // GetHsbyListingGoodsDetail 获取二级市场(挂牌点选)商品信息详情
- // 参数 goodsID int 目标商品ID
- // 返回 *HsbyListingGoodsDetail 二级市场(挂牌点选)商品信息详情,查询无结果返回nil
- // 返回 error error
- func GetHsbyListingGoodsDetail(goodsID int) (*HsbyListingGoodsDetail, error) {
- engine := db.GetEngine()
- details := make([]HsbyListingGoodsDetail, 0)
- // 获取挂牌商品信息,以及扩展表信息
- // FIXME: - 这里使用Get方法,会造成SQL语句的嵌套出错,后期再研究
- session := engine.Table("GOODS").
- Select(`GOODS.GOODSID, GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE, GOODS.MARKETID,
- HSBY_GOODSEX.HOTINDEX, HSBY_GOODSEX.VIDEOURLS, HSBY_GOODSEX.PICURLS, HSBY_GOODSEX.DESCPROVINCEID, HSBY_GOODSEX.Desccityid, HSBY_GOODSEX.Goodsdesc,
- ENUMDICITEM.ENUMDICNAME CURRENCY, ENUMDICITEM.PARAM2 CURRENCYSIGN,
- HSBY_SUPPLIERINFO.VENDORNAME, HSBY_SUPPLIERINFO.VENDORPHONE, HSBY_SUPPLIERINFO.VENDORATTR`).
- Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = GOODS.GOODSID").
- Join("LEFT", "ENUMDICITEM", "ENUMDICITEM.ENUMITEMNAME = GOODS.CURRENCYID and ENUMDICITEM.ENUMDICCODE = 'currency'").
- Join("LEFT", "HSBY_SUPPLIERINFO", "HSBY_SUPPLIERINFO.VENDORID = HSBY_GOODSEX.VENDORID").
- Where("GOODS.GOODSID = ?", goodsID)
- if err := session.Find(&details); err != nil {
- return nil, err
- }
- // 无目标商品
- if len(details) == 0 {
- return nil, nil
- }
- hsbyListingGoodsDetail := details[0]
- // 获取商品现价
- quoteDays, err := GetQuoteDays(hsbyListingGoodsDetail.Goodscode)
- if err != nil {
- return nil, err
- }
- if len(quoteDays) > 0 {
- if quoteDays[0].Last != 0 {
- hsbyListingGoodsDetail.Last = utils.IntToFloat64(int(quoteDays[0].Last), int(hsbyListingGoodsDetail.Decimalplace))
- }
- }
- return &hsbyListingGoodsDetail, nil
- }
- // HsbyGoodsOrderDetail 二级市场挂牌商品当前可摘委托单信息
- type HsbyGoodsOrderDetail struct {
- Orderid int64 `json:"orderid" xorm:"'ORDERID'" binding:"required"` // 委托单号(100+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
- Buyorsell int32 `json:"buyorsell" xorm:"'BUYORSELL'" binding:"required"` // 买卖 - 0:买 1:卖
- Ordertime time.Time `json:"ordertime" xorm:"'ORDERTIME'" binding:"required"` // 委托时间
- Orderprice float64 `json:"orderprice" xorm:"'ORDERPRICE'"` // 委托价格
- Enableqty int64 `json:"enableqty" xorm:"ENABLEQTY"` // 可用数量
- Customername string `json:"customername" xorm:"'CUSTOMERNAME'"` // 客户名称(企业名称),已脱敏
- Currencysign string `json:"currencysign" xorm:"-"` // 货币符号
- Goodunit string `json:"goodunit" xorm:"-"` // 报价单位
- }
- // GetHsbyGoodsOrderDetails 获取二级市场(挂牌点选)商品对应的挂牌委托单信息
- // 参数 goodsID int 商品ID
- // 返回 []HsbyGoodsOrderDetail 转让(卖出)挂牌委托单
- // 返回 []HsbyGoodsOrderDetail 求购(买入)挂牌委托单
- // 返回 error error
- func GetHsbyGoodsOrderDetails(goodsID int) ([]HsbyGoodsOrderDetail, []HsbyGoodsOrderDetail, error) {
- engine := db.GetEngine()
- // 获取与目标商品相关的挂牌委托单信息(ListingSelectType = 1 or 3; OrderStatus =3 or 7)
- hsbyGoodsOrderDetails := make([]HsbyGoodsOrderDetail, 0)
- if err := engine.Table("TRADE_ORDERDETAIL").
- Select(`TRADE_ORDERDETAIL.ORDERID, TRADE_ORDERDETAIL.BUYORSELL, TRADE_ORDERDETAIL.ORDERTIME, TRADE_ORDERDETAIL.ORDERPRICE, (TRADE_ORDERDETAIL.ORDERQTY - TRADE_ORDERDETAIL.TRADEQTY - TRADE_ORDERDETAIL.CANCELQTY) ENABLEQTY,
- substr(USERINFO.CUSTOMERNAME,0,1)||'****' as CUSTOMERNAME`).
- Join("LEFT", "TAACCOUNT", "TAACCOUNT.ACCOUNTID = TRADE_ORDERDETAIL.ACCOUNTID").
- Join("LEFT", "USERINFO", "USERINFO.USERID = TAACCOUNT.RELATEDUSERID").
- Where("(TRADE_ORDERDETAIL.LISTINGSELECTTYPE = 1 or TRADE_ORDERDETAIL.LISTINGSELECTTYPE = 3) and (TRADE_ORDERDETAIL.ORDERSTATUS = 3 or TRADE_ORDERDETAIL.ORDERSTATUS = 7)").
- And("TRADE_ORDERDETAIL.GOODSID = ?", goodsID).Find(&hsbyGoodsOrderDetails); err != nil {
- return nil, nil, err
- }
- sellOrderDetails := make([]HsbyGoodsOrderDetail, 0)
- buyOrderDetails := make([]HsbyGoodsOrderDetail, 0)
- if len(hsbyGoodsOrderDetails) == 0 {
- // 无数据
- return sellOrderDetails, buyOrderDetails, nil
- }
- // 获取商品货币符号和报价单位
- goods, err := GetGoods(goodsID)
- if err != nil {
- return nil, nil, err
- }
- currencyEnums, err := GetEnumDicItem("currency", int(goods.Currencyid))
- if err != nil {
- return nil, nil, err
- }
- currencysign := ""
- if len(currencyEnums) > 0 {
- currencysign = currencyEnums[0].Param2
- }
- goodsUnitEnums, err := GetEnumDicItem("goodsunit", int(goods.Goodunitid))
- if err != nil {
- return nil, nil, err
- }
- goodsUnit := ""
- if len(goodsUnitEnums) > 0 {
- goodsUnit = goodsUnitEnums[0].Enumdicname
- }
- for i := range hsbyGoodsOrderDetails {
- orderDetail := &hsbyGoodsOrderDetails[i]
- // 设置货币符号和报价单位
- orderDetail.Currencysign = currencysign
- orderDetail.Goodunit = goodsUnit
- // 分解转让(卖)和求购(买)单
- if orderDetail.Buyorsell == 1 {
- sellOrderDetails = append(sellOrderDetails, *orderDetail)
- }
- if orderDetail.Buyorsell == 0 {
- buyOrderDetails = append(buyOrderDetails, *orderDetail)
- }
- }
- return sellOrderDetails, buyOrderDetails, nil
- }
- // HybsMyBuyOrderDetail 我的订单(一二级市场的买方向委托单)
- type HybsMyBuyOrderDetail struct {
- Orderid int64 `json:"orderid" xorm:"'ORDERID'" binding:"required"` // 委托单号(100+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
- Marketid int32 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 市场ID
- Goodsid int32 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID
- Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'" binding:"required"` // 账户ID[报价币种]
- Buyorsell int32 `json:"buyorsell" xorm:"'BUYORSELL'" binding:"required"` // 买卖 - 0:买 1:卖
- Orderqty int64 `json:"orderqty" xorm:"'ORDERQTY'" binding:"required"` // 委托数量
- Tradeqty int64 `json:"tradeqty" xorm:"'TRADEQTY'"` // 成交数量
- Cancelqty int64 `json:"cancelqty" xorm:"'CANCELQTY'"` // 撤单数量
- Ordertime time.Time `json:"ordertime" xorm:"'ORDERTIME'" binding:"required"` // 委托时间
- Listingselecttype int32 `json:"listingselecttype" xorm:"'LISTINGSELECTTYPE'"` // 挂牌点选类型 - 1:挂牌 2:摘牌 3:先摘后挂
- Orderstatus int32 `json:"orderstatus" xorm:"'ORDERSTATUS'"` // 委托状态 - 1: 委托请求 2:待冻结 3:委托成功 4: 委托失败 5:配对成功 6: 已撤销 7:部分成交 8:已成交 9:部成部撤 10:成交失败 11:已拒绝 12:经过摘牌(先摘后挂专用-先摘后挂已摘过) 13:冻结成功(通道交易专用) 14:通道已撤 15:通道部成部撤 16:成交失败违约(荷兰式竞拍专用)
- Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
- Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
- Picurls string `json:"picurls" xorm:"'PICURLS'"` // 介绍图片[多张用逗号分隔]
- Trademode uint32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
- Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
- MyBuyStatus int `json:"mybuystatus" xorm:"-"` // "我的订单"显示状态- 1:抢购中 2:求购中 3:已完成 4:已撤消 5:委托失败
- }
- // GetHsbyBuyMyOrderDetails 获取“我的订单”数据(包括一二级市场)
- // 输入 accountID int 资金账户
- // 输入 myBuyStatus int "我的订单"状态, 1:抢购中 2:求购中 3:已完成
- // 输出 []HybsMyBuyOrderDetail “我的订单”数据
- // 输出 error error
- func GetHsbyBuyMyOrderDetails(accountID, myBuyStatus int) ([]HybsMyBuyOrderDetail, error) {
- engine := db.GetEngine()
- // 获取市场信息
- markets, err := GetMarkets()
- if err != nil {
- return nil, err
- }
- // 委托状态
- orderStatus := "0" // 单据状态,为0的时候查询全部
- marketID := 0 // 我的订单包括一二级市场的单据,目前暂时由服务直接报相关类型的第一个市场
- switch myBuyStatus {
- case 1: // 抢购中 (一级市场)
- // 获取市场ID
- for _, v := range markets {
- if v.Trademode == 71 { // 预售挂牌
- marketID = int(v.Marketid)
- break
- }
- }
- orderStatus = "3,7"
- case 2: // 求购中(二级市场)
- // 获取市场ID
- for _, v := range markets {
- if v.Trademode == 16 { // 挂牌点选
- marketID = int(v.Marketid)
- break
- }
- }
- orderStatus = "3,7"
- case 3: // 已完成
- orderStatus = "8,9"
- }
- hybsMyBuyOrderDetails := make([]HybsMyBuyOrderDetail, 0)
- session := engine.Table("TRADE_ORDERDETAIL").
- Select(`TRADE_ORDERDETAIL.*,
- GOODS.GOODSNAME, GOODS.DECIMALPLACE,
- HSBY_GOODSEX.PICURLS,
- MARKET.TRADEMODE,
- ENUMDICITEM.PARAM2 CURRENCYSIGN`).
- Join("LEFT", "GOODS", "GOODS.GOODSID = TRADE_ORDERDETAIL.GOODSID").
- Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = GOODS.GOODSID").
- Join("LEFT", "ENUMDICITEM", "GOODS.CURRENCYID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'currency'").
- Join("LEFT", "MARKET", "MARKET.MARKETID = TRADE_ORDERDETAIL.MARKETID").
- Where("TRADE_ORDERDETAIL.ACCOUNTID = ?", accountID)
- // 是否过滤市场(抢购中、求购中)
- if marketID > 0 {
- session = session.And("TRADE_ORDERDETAIL.MARKETID = ?", marketID)
- }
- // 是否过滤状态(抢购中、求购中、已完成)
- if orderStatus != "0" {
- session = session.And(fmt.Sprintf("TRADE_ORDERDETAIL.ORDERSTATUS in (%s)", orderStatus))
- }
- if err := session.Find(&hybsMyBuyOrderDetails); err != nil {
- return nil, err
- }
- // 设置“我的订单”显示状态
- for i := range hybsMyBuyOrderDetails {
- detail := &hybsMyBuyOrderDetails[i]
- if detail.Trademode == 71 && (detail.Orderstatus == 3 || detail.Orderstatus == 7) {
- // 抢购中
- detail.MyBuyStatus = 1
- } else if detail.Trademode == 16 && (detail.Orderstatus == 3 || detail.Orderstatus == 7) {
- // 求购中
- detail.MyBuyStatus = 2
- } else if detail.Orderstatus == 8 || detail.Orderstatus == 9 {
- // 已完成
- detail.MyBuyStatus = 3
- } else if detail.Orderstatus == 6 {
- // 已撤销
- detail.MyBuyStatus = 4
- } else if detail.Orderstatus == 4 {
- // 委托失败
- detail.MyBuyStatus = 5
- }
- }
- return hybsMyBuyOrderDetails, nil
- }
|