123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- package dao
- import (
- "context"
- "database/sql"
- "encoding/json"
- "fmt"
- "go-common/app/service/openplatform/ticket-sales/model"
- "go-common/library/cache/redis"
- xsql "go-common/library/database/sql"
- "go-common/library/log"
- )
- const (
- //insert
- _createPromo = "insert into promotion (promo_id,type,item_id,sku_id,extra,expire_sec,sku_count,amount,buyer_count,begin_time,end_time,status,priv_sku_id,usable_coupons) values(?,?,?,?,?,?,?,?,?,?,?,1,?,?)"
- //update
- _operatePromo = "update promotion set status = ? where promo_id = ? and status= ?"
- _updatePromoBuyerCount = "update promotion set buyer_count = buyer_count + ? where promo_id ="
- _updatePromo = "update promotion set amount = %v,expire_sec = %v,sku_count = %v,begin_time = %v,end_time = %v,priv_sku_id = %v,usable_coupons = '%v' where promo_id = %v"
- //select
- _promo = "select promo_id,type,item_id,sku_id,extra,expire_sec,sku_count,amount,buyer_count,begin_time,end_time,status,ctime,mtime,priv_sku_id,usable_coupons from promotion where promo_id = ?"
- _selctPromoBySKU = "select count(*) as num from promotion where end_time >= ? and begin_time <= ? and sku_id = ? and status = 1"
- _getPromoList = "select promo_id,type,item_id,sku_id,extra,expire_sec,sku_count,amount,buyer_count,begin_time,end_time,status,ctime,mtime,priv_sku_id,usable_coupons from promotion ? order by mtime desc limit ?,?"
- )
- //keyPromo 获取活动缓存key
- func keyPromo(promoID int64) string {
- return fmt.Sprintf(model.CacheKeyPromo, promoID)
- }
- //RawPromo get promo info from db
- func (d *Dao) RawPromo(c context.Context, promoID int64) (res *model.Promotion, err error) {
- res = new(model.Promotion)
- row := d.db.QueryRow(c, _promo, promoID)
- if err = row.Scan(&res.PromoID, &res.Type, &res.ItemID, &res.SKUID, &res.Extra, &res.ExpireSec, &res.SKUCount, &res.Amount, &res.BuyerCount, &res.BeginTime, &res.EndTime, &res.Status, &res.Ctime, &res.Mtime, &res.PrivSKUID, &res.UsableCoupons); err != nil {
- if err == sql.ErrNoRows {
- err = nil
- res = nil
- }
- return
- }
- return
- }
- //CachePromo get promo info from cache
- func (d *Dao) CachePromo(c context.Context, promoID int64) (res *model.Promotion, err error) {
- var (
- data []byte
- key = keyPromo(promoID)
- )
- conn := d.redis.Get(c)
- defer conn.Close()
- if data, err = redis.Bytes(conn.Do("GET", key)); err != nil {
- if err == redis.ErrNil {
- err = nil
- }
- return
- }
- json.Unmarshal(data, &res)
- return
- }
- //AddCachePromo add promo info into cache
- func (d *Dao) AddCachePromo(c context.Context, promoID int64, promo *model.Promotion) (err error) {
- var (
- data []byte
- key = keyPromo(promoID)
- )
- conn := d.redis.Get(c)
- defer conn.Close()
- if data, err = json.Marshal(promo); err != nil {
- return
- }
- conn.Do("SET", key, data, "EX", model.RedisExpirePromo)
- return
- }
- //DelCachePromo delete promo cache
- func (d *Dao) DelCachePromo(c context.Context, promoID int64) {
- var key = keyPromo(promoID)
- conn := d.redis.Get(c)
- defer conn.Close()
- conn.Do("DEL", key)
- }
- //CreatePromo create user promo order
- func (d *Dao) CreatePromo(c context.Context, promo *model.Promotion) (id int64, err error) {
- if _, err = d.db.Exec(c, _createPromo, promo.PromoID, promo.Type, promo.ItemID, promo.SKUID, promo.Extra, promo.ExpireSec, promo.SKUCount, promo.Amount, promo.BuyerCount, promo.BeginTime, promo.EndTime, promo.PrivSKUID, promo.UsableCoupons); err != nil {
- log.Warn("创建拼团活动失败:%d", promo.PromoID)
- return
- }
- id = promo.PromoID
- return
- }
- //OperatePromo 修改拼团活动状态
- func (d *Dao) OperatePromo(c context.Context, promoID int64, fromStatus int16, toStatus int16) (num int64, err error) {
- var res sql.Result
- if res, err = d.db.Exec(c, _operatePromo, toStatus, promoID, fromStatus); err != nil {
- log.Warn("更新拼团状态失败:%d", promoID)
- return
- }
- num, err = res.RowsAffected()
- return
- }
- //HasPromoOfSKU 判断skuID是否有正在上架的拼团活动
- func (d *Dao) HasPromoOfSKU(c context.Context, skuID int64, beginTime int64, endTime int64) (num int64, err error) {
- var res *xsql.Row
- if res = d.db.QueryRow(c, _selctPromoBySKU, skuID, beginTime, endTime); err != nil {
- return
- }
- err = res.Scan(&num)
- return
- }
- //GetPromoList 获取拼团列表
- func (d *Dao) GetPromoList(c context.Context, where string, index int64, size int64) (res []*model.Promotion, err error) {
- var rows *xsql.Rows
- if rows, err = d.db.Query(c, _getPromoList, where, index, size); err != nil {
- return
- }
- defer rows.Close()
- for rows.Next() {
- r := new(model.Promotion)
- if err = rows.Scan(&r.PromoID, &r.Type, &r.ItemID, &r.SKUID, &r.Extra, &r.ExpireSec, &r.SKUCount, &r.Amount, &r.BuyerCount, &r.BeginTime, &r.EndTime, &r.Status, &r.Ctime, &r.Mtime, &r.PrivSKUID, &r.UsableCoupons); err != nil {
- return
- }
- res = append(res, r)
- }
- return
- }
- //TxUpdatePromoBuyerCount 更新活动的购买人数
- func (d *Dao) TxUpdatePromoBuyerCount(c context.Context, tx *xsql.Tx, promoID int64, count int64) (number int64, err error) {
- var res sql.Result
- if res, err = tx.Exec(_updatePromoBuyerCount, count, promoID); err != nil {
- return
- }
- return res.RowsAffected()
- }
- //UpdatePromo 更新拼团
- func (d *Dao) UpdatePromo(c context.Context, arg *model.Promotion) (num int64, err error) {
- var res sql.Result
- if res, err = d.db.Exec(c, fmt.Sprintf(_updatePromo, arg.Amount, arg.ExpireSec, arg.SKUCount, arg.BeginTime, arg.EndTime, arg.PrivSKUID, arg.UsableCoupons, arg.PromoID)); err != nil {
- log.Warn("更新拼团活动%d失败", arg.PromoID)
- return
- }
- return res.RowsAffected()
- }
|