Browse Source

ADD 共富制度

tags/v1.1.5
DengBiao 2 years ago
parent
commit
392ce6c29c
4 changed files with 117 additions and 8 deletions
  1. +1
    -0
      db/model/user_public_platoon_relation.go
  2. +0
    -5
      go.sum
  3. +8
    -3
      md/public_platoon_relate_commission.go
  4. +108
    -0
      rule/public_platoon_relate_commission.go

+ 1
- 0
db/model/user_public_platoon_relation.go View File

@@ -8,6 +8,7 @@ type UserPublicPlatoonRelation struct {
Id int `json:"id" xorm:"not null pk autoincr INT(11)"` Id int `json:"id" xorm:"not null pk autoincr INT(11)"`
Uid int `json:"uid" xorm:"not null default 0 comment('用户id') unique INT(11)"` Uid int `json:"uid" xorm:"not null default 0 comment('用户id') unique INT(11)"`
FatherUid string `json:"father_uid" xorm:"not null default '' comment('父级id(123456-563464-438384)') index VARCHAR(100)"` FatherUid string `json:"father_uid" xorm:"not null default '' comment('父级id(123456-563464-438384)') index VARCHAR(100)"`
Pid int `json:"pid" xorm:"not null default 0 comment('父级id') INT(11)"`
RecommendUid int `json:"recommend_uid" xorm:"not null default 0 comment('推荐人id') INT(11)"` RecommendUid int `json:"recommend_uid" xorm:"not null default 0 comment('推荐人id') INT(11)"`
Level int `json:"level" xorm:"not null default 1 comment('等级(整个系统)') INT(11)"` Level int `json:"level" xorm:"not null default 1 comment('等级(整个系统)') INT(11)"`
Position int `json:"position" xorm:"not null default 1 comment('当前等级上位置') INT(11)"` Position int `json:"position" xorm:"not null default 1 comment('当前等级上位置') INT(11)"`


+ 0
- 5
go.sum View File

@@ -71,8 +71,6 @@ github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgO
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg=
github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
@@ -98,9 +96,6 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/gomodule/redigo v1.8.8 h1:f6cXq6RRfiyrOJEV7p3JhLDlmawGBVBBP1MggY8Mo4E=
github.com/gomodule/redigo/redis v0.0.1 h1:tQQSZyg4O0N0Dh2hli1pOrRdj+WHl1xf3w/x7olDgu0=
github.com/gomodule/redigo/redis v0.0.1/go.mod h1:QhGMo2EGfdSsmrYDENZq12/Y23fRP6X6nyFZ4TGSUvM=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=


+ 8
- 3
md/public_platoon_relate_commission.go View File

@@ -11,11 +11,11 @@ type LvGrade struct {
} }


type PublicPlatoonRelateCommissionReq struct { type PublicPlatoonRelateCommissionReq struct {
Pvd string `json:"pvd"`
Pvd string `json:"pvd"` //平台供应商 (taobao/jd/pdd/mall_goods ...)
Uid string `json:"uid"` Uid string `json:"uid"`
UserLevel string `json:"user_level"`
UserLevel string `json:"user_level"` //用户等级
PendingAmount string `json:"pending_amount"` //待处理金额 PendingAmount string `json:"pending_amount"` //待处理金额
Oid string `json:"oid"`
Oid string `json:"oid"` //订单id
} }


type PublicPlatoonRelateCommissionResp struct { type PublicPlatoonRelateCommissionResp struct {
@@ -28,3 +28,8 @@ type PublicPlatoonRelateCommissionResp struct {
CommonWealthSystem map[string]string `json:"common_wealth_system"` // 共富制度奖励 CommonWealthSystem map[string]string `json:"common_wealth_system"` // 共富制度奖励
DirectPush map[string]string `json:"direct_push"` // 直推奖励 DirectPush map[string]string `json:"direct_push"` // 直推奖励
} }

type AddPublicPlatoonRelateCommissionReq struct {
Uid string `json:"uid"`
RecommendUid string `json:"recommend_uid"` //推荐人uid
}

+ 108
- 0
rule/public_platoon_relate_commission.go View File

@@ -2,14 +2,17 @@ package rule


import ( import (
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/db" "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/db"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/db/model"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md" "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md"
zhios_order_relate_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/utils" zhios_order_relate_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/utils"
zhios_order_relate_logx "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/utils/logx" zhios_order_relate_logx "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/utils/logx"
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
"math"
"strconv" "strconv"
"strings" "strings"
"time"
"xorm.io/xorm" "xorm.io/xorm"
) )


@@ -103,3 +106,108 @@ func BatchGetPublicPlatoonRelateCommissionByOrder(engine *xorm.Engine, masterId
} }
return resp, nil return resp, nil
} }

