package auction_service import ( "errors" "github.com/ouxuanserver/osmanthuswine/src/core" "hudongzhuanjia/models" "hudongzhuanjia/utils/define" "strconv" "time" ) func GetCurrentAuction(aid, rid, uid int64) (map[string]interface{}, error) { auction := new(models.NewAuctionActivity) exist, err := auction.GetCurrent(aid) if err != nil { return nil, err } if !exist { return nil, errors.New("轮次尚未开启") } // 计算当前价格 和 当前数量 if auction.AuctionModel == define.INCR_AUCTION { // 加价竞拍 最高价格 history := new(models.AuctionHistory) exist, err = history.GetHighestMoney(rid, auction.Id) if err != nil { return nil, err } if !exist { auction.CurrentMoney = auction.StartPrice } else { auction.CurrentMoney = history.Money } } else { // 初始价格 - (竞拍时长 - (竞拍结束时间 - 现在时间)) * 减价速率 if auction.AuctionEndTime == 0 { auction.CurrentMoney = auction.StartPrice } else { duration, _ := strconv.ParseInt(auction.AuctionDuration, 10, 64) reduceRate, _ := strconv.ParseInt(auction.ReduceRate, 10, 64) money := auction.StartPrice - float64((duration-(auction.AuctionEndTime-time.Now().Unix()))*reduceRate) auction.CurrentMoney = money } record := new(models.AuctionResultRecord) count, err := record.CountHistory(rid, aid) if err != nil { return nil, err } auction.GoodsNum -= int(count) } player := new(models.AuctionPlayer) exist, err = player.GetByAuctionIdAndUid(auction.Id, uid, rid) if err != nil { return nil, err } if !exist { // 领取号码, 开启事务: 获取人数和写入人数 保证原子性 session := core.GetXormAuto().NewSession() if session.Begin(); err != nil { // 开启事务 return nil, err } num, err := session.Where("is_delete=0 and auction_activity_id=? and rehearsal_id=?", auction.Id, rid).Count(player) if err != nil { session.Rollback() return nil, err } player.AuctionActivityId = auction.Id player.UserId = uid player.RehearsalId = rid player.Code = num + 1 player.UpdatedAt = time.Now() player.CreatedAt = time.Now() _, err = session.Insert(player) if err != nil { session.Rollback() return nil, err } session.Commit() } return map[string]interface{}{ "auction": auction, "player": player, }, nil } type UserAuctionsResult struct { Id int64 `json:"id"` AuctionActivityId int64 `json:"auction_activity_id"` AuctionGoodsName string `json:"auction_goods_name"` GoodsPicUrl string `json:"goods_pic_url"` DealPrice float64 `json:"deal_price"` Unit int64 `json:"unit"` } func GetUserAuctions(activityId, rehearsalId, userId int64) ([]*UserAuctionsResult, error) { records := make([]*UserAuctionsResult, 0) err := core.GetXormAuto().Table(new(models.AuctionResultRecord)).Alias("r"). Select("r.id, a.id as auction_activity_id, a.auction_goods_name, a.goods_pic_url, r.deal_price, a.unit"). Join("LEFT", new(models.NewAuctionActivity).Alias("a"), "a.id=r.auction_activity_id and a.is_delete=0"). Where("r.is_delete=0 and r.activity_id=? and r.user_id=? and r.rehearsal_id=?", activityId, userId, rehearsalId).Desc("r.created_at").Find(&records) return records, err }