소스 검색

提现加入redis队列处理

abiao 5 년 전
부모
커밋
aeb169a830

+ 6 - 0
go/gopath/src/fohow.com/apps/controllers/balance_controller/balance_controller.go

@@ -1,6 +1,8 @@
 package balance_controller
 
 import (
+	"fmt"
+	"fohow.com/apps/helpers"
 	// "crypto/md5"
 	// "encoding/hex"
 	"strconv"
@@ -180,6 +182,10 @@ func (self *BalanceController) TakeCash() {
 		o.ExpcPayAt = time.Now().Add(time.Minute * 5)
 		o.Save()
 	}
+	//提现成功加入提现处理队列
+	cashKey := helpers.GetAutoTakeCashList()
+	takeId := fmt.Sprintf("%d", o.Id)
+	helpers.ThrowInRedisList(cashKey, takeId)
 
 	self.Data["json"] = o
 	self.ServeJSON()

+ 2 - 1
go/gopath/src/fohow.com/apps/controllers/cron_controller/init.go

@@ -65,7 +65,8 @@ func (self *CronController) Cron() {
 func exec(name string) {
 	switch name {
 	case "take_cash": //提现
-		takeCash()
+		//takeCash()
+		autoTakeCash() //redis队列处理
 	case "orderReceiveAutomatically": //已发货订单7天自动收货
 		OrderReceiveAutomatically()
 	case "updateUserNicknameAndHead": //修复数据-只执行一次

+ 66 - 0
go/gopath/src/fohow.com/apps/controllers/cron_controller/sync_balance.go

@@ -3,7 +3,10 @@ package cron_controller
 import (
 	"crypto/md5"
 	"fmt"
+	"fohow.com/apps/helpers"
+	"github.com/go-redis/redis"
 	"io"
+	"strconv"
 	"time"
 
 	"fohow.com/apps/models/balance_model"
@@ -72,3 +75,66 @@ func takeCash() {
 		}
 	}
 }
+
+//自动提现打款的定时任务
+func autoTakeCash() {
+	db, err := beego.AppConfig.Int("AliRedisDb")
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return
+	}
+	client := redis.NewClient(&redis.Options{
+		Addr:     beego.AppConfig.String("AliRedisHost"),
+		Password: beego.AppConfig.String("AliRedisPwd"), //默认空密码
+		DB:       db,                                    //使用默认数据库
+	})
+	beego.BeeLogger.Info("take Cash Connect redis name (%s), pwd=%s", beego.AppConfig.String("AliRedisHost"), beego.AppConfig.String("AliRedisPwd"))
+	defer client.Close() //最后关闭
+	cashKey := helpers.GetAutoTakeCashList()
+	list, _ := client.LRange(cashKey, -1000, -1).Result()
+	for _, takeId := range list {
+		id, err := strconv.ParseInt(takeId, 10, 64)
+		if err != nil {
+			continue
+		}
+		//提现记录状态判断
+		cashRecord := balance_model.GetTakeCashOrderById(id, false)
+		//已支付或记录不存在,剔除队列
+		if cashRecord == nil || cashRecord.State == 1 {
+			helpers.ThrowOutRedisList(cashKey, takeId)
+			continue
+		}
+		//未审批或者不达处理时间不提现,则下次处理
+		if cashRecord.AuditState < 1 || cashRecord.ExpcPayAt.Unix() > time.Now().Unix() {
+			continue
+		}
+		//微信提现处理
+		wxUser := user_model.GetWxUserById(cashRecord.WxUId, false)
+		if wxUser == nil {
+			beego.BeeLogger.Error("Take cash wxUser[%d] is not exist", cashRecord.WxUId)
+			continue
+		}
+		user := user_model.GetUserById(wxUser.UserId, false)
+		if user == nil {
+			beego.BeeLogger.Error("Take cash User[%d] is not exist", wxUser.UserId)
+			continue
+		}
+		var check_state string
+		check_state = wx_mp.PAY_NO_CHECK
+		ret := wx_mp.Transfers(wxUser.Openid, cashRecord.Count, cashRecord.OrderId, check_state, user.RealName, "提现")
+		if ret["result_code"] == wx_mp.PAY_SUCCESS {
+			cashRecord.State = 1
+			cashRecord.TradeNo = ret["payment_no"]
+			// paiedAt, _ := time.Parse("2006-01-02 15:04:05", ret["payment_time"])
+			cashRecord.Remark = "提现已打款"
+			cashRecord.PaiedAt = time.Now().Unix()
+			cashRecord.Save()
+			//提现成功,剔除队列
+			helpers.ThrowOutRedisList(cashKey, takeId)
+		} else {
+			cashRecord.State = 2
+			cashRecord.Remark = ret["err_code_des"]
+			cashRecord.Save()
+		}
+	}
+}

+ 8 - 0
go/gopath/src/fohow.com/apps/helpers/redis_helper.go

@@ -83,6 +83,8 @@ func ThrowInRedisList(key, value string) {
 		beego.BeeLogger.Error("%s", err)
 		return
 	}
+	beego.BeeLogger.Info("throwin redis key (%s), value=%s", key, value)
+
 	client.LPush(key, value) //rpush则在尾部插入
 	return
 }
@@ -107,6 +109,7 @@ func ThrowOutRedisList(key, value string) {
 		return
 	}
 	client.LRem(key, 0, value)
+	beego.BeeLogger.Info("throwout redis key (%s), value=%s", key, value)
 	return
 }
 
@@ -118,3 +121,8 @@ func GetKeyByOrderId(orderId string) string {
 func GetOrderCancelList() string {
 	return fmt.Sprintf("mall:cancelorder")
 }
+
+//所有自动提现订单加入队列,自动提现
+func GetAutoTakeCashList() string {
+	return fmt.Sprintf("mall:takecash")
+}

+ 19 - 0
go/gopath/src/fohow.com/apps/models/balance_model/takecash.go

@@ -122,6 +122,25 @@ func GetTakeCashOrderByOId(oId string, useCache bool) *TakeCashOrder {
 	}
 }
 
+func GetTakeCashOrderById(id int64, useCache bool) *TakeCashOrder {
+	k := fmt.Sprintf("balance_model.GetTakeCashOrderById[%d]", id)
+	if useCache {
+		if order, ok := cache.Cache.Get(k).(*TakeCashOrder); ok {
+			return order
+		}
+	}
+	order := new(TakeCashOrder)
+	o := orm.NewOrm()
+	err := o.QueryTable(order).Filter("id", id).Limit(1).One(order)
+	if err != nil {
+		beego.Debug("GetTakeCashOrderById is not found err=[%s], id=%d", err, id)
+		return nil
+	} else {
+		cache.Cache.Put(k, order, 5*time.Minute)
+		return order
+	}
+}
+
 //获取某人的提现流列表
 func GetTakeCashOrderListByWxUId(wxUId, page, perPage int64, useCache bool) (list []*TakeCashOrder) {
 	k := fmt.Sprintf("balance_model.GetTakeCashOrderListByWxUId.wxUId(%d).page(%d).perPage(%d)", wxUId, page, perPage)