// AddPublicPlatoonRelateCommission 新增公排用户关系记录
func AddPublicPlatoonRelateCommission(engine *xorm.Engine, masterId string, AddPublicPlatoonRelateCommissionReqList []*md.AddPublicPlatoonRelateCommissionReq) (map[string]*model.UserPublicPlatoonRelation, error) {
var resp map[string]*model.UserPublicPlatoonRelation
//查找 `user_public_platoon_setting` 基础设置
userPublicPlatoonSetting, err := db.UserPublicPlatoonSettingGetOneByParams(engine, map[string]interface{}{
"key": "is_open",
"value": 1,
})
if err != nil {
return nil, err
}
for _, param := range AddPublicPlatoonRelateCommissionReqList {
res, err := publicPlatoon(engine, zhios_order_relate_utils.StrToInt(param.Uid), zhios_order_relate_utils.StrToInt(param.RecommendUid), *userPublicPlatoonSetting)
if err != nil {
return nil, err
}
resp[param.Uid] = &res
}
return resp, nil
}

/*
publicPlatoon 公排方法
TODO 相关公式:
1: 每个等级的起始值(1+5^0+5^1+5^2+...+5^x-2), 每个等级的结束值(`5^0+5^1+5^2+...+5^x-1)
2: 根据position查找pid { (position-1)/5 }
3: 根据position查找等级level {position-5^0-5^1-5^2-...-5^x 是否 <0 ? = x+1 }
*/
func publicPlatoon(engine *xorm.Engine, uid, recommendUid int, userPublicPlatoonSetting model.UserPublicPlatoonSetting) (model.UserPublicPlatoonRelation, error) {
var userPublicPlatoonRelation model.UserPublicPlatoonRelation
//1、 查找当前 user_public_platoon_relation 中 `position` 最大的记录
var m model.UserPublicPlatoonRelation
if has, err := engine.OrderBy("position desc").Get(&m); err != nil || has == false {
return userPublicPlatoonRelation, err
}

position := m.Position + 1
pid := makeSearchPid(position, userPublicPlatoonSetting.SeveralTimes)
var level float64
makeSearchLevel(&position, float64(userPublicPlatoonSetting.SeveralTimes), &level)
level = level + 1 //TODO::根据公式需要 + 1

//2、查找对应pid的 user_public_platoon_relation 记录
var m1 model.UserPublicPlatoonRelation
if has, err := engine.Where("uid=?", pid).Get(&m1); err != nil || has == false {
return userPublicPlatoonRelation, err
}
var fatherUid string
if m1.FatherUid == "" {
//TODO::顶级
fatherUid = zhios_order_relate_utils.IntToStr(m1.Uid)
} else {
fatherUid = zhios_order_relate_utils.IntToStr(m1.Uid) + "-" + m1.FatherUid
}

//唯一标识符(父级id-uid-等级-位置)
var uniqueIdentifier = zhios_order_relate_utils.IntToStr(pid) + zhios_order_relate_utils.IntToStr(uid) + zhios_order_relate_utils.Float64ToStr(level) + zhios_order_relate_utils.IntToStr(position)

// 3、插入 user_public_platoon_relation 记录
now := time.Now()
userPublicPlatoonRelation.Uid = uid
userPublicPlatoonRelation.FatherUid = fatherUid
userPublicPlatoonRelation.Pid = pid
userPublicPlatoonRelation.RecommendUid = recommendUid
userPublicPlatoonRelation.Level = int(level)
userPublicPlatoonRelation.Position = position
userPublicPlatoonRelation.UniqueIdentifier = uniqueIdentifier
userPublicPlatoonRelation.CreateAt = now
userPublicPlatoonRelation.UpdateAt = now
_, err := db.UserPublicPlatoonRelationInsert(engine, &userPublicPlatoonRelation)
if err != nil {
return model.UserPublicPlatoonRelation{}, err
}
return userPublicPlatoonRelation, nil
}

//递归查找等级
func makeSearchLevel(position *int, rows float64, times *float64) (level int) {
difference := *position - int(math.Pow(rows, *times))
if difference <= 0 {
return int(*times)
} else {
position = &difference
*times++
return makeSearchLevel(position, rows, times)
}
}

//查找归属父级id
func makeSearchPid(position int, row int) (pid int) {
divisionValue := (position - 1) / row
if divisionValue == 0 {
pid = 1
return
} else {
if (divisionValue*row + 1) == position {
pid = divisionValue
return
} else {
pid = divisionValue + 1
return
}
}
}

Loading…
Cancel
Save