Browse Source

ADD 共富制度

tags/v1.1.4
DengBiao 2 years ago
parent
commit
08591df2b7
6 changed files with 403 additions and 0 deletions
  1. +117
    -0
      db/db_user_public_platoon_relation.go
  2. +117
    -0
      db/db_user_public_platoon_setting.go
  3. +18
    -0
      db/model/user_public_platoon_relation.go
  4. +16
    -0
      db/model/user_public_platoon_setting.go
  5. +30
    -0
      md/public_platoon_relate_commission.go
  6. +105
    -0
      rule/public_platoon_relate_commission.go

+ 117
- 0
db/db_user_public_platoon_relation.go View File

@@ -0,0 +1,117 @@
package db

import (
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/db/model"
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"
"errors"
"fmt"
"reflect"
"xorm.io/xorm"
)

// BatchSelectUserPublicPlatoonRelations 批量查询数据 TODO::和下面的方法重复了,建议采用下面的 `UserPublicPlatoonRelationFindByParams` 方法
func BatchSelectUserPublicPlatoonRelations(Db *xorm.Engine, params map[string]interface{}) (*[]model.UserPublicPlatoonRelation, error) {
var UserPublicPlatoonRelationData []model.UserPublicPlatoonRelation
if err := Db.In(zhios_order_relate_utils.AnyToString(params["key"]), params["value"]).
Find(&UserPublicPlatoonRelationData); err != nil {
return nil, zhios_order_relate_logx.Warn(err)
}
return &UserPublicPlatoonRelationData, nil
}

// UserPublicPlatoonRelationInsert 插入单条数据
func UserPublicPlatoonRelationInsert(Db *xorm.Engine, UserPublicPlatoonRelation *model.UserPublicPlatoonRelation) (int, error) {
_, err := Db.InsertOne(UserPublicPlatoonRelation)
if err != nil {
return 0, err
}
return UserPublicPlatoonRelation.Id, nil
}

// BatchAddUserPublicPlatoonRelations 批量新增数据
func BatchAddUserPublicPlatoonRelations(Db *xorm.Engine, UserPublicPlatoonRelationData []*model.UserPublicPlatoonRelation) (int64, error) {
affected, err := Db.Insert(UserPublicPlatoonRelationData)
if err != nil {
return 0, err
}
return affected, nil
}

func GetUserPublicPlatoonRelationCount(Db *xorm.Engine) int {
var UserPublicPlatoonRelation model.UserPublicPlatoonRelation
session := Db.Where("")
count, err := session.Count(&UserPublicPlatoonRelation)
if err != nil {
return 0
}
return int(count)
}

// UserPublicPlatoonRelationDelete 删除记录
func UserPublicPlatoonRelationDelete(Db *xorm.Engine, id interface{}) (int64, error) {
if reflect.TypeOf(id).Kind() == reflect.Slice {
return Db.In("id", id).Delete(model.UserPublicPlatoonRelation{})
} else {
return Db.Where("id = ?", id).Delete(model.UserPublicPlatoonRelation{})
}
}

// UserPublicPlatoonRelationUpdate 更新记录
func UserPublicPlatoonRelationUpdate(Db *xorm.Engine, id interface{}, UserPublicPlatoonRelation *model.UserPublicPlatoonRelation, forceColums ...string) (int64, error) {
var (
affected int64
err error
)
if forceColums != nil {
affected, err = Db.Where("id=?", id).Cols(forceColums...).Update(UserPublicPlatoonRelation)
} else {
affected, err = Db.Where("id=?", id).Update(UserPublicPlatoonRelation)
}
if err != nil {
return 0, err
}
return affected, nil
}

// UserPublicPlatoonRelationGetOneByParams 通过传入的参数查询数据(单条)
func UserPublicPlatoonRelationGetOneByParams(Db *xorm.Engine, params map[string]interface{}) (*model.UserPublicPlatoonRelation, error) {
var m model.UserPublicPlatoonRelation
var query = fmt.Sprintf("%s =?", params["key"])
if has, err := Db.Where(query, params["value"]).Get(&m); err != nil || has == false {
return nil, zhios_order_relate_logx.Error(err)
}
return &m, nil
}

