diff --git a/api/errcode/errcode.go b/api/errcode/errcode.go index 118a9f79..c3133310 100644 --- a/api/errcode/errcode.go +++ b/api/errcode/errcode.go @@ -214,6 +214,7 @@ const ( ErrCodeVasNoEnoughWithdrawDias ErrCode = -7019 // 参数错误 ErrCodeVasInvalidVerifycode ErrCode = -7020 // 提现验证码错误 ErrCodeVasAlipayUniTransferFail ErrCode = -7021 // 支付宝提现失败 + ErrCodeVasOverTodayWithdrawCnt ErrCode = -7022 // 今天提现次数到达上限 // Moment: 8xxx ErrCodeMomentSrvOk ErrCode = ErrCodeOk diff --git a/api/errs/error.go b/api/errs/error.go index 43799edd..80e88a7a 100644 --- a/api/errs/error.go +++ b/api/errs/error.go @@ -40,6 +40,7 @@ var ErrEcMap = map[error]errcode.ErrCode{ ErrVasInvalidParam: errcode.ErrCodeVasInvalidParam, ErrVasNoEnoughWithdrawDias: errcode.ErrCodeVasNoEnoughWithdrawDias, ErrVasAlipayUniTransferFail: errcode.ErrCodeVasAlipayUniTransferFail, + ErrVasOverTodayWithdrawCnt: errcode.ErrCodeVasOverTodayWithdrawCnt, } var ( @@ -60,4 +61,5 @@ var ( ErrVasInvalidParam = errors.New("invalid param") ErrVasNoEnoughWithdrawDias = errors.New("no enough withdraw dias") ErrVasAlipayUniTransferFail = errors.New("alipay uni transfer fail") + ErrVasOverTodayWithdrawCnt = errors.New("over today withdraw cnt") ) diff --git a/app/mix/controller/vas.go b/app/mix/controller/vas.go index 2c4f4787..763c2294 100644 --- a/app/mix/controller/vas.go +++ b/app/mix/controller/vas.go @@ -8,6 +8,7 @@ import ( "service/bizcommon/common" "service/bizcommon/util" "service/library/logger" + "time" ) // 获取充值商品 @@ -237,6 +238,17 @@ func WithdrawSendVerifycode(ctx *gin.Context) { // 提现申请 func WithdrawApply(ctx *gin.Context) { req := ctx.MustGet("client_req").(*vasproto.WithdrawApplyReq) + if req.Diamonds < 2000 { + ReplyErrorMsg(ctx, "最低提现金额不能小于200元") + return + } + if req.Diamonds > 20000 { + ReplyErrorMsg(ctx, "最大提现金额不能大于2000元") + return + } + + time.Sleep(time.Second * 1) + data, ec := service.DefaultService.WithdrawApply(ctx, req) if ec != errcode.ErrCodeVasSrvOk { logger.Error("WithdrawApply fail, req: %v, data: %v, ec: %v", util.ToJson(req), data, ec) diff --git a/app/mix/dao/mysql.go b/app/mix/dao/mysql.go index 5321967a..bd1296b3 100644 --- a/app/mix/dao/mysql.go +++ b/app/mix/dao/mysql.go @@ -594,6 +594,23 @@ func (m *Mysql) GetUCHList(ctx *gin.Context, tx *sqlx.Tx, mid int64, typ int32, return } +// 获取收入历史 +func (m *Mysql) GetIncomeCHList(ctx *gin.Context, tx *sqlx.Tx, orderId string) (list []*dbstruct.ConsumeHistory, err error) { + list = make([]*dbstruct.ConsumeHistory, 0) + tableName, err := m.ChTableName(&dbstruct.ConsumeHistory{Type: goproto.Int32(dbstruct.CHTypeIncome)}) + sqlStr := fmt.Sprintf("select * from %s where order_id=?", tableName) + if tx != nil { + err = tx.SelectContext(ctx, &list, sqlStr, orderId) + } else { + db := m.getDBVas() + err = db.SelectContext(ctx, &list, sqlStr, orderId) + } + if err != nil { + return + } + return +} + // 获取订单 func (m *Mysql) GetOrderCountGroupByStatus(ctx *gin.Context, tx *sqlx.Tx, orderStatuses []int32, ctStart *int64, ctEnd *int64) (list []*dbstruct.VasOrderStatusCount, err error) { var sql strings.Builder @@ -675,3 +692,23 @@ func (m *Mysql) UpdateWithdrawOrderStatus(ctx *gin.Context, tx *sqlx.Tx, orderId } return err } + +// 获取提现订单 +func (m *Mysql) GetWithdrawOrdersByMid(ctx *gin.Context, tx *sqlx.Tx, mid, st, et int64) (list []*dbstruct.WithdrawOrder, err error) { + list = make([]*dbstruct.WithdrawOrder, 0) + sqlStr := fmt.Sprintf("select * from %s where mid=? and apply_time>=? and apply_time 0 { + err = errs.ErrVasOverTodayWithdrawCnt + return + } + // todo 分布式锁 // 检查余额 @@ -1918,3 +1927,44 @@ func (v *Vas) WithdrawApply(ctx *gin.Context, req *vasproto.WithdrawApplyReq) (t } return } + +// 结算订单 +func (v *Vas) DealOneCoinOrder(ctx *gin.Context, coinOrder *dbstruct.CoinOrder) { + // 判断时间,小于7天不处理 + if time.Now().Unix()-coinOrder.GetCt() < 7*86400 { + logger.Info("DealOneCoinOrder ct fail, coinOrder: %v", coinOrder.ToString()) + return + } + if coinOrder.GetOrderStatus() >= dbstruct.VasCoinOrderStatusFinish { + logger.Info("DealOneCoinOrder status fail, coinOrder: %v", coinOrder.ToString()) + return + } + + // 开启事务 + tx, err := v.store.VasBegin(ctx) + if err != nil { + logger.Error("vas begin fail, err: %v", err) + return + } + defer func() { + if err != nil { + logger.Error("global err, coinOrder: %v, err: %v", util.ToJson(coinOrder), err) + } + errTx := v.store.DealTxCR(tx, err) + if errTx != nil { + logger.Error("DealTxCR fail, err: %v", errTx) + return + } + }() + + // 把金币订单对应的收入记录拿出来 + //chList, err := v.store.GetIncomeCHList(ctx, tx, coinOrder.GetID()) + //if err != nil { + // logger.Error("GetIncomeCHList fail, orderId: %v, err: %v", coinOrder.GetID(), err) + // return + //} + + // 更新钱包 + + // 更新订单状态 +} diff --git a/bizcommon/util/util.go b/bizcommon/util/util.go index 695df762..692d54fa 100644 --- a/bizcommon/util/util.go +++ b/bizcommon/util/util.go @@ -74,3 +74,10 @@ func GetHourStartTimeStamp(t time.Time) int64 { } return duetimecst.Unix() } + +// 获取今天0点 +func GetTodayZeroTime() time.Time { + currentTime := time.Now() + zeroTime := time.Date(currentTime.Year(), currentTime.Month(), currentTime.Day(), 0, 0, 0, 0, currentTime.Location()) + return zeroTime +} diff --git a/dbstruct/vas.sql b/dbstruct/vas.sql index e4c15922..49c70407 100644 --- a/dbstruct/vas.sql +++ b/dbstruct/vas.sql @@ -64,6 +64,7 @@ CREATE INDEX mid_ct ON vas_ch_charge (mid, ct); CREATE INDEX uid_ct ON vas_ch_charge (uid, ct); CREATE INDEX mid_ct ON vas_ch_income (mid, ct); CREATE INDEX uid_ct ON vas_ch_income (uid, ct); +CREATE INDEX ix_orderid ON vas_ch_income (order_id); CREATE INDEX mid_ct ON vas_ch_withdraw (mid, ct); CREATE INDEX uid_ct ON vas_ch_withdraw (uid, ct); @@ -99,6 +100,7 @@ CREATE TABLE `vas_coin_order` PRIMARY KEY (`id`) ); CREATE INDEX uid_product_id_status ON vas_coin_order (uid, product_id, order_status); +CREATE INDEX ix_ct ON vas_coin_order (ct); CREATE TABLE `vas_user_unlock` @@ -133,3 +135,4 @@ CREATE TABLE `vas_withdraw_order` `op_time` int DEFAULT NULL COMMENT 'op操作时间', PRIMARY KEY (`id`) ); +CREATE INDEX ix_mid_applytime ON vas_withdraw_order (mid, apply_time);