huangjiajun 5 месяцев назад
Родитель
Сommit
f2576800fb
8 измененных файлов: 434 добавлений и 2 удалений
  1. +23
    -0
      app/db/db_comm_order_ralate.go
  2. +15
    -0
      app/db/model/comm_ord_list_relate.go
  3. +282
    -0
      app/svc/svc_comm_deal_commission.go
  4. +8
    -2
      app/svc/svc_deal_commission.go
  5. +2
    -0
      consume/init.go
  6. +10
    -0
      consume/md/consume_key.go
  7. +1
    -0
      consume/md/md.go
  8. +93
    -0
      consume/zhios_relate_reward_exchange.go

+ 23
- 0
app/db/db_comm_order_ralate.go Просмотреть файл

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

import (
"applet/app/db/model"
"xorm.io/xorm"
)

func CommOrderRelateListByOid(Db *xorm.Engine, oid int64, pvd string) ([]*model.CommOrdListRelate, error) {
var ol []*model.CommOrdListRelate
err := Db.Where("oid=? and pvd=?", oid, pvd).Find(&ol)
if err != nil {
return nil, err
}
return ol, nil
}
func CommOrderRelateListByOidSess(sess *xorm.Session, oid int64, pvd string) ([]*model.CommOrdListRelate, error) {
var ol []*model.CommOrdListRelate
err := sess.Where("oid=? and pvd=?", oid, pvd).Find(&ol)
if err != nil {
return nil, err
}
return ol, nil
}

+ 15
- 0
app/db/model/comm_ord_list_relate.go Просмотреть файл

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

type CommOrdListRelate struct {
Id int64 `json:"id" xorm:"pk autoincr BIGINT(20)"`
Oid int64 `json:"oid" xorm:"not null default 0 comment('订单号') index unique(IDX_ORD) BIGINT(20)"`
Uid int `json:"uid" xorm:"not null default 0 comment('用户ID') unique(IDX_ORD) index INT(10)"`
Amount float64 `json:"amount" xorm:"not null default 0.00 comment('金额') FLOAT(10,2)"`
Pvd string `json:"pvd" xorm:"not null default '' comment('供应商taobao,jd,pdd,vip,suning,kaola') index VARCHAR(8)"`
Info string `json:"info" xorm:"not null comment('备注') TEXT"`
CreateAt int `json:"create_at" xorm:"not null default 0 comment('订单创建时间') index INT(10)"`
Level int `json:"level" xorm:"not null default 0 comment('0自购 1直推 大于1:间推') INT(10)"`
Mode string `json:"mode" xorm:"default '' comment('分佣方案类型') VARCHAR(255)"`
AdditionalSubsidy string `json:"additional_subsidy" xorm:"default 0.000000 comment('额外补贴 酒庄模式才有效') DECIMAL(16,6)"`
ExtendType int `json:"extend_type" xorm:"default 0 unique(IDX_ORD) comment('0普通 1超级推荐人 2团长 3团长上级超级推荐人 4团长担保用户') INT(11)"`
}

+ 282
- 0
app/svc/svc_comm_deal_commission.go Просмотреть файл

@@ -0,0 +1,282 @@
package svc

import (
db2 "applet/app/db"
"applet/app/db/model"
"applet/app/utils"
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/lib/comm_plan"
md2 "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/rule"
svc2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/svc"
"fmt"
"github.com/jinzhu/copier"
"time"
"xorm.io/xorm"
)