// UserPublicPlatoonRelationFindByParams 通过传入的参数查询数据(多条)
func UserPublicPlatoonRelationFindByParams(Db *xorm.Engine, params map[string]interface{}) (*[]model.UserPublicPlatoonRelation, error) {
var m []model.UserPublicPlatoonRelation
if params["value"] == nil {
return nil, errors.New("参数有误")
}
if params["key"] == nil {
//查询全部数据
err := Db.Find(&m)
if err != nil {
return nil, zhios_order_relate_logx.Error(err)
}
return &m, nil
} else {
if reflect.TypeOf(params["value"]).Kind() == reflect.Slice {
//指定In查询
if err := Db.In(zhios_order_relate_utils.AnyToString(params["key"]), params["value"]).Find(&m); err != nil {
return nil, zhios_order_relate_logx.Warn(err)
}
return &m, nil
} else {
var query = fmt.Sprintf("%s =?", params["key"])
err := Db.Where(query, params["value"]).Find(&m)
if err != nil {
return nil, zhios_order_relate_logx.Error(err)
}
return &m, nil
}

}
}

+ 117
- 0
db/db_user_public_platoon_setting.go View File

@@ -0,0 +1,117 @@
package db

import (
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/db/model"
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"
"errors"
"fmt"
"reflect"
"xorm.io/xorm"
)

// BatchSelectUserPublicPlatoonSettings 批量查询数据 TODO::和下面的方法重复了,建议采用下面的 `UserPublicPlatoonSettingFindByParams` 方法
func BatchSelectUserPublicPlatoonSettings(Db *xorm.Engine, params map[string]interface{}) (*[]model.UserPublicPlatoonSetting, error) {
var UserPublicPlatoonSettingData []model.UserPublicPlatoonSetting
if err := Db.In(zhios_order_relate_utils.AnyToString(params["key"]), params["value"]).
Find(&UserPublicPlatoonSettingData); err != nil {
return nil, zhios_order_relate_logx.Warn(err)
}
return &UserPublicPlatoonSettingData, nil
}

// UserPublicPlatoonSettingInsert 插入单条数据
func UserPublicPlatoonSettingInsert(Db *xorm.Engine, UserPublicPlatoonSetting *model.UserPublicPlatoonSetting) (int, error) {
_, err := Db.InsertOne(UserPublicPlatoonSetting)
if err != nil {
return 0, err
}
return UserPublicPlatoonSetting.Id, nil
}

// BatchAddUserPublicPlatoonSettings 批量新增数据
func BatchAddUserPublicPlatoonSettings(Db *xorm.Engine, UserPublicPlatoonSettingData []*model.UserPublicPlatoonSetting) (int64, error) {
affected, err := Db.Insert(UserPublicPlatoonSettingData)
if err != nil {
return 0, err
}
return affected, nil
}

func GetUserPublicPlatoonSettingCount(Db *xorm.Engine) int {
var UserPublicPlatoonSetting model.UserPublicPlatoonSetting
session := Db.Where("")
count, err := session.Count(&UserPublicPlatoonSetting)
if err != nil {
return 0
}
return int(count)
}

// UserPublicPlatoonSettingDelete 删除记录
func UserPublicPlatoonSettingDelete(Db *xorm.Engine, id interface{}) (int64, error) {
if reflect.TypeOf(id).Kind() == reflect.Slice {
return Db.In("id", id).Delete(model.UserPublicPlatoonSetting{})
} else {
return Db.Where("id = ?", id).Delete(model.UserPublicPlatoonSetting{})
}
}

// UserPublicPlatoonSettingUpdate 更新记录
func UserPublicPlatoonSettingUpdate(Db *xorm.Engine, id interface{}, UserPublicPlatoonSetting *model.UserPublicPlatoonSetting, forceColums ...string) (int64, error) {
var (
affected int64
err error
)
if forceColums != nil {
affected, err = Db.Where("id=?", id).Cols(forceColums...).Update(UserPublicPlatoonSetting)
} else {
affected, err = Db.Where("id=?", id).Update(UserPublicPlatoonSetting)
}
if err != nil {
return 0, err
}
return affected, nil
}

// UserPublicPlatoonSettingGetOneByParams 通过传入的参数查询数据(单条)
func UserPublicPlatoonSettingGetOneByParams(Db *xorm.Engine, params map[string]interface{}) (*model.UserPublicPlatoonSetting, error) {
var m model.UserPublicPlatoonSetting
var query = fmt.Sprintf("%s =?", params["key"])
if has, err := Db.Where(query, params["value"]).Get(&m); err != nil || has == false {
return nil, zhios_order_relate_logx.Error(err)
}
return &m, nil
}

