@@ -0,0 +1,88 @@ | |||||
package consume | |||||
import ( | |||||
utils2 "applet/app/utils" | |||||
"applet/app/utils/logx" | |||||
"applet/consume/md" | |||||
md2 "applet/es/md" | |||||
es2 "code.fnuoos.com/EggPlanet/egg_system_rules.git/utils/es" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_es.git/es" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit" | |||||
"context" | |||||
"encoding/json" | |||||
"errors" | |||||
"fmt" | |||||
"github.com/olivere/elastic/v7" | |||||
"github.com/streadway/amqp" | |||||
"time" | |||||
) | |||||
func EggCanalInviteUserNumsConsume(queue md.MqQueue) { | |||||
fmt.Println(">>>>>>>>>>>EggCanalInviteUserNumsConsume>>>>>>>>>>>>>") | |||||
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(1000) | |||||
delivery := ch.Consume(queue.Name, true) //设置自动应答 | |||||
var res amqp.Delivery | |||||
var ok bool | |||||
for { | |||||
res, ok = <-delivery | |||||
if ok == true { | |||||
//fmt.Println(string(res.Body)) | |||||
fmt.Println(">>>>>>>>>>>>>>>>>>EggCanalInviteUserNumsConsume<<<<<<<<<<<<<<<<<<<<<<<<<") | |||||
err = handleEggCanalInviteUserNumsConsume(res.Body) | |||||
if err != nil { | |||||
fmt.Println("EggCanalInviteUserNumsConsume_ERR:::::", err.Error()) | |||||
utils2.FilePutContents("EggCanalInviteUserNumsConsume_ERR", utils2.SerializeStr(map[string]interface{}{ | |||||
"body": res.Body, | |||||
"err": err.Error(), | |||||
})) | |||||
} | |||||
//_ = res.Reject(false) | |||||
//_ = res.Ack(true) | |||||
} else { | |||||
panic(errors.New("error getting message")) | |||||
} | |||||
} | |||||
} | |||||
func handleEggCanalInviteUserNumsConsume(msg []byte) error { | |||||
//1、解析canal采集至mq中queue的数据结构体 | |||||
var canalMsg *md.CanalUserRelateMessage[md.CanalUserRelate] | |||||
err := json.Unmarshal(msg, &canalMsg) | |||||
if err != nil { | |||||
return nil | |||||
} | |||||
year, week := time.Now().ISOWeek() | |||||
yearStr := utils2.IntToStr(year) | |||||
weekStr := utils2.IntToStr(week) | |||||
index := es2.GetAppointIndexFromAlias(yearStr, weekStr) | |||||
// 2. 监听插入信息 | |||||
if canalMsg.Type == md2.CanalMsgInsertSqlType { | |||||
for _, item := range canalMsg.Data { | |||||
parentUid := item.ParentUid | |||||
id := fmt.Sprintf("%d%d-%d", year, week, parentUid) | |||||
// 新增拉新人数 | |||||
script := elastic.NewScript("ctx._source.invite_user_nums += params.inc").Param("inc", 1) | |||||
_, err = es.EsClient.Update(). | |||||
Index(index). | |||||
Id(id). | |||||
Script(script). | |||||
Do(context.Background()) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
} | |||||
} | |||||
return nil | |||||
} |
@@ -0,0 +1,105 @@ | |||||
package consume | |||||
import ( | |||||
utils2 "applet/app/utils" | |||||
"applet/app/utils/logx" | |||||
"applet/consume/md" | |||||
md2 "applet/es/md" | |||||
es2 "code.fnuoos.com/EggPlanet/egg_system_rules.git/utils/es" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_es.git/es" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit" | |||||
"context" | |||||
"encoding/json" | |||||
"errors" | |||||
"fmt" | |||||
"github.com/olivere/elastic/v7" | |||||
"github.com/streadway/amqp" | |||||
"time" | |||||
) | |||||
func EggCanalViolateNumsConsume(queue md.MqQueue) { | |||||
fmt.Println(">>>>>>>>>>>EggCanalViolateNumsConsume>>>>>>>>>>>>>") | |||||
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(1000) | |||||
delivery := ch.Consume(queue.Name, true) //设置自动应答 | |||||
var res amqp.Delivery | |||||
var ok bool | |||||
for { | |||||
res, ok = <-delivery | |||||
if ok == true { | |||||
//fmt.Println(string(res.Body)) | |||||
fmt.Println(">>>>>>>>>>>>>>>>>>EggCanalViolateNumsConsume<<<<<<<<<<<<<<<<<<<<<<<<<") | |||||
err = handleEggCanalViolateNumsConsume(res.Body) | |||||
if err != nil { | |||||
fmt.Println("EggCanalViolateNumsConsume_ERR:::::", err.Error()) | |||||
utils2.FilePutContents("EggCanalViolateNumsConsume_ERR", utils2.SerializeStr(map[string]interface{}{ | |||||
"body": res.Body, | |||||
"err": err.Error(), | |||||
})) | |||||
} | |||||
//_ = res.Reject(false) | |||||
//_ = res.Ack(true) | |||||
} else { | |||||
panic(errors.New("error getting message")) | |||||
} | |||||
} | |||||
} | |||||
func handleEggCanalViolateNumsConsume(msg []byte) error { | |||||
//1、解析canal采集至mq中queue的数据结构体 | |||||
var canalMsg *md.CanalUserRelateMessage[md.CanalUserRelate] | |||||
err := json.Unmarshal(msg, &canalMsg) | |||||
if err != nil { | |||||
return nil | |||||
} | |||||
year, week := time.Now().ISOWeek() | |||||
yearStr := utils2.IntToStr(year) | |||||
weekStr := utils2.IntToStr(week) | |||||
index := es2.GetAppointIndexFromAlias(yearStr, weekStr) | |||||
// 2. 监听插入信息 | |||||
if canalMsg.Type == md2.CanalMsgInsertSqlType { | |||||
for _, item := range canalMsg.Data { | |||||
parentUid := item.ParentUid | |||||
id := fmt.Sprintf("%d%d-%d", year, week, parentUid) | |||||
// 增加违规次数记录 | |||||
script := elastic.NewScript("ctx._source.violate_nums += params.inc").Param("inc", 1) | |||||
_, err = es.EsClient.Update(). | |||||
Index(index). | |||||
Id(id). | |||||
Script(script). | |||||
Do(context.Background()) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
} | |||||
} | |||||
if canalMsg.Type == md2.CanalMsgDeleteSqlType { | |||||
for _, item := range canalMsg.Data { | |||||
parentUid := item.ParentUid | |||||
id := fmt.Sprintf("%d%d-%d", year, week, parentUid) | |||||
// 减少违规次数记录 | |||||
script := elastic.NewScript("ctx._source.violate_nums -= params.inc").Param("inc", 1) | |||||
_, err = es.EsClient.Update(). | |||||
Index(index). | |||||
Id(id). | |||||
Script(script). | |||||
Do(context.Background()) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
} | |||||
} | |||||
return nil | |||||
} |
@@ -0,0 +1,81 @@ | |||||
package consume | |||||
import ( | |||||
"applet/app/cfg" | |||||
utils2 "applet/app/utils" | |||||
"applet/app/utils/logx" | |||||
"applet/consume/md" | |||||
"code.fnuoos.com/EggPlanet/egg_system_rules.git" | |||||
md2 "code.fnuoos.com/EggPlanet/egg_system_rules.git/md" | |||||
es2 "code.fnuoos.com/EggPlanet/egg_system_rules.git/utils/es" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_es.git/es" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit" | |||||
"encoding/json" | |||||
"errors" | |||||
"fmt" | |||||
"github.com/streadway/amqp" | |||||
"time" | |||||
) | |||||
func EggEnergyDealUserECPMConsume(queue md.MqQueue) { | |||||
fmt.Println(">>>>>>>>>>>>EggEnergyDealUserECPMConsume>>>>>>>>>>>>") | |||||
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) | |||||
egg_system_rules.Init(cfg.RedisAddr) | |||||
var res amqp.Delivery | |||||
var ok bool | |||||
for { | |||||
res, ok = <-delivery | |||||
if ok == true { | |||||
err = handleEggEnergyDealUserECPMConsume(res.Body) | |||||
if err != nil { | |||||
fmt.Println("EggEnergyDealUserECPMConsume_ERR:::::", err.Error()) | |||||
utils2.FilePutContents("EggEnergyDealUserECPMConsume_ERR", utils2.SerializeStr(map[string]interface{}{ | |||||
"body": res.Body, | |||||
"err": err.Error(), | |||||
})) | |||||
} | |||||
//_ = res.Reject(false) | |||||
err = res.Ack(true) | |||||
fmt.Println("err ::: ", err) | |||||
} else { | |||||
panic(errors.New("error getting message")) | |||||
} | |||||
} | |||||
} | |||||
func handleEggEnergyDealUserECPMConsume(msgData []byte) error { | |||||
//1、解析mq中queue的数据结构体 | |||||
var msg *md2.DealUserEcpmReq | |||||
err := json.Unmarshal(msgData, &msg) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
//2、更新用户信息 | |||||
year, week := time.Now().ISOWeek() | |||||
yearStr := utils2.IntToStr(year) | |||||
weekStr := utils2.IntToStr(week) | |||||
index := es2.GetAppointIndexFromAlias(yearStr, weekStr) | |||||
id := fmt.Sprintf("%d%d-%d", year, week, msg.Uid) | |||||
m := md2.EggEnergyUserEggScoreEs{ | |||||
Ecpm: utils2.StrToFloat64(msg.Ecpm), | |||||
} | |||||
updateDocRet, err := es.UpdateDoc(index, id, m) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
fmt.Printf("UpdateCreateDoc ==> %+v \n\n", updateDocRet) | |||||
return err | |||||
} |
@@ -0,0 +1,84 @@ | |||||
package consume | |||||
import ( | |||||
"applet/app/cfg" | |||||
utils2 "applet/app/utils" | |||||
"applet/app/utils/logx" | |||||
"applet/consume/md" | |||||
"code.fnuoos.com/EggPlanet/egg_system_rules.git" | |||||
md3 "code.fnuoos.com/EggPlanet/egg_system_rules.git/rule/egg_energy/md" | |||||
es2 "code.fnuoos.com/EggPlanet/egg_system_rules.git/utils/es" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_es.git/es" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit" | |||||
"context" | |||||
"encoding/json" | |||||
"errors" | |||||
"fmt" | |||||
"github.com/olivere/elastic/v7" | |||||
"github.com/streadway/amqp" | |||||
"time" | |||||
) | |||||
func IMEggEnergySendRedPackageConsume(queue md.MqQueue) { | |||||
fmt.Println(">>>>>>>>>>>>IMEggEnergySendRedPackageConsume>>>>>>>>>>>>") | |||||
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) | |||||
egg_system_rules.Init(cfg.RedisAddr) | |||||
var res amqp.Delivery | |||||
var ok bool | |||||
for { | |||||
res, ok = <-delivery | |||||
if ok == true { | |||||
err = handleIMEggEnergySendRedPackageConsume(res.Body) | |||||
if err != nil { | |||||
fmt.Println("IMEggEnergySendRedPackageConsume_ERR:::::", err.Error()) | |||||
utils2.FilePutContents("IMEggEnergySendRedPackageConsume_ERR", utils2.SerializeStr(map[string]interface{}{ | |||||
"body": res.Body, | |||||
"err": err.Error(), | |||||
})) | |||||
} | |||||
//_ = res.Reject(false) | |||||
err = res.Ack(true) | |||||
fmt.Println("err ::: ", err) | |||||
} else { | |||||
panic(errors.New("error getting message")) | |||||
} | |||||
} | |||||
} | |||||
func handleIMEggEnergySendRedPackageConsume(msgData []byte) error { | |||||
//1、解析mq中queue的数据结构体 | |||||
var msg *md3.IMEggEnergyStructForSendRedPackageData | |||||
err := json.Unmarshal(msgData, &msg) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
//2、更新用户信息 | |||||
year, week := time.Now().ISOWeek() | |||||
yearStr := utils2.IntToStr(year) | |||||
weekStr := utils2.IntToStr(week) | |||||
index := es2.GetAppointIndexFromAlias(yearStr, weekStr) | |||||
id := fmt.Sprintf("%d%d-%d", year, week, msg.Uid) | |||||
// 新增拉新人数 | |||||
script := elastic.NewScript("ctx._source.send_red_package_nums += params.inc").Param("inc", 1) | |||||
_, err = es.EsClient.Update(). | |||||
Index(index). | |||||
Id(id). | |||||
Script(script). | |||||
Do(context.Background()) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
return err | |||||
} |
@@ -30,6 +30,10 @@ func initConsumes() { | |||||
jobs[consumeMd.EggEnergyStartExchangeGreenEnergyFunName] = EggEnergyStartExchangeGreenEnergyConsume | jobs[consumeMd.EggEnergyStartExchangeGreenEnergyFunName] = EggEnergyStartExchangeGreenEnergyConsume | ||||
jobs[consumeMd.EggEnergyAutoExchangeGreenEnergyFunName] = EggEnergyAutoExchangeGreenEnergyConsume | jobs[consumeMd.EggEnergyAutoExchangeGreenEnergyFunName] = EggEnergyAutoExchangeGreenEnergyConsume | ||||
jobs[consumeMd.EggEnergyNewUserRegisterDataFunName] = EggEnergyNewUserRegisterDataConsume // 新用户注册 | jobs[consumeMd.EggEnergyNewUserRegisterDataFunName] = EggEnergyNewUserRegisterDataConsume // 新用户注册 | ||||
jobs[consumeMd.EggEnergyDealUserECPMFunName] = EggEnergyDealUserECPMConsume // 处理给用户Ecpm值 | |||||
jobs[consumeMd.EggCanalInviteUserNumsFunName] = EggCanalInviteUserNumsConsume // 处理拉新人数 | |||||
jobs[consumeMd.EggCanalViolateNumsFunName] = EggCanalViolateNumsConsume // 处理违规次数 | |||||
jobs[consumeMd.IMEggEnergySendRedPackageFunName] = IMEggEnergySendRedPackageConsume // 处理用户发送红包次数 | |||||
} | } | ||||
func Run() { | func Run() { | ||||
@@ -146,6 +146,42 @@ var RabbitMqQueueKeyList = []*MqQueue{ | |||||
BindKey: "", | BindKey: "", | ||||
ConsumeFunName: "EggEnergyNewUserRegisterDataConsume", | ConsumeFunName: "EggEnergyNewUserRegisterDataConsume", | ||||
}, | }, | ||||
{ | |||||
ExchangeName: "egg.app", | |||||
Name: "egg_energy_user_ecpm", | |||||
Type: DirectQueueType, | |||||
IsPersistent: false, | |||||
RoutKey: "user_ecpm", | |||||
BindKey: "", | |||||
ConsumeFunName: "EggEnergyDealUserECPMConsume", | |||||
}, | |||||
{ | |||||
ExchangeName: "egg.canal.topic", | |||||
Name: "egg_canal_invite_user_nums_queue", | |||||
Type: DirectQueueType, | |||||
IsPersistent: false, | |||||
RoutKey: "egg_canal_invite_user_nums", | |||||
BindKey: "", | |||||
ConsumeFunName: "EggEnergyDealUserECPMConsume", | |||||
}, | |||||
{ | |||||
ExchangeName: "egg.canal.topic", | |||||
Name: "egg_canal_violate_nums_queue", | |||||
Type: DirectQueueType, | |||||
IsPersistent: false, | |||||
RoutKey: "egg_canal_violate_nums", | |||||
BindKey: "", | |||||
ConsumeFunName: "EggCanalViolateNumsConsume", | |||||
}, | |||||
{ | |||||
ExchangeName: "im.egg.energy", | |||||
Name: "im_egg_energy_send_red_package_queue", | |||||
Type: DirectQueueType, | |||||
IsPersistent: false, | |||||
RoutKey: "send_red_package", | |||||
BindKey: "", | |||||
ConsumeFunName: "IMEggEnergySendRedPackageConsume", | |||||
}, | |||||
} | } | ||||
const ( | const ( | ||||
@@ -164,4 +200,8 @@ const ( | |||||
EggEnergyStartExchangeGreenEnergyFunName = "EggEnergyStartExchangeGreenEnergyConsume" | EggEnergyStartExchangeGreenEnergyFunName = "EggEnergyStartExchangeGreenEnergyConsume" | ||||
EggEnergyAutoExchangeGreenEnergyFunName = "EggEnergyAutoExchangeGreenEnergyConsume" | EggEnergyAutoExchangeGreenEnergyFunName = "EggEnergyAutoExchangeGreenEnergyConsume" | ||||
EggEnergyNewUserRegisterDataFunName = "EggEnergyNewUserRegisterDataConsume" | EggEnergyNewUserRegisterDataFunName = "EggEnergyNewUserRegisterDataConsume" | ||||
EggEnergyDealUserECPMFunName = "EggEnergyDealUserECPMConsume" | |||||
EggCanalInviteUserNumsFunName = "EggCanalInviteUserNumsConsume" | |||||
EggCanalViolateNumsFunName = "EggCanalViolateNumsConsume" | |||||
IMEggEnergySendRedPackageFunName = "IMEggEnergySendRedPackageConsume" | |||||
) | ) |
@@ -0,0 +1,23 @@ | |||||
package md | |||||
type CanalTagRecords struct { | |||||
Id int `json:"id" ` | |||||
TagId int `json:"tag_id" ` | |||||
Uid int64 `json:"uid" ` | |||||
Memo string `json:"memo" ` | |||||
CreateAt string `json:"create_at" ` | |||||
UpdateAt string `json:"update_at" ` | |||||
} | |||||
type CanalTagRecordsMessage[T any] struct { | |||||
Data []T `json:"data"` | |||||
Database string `json:"database"` | |||||
ES int64 `json:"es"` | |||||
ID int64 `json:"id"` | |||||
IsDdl bool `json:"isDdl"` | |||||
Old []T `json:"old"` | |||||
PkNames []string `json:"pkNames"` | |||||
Table string `json:"table"` | |||||
TS int64 `json:"ts"` | |||||
Type string `json:"type"` | |||||
} |
@@ -0,0 +1,22 @@ | |||||
package md | |||||
type CanalUserRelate struct { | |||||
Id int64 `json:"id"` | |||||
ParentUid int64 `json:"parent_uid"` | |||||
Uid int64 `json:"uid"` | |||||
Level int `json:"level"` | |||||
InviteTime string `json:"invite_time"` | |||||
} | |||||
type CanalUserRelateMessage[T any] struct { | |||||
Data []T `json:"data"` | |||||
Database string `json:"database"` | |||||
ES int64 `json:"es"` | |||||
ID int64 `json:"id"` | |||||
IsDdl bool `json:"isDdl"` | |||||
Old []T `json:"old"` | |||||
PkNames []string `json:"pkNames"` | |||||
Table string `json:"table"` | |||||
TS int64 `json:"ts"` | |||||
Type string `json:"type"` | |||||
} |
@@ -0,0 +1,7 @@ | |||||
package md | |||||
const ( | |||||
CanalMsgInsertSqlType = "INSERT" | |||||
CanalMsgDeleteSqlType = "DELETE" | |||||
CanalMsgUpdateSqlType = "UPDATE" | |||||
) |
@@ -4,11 +4,11 @@ go 1.19 | |||||
//replace code.fnuoos.com/EggPlanet/egg_models.git => E:/company/Egg/egg_models | //replace code.fnuoos.com/EggPlanet/egg_models.git => E:/company/Egg/egg_models | ||||
//replace code.fnuoos.com/EggPlanet/egg_system_rules.git => E:/company/Egg/egg_system_rules | |||||
// replace code.fnuoos.com/EggPlanet/egg_system_rules.git => E:/company/Egg/egg_system_rules | |||||
require ( | require ( | ||||
code.fnuoos.com/EggPlanet/egg_models.git v0.2.1-0.20241205041102-0e106357c399 | |||||
code.fnuoos.com/EggPlanet/egg_system_rules.git v0.0.4-0.20241205061938-91f42710d6cd | |||||
code.fnuoos.com/EggPlanet/egg_models.git v0.2.1-0.20241206115326-8cbc93c7c64d | |||||
code.fnuoos.com/EggPlanet/egg_system_rules.git v0.0.4-0.20241207095445-64c8aa0b486e | |||||
code.fnuoos.com/go_rely_warehouse/zyos_go_es.git v1.0.1-0.20241118083738-0f22da9ba0be | code.fnuoos.com/go_rely_warehouse/zyos_go_es.git v1.0.1-0.20241118083738-0f22da9ba0be | ||||
code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git v0.0.5 | code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git v0.0.5 | ||||
github.com/boombuler/barcode v1.0.1 | github.com/boombuler/barcode v1.0.1 | ||||
@@ -79,7 +79,7 @@ require ( | |||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | ||||
github.com/modern-go/reflect2 v1.0.2 // indirect | github.com/modern-go/reflect2 v1.0.2 // indirect | ||||
github.com/nxadm/tail v1.4.8 // indirect | github.com/nxadm/tail v1.4.8 // indirect | ||||
github.com/olivere/elastic/v7 v7.0.32 // indirect | |||||
github.com/olivere/elastic/v7 v7.0.32 | |||||
github.com/pelletier/go-toml/v2 v2.2.0 // indirect | github.com/pelletier/go-toml/v2 v2.2.0 // indirect | ||||
github.com/pkg/errors v0.9.1 // indirect | github.com/pkg/errors v0.9.1 // indirect | ||||
github.com/syndtr/goleveldb v1.0.0 // indirect | github.com/syndtr/goleveldb v1.0.0 // indirect | ||||