func CommGetLvUser(engine *xorm.Engine, CommissionParam md2.CommissionFirstParam, oid int64, masterId string, mapData map[string]string) {
commArr := rule.GetComm(engine)
plan, commission, virtualCoinMoneyRate := svc2.GetAllPlan(engine, masterId)
var CommissionParam1 md2.CommissionParam
comm := CommissionParam.CommissionParam
err2 := copier.Copy(&CommissionParam1, &comm)
fmt.Println(err2)
_, _, _, _, lvUser, err := svc2.GetRewardCommission(engine, &CommissionParam1, false, CommissionParam.Uid, CommissionParam.Provider, masterId, true, mapData, commArr, plan, commission, virtualCoinMoneyRate)
if err != nil {
return
}
if lvUser == nil {
return
}

CommCommOrderRelateInsert(engine, oid, CommissionParam.Provider, int(time.Now().Unix()), lvUser, mapData)
//sql := `SELECT id from user_virtual_coin_flow where ord_id='%d'`
//sql = fmt.Sprintf(sql, oid)
//nativeString, _ := db2.QueryNativeString(engine, sql)
//has := false
//if len(nativeString) > 0 && utils.StrToInt(nativeString[0]["id"]) > 0 {
// has = true
//}
//sql1 := `SELECT id from fin_user_flow where ord_id='%d'`
//sql1 = fmt.Sprintf(sql1, oid)
//nativeString1, _ := db2.QueryNativeString(engine, sql1)
//has1 := false
//if len(nativeString1) > 0 && utils.StrToInt(nativeString1[0]["id"]) > 0 {
// has1 = true
//}
//fmt.Println("===========任务4=============", masterId, CommissionParam.Uid, oid, has, has1)
//if has == false && has1 == false {
CommSettleDone(engine, CommissionParam.Provider, oid, masterId, mapData)
//}
}