// UserPublicPlatoonSettingFindByParams 通过传入的参数查询数据(多条)
func UserPublicPlatoonSettingFindByParams(Db *xorm.Engine, params map[string]interface{}) (*[]model.UserPublicPlatoonSetting, error) {
var m []model.UserPublicPlatoonSetting
if params["value"] == nil {
return nil, errors.New("参数有误")
}
if params["key"] == nil {
//查询全部数据
err := Db.Find(&m)
if err != nil {
return nil, zhios_order_relate_logx.Error(err)
}
return &m, nil
} else {
if reflect.TypeOf(params["value"]).Kind() == reflect.Slice {
//指定In查询
if err := Db.In(zhios_order_relate_utils.AnyToString(params["key"]), params["value"]).Find(&m); err != nil {
return nil, zhios_order_relate_logx.Warn(err)
}
return &m, nil
} else {
var query = fmt.Sprintf("%s =?", params["key"])
err := Db.Where(query, params["value"]).Find(&m)
if err != nil {
return nil, zhios_order_relate_logx.Error(err)
}
return &m, nil
}

}
}

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

@@ -0,0 +1,18 @@
package model

import (
"time"
)

type UserPublicPlatoonRelation struct {
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)"`
FatherUid string `json:"father_uid" xorm:"not null default '' comment('父级id(123456-563464-438384)') index VARCHAR(100)"`
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)"`
Position int `json:"position" xorm:"not null default 1 comment('当前等级上位置') INT(11)"`
UniqueIdentifier string `json:"unique_identifier" xorm:"not null default '' comment('唯一标识符(uid-推荐人id-等级-位置)') unique CHAR(100)"`
ReturnCommissionNum int `json:"return_commission_num" xorm:"not null default 0 comment('返佣次数') INT(11)"`
CreateAt time.Time `json:"create_at" xorm:"not null default 'CURRENT_TIMESTAMP' DATETIME"`
UpdateAt time.Time `json:"update_at" xorm:"not null default 'CURRENT_TIMESTAMP' DATETIME"`
}

+ 16
- 0
db/model/user_public_platoon_setting.go View File

@@ -0,0 +1,16 @@
package model

import (
"time"
)

type UserPublicPlatoonSetting struct {
Id int `json:"id" xorm:"not null pk autoincr INT(11)"`
IsOpen int `json:"is_open" xorm:"not null default 0 comment('是否开启(0:关闭 1:开启)') TINYINT(1)"`
SeveralTimes int `json:"several_times" xorm:"not null default 0 comment('几乘') TINYINT(3)"`
SeveralRows int `json:"several_rows" xorm:"not null default 0 comment('几排') TINYINT(3)"`
OriginatorUid int `json:"originator_uid" xorm:"not null default 0 comment('创始人uid') INT(11)"`
Ext string `json:"ext" xorm:"comment('拓展字段(json存储)') TEXT"`
CreateAt time.Time `json:"create_at" xorm:"not null default 'CURRENT_TIMESTAMP' DATETIME"`
UpdateAt time.Time `json:"update_at" xorm:"not null default 'CURRENT_TIMESTAMP' DATETIME"`
}

+ 30
- 0
md/public_platoon_relate_commission.go View File

@@ -0,0 +1,30 @@
package md

// 公排结构
type LvGrade struct {
Lv int `json:"lv"` // 会员级别
LvName string `json:"lv_name"` // 会员名称
ReturnType []string `json:"return_type"` //返利类型
CommonWealthSystem map[string]string `json:"common_wealth_system"` //共富制度比例
SelfRateList map[string]string `json:"self_rate_list"` // 自购比例
DirectPush map[string]string `json:"direct_push"` // 直推奖励比例
}

type PublicPlatoonRelateCommissionReq struct {
Pvd string `json:"pvd"`
Uid string `json:"uid"`
UserLevel string `json:"user_level"`
PendingAmount string `json:"pending_amount"` //待处理金额
Oid string `json:"oid"`
}

type PublicPlatoonRelateCommissionResp struct {
Uid string `json:"uid"`
CommonWealthBenefitUid string `json:"common_wealth_benefit_uid"` //共富奖励给到的uid
DirectPushBenefitUid string `json:"direct_push_benefit_uid"` //共富奖励给到的uid
PendingAmount string `json:"pending_amount"` //直推奖励给到的uid
Oid string `json:"oid"`
SelfRateList map[string]string `json:"self_rate_list"` // 自购奖励
CommonWealthSystem map[string]string `json:"common_wealth_system"` // 共富制度奖励
DirectPush map[string]string `json:"direct_push"` // 直推奖励
}

+ 105
- 0
rule/public_platoon_relate_commission.go View File

@@ -0,0 +1,105 @@
package rule

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/md"
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"
"encoding/json"
"errors"
"fmt"
"strconv"
"strings"
"xorm.io/xorm"
)

