127 lines
3.4 KiB
Go
127 lines
3.4 KiB
Go
|
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)
|
||
|
}
|