package dao import ( "context" xsql "database/sql" "fmt" "go-common/app/service/main/vip/model" "go-common/library/database/sql" "go-common/library/time" "github.com/pkg/errors" ) const ( _vipUserInfoByMid = "SELECT id,mid,vip_type,vip_pay_type,vip_status,pay_channel_id,vip_start_time,vip_overdue_time,annual_vip_overdue_time,ctime,mtime,vip_recent_time,ios_overdue_time,ver FROM vip_user_info WHERE mid = ?;" _updateVipStatusTypeSQL = "UPDATE `vip_user_info` SET `vip_status`=? AND `vip_type`=? WHERE `mid`=? ;" _vipChangeHistorySQL = "SELECT id,mid,change_type,change_time,days,operator_id,relation_id,batch_id,remark FROM vip_user_change_history WHERE mid=? ORDER BY change_time DESC" _changeHistoryCountSQL = "SELECT COUNT(1) FROM vip_user_change_history WHERE mid=?" _updateChannelIDSQL = "UPDATE vip_user_info SET pay_channel_id=?,ver=? WHERE mid=? AND ver=?" _dupUserDiscountSQL = "INSERT INTO vip_user_discount_history(mid,discount_id,order_no,status) VALUES(?,?,?,?) ON DUPLICATE KEY UPDATE order_no= VALUES(order_no) ,status = VALUES(status);" _updatePayTypeSQL = "UPDATE vip_user_info SET vip_pay_type = ?,ver=? WHERE mid =? AND ver=?" _selVipChangeHistoryByRelationIDSQL = "SELECT id,mid,change_type,change_time,days,operator_id,relation_id,batch_id,remark,ctime FROM vip_user_change_history WHERE relation_id=?" _InsertVipChangeHistory = "INSERT INTO vip_user_change_history(mid,change_type,change_time,days,operator_id,relation_id,batch_id,remark,batch_code_id) VALUES(?,?,?,?,?,?,?,?,?)" _SelVipUserInfoByMid = "SELECT id,mid,vip_type,vip_pay_type,vip_status,ver,vip_start_time,vip_overdue_time,annual_vip_overdue_time,ctime,mtime,vip_recent_time,ios_overdue_time FROM vip_user_info WHERE mid = ?" _InsertVipUserInfo = "INSERT INTO vip_user_info(mid,vip_type,vip_pay_type,vip_status,vip_start_time,vip_overdue_time,annual_vip_overdue_time,vip_recent_time) VALUES(?,?,?,?,?,?,?,?)" _addIosVipUserInfo = "INSERT INTO vip_user_info(mid,vip_type,vip_status,vip_start_time,ios_overdue_time) VALUES(?,?,?,?,?)" _UpdateVipUserInfoByID = "UPDATE vip_user_info SET vip_type=?,vip_pay_type=?,vip_status=?,vip_overdue_time=?,annual_vip_overdue_time=?,vip_recent_time=?,ver=? WHERE mid=? AND ver=?" _updateIosUserInfoSQL = "UPDATE vip_user_info SET ios_overdue_time=? WHERE mid = ?" _updateIosRenewUserInfoSQL = "UPDATE vip_user_info SET vip_pay_type=?,ver=?,pay_channel_id=? WHERE mid = ? AND ver=?" _addUserDiscount = "INSERT IGNORE INTO vip_user_discount_history(mid,discount_id,order_no,status) VALUES(?,?,?,?)" //refund _oldUpdateVipUserInfoByID = "UPDATE vip_user_info SET vip_type=?,vip_status=?,vip_overdue_time=?,annual_vip_overdue_time=?,ver=? WHERE id=? AND ver=?" _oldSelVipUserInfoByMid = "SELECT id,mid,vip_type,vip_status,ver,vip_start_time,vip_overdue_time,annual_vip_overdue_time,vip_recent_time,ios_overdue_time FROM vip_user_info WHERE mid = ?" _oldAddVipChangeHistory = "INSERT INTO vip_change_history(mid,change_type,change_time,days,operator_id,relation_id,batch_id,remark,batch_code_id) VALUES(?,?,?,?,?,?,?,?,?)" //sync _syncAddUser = "INSERT INTO vip_user_info(mid,vip_type,vip_pay_type,vip_status,vip_start_time,vip_overdue_time,annual_vip_overdue_time,vip_recent_time,ios_overdue_time,pay_channel_id,ver) VALUES(?,?,?,?,?,?,?,?,?,?,?)" _syncUpdateUser = "UPDATE vip_user_info SET vip_type=?,vip_pay_type=?,vip_status=?,vip_overdue_time=?,annual_vip_overdue_time=?,vip_recent_time=?,ios_overdue_time=?,pay_channel_id=?,ver=? WHERE mid=? AND ver=?" //clean job cache _cleanjobSQL = "UPDATE vip_user_info SET ver = ver + 1 WHERE mid=?" ) //VipInfo select user info by mid. func (d *Dao) VipInfo(c context.Context, mid int64) (r *model.VipInfoDB, err error) { var row = d.db.QueryRow(c, _vipUserInfoByMid, mid) r = new(model.VipInfoDB) if err = row.Scan(&r.ID, &r.Mid, &r.VipType, &r.VipPayType, &r.VipStatus, &r.PayChannelID, &r.VipStartTime, &r.VipOverdueTime, &r.AnnualVipOverdueTime, &r.Ctime, &r.Mtime, &r.VipRecentTime, &r.IosOverdueTime, &r.Ver); err != nil { if err == sql.ErrNoRows { r = nil err = nil } else { err = errors.WithStack(err) d.errProm.Incr("row_scan_db") } } return } // UpdateVipTypeAndStatus update vip type and status. func (d *Dao) UpdateVipTypeAndStatus(c context.Context, mid int64, vipStatus int32, vipType int32) (ret int64, err error) { var res xsql.Result if res, err = d.db.Exec(c, _updateVipStatusTypeSQL, vipStatus, vipType, mid); err != nil { err = errors.WithStack(err) d.errProm.Incr("exec_db") return } return res.RowsAffected() } //SelChangeHistoryCount . func (d *Dao) SelChangeHistoryCount(c context.Context, arg *model.ArgChangeHistory) (count int64, err error) { row := d.db.QueryRow(c, _changeHistoryCountSQL, arg.Mid) if err = row.Scan(&count); err != nil { if sql.ErrNoRows == err { err = nil count = 0 } err = errors.WithStack(err) } return } //SelChangeHistory . func (d *Dao) SelChangeHistory(c context.Context, arg *model.ArgChangeHistory) (vcs []*model.VipChangeHistory, err error) { SQLStr := _vipChangeHistorySQL if arg.Pn > 0 && arg.Ps > 0 { SQLStr += fmt.Sprintf(" LIMIT %d,%d", (arg.Pn-1)*arg.Ps, arg.Ps) } var rows *sql.Rows if rows, err = d.db.Query(c, SQLStr, arg.Mid); err != nil { err = errors.WithStack(err) d.errProm.Incr("query_db") return } defer rows.Close() for rows.Next() { r := new(model.VipChangeHistory) if rows.Scan(&r.ID, &r.Mid, &r.ChangeType, &r.ChangeTime, &r.Days, &r.OperatorID, &r.RelationID, &r.BatchID, &r.Remark); err != nil { err = errors.WithStack(err) d.errProm.Incr("row_scan_db") vcs = nil return } vcs = append(vcs, r) } err = rows.Err() return } //TxUpdateChannelID . func (d *Dao) TxUpdateChannelID(tx *sql.Tx, mid int64, payChannelID int32, ver int64, oldVer int64) (err error) { if _, err = tx.Exec(_updateChannelIDSQL, payChannelID, ver, mid, oldVer); err != nil { err = errors.WithStack(err) return } return } //TxDupUserDiscount . func (d *Dao) TxDupUserDiscount(tx *sql.Tx, mid, discountID int64, orderNo string, status int8) (err error) { if _, err = tx.Exec(_dupUserDiscountSQL, mid, discountID, orderNo, status); err != nil { err = errors.WithStack(err) return } return } //UpdatePayType . func (d *Dao) UpdatePayType(tx *sql.Tx, mid int64, payType int8, ver, oldVer int64) (a int64, err error) { var result xsql.Result if result, err = tx.Exec(_updatePayTypeSQL, payType, ver, mid, oldVer); err != nil { err = errors.WithStack(err) return } if a, err = result.RowsAffected(); err != nil { err = errors.WithStack(err) return } return } //SelVipChangeHistory select vip_change_history by relationId func (d *Dao) SelVipChangeHistory(c context.Context, relationID string) (r *model.VipChangeHistory, err error) { var row = d.db.QueryRow(c, _selVipChangeHistoryByRelationIDSQL, relationID) r = new(model.VipChangeHistory) if err = row.Scan(&r.ID, &r.Mid, &r.ChangeType, &r.ChangeTime, &r.Days, &r.OperatorID, &r.RelationID, &r.BatchID, &r.Remark, &r.Ctime); err != nil { if err == sql.ErrNoRows { r = nil err = nil } else { err = errors.WithStack(err) d.errProm.Incr("scan_error") } } return } //InsertVipChangeHistory insert vipChangeHistory func (d *Dao) InsertVipChangeHistory(tx *sql.Tx, r *model.VipChangeHistory) (id int64, err error) { var res xsql.Result if res, err = tx.Exec(_InsertVipChangeHistory, r.Mid, r.ChangeType, r.ChangeTime, r.Days, r.OperatorID, r.RelationID, r.BatchID, r.Remark, r.BatchCodeID); err != nil { err = errors.WithStack(err) } else { if id, err = res.LastInsertId(); err != nil { err = errors.WithStack(err) } } return } //TxSelVipUserInfo . func (d *Dao) TxSelVipUserInfo(tx *sql.Tx, mid int64) (r *model.VipInfoDB, err error) { var row = tx.QueryRow(_SelVipUserInfoByMid, mid) r = new(model.VipInfoDB) if err = row.Scan(&r.ID, &r.Mid, &r.VipType, &r.VipPayType, &r.VipStatus, &r.Ver, &r.VipStartTime, &r.VipOverdueTime, &r.AnnualVipOverdueTime, &r.Ctime, &r.Mtime, &r.VipRecentTime, &r.IosOverdueTime); err != nil { if err == sql.ErrNoRows { r = nil err = nil } else { err = errors.WithStack(err) } } return } // TxAddIosVipUserInfo tx add ios vip user info. func (d *Dao) TxAddIosVipUserInfo(tx *sql.Tx, r *model.VipInfoDB) (eff int64, err error) { var result xsql.Result if result, err = tx.Exec(_addIosVipUserInfo, r.Mid, r.VipType, r.VipStatus, r.VipStartTime, r.IosOverdueTime); err != nil { err = errors.WithStack(err) return } if eff, err = result.RowsAffected(); err != nil { err = errors.WithStack(err) } return } //InsertVipUserInfo insert vipUserInfo func (d *Dao) InsertVipUserInfo(tx *sql.Tx, r *model.VipInfoDB) (err error) { if _, err = tx.Exec(_InsertVipUserInfo, r.Mid, r.VipType, r.VipPayType, r.VipStatus, r.VipStartTime, r.VipOverdueTime, r.AnnualVipOverdueTime, r.VipRecentTime); err != nil { err = errors.WithStack(err) } return } //TxUpdateIosUserInfo update ios time func (d *Dao) TxUpdateIosUserInfo(tx *sql.Tx, iosTime time.Time, mid int64) (eff int64, err error) { var result xsql.Result if result, err = tx.Exec(_updateIosUserInfoSQL, iosTime, mid); err != nil { err = errors.WithStack(err) return } if eff, err = result.RowsAffected(); err != nil { err = errors.WithStack(err) } return } //TxUpdateIosRenewUserInfo . func (d *Dao) TxUpdateIosRenewUserInfo(tx *sql.Tx, paychannelID, ver, oldVer, mid int64, payType int8) (err error) { if _, err = tx.Exec(_updateIosRenewUserInfoSQL, payType, ver, paychannelID, mid, oldVer); err != nil { err = errors.WithStack(err) return } return } //UpdateVipUserInfo update vip user info by id func (d *Dao) UpdateVipUserInfo(tx *sql.Tx, r *model.VipInfoDB, ver int64) (a int64, err error) { var res xsql.Result if res, err = tx.Exec(_UpdateVipUserInfoByID, r.VipType, r.VipPayType, r.VipStatus, r.VipOverdueTime, r.AnnualVipOverdueTime, r.VipRecentTime, r.Ver, r.Mid, ver); err != nil { err = errors.WithStack(err) } else { if a, err = res.RowsAffected(); err != nil { err = errors.WithStack(err) } } return } // TxAddUserDiscount add user discount history. func (d *Dao) TxAddUserDiscount(tx *sql.Tx, r *model.VipUserDiscountHistory) (eff int64, err error) { var res xsql.Result if res, err = tx.Exec(_addUserDiscount, r.Mid, r.DiscountID, r.OrderNo, r.Status); err != nil { err = errors.WithStack(err) return } eff, err = res.RowsAffected() return } //SyncAddUser insert vipUserInfo func (d *Dao) SyncAddUser(tx *sql.Tx, r *model.VipInfoDB) (err error) { if _, err = tx.Exec(_syncAddUser, r.Mid, r.VipType, r.VipPayType, r.VipStatus, r.VipStartTime, r.VipOverdueTime, r.AnnualVipOverdueTime, r.VipRecentTime, r.IosOverdueTime, r.PayChannelID, r.Ver); err != nil { err = errors.WithStack(err) } return } //SyncUpdateUser insert vipUserInfo func (d *Dao) SyncUpdateUser(tx *sql.Tx, r *model.VipInfoDB, ver int64) (eff int64, err error) { var res xsql.Result if res, err = tx.Exec(_syncUpdateUser, r.VipType, r.VipPayType, r.VipStatus, r.VipOverdueTime, r.AnnualVipOverdueTime, r.VipRecentTime, r.IosOverdueTime, r.PayChannelID, r.Ver, r.Mid, ver); err != nil { err = errors.WithStack(err) return } if eff, err = res.RowsAffected(); err != nil { err = errors.WithStack(err) } return } //OldTxSelVipUserInfo . func (d *Dao) OldTxSelVipUserInfo(tx *sql.Tx, mid int64) (r *model.VipInfoDB, err error) { var row = tx.QueryRow(_oldSelVipUserInfoByMid, mid) r = new(model.VipInfoDB) if err = row.Scan(&r.ID, &r.Mid, &r.VipType, &r.VipStatus, &r.Ver, &r.VipStartTime, &r.VipOverdueTime, &r.AnnualVipOverdueTime, &r.VipRecentTime, &r.IosOverdueTime); err != nil { if err == sql.ErrNoRows { r = nil err = nil } else { err = errors.WithStack(err) } } return } //OldTxUpdateVipUserInfo . func (d *Dao) OldTxUpdateVipUserInfo(tx *sql.Tx, r *model.VipInfoDB, ver int64) (eff int64, err error) { var res xsql.Result if res, err = tx.Exec(_oldUpdateVipUserInfoByID, r.VipType, r.VipStatus, r.VipOverdueTime, r.AnnualVipOverdueTime, r.Ver, r.ID, ver); err != nil { err = errors.WithStack(err) return } eff, err = res.RowsAffected() return } //OldTxAddChangeHistory . func (d *Dao) OldTxAddChangeHistory(tx *sql.Tx, r *model.VipChangeHistory) (err error) { if _, err = tx.Exec(_oldAddVipChangeHistory, r.Mid, r.ChangeType, r.ChangeTime, r.Days, r.OperatorID, r.RelationID, r.BatchID, r.Remark, r.BatchCodeID); err != nil { err = errors.WithStack(err) } return } //CleanCache clean job cache. func (d *Dao) CleanCache(c context.Context, mid int64) (err error) { if _, err = d.db.Exec(c, _cleanjobSQL, mid); err != nil { err = errors.WithStack(err) } return }