// BatchGetPublicPlatoonRelateCommission 批量分佣 订单显示
func BatchGetPublicPlatoonRelateCommissionByOrder(engine *xorm.Engine, masterId string, PublicPlatoonRelateCommissionReqList []*md.PublicPlatoonRelateCommissionReq) (map[string]*md.PublicPlatoonRelateCommissionResp, error) {
var resp map[string]*md.PublicPlatoonRelateCommissionResp
userPublicPlatoonSetting, err := db.UserPublicPlatoonSettingGetOneByParams(engine, map[string]interface{}{
"key": "is_open",
"value": 1,
})
if err != nil {
return nil, err
}
for _, param := range PublicPlatoonRelateCommissionReqList {
// 根据供应商
rewardOpt, err := db.DbsPlanRewardByPvd(engine, param.Pvd)
if err != nil {
return nil, err
}
if rewardOpt == nil {
return nil, zhios_order_relate_logx.Warn("找不到方案记录")
}
if rewardOpt.State == 0 {
return nil, zhios_order_relate_logx.Warn("抽成方案未开启")
}
if rewardOpt.PlanCommissionId == 0 {
return nil, zhios_order_relate_logx.Warn("抽成方案未设置佣金方案id")
}
fmt.Println("抽成设置:", zhios_order_relate_utils.SerializeStr(rewardOpt))
fmt.Println("commission id:", rewardOpt.PlanCommissionId)

//TODO::计算共富收益
commissionOpt, err := db.DbsPlanCommissionById(engine, rewardOpt.PlanCommissionId)
if err != nil || commissionOpt == nil || commissionOpt.Id == 0 {
return nil, err
}
if err != nil || commissionOpt == nil || commissionOpt.Id == 0 {
return nil, err
}
var subsidyTmp map[string]*md.LvGrade
if err := json.Unmarshal([]byte(commissionOpt.Data), &subsidyTmp); err != nil {
return nil, zhios_order_relate_logx.Warn(fmt.Sprintf("%s:分佣方案数据设置错误", masterId))
}
lvGrade := subsidyTmp[param.UserLevel]
var selfRateList, commonWealthSystem, directPush map[string]string
for _, coinId := range lvGrade.ReturnType {
selfRateList[coinId] = zhios_order_relate_utils.Float64ToStr(zhios_order_relate_utils.StrToFloat64(lvGrade.SelfRateList[coinId]) * zhios_order_relate_utils.StrToFloat64(param.PendingAmount))
commonWealthSystem[coinId] = zhios_order_relate_utils.Float64ToStr(zhios_order_relate_utils.StrToFloat64(lvGrade.CommonWealthSystem[coinId]) * zhios_order_relate_utils.StrToFloat64(param.PendingAmount))
directPush[coinId] = zhios_order_relate_utils.Float64ToStr(zhios_order_relate_utils.StrToFloat64(lvGrade.DirectPush[coinId]) * zhios_order_relate_utils.StrToFloat64(param.PendingAmount))
}

//TODO::本次消费产生的共富收益给到谁
var nowBenefitUid string
userPublicPlatoonRelation, err := db.UserPublicPlatoonRelationGetOneByParams(engine, map[string]interface{}{
"key": "uid",
"value": param.Uid,
})
if err != nil {
return nil, err
}
if userPublicPlatoonRelation == nil {
return nil, errors.New("未查询到公排关系记录")
}
fatherUids := strings.Split(userPublicPlatoonRelation.FatherUid, "-")
userPublicPlatoonRelation.ReturnCommissionNum++
remainder := (userPublicPlatoonRelation.ReturnCommissionNum) % userPublicPlatoonSetting.SeveralRows
if remainder == 0 {
nowBenefitUid = fatherUids[userPublicPlatoonSetting.SeveralRows-1]
} else {
nowBenefitUid = fatherUids[remainder-1]
}

//TODO::更新 公排关系记录 中 `return_commission_num`
affected, err := db.UserPublicPlatoonRelationUpdate(engine, userPublicPlatoonRelation.Id, userPublicPlatoonRelation, "return_commission_num")
if err != nil {
return nil, err
}
if affected == 0 {
return nil, errors.New("更新公排关系记录失败")
}
resp[param.Oid] = &md.PublicPlatoonRelateCommissionResp{
Uid: param.Uid,
CommonWealthBenefitUid: nowBenefitUid,
DirectPushBenefitUid: strconv.Itoa(userPublicPlatoonRelation.RecommendUid),
PendingAmount: param.PendingAmount,
Oid: param.Oid,
SelfRateList: selfRateList,
CommonWealthSystem: commonWealthSystem,
DirectPush: directPush,
}
}
return resp, nil
}

Loading…
Cancel
Save