// 分佣表插入获取到的数据
func CommCommOrderRelateInsert(eg *xorm.Engine, oid int64, pvd string, createTime int, lvUser *comm_plan.LvUser, mapData map[string]string) {
level := 0
oldLevel := 0
fmt.Println(lvUser)
profit := utils.FloatFormat(lvUser.Profit+lvUser.SubsidyFee, 6)
oldLvUser := lvUser
data := []*model.CommOrdListRelate{
{
Oid: oid,
Uid: lvUser.Uid,
Amount: profit,
Pvd: pvd,
CreateAt: createTime,
Level: level,
},
}
if mapData["reward_type"] == "2" {
data = make([]*model.CommOrdListRelate, 0)
}
mode := mapData["mode"]
for lvUser.ParentUser != nil {
lvUser = lvUser.ParentUser
if lvUser.Uid == 0 {
continue
}
fmt.Println(lvUser)
level = level + 1
profit = utils.FloatFormat(lvUser.Profit+lvUser.SubsidyFee, 6)
var additionalSubsidy float64 = 0
if utils.InArr(mode, []string{"lv_winery", "public_platoon"}) {
profit = utils.FloatFormat(lvUser.Profit, 6)
additionalSubsidy = lvUser.SubsidyFee
}
data = append(data, &model.CommOrdListRelate{
Oid: oid,
Uid: lvUser.Uid,
Amount: profit,
Pvd: pvd,
CreateAt: createTime,
Level: level,
Mode: mode,
AdditionalSubsidy: utils.Float64ToStrByPrec(additionalSubsidy, 9),
ExtendType: lvUser.ExtendType,
})
}
for _, v := range data {
if utils.StrToInt(mapData["coin_id_type"]) > 0 {
v.Amount = 0
v.Info = "任务没佣金设置,不返佣金"
}
}
err1 := db2.DbInsertBatch(eg, data)
if err1 != nil {
return
} else {
// 插入虚拟币数据
vcrData := CommCombineVirtualCoinRelateData(oldLvUser, oid, pvd, oldLevel, mapData)
err2 := db2.DbInsertBatch(eg, vcrData)
for _, item := range vcrData {
fmt.Println(item)
}
if err2 != nil {
return
}
}
}
func CommSettleDone(eg *xorm.Engine, pvd string, oid int64, masterId string, mapData map[string]string) bool {
fmt.Println("=======================任务=============", masterId, oid, pvd)
ol, err := db2.CommOrderRelateListByOid(eg, oid, pvd)
if err != nil {
return false
}
// 查询虚拟币 virtual_coin_relate 表
vcrList, err := db2.GetVirtualCoinRelateListWithOrdId(eg, oid, pvd)
if err != nil {
return false
}
session := eg.NewSession()
defer session.Close()
if err := session.Begin(); err != nil {
return false
}

set, _ := db2.SysCfgGetOne(eg, "app_name_cn")
var appName = ""
if set != nil {
appName = set.Val
}
for _, item := range ol {
if mapData["reward_type"] == "2" && item.Level == 0 {
continue
}
//佣金不为空
if item.Amount > 0 {
//公排
if utils.InArr(item.Mode, []string{"lv_commission_public_platoon", "lv_price_public_platoon"}) && item.ExtendType == 5 {
fmt.Println("======================555")
bools := PublicPlatoonSettle(session, "共富奖励", mapData["title"], utils.Int64ToStr(oid), item.Uid, 0, item.Amount)
fmt.Println("======================666", bools)
if bools == false {
_ = session.Rollback()
return false
}
continue
}
_ = CommCommSettleMoney(session, item, appName, masterId, mapData)
}
if utils.StrToFloat64(item.AdditionalSubsidy) > 0 {
if item.Mode == "public_platoon" { //公排
bools := PublicPlatoonSettle(session, "共富奖励", mapData["title"], utils.Int64ToStr(oid), item.Uid, 0, utils.StrToFloat64(item.AdditionalSubsidy))
if bools == false {
_ = session.Rollback()
return false
}
}
}
}
// 虚拟币相关操作
for _, item := range vcrList {
if mapData["reward_type"] == "2" && item.Level == 0 {
continue
}
if utils.StrToFloat64(item.Amount) > 0 {
if utils.InArr(item.Mode, []string{"lv_commission_public_platoon", "lv_price_public_platoon"}) && item.ExtendType == 5 {
fmt.Println("======================555")
bools := PublicPlatoonSettle(session, "共富奖励", mapData["title"], utils.Int64ToStr(oid), item.Uid, item.CoinId, utils.StrToFloat64(item.Amount))
fmt.Println("======================666", bools)
if bools == false {
_ = session.Rollback()
return false
}
continue
}
_ = CommSettleVirtualCoin(session, item, mapData)
}
//公排
if item.Mode == "public_platoon" && utils.StrToFloat64(item.AdditionalSubsidy) > 0 {
bools := PublicPlatoonSettle(session, "共富奖励", mapData["title"], utils.Int64ToStr(oid), item.Uid, item.CoinId, utils.StrToFloat64(item.AdditionalSubsidy))
if bools == false {
_ = session.Rollback()
return false
}
}
}
// 提交事务
err = session.Commit()
if err != nil {
return false
}
return true
}
func CommCommSettleMoney(session *xorm.Session, item *model.CommOrdListRelate, appName, masterId string, mapData map[string]string) bool {
now := time.Now()
beforeAmount := "0"
afterAmount := "0"
var affected int64 = 0
userProfile, err := db2.UserProfileFindByIdWithSession(session, item.Uid)
if userProfile == nil {
}
if err != nil || userProfile == nil {
_ = session.Rollback()
return false
}

// 获取余额更新锁
cb, err := HandleBalanceDistributedLock(masterId, utils.IntToStr(item.Uid), "mall_settle_order")
if err != nil {
fmt.Println(err.Error())
_ = session.Rollback()
return false
}
// 释放锁
if cb != nil {
defer cb()
}
// 开始写入流水
var orderAction int
if item.Level == 0 {
orderAction = 10 // 自购
} else {
orderAction = 11 // 推广
}
var ItemTitle = mapData["title"] + "奖励"
if item.Level > 0 {
ItemTitle = mapData["title"] + "团队奖励"
}
finUserFlow := model.FinUserFlow{
Type: 0,
Uid: item.Uid,
Amount: utils.Float64ToStrByPrec(item.Amount, 8),
BeforeAmount: beforeAmount,
AfterAmount: afterAmount,
OrdType: item.Pvd,
OrdId: utils.AnyToString(item.Oid),
OrdAction: orderAction,
OrdDetail: "",
State: 2,
OtherId: item.Id,
OrdTitle: ItemTitle,
OrdTime: int(now.Unix()),
CreateAt: now,
UpdateAt: now,
}
// 更新用户余额
finUserFlow.BeforeAmount = userProfile.FinValid
userProfile.FinValid = utils.Float64ToStrByPrec(utils.AnyToFloat64(userProfile.FinValid)+utils.AnyToFloat64(item.Amount), 8)
userProfile.FinTotal = userProfile.FinTotal + utils.StrToFloat32(utils.Float64ToStrByPrec(item.Amount, 8))
affected, err = db2.UserProfileUpdateWithSession(session, item.Uid, userProfile)
finUserFlow.AfterAmount = userProfile.FinValid
has, errs := db2.InsertCommWithSession(
session, &finUserFlow)
if affected == 0 || err != nil || errs != nil || has == 0 {
_ = session.Rollback()
return false
}
if utils.InArr(item.Mode, []string{"public_platoon", "lv_commission_public_platoon", "lv_price_public_platoon"}) { //公排的加一条流水
kind := 4
title := "自购奖"
if item.Level == 1 {
kind = 5
title = "直推奖"
}
bools := PublicPlatoonAddRecordWithSession(session, title, utils.Int64ToStr(item.Oid), item.Uid, 0, kind, 0, item.Amount, beforeAmount)
if bools == false {
return false
}
}
return true
}

