印度包网
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.

114 lines
2.9 KiB

2 months ago
package customer
import (
"fmt"
"math/rand"
"server/common"
"server/config"
"server/db"
"server/modules/customer/bdb"
"server/modules/customer/values"
"server/util"
"time"
"github.com/liangdas/mqant/log"
)
func StartTimer() {
count := config.GetConfig().Customer.MaxOrderCount
if count > 0 {
MaxOrderCount = count
}
CustomerOrderAssignTimer()
}
const (
// MaxOrderCount = 10 // 暂定客诉最大同时分配支付订单数
)
var (
MaxOrderCount int64 = 10
)
func CustomerOrderAssignTimer() {
time.AfterFunc(2*time.Second, func() {
defer func() {
CustomerOrderAssignTimer()
}()
users := []*values.User{}
bdb.BackDB.QueryAll(fmt.Sprintf("role = %d and online = 1", values.UserRole2), "", &values.User{}, &users)
if len(users) == 0 {
return
}
orderCount := map[int]int64{}
uids := []int{}
for _, v := range users {
list := []common.CustomerOrder{}
count, _ := db.Mysql().QueryList(0, 100, fmt.Sprintf(`customer_uid = %d and status = %d and order_id <> ""`, v.ID, common.CustomerOrderCreate),
"", &common.CustomerOrder{}, &list)
orderCount[int(v.ID)] = count
uids = append(uids, int(v.ID))
}
rechargeList := []common.CustomerOrder{}
db.Mysql().QueryList(0, 100, fmt.Sprintf(`status = %d and order_id <> ""`, common.CustomerOrderCreate), "", &common.CustomerOrder{}, &rechargeList)
normalList := []common.CustomerOrder{}
db.Mysql().QueryList(0, 100, fmt.Sprintf(`status = %d`, common.CustomerOrderCreate), "", &common.CustomerOrder{}, &normalList)
if len(rechargeList) == 0 && len(normalList) == 0 {
return
}
begin := time.Now()
// log.Debug("start CustomerOrderAssignTimer......")
count := 0
now := time.Now().Unix()
// 先分配充值订单
for _, v := range rechargeList {
if util.SliceContain(uids, v.CustomerUid) {
continue
}
indexs := rand.Perm(len(users))
var u *values.User
for _, l := range indexs {
diff := MaxOrderCount - orderCount[int(users[l].ID)]
if diff <= 0 {
continue
}
u = users[l]
break
}
if u == nil {
break
}
orderCount[int(u.ID)]++
db.Mysql().Update(&common.CustomerOrder{ID: v.ID}, map[string]interface{}{"customer_uid": u.ID, "assign_time": now})
count++
}
for _, v := range normalList {
if util.SliceContain(uids, v.CustomerUid) {
continue
}
indexs := rand.Perm(len(users))
var u *values.User
for _, l := range indexs {
diff := MaxOrderCount - orderCount[int(users[l].ID)]
if diff <= 0 {
continue
}
u = users[l]
break
}
if u == nil {
break
}
orderCount[int(u.ID)]++
db.Mysql().Update(&common.CustomerOrder{ID: v.ID}, map[string]interface{}{"customer_uid": u.ID, "assign_time": now})
count++
}
if count > 0 {
log.Debug("finish CustomerOrderAssignTimer since:%v,rechargeList:%d,normalList:%d,count:%d", time.Since(begin), len(rechargeList), len(normalList), count)
}
})
}