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.
276 lines
11 KiB
276 lines
11 KiB
package dao |
|
|
|
import ( |
|
"context" |
|
xsql "database/sql" |
|
"fmt" |
|
|
|
"go-common/app/service/main/vip/model" |
|
"go-common/library/database/sql" |
|
"go-common/library/xstr" |
|
|
|
"github.com/pkg/errors" |
|
) |
|
|
|
const ( |
|
_vipOrderListSQL = "SELECT id,order_no,app_id,platform,order_type,mid,to_mid,buy_months,money,refund_amount,status,pay_type,recharge_bp,third_trade_no,ver,payment_time,ctime,mtime,app_sub_id FROM vip_pay_order WHERE mid = ? AND status = ? ORDER BY id DESC LIMIT ?,?;" |
|
_vipOrderCountSQL = "SELECT COUNT(1) FROM vip_pay_order WHERE mid = ? AND status = ? ORDER BY id desc;" |
|
_getOrderInfoSQL = "SELECT id,order_no, app_id,platform,order_type,mid,to_mid,buy_months,money,refund_amount,status,pay_type,recharge_bp,third_trade_no,payment_time,ver,ctime,mtime,app_sub_id FROM `vip_pay_order` WHERE `order_no` = ?;" |
|
_discountSQL = "SELECT mid,discount_id,status FROM vip_user_discount_history where mid=? AND discount_id = ? AND status = 1 " |
|
_allPriceMapping = "SELECT id,month_id,month_type,money,selected,first_discount_money,discount_money,start_time,end_time,remark,operator,mtime FROM vip_month_price WHERE month_id = ? AND month_type = ? LIMIT 1;" |
|
_insertPayOrder = "INSERT INTO vip_pay_order(order_no,app_id,platform,order_type,mid,to_mid,buy_months,money,status,pay_type,recharge_bp,third_trade_no,app_sub_id,coupon_money,pid,user_ip)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);" |
|
_allMonthOrderSQL = "SELECT id,month,month_type,operator,status,deleted,mtime FROM vip_month where deleted = 0 AND status = 1 ORDER BY month " |
|
_updateOrderStatusSQL = "UPDATE vip_pay_order SET status = ?,pay_type = ?,third_trade_no = ? WHERE order_no = ?;" |
|
_updatePayOrderSQL = "UPDATE vip_pay_order SET pay_type=?,third_trade_no=?,recharge_bp=?,ver=? WHERE id = ? AND ver=? " |
|
_updateIosPayOrderSQL = "UPDATE vip_pay_order SET pay_type=?,third_trade_no=?,recharge_bp=?,ver=?,order_type=?,status=? WHERE id = ? AND ver=? " |
|
_updatePayOrderStatusSQL = "UPDATE vip_pay_order SET status = ? WHERE id = ? AND ver=?;" |
|
_addOrderLogSQL = "INSERT INTO vip_pay_order_log(order_no,refund_id,refund_amount,mid,status) VALUES(?,?,?,?,?);" |
|
_payOrderLastSQL = "SELECT id,order_no,app_id,platform,order_type,mid,to_mid,buy_months,money,refund_amount,status,pay_type,recharge_bp,third_trade_no,payment_time,ver,ctime,mtime,app_sub_id FROM vip_pay_order WHERE mid = %v AND status = %v AND order_type IN (%v) ORDER BY id DESC LIMIT 1 " |
|
_updatePayOrderRefundAmountSQL = "UPDATE vip_pay_order SET refund_amount=?,ver=? WHERE id=? AND ver=?" |
|
_selOldPayOrder = "SELECT order_no,app_id,order_type,mid,IFNULL(buy_months,0),money,IFNULL(pay_type,4),IFNULL(status,1),ver,IFNULL(platform,3),mtime,app_sub_id,pid,user_ip from vip_pay_order WHERE order_no = ?;" |
|
_selOrderLogSQL = "SELECT order_no,refund_id,mid,status FROM vip_pay_order_log WHERE order_no = ? AND refund_id = ? AND status = ?" |
|
) |
|
|
|
// BeginTran begin tran. |
|
func (d *Dao) BeginTran(c context.Context) (tx *sql.Tx, err error) { |
|
tx, err = d.db.Begin(c) |
|
return |
|
} |
|
|
|
//OrderCount order count. |
|
func (d *Dao) OrderCount(c context.Context, mid int64, status int8) (count int64, err error) { |
|
var row *sql.Row |
|
if row = d.db.QueryRow(c, _vipOrderCountSQL, mid, status); err != nil { |
|
err = errors.WithStack(err) |
|
d.errProm.Incr("query_db") |
|
return |
|
} |
|
if err = row.Scan(&count); err != nil { |
|
err = errors.WithStack(err) |
|
d.errProm.Incr("row_scan_db") |
|
return |
|
} |
|
return |
|
} |
|
|
|
// OrderList order list. |
|
func (d *Dao) OrderList(c context.Context, mid int64, status int8, pn, ps int) (res []*model.PayOrder, err error) { |
|
var rows *sql.Rows |
|
if rows, err = d.db.Query(c, _vipOrderListSQL, mid, status, (pn-1)*ps, ps); err != nil { |
|
err = errors.WithStack(err) |
|
d.errProm.Incr("query_db") |
|
return |
|
} |
|
defer rows.Close() |
|
for rows.Next() { |
|
r := new(model.PayOrder) |
|
if err = rows.Scan(&r.ID, &r.OrderNo, &r.AppID, &r.Platform, &r.OrderType, &r.Mid, &r.ToMid, &r.BuyMonths, &r.Money, &r.RefundAmount, &r.Status, &r.PayType, &r.RechargeBp, |
|
&r.ThirdTradeNo, &r.Ver, &r.PaymentTime, &r.Ctime, &r.Mtime, &r.AppSubID); err != nil { |
|
err = errors.WithStack(err) |
|
d.errProm.Incr("row_scan_db") |
|
res = nil |
|
return |
|
} |
|
res = append(res, r) |
|
} |
|
err = rows.Err() |
|
return |
|
} |
|
|
|
//OrderInfo select order by order no. |
|
func (d *Dao) OrderInfo(c context.Context, orderNo string) (r *model.OrderInfo, err error) { |
|
var row = d.db.QueryRow(c, _getOrderInfoSQL, orderNo) |
|
r = new(model.OrderInfo) |
|
if err = row.Scan(&r.ID, &r.OrderNo, &r.AppID, &r.Platform, &r.OrderType, &r.Mid, &r.ToMid, &r.BuyMonths, &r.Money, &r.RefundAmount, &r.Status, &r.PayType, |
|
&r.RechargeBP, &r.ThirdTradeNo, &r.PaymentTime, &r.Ver, &r.Ctime, &r.Mtime, &r.AppSubID); err != nil { |
|
if err == sql.ErrNoRows { |
|
r = nil |
|
err = nil |
|
} else { |
|
err = errors.WithStack(err) |
|
d.errProm.Incr("row_scan_db") |
|
} |
|
} |
|
return |
|
} |
|
|
|
// DiscountSQL discount sql. |
|
func (d *Dao) DiscountSQL(c context.Context, mid int64, discountID int64) (dh *model.VipUserDiscountHistory, err error) { |
|
row := d.db.QueryRow(c, _discountSQL, mid, discountID) |
|
dh = new(model.VipUserDiscountHistory) |
|
if err = row.Scan(&dh.Mid, &dh.DiscountID, &dh.Status); err != nil { |
|
if err == sql.ErrNoRows { |
|
dh = nil |
|
err = nil |
|
} else { |
|
err = errors.WithStack(err) |
|
d.errProm.Incr("row_scan_db") |
|
} |
|
} |
|
return |
|
} |
|
|
|
//PriceMapping all price mapping. |
|
func (d *Dao) PriceMapping(c context.Context, monthID int64, platform int8) (r *model.PriceMapping, err error) { |
|
row := d.db.QueryRow(c, _allPriceMapping, monthID, platform) |
|
r = new(model.PriceMapping) |
|
if err = row.Scan(&r.ID, &r.MonthID, &r.MonthType, &r.Money, &r.Selected, &r.FirstDiscountMoney, &r.DiscountMoney, |
|
&r.StartTime, &r.EndTime, &r.Remark, &r.Operator, &r.Mtime); err != nil { |
|
if err == sql.ErrNoRows { |
|
err = nil |
|
r = nil |
|
} else { |
|
err = errors.WithStack(err) |
|
d.errProm.Incr("row_scan_db") |
|
} |
|
} |
|
return |
|
} |
|
|
|
// TxAddOrder tx add order. |
|
func (d *Dao) TxAddOrder(tx *sql.Tx, p *model.PayOrder) (id int64, err error) { |
|
var result xsql.Result |
|
if result, err = tx.Exec(_insertPayOrder, &p.OrderNo, &p.AppID, &p.Platform, &p.OrderType, &p.Mid, &p.ToMid, |
|
&p.BuyMonths, &p.Money, &p.Status, &p.PayType, &p.RechargeBp, &p.ThirdTradeNo, &p.AppSubID, &p.CouponMoney, &p.PID, &p.UserIP); err != nil { |
|
err = errors.WithStack(err) |
|
d.errProm.Incr("exec_db") |
|
return |
|
} |
|
|
|
if id, err = result.LastInsertId(); err != nil { |
|
err = errors.WithStack(err) |
|
|
|
} |
|
return |
|
} |
|
|
|
//AllMonthByOrder order by month. |
|
func (d *Dao) AllMonthByOrder(c context.Context, orderStr string) (res []*model.Month, err error) { |
|
var rows *sql.Rows |
|
if rows, err = d.db.Query(c, _allMonthOrderSQL+orderStr); err != nil { |
|
err = errors.WithStack(err) |
|
d.errProm.Incr("query_db") |
|
return |
|
} |
|
defer rows.Close() |
|
for rows.Next() { |
|
r := new(model.Month) |
|
if err = rows.Scan(&r.ID, &r.Month, &r.MonthType, &r.Operator, &r.Status, &r.Deleted, &r.Mtime); err != nil { |
|
err = errors.WithStack(err) |
|
d.errProm.Incr("row_scan_db") |
|
res = nil |
|
return |
|
} |
|
res = append(res, r) |
|
} |
|
err = rows.Err() |
|
return |
|
} |
|
|
|
// TxUpdateOrderStatus update order status. |
|
func (d *Dao) TxUpdateOrderStatus(c context.Context, tx *sql.Tx, status int8, payType string, thirdTradeNO string, orderNO string) (err error) { |
|
if _, err = tx.Exec(_updateOrderStatusSQL, status, payType, thirdTradeNO, orderNO); err != nil { |
|
err = errors.WithStack(err) |
|
d.errProm.Incr("exec_db") |
|
return |
|
} |
|
return |
|
} |
|
|
|
//TxUpdatePayOrder . |
|
func (d *Dao) TxUpdatePayOrder(tx *sql.Tx, o *model.OrderInfo, ver int64) (err error) { |
|
if _, err = tx.Exec(_updatePayOrderSQL, o.PayType, o.ThirdTradeNo, o.RechargeBP, o.Ver, o.ID, ver); err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
return |
|
} |
|
|
|
//TxUpdateIosPayOrder . |
|
func (d *Dao) TxUpdateIosPayOrder(tx *sql.Tx, o *model.OrderInfo, ver int64) (err error) { |
|
if _, err = tx.Exec(_updateIosPayOrderSQL, o.PayType, o.ThirdTradeNo, o.RechargeBP, o.Ver, o.OrderType, o.Status, o.ID, ver); err != nil { |
|
err = errors.WithStack(err) |
|
} |
|
return |
|
} |
|
|
|
//TxUpdatePayOrderStatus . |
|
func (d *Dao) TxUpdatePayOrderStatus(tx *sql.Tx, status int8, id int64, ver int64) (a int64, err error) { |
|
var result xsql.Result |
|
if result, err = tx.Exec(_updatePayOrderStatusSQL, status, id, ver); err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
if a, err = result.RowsAffected(); err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
return |
|
} |
|
|
|
//TxAddOrderLog . |
|
func (d *Dao) TxAddOrderLog(tx *sql.Tx, arg *model.VipPayOrderLog) (err error) { |
|
if _, err = tx.Exec(_addOrderLogSQL, arg.OrderNo, arg.RefundID, arg.RefundAmount, arg.Mid, arg.Status); err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
return |
|
} |
|
|
|
//PayOrderLast . |
|
func (d *Dao) PayOrderLast(c context.Context, mid int64, status int8, orderTypes ...int64) (r *model.PayOrder, err error) { |
|
row := d.db.QueryRow(c, fmt.Sprintf(_payOrderLastSQL, mid, status, xstr.JoinInts(orderTypes))) |
|
r = new(model.PayOrder) |
|
if err = row.Scan(&r.ID, &r.OrderNo, &r.AppID, &r.Platform, &r.OrderType, &r.Mid, &r.ToMid, &r.BuyMonths, &r.Money, &r.RefundAmount, &r.Status, &r.PayType, |
|
&r.RechargeBp, &r.ThirdTradeNo, &r.PaymentTime, &r.Ver, &r.Ctime, &r.Mtime, &r.AppSubID); err != nil { |
|
if err == sql.ErrNoRows { |
|
r = nil |
|
err = nil |
|
} else { |
|
err = errors.WithStack(err) |
|
d.errProm.Incr("row_scan_db") |
|
} |
|
} |
|
return |
|
} |
|
|
|
//SelOldPayOrder sel old payorder |
|
func (d *Dao) SelOldPayOrder(c context.Context, orderNo string) (r *model.VipPayOrderOld, err error) { |
|
var row = d.olddb.QueryRow(c, _selOldPayOrder, orderNo) |
|
r = new(model.VipPayOrderOld) |
|
if err = row.Scan(&r.OrderNo, &r.AppID, &r.OrderType, &r.Mid, &r.BuyMonths, &r.Money, &r.PayType, &r.Status, &r.Ver, &r.Platform, &r.PaymentTime, &r.AppSubID, &r.PID, &r.UserIP); err != nil { |
|
if err == sql.ErrNoRows { |
|
r = nil |
|
err = nil |
|
} else { |
|
err = errors.WithStack(err) |
|
d.errProm.Incr("row_scan_db") |
|
} |
|
} |
|
return |
|
} |
|
|
|
// SelPayOrderLog sel pay order log. |
|
func (d *Dao) SelPayOrderLog(c context.Context, orderNo, refundID string, status int8) (res *model.VipPayOrderLog, err error) { |
|
row := d.db.QueryRow(c, _selOrderLogSQL, orderNo, refundID, status) |
|
res = new(model.VipPayOrderLog) |
|
if err = row.Scan(&res.OrderNo, &res.RefundID, &res.Mid, &res.Status); err != nil { |
|
if err == sql.ErrNoRows { |
|
res = nil |
|
err = nil |
|
return |
|
} |
|
err = errors.WithStack(err) |
|
d.errProm.Incr("row_scan_db") |
|
} |
|
return |
|
} |
|
|
|
//TxUpdatePayOrderRefundAmount update payorder refund amount |
|
func (d *Dao) TxUpdatePayOrderRefundAmount(tx *sql.Tx, id int64, refundAmount float64, ver, oldVer int64) (err error) { |
|
if _, err = tx.Exec(_updatePayOrderRefundAmountSQL, refundAmount, ver, id, oldVer); err != nil { |
|
err = errors.WithStack(err) |
|
d.errProm.Incr("tx_db") |
|
} |
|
return |
|
}
|
|
|