+ 8
- 2
app/svc/svc_deal_commission.go Просмотреть файл

@@ -259,7 +259,7 @@ func SettleDone(eg *xorm.Engine, pvd string, oid int64, masterId string, mapData
}
continue
}
_ = CommSettleVirtualCoin(session, item)
_ = CommSettleVirtualCoin(session, item, map[string]string{})
}
//公排
if item.Mode == "public_platoon" && utils.StrToFloat64(item.AdditionalSubsidy) > 0 {
@@ -362,7 +362,7 @@ func CommSettleMoney(session *xorm.Session, item *model.TaskOrdListRelate, appNa
return true
}

func CommSettleVirtualCoin(session *xorm.Session, virtualCoinRelateItem *model.VirtualCoinRelate) bool {
func CommSettleVirtualCoin(session *xorm.Session, virtualCoinRelateItem *model.VirtualCoinRelate, mapData map[string]string) bool {

var (
beforeAmount = "0"
@@ -407,11 +407,17 @@ func CommSettleVirtualCoin(session *xorm.Session, virtualCoinRelateItem *model.V
if virtualCoinRelateItem.Pvd == "adset_video" {
title = "看视频奖励"
}
if mapData["title"] != "" {
title = mapData["title"] + "奖励"
}
if virtualCoinRelateItem.Level > 0 {
title = "团队任务奖励"
if virtualCoinRelateItem.Pvd == "adset_video" {
title = "团队看视频奖励"
}
if mapData["title"] != "" {
title = mapData["title"] + "团队奖励"
}
}
// 用户虚拟币流水表新增记录
var userVirtualCoinFlow = model.UserVirtualCoinFlow{


+ 2
- 0
consume/init.go Просмотреть файл

@@ -96,6 +96,8 @@ func initConsumes() {
jobs[consumeMd.ZhiosTaskVideoRewardConsumeFunName] = ZhiosTaskVideoRewardExchange //视频分佣
jobs[consumeMd.ZhiosNewVideoRewardConsumeFunName] = ZhiosNewVideoRewardExchange //短视频奖励

jobs[consumeMd.ZhiosRelateRewardConsumeFunName] = ZhiosRelateRewardExchange //分佣结算

}

func Run() {


+ 10
- 0
consume/md/consume_key.go Просмотреть файл

@@ -461,6 +461,15 @@ var RabbitMqQueueKeyList = []*MqQueue{
BindKey: "",
ConsumeFunName: "ZhiosTaskRewardExchange",
},
{
ExchangeName: "zhios.relate_reward.exchange",
Name: "zhios_relate_reward",
Type: FanOutQueueType,
IsPersistent: false,
RoutKey: "relate_reward",
BindKey: "",
ConsumeFunName: "ZhiosRelateRewardExchange",
},
{
ExchangeName: "zhios.task_video_reward.exchange",
Name: "zhios_task_video_reward",
@@ -553,6 +562,7 @@ const (
CancalUserRelateConsumeFunName = "CancalUserRelateConsume"
CancalUserIntegralExchangeConsumeFunName = "CancalUserIntegralExchange"
ZhiosTaskRewardConsumeFunName = "ZhiosTaskRewardExchange"
ZhiosRelateRewardConsumeFunName = "ZhiosRelateRewardExchange"
ZhiosTaskVideoRewardConsumeFunName = "ZhiosTaskVideoRewardExchange"
ZhiosNewVideoRewardConsumeFunName = "ZhiosNewVideoRewardExchange"
CanalOneOrengeUserVirtualCcoinFlowFunName = "CanalOneOrengeUserVirtualCoinFlowConsume"


+ 1
- 0
consume/md/md.go Просмотреть файл

@@ -20,6 +20,7 @@ type ZhiosTaskReward struct {
Oid string `json:"oid"`
RewardType string `json:"reward_type"`
PlanType string `json:"plan_type"`
Provider string `json:"provider"`
}
type AcquisitionCfg struct {
Id string `json:"id"`


+ 93
- 0
consume/zhios_relate_reward_exchange.go Просмотреть файл

@@ -0,0 +1,93 @@
package consume

import (
"applet/app/db"
"applet/app/svc"
"applet/app/utils"
"applet/app/utils/logx"
"applet/consume/md"
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit"
md3 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md"
svc2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/svc"
"encoding/json"
"errors"
"fmt"
"github.com/streadway/amqp"
)

//
func ZhiosRelateRewardExchange(queue md.MqQueue) {
fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>")
ch, err := rabbit.Cfg.Pool.GetChannel()
if err != nil {
logx.Error(err)
return
}
defer ch.Release()
//1、将自己绑定到交换机上
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey)
//2、取出数据进行消费
ch.Qos(1)
delivery := ch.Consume(queue.Name, false)

var res amqp.Delivery
var ok bool
for {
res, ok = <-delivery
if ok == true {
//fmt.Println(string(res.Body))
fmt.Println(">>>>>>>>>>>>>>>>CanalOrderConsume<<<<<<<<<<<<<<<<<<<<<<<<<")
err = handleZhiosRelateRewardExchange(res.Body)
//_ = res.Reject(false)
fmt.Println(err)
_ = res.Ack(true)
} else {
panic(errors.New("error getting message"))
}
}
fmt.Println("get msg done")
}

func handleZhiosRelateRewardExchange(msg []byte) error {
//1、解析canal采集至mq中queue的数据结构体
var canalMsg *md.ZhiosTaskReward
fmt.Println(string(msg))
var tmpString string
err := json.Unmarshal(msg, &tmpString)
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println(tmpString)
err = json.Unmarshal([]byte(tmpString), &canalMsg)
if err != nil {
return err
}
mid := canalMsg.Mid
eg := db.DBs[mid]
if eg == nil {
return nil
}
uid := canalMsg.Uid
//计算佣金
var CommissionParam md3.CommissionFirstParam
CommissionParam.CommissionParam.Commission = canalMsg.Reward
CommissionParam.Uid = uid
CommissionParam.Provider = canalMsg.Provider

plans, commission, virtualCoinMoneyRate := svc2.GetAllPlan(eg, mid)
cfgs, err := svc2.GetPlanCfg(eg, canalMsg.Provider, mid, plans, commission, virtualCoinMoneyRate, &CommissionParam.CommissionParam)
if err != nil || cfgs == nil {
return nil
}
title := canalMsg.Title
var mapData = map[string]string{
"coin_id_type": canalMsg.CoinIdType,
"mode": cfgs.Mode,
"title": title,
"device_model": canalMsg.DeviceModel,
"reward_type": canalMsg.RewardType,
}
svc.CommGetLvUser(eg, CommissionParam, utils.StrToInt64(canalMsg.Oid), mid, mapData)
return nil
}

Загрузка…
Отмена
Сохранить