You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
3.4 KiB
126 lines
3.4 KiB
package dao |
|
|
|
import ( |
|
"bytes" |
|
"context" |
|
"fmt" |
|
|
|
"go-common/app/admin/main/coupon/model" |
|
"go-common/library/database/sql" |
|
|
|
"github.com/pkg/errors" |
|
) |
|
|
|
const ( |
|
_codeCountSQL = "SELECT COUNT(1) FROM bilibili_coupon.coupon_code WHERE 1=1 %s" |
|
_codeListSQL = "SELECT id,batch_token,state,code,mid,coupon_token,coupon_type,ver,ctime,mtime FROM coupon_code WHERE 1=1 %s %s" |
|
_codeBlockSQL = "UPDATE coupon_code SET state = ?, ver = ver +1 WHERE id = ? AND ver =?;" |
|
_codeByIDSQL = "SELECT id,batch_token,state,code,mid,coupon_token,coupon_type,ver,ctime,mtime FROM coupon_code WHERE id = ?" |
|
_batchAddCodeSQL = "INSERT IGNORE INTO coupon_code(batch_token,state,code,coupon_type)VALUES " |
|
) |
|
|
|
// CountCode coupon code count. |
|
func (d *Dao) CountCode(c context.Context, a *model.ArgCouponCode) (count int64, err error) { |
|
sql := fmt.Sprintf(_codeCountSQL, whereSQL(a)) |
|
if err = d.db.QueryRow(c, sql).Scan(&count); err != nil { |
|
err = errors.Wrapf(err, "dao code list") |
|
} |
|
return |
|
} |
|
|
|
// CodeList code list. |
|
func (d *Dao) CodeList(c context.Context, a *model.ArgCouponCode) (res []*model.CouponCode, err error) { |
|
listSQL := fmt.Sprintf(_codeListSQL, whereSQL(a), pageSQL(a.Pn, a.Ps)) |
|
var rows *sql.Rows |
|
if rows, err = d.db.Query(c, listSQL); err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
defer rows.Close() |
|
for rows.Next() { |
|
r := new(model.CouponCode) |
|
if err = rows.Scan(&r.ID, &r.BatchToken, &r.State, &r.Code, &r.Mid, &r.CouponToken, &r.CouponType, &r.Ver, &r.Ctime, &r.Mtime); err != nil { |
|
err = errors.WithStack(err) |
|
res = nil |
|
return |
|
} |
|
|
|
res = append(res, r) |
|
} |
|
err = rows.Err() |
|
return |
|
} |
|
|
|
// UpdateCodeBlock update code block. |
|
func (d *Dao) UpdateCodeBlock(c context.Context, a *model.CouponCode) (err error) { |
|
if _, err = d.db.Exec(c, _codeBlockSQL, a.State, a.ID, a.Ver); err != nil { |
|
err = errors.Wrapf(err, "dao update code block(%+v)", a) |
|
} |
|
return |
|
} |
|
|
|
// CodeByID code by id. |
|
func (d *Dao) CodeByID(c context.Context, id int64) (r *model.CouponCode, err error) { |
|
r = new(model.CouponCode) |
|
if err = d.db.QueryRow(c, _codeByIDSQL, id). |
|
Scan(&r.ID, &r.BatchToken, &r.State, &r.Code, &r.Mid, &r.CouponToken, &r.CouponType, &r.Ver, &r.Ctime, &r.Mtime); err != nil { |
|
if err == sql.ErrNoRows { |
|
r = nil |
|
err = nil |
|
return |
|
} |
|
err = errors.Wrapf(err, "dao query code by id") |
|
} |
|
return |
|
} |
|
|
|
// BatchAddCode batch add code. |
|
func (d *Dao) BatchAddCode(c context.Context, cs []*model.CouponCode) (err error) { |
|
var ( |
|
buf bytes.Buffer |
|
sql string |
|
) |
|
buf.WriteString(_batchAddCodeSQL) |
|
for _, v := range cs { |
|
buf.WriteString("('") |
|
buf.WriteString(v.BatchToken) |
|
buf.WriteString("',") |
|
buf.WriteString(fmt.Sprintf("%d", v.State)) |
|
buf.WriteString(",'") |
|
buf.WriteString(v.Code) |
|
buf.WriteString("',") |
|
buf.WriteString(fmt.Sprintf("%d", v.CouponType)) |
|
buf.WriteString("),") |
|
} |
|
sql = buf.String() |
|
if _, err = d.db.Exec(c, sql[0:len(sql)-1]); err != nil { |
|
err = errors.Wrapf(err, "dao insert codes") |
|
} |
|
return |
|
} |
|
|
|
func whereSQL(a *model.ArgCouponCode) (sql string) { |
|
if a == nil { |
|
return |
|
} |
|
if a.Mid > 0 { |
|
sql += " AND mid = " + fmt.Sprintf("%d", a.Mid) |
|
} |
|
if a.Code != "" { |
|
sql += " AND code = '" + a.Code + "'" |
|
} |
|
if a.BatchToken != "" { |
|
sql += " AND batch_token = '" + a.BatchToken + "'" |
|
} |
|
return sql |
|
} |
|
|
|
func pageSQL(pn, ps int) (sql string) { |
|
if pn <= 0 { |
|
pn = 1 |
|
} |
|
if ps <= 0 { |
|
ps = 20 |
|
} |
|
return " ORDER BY ID DESC LIMIT " + fmt.Sprintf("%d,%d", (pn-1)*ps, ps) |
|
}
|
|
|