You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1269 lines
29 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package script
import (
"context"
"joybuywork/internal/app"
"joybuywork/internal/config"
"joybuywork/internal/consts"
"joybuywork/internal/consts/ckey"
"joybuywork/internal/plugins/jsonm"
"joybuywork/internal/plugins/printer"
"joybuywork/internal/repository/cache"
"joybuywork/internal/repository/dao"
"joybuywork/internal/repository/finder"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/repository/withdefault"
"joybuywork/internal/service/provider"
"joybuywork/internal/service/queue/producer"
"joybuywork/internal/service/queue/types"
"joybuywork/internal/utils"
"encoding/json"
"fmt"
"os"
"strings"
"time"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
ddevicepb "gits.branchcn.com/backend/deeplink/proto/go_proto/ddevice"
)
type clearCache struct {
ctx context.Context
Table string `json:"table"`
}
// 清楚对应的数据表缓存
func (c clearCache) clearCache() {
var table = strings.Split(c.Table, ",")
for _, v := range table {
var mkey string
switch v {
case model.TableNameFissionCampaign:
cc := cache.NewCampaign(c.ctx)
mkey = cc.Cache.Prefix()
case model.TableNameFissionCampaignConfig:
cc := cache.NewCampaignConfig(c.ctx)
mkey = cc.Cache.Prefix()
case model.TableNameFissionCampaignStyle:
cc := cache.NewCampaignStyle(c.ctx)
mkey = cc.Cache.Prefix()
case model.TableNameFissionCampaignCash:
cc := cache.NewCampaignCash(c.ctx)
mkey = cc.Cache.Prefix()
case model.TableNameUser:
cc := cache.NewUser(c.ctx)
mkey = cc.Cache.Prefix()
case model.TableNameProject:
cc := cache.NewProject(c.ctx)
mkey = cc.Cache.Prefix()
case model.TableNameFissionUser:
cc := cache.NewFissionUser(c.ctx, 0)
mkey = cc.Cache.Prefix()
case model.TableNameReward:
cc := cache.NewReward(c.ctx)
mkey = cc.Cache.Prefix()
case model.TableNameFissionWebUser:
cc := cache.NewReward(c.ctx)
mkey = cc.Cache.Prefix()
case model.TableNameFissionTemp:
cc := cache.NewFissionTemp(c.ctx)
mkey = cc.Cache.Prefix()
case model.TableNameLibraryQaGroup:
cc := cache.NewLibraryQaGroup(c.ctx)
mkey = cc.Cache.Prefix()
case model.TableNameFissionTempGroup:
cc := cache.NewFissionTempGroup(c.ctx)
list, _ := dao.FissionTempGroup.WithContext(c.ctx).Find()
_ = cc.Clear(list...)
return
}
if mkey == "" {
continue
}
app.FeishuNormalSend("[%s]开始处理缓存数据", v)
var idx int
var cursor uint64
var err error
var keys []string
for {
keys, cursor, err = app.Redis.Cache.Scan(c.ctx, cursor, fmt.Sprintf("%s:*", mkey), 10000).Result()
if err != nil {
return
}
app.Redis.Cache.Del(c.ctx, keys...)
idx += len(keys)
if cursor == 0 {
break
}
}
app.FeishuNormalSend("[%s]删除了%d个缓存", v, idx)
}
}
type lang struct {
ctx context.Context
taskId string
}
// 把json文件里面的语言数据写到表里面
func (s lang) lang() {
dir, _ := os.Getwd()
var path string
if consts.RunTest {
path = fmt.Sprintf("../../../asset/campaign/lang")
} else {
path = fmt.Sprintf("%s/asset/campaign/lang", dir)
}
var err error
tx := dao.Q.Begin()
defer func() {
if err != nil {
app.Logger.Error(s.ctx, fmt.Sprintf("语言包处理有异常:%v", err))
_ = tx.Rollback()
return
}
_ = tx.Commit()
}()
entrys, err := os.ReadDir(path)
if err != nil {
return
}
m := tx.Lang
for _, entry := range entrys {
if !strings.HasSuffix(entry.Name(), ".json") {
continue
}
mark, _ := strings.CutSuffix(entry.Name(), ".json")
_, ok := mtype.MarkToLangType[mark]
if !ok {
continue
}
var ddd = make(map[string]string)
var b []byte
b, err = os.ReadFile(path + "/" + entry.Name())
if err != nil {
return
}
_ = json.Unmarshal(b, &ddd)
var list []*model.Lang
list, err = m.WithContext(s.ctx).Where(m.Mark.Eq(mark)).Find()
if err != nil {
return
}
var oldMap = make(map[string]*model.Lang)
for _, v := range list {
oldMap[v.LangMark] = v
}
var add []*model.Lang
for mk, text := range ddd {
for {
if strings.HasSuffix(text, "_") {
text = strings.TrimSuffix(text, "_")
continue
}
break
}
l, ok1 := oldMap[mk]
if !ok1 {
add = append(add, withdefault.Lang(&model.Lang{
Mark: mark,
LangMark: mk,
LangText: text,
}))
continue
}
if l.LangText != text {
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(l.ID)).UpdateSimple(m.LangText.Value(text))
if err != nil {
return
}
}
}
if len(add) > 0 {
err = m.WithContext(s.ctx).Create(add...)
if err != nil {
return
}
}
}
}
type langModule struct {
ctx context.Context
taskId string
}
func (s langModule) langModule() {
dir, _ := os.Getwd()
var path string
if consts.RunTest {
path = fmt.Sprintf("../../../asset/campaign")
} else {
path = fmt.Sprintf("%s/asset/campaign", dir)
}
var err error
tx := dao.Q.Begin()
defer func() {
if err != nil {
app.Logger.Error(s.ctx, fmt.Sprintf("语言包处理有异常:%v", err))
_ = tx.Rollback()
return
}
_ = tx.Commit()
}()
m := tx.FissionLangModule
type parts struct {
Parts any `json:"parts"`
Desc string `json:"desc"`
}
var ddd = make(map[string]*parts)
b, err := os.ReadFile(path + "/fission_lang.json")
if err != nil {
return
}
_ = json.Unmarshal(b, &ddd)
list, err := m.WithContext(s.ctx).Find()
if err != nil {
return
}
var old = make(map[string]*model.FissionLangModule)
for _, v := range list {
old[v.Mark] = v
}
var add []*model.FissionLangModule
for mark, v := range ddd {
ps, _ := jsonm.MarshalToString(v.Parts)
module, ok := old[mark]
if !ok {
add = append(add, withdefault.FissionLangModule(&model.FissionLangModule{
Mark: mark,
Desc: v.Desc,
Parts: ps,
}))
continue
}
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(module.ID)).UpdateSimple(m.Desc.Value(v.Desc), m.Parts.Value(ps))
if err != nil {
return
}
}
if len(add) > 0 {
err = m.WithContext(s.ctx).Create(add...)
if err != nil {
return
}
}
}
type langTextMark struct {
ctx context.Context
taskId string
}
// 语言文案标识,用中文来做文案标识
func (s langTextMark) langTextMark() {
dir, _ := os.Getwd()
var path string
if consts.RunTest {
path = fmt.Sprintf("../../../asset/campaign/lang")
} else {
path = fmt.Sprintf("%s/asset/campaign/lang", dir)
}
var err error
tx := dao.Q.Begin()
defer func() {
if err != nil {
app.Logger.Error(s.ctx, fmt.Sprintf("语言包处理有异常:%v", err))
_ = tx.Rollback()
return
}
_ = tx.Commit()
}()
b, err := os.ReadFile(path + "/zh.json")
if err != nil {
return
}
m := tx.LangTextMark
var ddd = make(map[string]string)
_ = json.Unmarshal(b, &ddd)
var list []*model.LangTextMark
list, err = m.WithContext(s.ctx).Find()
if err != nil {
return
}
var lm = make(map[string]*model.LangTextMark)
for _, v := range list {
lm[v.Mark] = v
}
var add []*model.LangTextMark
for mark, text := range ddd {
ltm, ok := lm[mark]
if !ok {
add = append(add, withdefault.LangTextMark(&model.LangTextMark{
Mark: mark,
Text: text,
}))
continue
}
if ltm.Text != text {
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(ltm.ID)).UpdateSimple(m.Text.Value(text))
if err != nil {
return
}
}
}
if len(add) > 0 {
err = m.WithContext(s.ctx).Create(add...)
if err != nil {
return
}
}
}
type checkLang struct {
ctx context.Context
taskId string
}
func (s checkLang) checkLang() {
path := fmt.Sprintf("../../../asset/campaign/lang")
b, err := os.ReadFile(path + "/zh.json")
if err != nil {
return
}
var ddd = make(map[string]string)
_ = json.Unmarshal(b, &ddd)
entrys, err := os.ReadDir(path)
if err != nil {
return
}
for _, entry := range entrys {
if !strings.HasSuffix(entry.Name(), ".json") {
continue
}
mark, _ := strings.CutSuffix(entry.Name(), ".json")
_, ok := mtype.MarkToLangType[mark]
if !ok {
continue
}
var c []byte
c, err = os.ReadFile(path + "/" + entry.Name())
if err != nil {
return
}
var fff = make(map[string]string)
_ = json.Unmarshal(c, &fff)
for k := range fff {
if _, ok1 := ddd[k]; !ok1 {
fmt.Printf("[%s]文件的[%s]不存在于zh\n", entry.Name(), k)
}
}
for k := range ddd {
if _, ok1 := fff[k]; !ok1 {
fmt.Printf("[%s]不存在于[%s]\n", k, entry.Name())
}
}
}
}
type fillLang struct {
ctx context.Context
taskId string
}
func (s fillLang) fillLang() {
var lts = []int8{
mtype.FissionLangTypeZh,
mtype.FissionLangTypeEn,
mtype.FissionLangTypeRu,
mtype.FissionLangTypeFr,
mtype.FissionLangTypePt,
mtype.FissionLangTypeJa,
mtype.FissionLangTypeDe,
mtype.FissionLangTypeEs,
mtype.FissionLangTypeId,
mtype.FissionLangTypeIt,
mtype.FissionLangTypeTr,
mtype.FissionLangTypeAr,
mtype.FissionLangTypeKo,
mtype.FissionLangTypeTh,
}
m := dao.FissionTempGroup
list, err := m.WithContext(s.ctx).Find()
tx := dao.Q.Begin()
defer func() {
if err != nil {
app.Logger.Error(s.ctx, fmt.Sprintf("语言包处理有异常:%v", err))
_ = tx.Rollback()
return
}
_ = tx.Commit()
}()
tempM := tx.FissionTemp
imgM := tx.FissionTempImage
for _, v := range list {
var tempList []*model.FissionTemp
tempList, err = tempM.WithContext(s.ctx).Where(tempM.GroupID.Eq(v.ID), tempM.LangType.In(lts...)).Find()
if err != nil {
return
}
var old = make(map[int8]*model.FissionTemp)
var ch bool
for _, temp := range tempList {
if temp.LangType == mtype.FissionLangTypeZh {
ch = true
}
old[temp.LangType] = temp
}
if len(tempList) == 0 || !ch {
continue
}
var add []*model.FissionTemp
for _, lt := range lts {
if _, ok := old[lt]; ok {
continue
}
one := withdefault.FissionTemp(&model.FissionTemp{
FissionID: v.FissionID,
GroupID: v.ID,
LangType: lt,
TextType: mtype.FissionLangTypeTextType[lt],
})
add = append(add, one)
}
if len(add) == 0 {
continue
}
err = tempM.WithContext(s.ctx).Create(add...)
if err != nil {
return
}
var images []*model.FissionTempImage
enTemp, ok := old[mtype.FissionLangTypeEn]
if ok {
var useImg []*model.FissionTempImage
useImg, err = dao.FissionTempImage.WithContext(s.ctx).Where(dao.FissionTempImage.TempID.Eq(enTemp.ID)).Find()
if err != nil {
return
}
for _, temp := range add {
for _, image := range useImg {
images = append(images, withdefault.FissionTempImage(&model.FissionTempImage{
TempID: temp.ID,
Mark: image.Mark,
Val: image.Val,
Desc: image.Desc,
}))
}
}
} else {
for _, temp := range add {
images = append(images, withdefault.FissionTempImage(&model.FissionTempImage{
TempID: temp.ID,
Mark: "main",
Val: fmt.Sprintf("ftg/%s/main_en.png", v.Mark),
Desc: "活动主图",
}), withdefault.FissionTempImage(&model.FissionTempImage{
TempID: temp.ID,
Mark: "wechat",
Val: fmt.Sprintf("ftg/%s/main_en.png", v.Mark),
Desc: "微信引导图",
}), withdefault.FissionTempImage(&model.FissionTempImage{
TempID: temp.ID,
Mark: "wechat_bg",
Val: fmt.Sprintf("ftg/%s/main_en.png", v.Mark),
Desc: "微信引导图背景",
}), withdefault.FissionTempImage(&model.FissionTempImage{
TempID: temp.ID,
Mark: "download",
Val: fmt.Sprintf("ftg/%s/main_en.png", v.Mark),
Desc: "下载引导图",
}))
}
}
if len(images) > 0 {
err = imgM.WithContext(s.ctx).Create(images...)
if err != nil {
return
}
}
}
}
type openAd struct {
ctx context.Context
taskId string
ProjectId int64 `json:"project_id"`
ProjectHashId string `json:"project_hash_id"`
GaShowId string `json:"ga_show_id"`
GaEmbedId string `json:"ga_embed_id"`
GaDoubleId string `json:"ga_double_id"`
Prod bool `json:"prod"`
}
func (s openAd) openAd() {
project, err := finder.Project(s.ctx, s.ProjectId, s.ProjectHashId)
if err != nil {
return
}
if project == nil {
app.FeishuNormalSend(fmt.Sprintf("[%d_%s] 找不到对应的项目", s.ProjectId, s.ProjectHashId))
return
}
ads, err := cache.NewProjectAd(s.ctx).FindByProjectId(project.ID)
if err != nil {
return
}
showId := utils.Ternary[string](s.Prod, s.GaShowId, "6366208850")
embedId := utils.Ternary[string](s.Prod, s.GaEmbedId, "8800800505")
doubleId := utils.Ternary[string](s.Prod, s.GaDoubleId, "6174637163")
status := utils.Ternary[int8](s.Prod, mtype.ProjectAdStatusProd, mtype.ProjectAdStatusTest)
if ads == nil {
ads = withdefault.ProjectAd(&model.ProjectAd{
ProjectID: project.ID,
OpenAd: mtype.Yes,
CampaignAd: mtype.Yes,
GaShowID: showId,
GaEmbedID: embedId,
GaDoubleID: doubleId,
AdStatus: status,
})
err = dao.ProjectAd.WithContext(s.ctx).Create(ads)
if err != nil {
return
}
} else {
m := dao.ProjectAd
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(ads.ID)).UpdateSimple(
m.GaShowID.Value(showId),
m.GaEmbedID.Value(embedId),
m.GaDoubleID.Value(doubleId),
m.AdStatus.Value(status),
)
if err != nil {
return
}
_ = cache.NewProjectAd(s.ctx).Clear(ads)
}
app.FeishuNormalSend(fmt.Sprintf(
"[%d_%s]配置广告成功, 谷歌展示广告id:%s, 谷歌内嵌广告id:%s,谷歌多重广告id:%s,状态:%d",
s.ProjectId,
s.ProjectHashId,
showId,
embedId,
doubleId,
status,
))
}
type openCloseCopyShare struct {
ctx context.Context
taskId string
ProjectId int64 `json:"project_id"`
ProjectHashId string `json:"project_hash_id"`
Open int8 `json:"open"`
}
func (s openCloseCopyShare) openCloseCopyShare() {
project, err := finder.Project(s.ctx, s.ProjectId, s.ProjectHashId)
if err != nil {
return
}
if project == nil {
app.FeishuNormalSend(fmt.Sprintf("[%d_%s] 找不到对应的项目", s.ProjectId, s.ProjectHashId))
return
}
m := dao.Project
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(project.ID)).UpdateSimple(m.CloseCopyShare.Value(s.Open))
if err != nil {
return
}
_ = cache.NewProject(s.ctx).Clear(project)
app.Redis.Cache.Del(s.ctx,
fmt.Sprintf("certified:project:project_show_id:%d", project.ID),
fmt.Sprintf("certified:project:project_show_hash:%s", project.HashID),
)
app.FeishuNormalSend(fmt.Sprintf("[%d_%s]项目关闭社媒状态修改为[%s]", s.ProjectId, s.ProjectHashId, utils.Ternary(s.Open == mtype.Yes, "开启", "关闭")))
}
type openPushLadder struct {
ctx context.Context
taskId string
ProjectId int64 `json:"project_id"`
ProjectHashId string `json:"project_hash_id"`
Open int8 `json:"open"`
}
func (s openPushLadder) openPushLadder() {
project, err := finder.Project(s.ctx, s.ProjectId, s.ProjectHashId)
if err != nil {
return
}
if project == nil {
app.FeishuNormalSend(fmt.Sprintf("[%d_%s] 找不到对应的项目", s.ProjectId, s.ProjectHashId))
return
}
m := dao.Project
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(project.ID)).UpdateSimple(m.PushLadder.Value(s.Open))
if err != nil {
return
}
_ = cache.NewProject(s.ctx).Clear(project)
app.Redis.Cache.Del(s.ctx,
fmt.Sprintf("certified:project:project_show_id:%d", project.ID),
fmt.Sprintf("certified:project:project_show_hash:%s", project.HashID),
)
app.FeishuNormalSend(fmt.Sprintf("[%d_%s]项目代理推送状态修改为[%s]", s.ProjectId, s.ProjectHashId, utils.Ternary(s.Open == mtype.Yes, "开启", "关闭")))
}
type openCert struct {
ctx context.Context
taskId string
ProjectId int64 `json:"project_id"`
ProjectHashId string `json:"project_hash_id"`
Open int8 `json:"open"`
}
func (s openCert) openCert() {
project, err := finder.Project(s.ctx, s.ProjectId, s.ProjectHashId)
if err != nil {
return
}
if project == nil {
app.FeishuNormalSend(fmt.Sprintf("[%d_%s] 找不到对应的项目", s.ProjectId, s.ProjectHashId))
return
}
m := dao.Project
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(project.ID)).UpdateSimple(m.FissionCertType.Value(s.Open))
if err != nil {
return
}
_ = cache.NewProject(s.ctx).Clear(project)
app.Redis.Cache.Del(s.ctx,
fmt.Sprintf("certified:project:project_show_id:%d", project.ID),
fmt.Sprintf("certified:project:project_show_hash:%s", project.HashID),
)
app.FeishuNormalSend(fmt.Sprintf("[%d_%s]项目认证状态修改为[%s]", s.ProjectId, s.ProjectHashId, utils.Ternary(s.Open == mtype.Yes, "开启", "关闭")))
}
// 奖品库存缓存清理
type clearStock struct {
ctx context.Context
taskId string
CampaignId int64 `json:"campaign_id"`
}
func (s clearStock) clearStock() {
var err error
defer func() {
if err != nil {
app.Logger.Error(s.ctx, fmt.Sprintf("fixData逻辑问题%v", err))
return
}
}()
cpn, err := finder.Campaign(s.ctx, s.CampaignId)
if err != nil || cpn == nil {
return
}
m := dao.FissionCampaignReward
list, err := m.WithContext(s.ctx).Where(m.CampaignID.Eq(cpn.ID), m.IsDel.Eq(mtype.No)).Find()
if err != nil {
return
}
var ids []int64
for _, v := range list {
ids = append(ids, v.ID)
}
type num struct {
RewardId int64
Num int64
}
recordM := dao.FissionRewardRecord.SubTable(cpn.ID)
var nums []*num
err = recordM.WithContext(s.ctx).Select(recordM.RewardID, recordM.ID.Count().As("num")).Where(recordM.RewardID.In(ids...)).Group(recordM.RewardID).Scan(&nums)
if err != nil {
return
}
var idMap = make(map[int64]int64)
for _, v := range nums {
idMap[v.RewardId] = v.Num
}
var preIdMap = make(map[int64]int64)
switch cpn.FissionID {
case consts.IdKeep:
var preNums []*num
preM := dao.FissionKeep
err = preM.WithContext(s.ctx).Select(preM.RewardID, preM.ID.Count().As("num")).Where(preM.RewardID.In(ids...)).Group(preM.RewardID).Scan(&nums)
if err != nil {
return
}
for _, v := range preNums {
preIdMap[v.RewardId] = v.Num
}
}
for _, v := range list {
n, _ := app.Redis.Cache.Get(s.ctx, ckey.FissionCampaignRewardPool(v.ID)).Int64()
n1, _ := app.Redis.Cache.Get(s.ctx, ckey.FissionCampaignRewardUseStock(v.ID)).Int64()
app.FeishuNormalSend("配置库存:%d, 实际发放库存: %d,redis记录库存池剩余库存:%d,已使用库存: %d", v.Stock, idMap[v.ID], n, n1)
app.Redis.Cache.Del(s.ctx, ckey.FissionCampaignRewardPool(v.ID), ckey.FissionCampaignRewardUseStock(v.ID))
pn, _ := app.Redis.Cache.Get(s.ctx, ckey.FissionCampaignPreRewardPool(v.ID)).Int64()
pn1, _ := app.Redis.Cache.Get(s.ctx, ckey.FissionCampaignRewardPreUseStock(v.ID)).Int64()
app.FeishuNormalSend("配置预备库存:%d, 实际发放预备库存: %d,redis记录预备库存池剩余预备库存:%d,已使用预备库存: %d", v.Stock, preIdMap[v.ID], pn, pn1)
app.Redis.Cache.Del(s.ctx, ckey.FissionCampaignPreRewardPool(v.ID), ckey.FissionCampaignRewardPreUseStock(v.ID))
}
}
type resetAdsInit struct {
ctx context.Context
taskId string
Url string `json:"url"`
}
// 重制广告配置
func (s resetAdsInit) resetAdsInit() {
resp, err := app.EtcdCli.Put(s.ctx, app.EtcdConfig+"/ads", s.Url)
if err != nil {
app.FeishuNormalSend("重制广告配置错误:%v", err)
return
}
app.FeishuNormalSend("重制广告配置成功, Header: %+v, PrevKv: %+v", resp.Header, resp.PrevKv)
return
}
type taskCenterLang struct {
ctx context.Context
taskId string
Refresh int32 `json:"refresh"`
Ver int64 `json:"ver"`
}
// 重制广告配置
func (s taskCenterLang) taskCenterLang() {
var err error
defer func() {
if err != nil {
app.Logger.Error(s.ctx, fmt.Sprintf("语言包处理有异常:%v", err))
return
}
}()
dir, _ := os.Getwd()
var path string
if consts.RunTest {
path = fmt.Sprintf("../../../asset/taskcenter")
} else {
path = fmt.Sprintf("%s/asset/taskcenter", dir)
}
client, err := oss.New("https://oss-cn-shenzhen.aliyuncs.com", "LTAI5tNvMLF181bTb3qCZxk4", "9HXWh6yTXhbBQ7WaMkS1c3o0UNtl7A")
if err != nil {
return
}
// 填写存储空间名称,例如examplebucket。
bucket, err := client.Bucket("client-project-resource")
if err != nil {
return
}
var yunPath = "taskcenter/lang"
var fileNames []string
files, _ := os.ReadDir(path)
for _, v := range files {
name := fmt.Sprintf("%s/%s", yunPath, v.Name())
err = bucket.PutObjectFromFile(name, fmt.Sprintf("%s/%s", path, v.Name()))
if err != nil {
return
}
fileNames = append(fileNames, name)
}
if s.Refresh == 0 {
app.FeishuNormalSend("任务中心语言包处理成功,仅更新远端语言包")
return
}
b, _ := jsonm.MarshalToString(map[string]interface{}{
"ver": utils.STernary[int64](s.Ver, 0, time.Now().Unix()),
"path": fmt.Sprintf("%s/%s", config.Config.Upload.Host, yunPath),
})
resp, err := app.EtcdCli.Put(s.ctx, "/taskcenter/lang", b)
if err != nil {
return
}
app.FeishuNormalSend("任务中心语言包处理成功, Header: %+v, PrevKv: %+v, data: %s, 文件内容:%+v", resp.Header, resp.PrevKv, b, fileNames)
return
}
type clearCpn struct {
ctx context.Context
CampaignHashId string `json:"campaign_hash_id"`
}
// 清楚活动的用户设备数据
func (s clearCpn) clearCpn() {
d := dao.Q.Begin()
var err error
defer func() {
if err != nil {
app.Logger.Error(s.ctx, fmt.Sprintf("clearCpn逻辑问题%v", err))
d.Rollback()
return
}
d.Commit()
}()
cpn, err := finder.Campaign(s.ctx, s.CampaignHashId)
if err != nil || cpn == nil {
return
}
project, err := finder.Project(s.ctx, cpn.ProjectID)
if err != nil {
return
}
if project == nil || project.IsDel == mtype.Yes || project.IsTest == mtype.No {
return
}
m := d.FissionUser.SubTable(cpn.ID)
list, err := m.WithContext(s.ctx).Where(m.CampaignID.Eq(cpn.ID)).Limit(50).Find()
if err != nil {
return
}
if len(list) == 0 {
return
}
cc := cache.NewFissionUser(s.ctx, cpn.ID)
var keys []string
var ids []int64
for _, v := range list {
ids = append(ids, v.ID)
if v.DeviceID != "" {
keys = append(keys, cc.IdxKey("campaign_id", v.CampaignID, "device_id", v.DeviceID))
}
if v.SubUserID != "" {
keys = append(keys, cc.IdxKey("campaign_id", v.CampaignID, "sub_user_id", v.SubUserID))
}
if v.DeviceID != "" {
_, _ = app.NewDeepLinkDevice().DeleteDevice(s.ctx, &ddevicepb.DeleteDeviceReq{
Code: v.DeviceID,
ProjectId: project.ID,
})
}
}
res, err := m.WithContext(s.ctx).Where(m.ID.In(ids...)).Delete()
if err != nil {
return
}
statM := d.FissionUserStat
resStat, err := statM.WithContext(s.ctx).Where(statM.UserID.In(ids...)).Delete()
if err != nil {
return
}
_ = cc.Clear(list...)
if len(keys) > 0 {
app.Redis.Cache.Del(s.ctx, keys...)
}
app.FeishuNormalSend("用户数据删除:%d,统计数据删除:%d", res.RowsAffected, resStat.RowsAffected)
}
type openTest struct {
ctx context.Context
taskId string
ProjectId int64 `json:"project_id"`
ProjectHashId string `json:"project_hash_id"`
Open int8 `json:"open"`
}
// 把项目变成测试项目
func (s openTest) openTest() {
project, err := finder.Project(s.ctx, s.ProjectId, s.ProjectHashId)
if err != nil {
return
}
if project == nil {
app.FeishuNormalSend(fmt.Sprintf("[%d_%s] 找不到对应的项目", s.ProjectId, s.ProjectHashId))
return
}
m := dao.Project
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(project.ID)).UpdateSimple(m.IsTest.Value(s.Open))
if err != nil {
return
}
_ = cache.NewProject(s.ctx).Clear(project)
app.Redis.Cache.Del(s.ctx,
fmt.Sprintf("certified:project:project_show_id:%d", project.ID),
fmt.Sprintf("certified:project:project_show_hash:%s", project.HashID),
)
app.FeishuNormalSend(fmt.Sprintf("[%d_%s]项目测试状态修改为[%s]", s.ProjectId, s.ProjectHashId, utils.Ternary(s.Open == mtype.Yes, "开启", "关闭")))
}
type getCache struct {
ctx context.Context
taskId string
Key string `json:"key"`
Cmd string `json:"cmd"`
}
// 把项目变成测试项目
func (s getCache) getCache() {
var v string
switch s.Cmd {
case "hget":
r, _ := app.Redis.Cache.HGetAll(s.ctx, s.Key).Result()
v, _ = jsonm.MarshalToString(r)
case "del":
r, _ := app.Redis.Cache.Del(s.ctx, s.Key).Result()
v = fmt.Sprintf("del:%d rows", r)
default:
v, _ = app.Redis.Cache.Get(s.ctx, s.Key).Result()
}
app.FeishuNormalSend("key:%s value:%s", s.Key, utils.STernary[string](v, "", "没有查到数据哦"))
}
type printAllLog struct {
ctx context.Context
taskId string
Open int32 `json:"open"`
}
// 把项目变成测试项目
func (s printAllLog) printAllLog() {
switch s.Open {
case 1:
consts.PrintAllLog = true
default:
consts.PrintAllLog = false
}
app.FeishuNormalSend(fmt.Sprintf("全量日志状态修改为[%s]", utils.Ternary[string](s.Open == mtype.Yes, "开启", "关闭")))
}
type collectSlowLog struct {
ctx context.Context
taskId string
Open int32 `json:"open"`
}
// 把项目变成测试项目
func (s collectSlowLog) collectSlowLog() {
defer app.TryCatch(s.ctx, "收集慢日志状态修改")
switch s.Open {
case 1:
if consts.CollectSlowLog {
return
}
consts.CollectSlowLog = true
printer.Slow.Run()
default:
if !consts.CollectSlowLog {
return
}
consts.CollectSlowLog = false
printer.Slow.Stop()
}
app.FeishuNormalSend(fmt.Sprintf("收集慢日志状态修改为[%s]", utils.Ternary[string](s.Open == mtype.Yes, "开启", "关闭")))
}
type setLangParts struct {
ctx context.Context
taskId string
Mark string `json:"mark"`
Parts string `json:"parts"`
}
func (s setLangParts) setLangParts() {
m := dao.FissionTempGroup
g, err := m.WithContext(s.ctx).Where(m.Mark.Eq(s.Mark)).Take()
if err != nil || g == nil || g.LangParts == s.Parts {
return
}
_, err = m.WithContext(s.ctx).Where(m.ID.Eq(g.ID)).UpdateSimple(m.LangParts.Value(s.Parts))
if err != nil {
return
}
_ = cache.NewFissionTempGroup(s.ctx).Clear(g)
app.FeishuNormalSend(fmt.Sprintf("模版组[%s]语言包修改过成功[%s]->[%s]", g.Mark, g.LangParts, s.Parts))
}
type openLvApi struct {
ctx context.Context
taskId string
CompanyId int64 `json:"company_id"`
Open int32 `json:"open"`
}
func (s openLvApi) openLvApi() {
made, err := cache.NewCompanyMade(s.ctx).FindByUniqId(s.CompanyId, mtype.CompanyMadeMarkLvApi)
if err != nil {
return
}
if made == nil && s.Open == 1 {
err = provider.NewCompanyMade(s.ctx, s.CompanyId).SetMake(mtype.CompanyMadeMarkLvApi, "")
app.FeishuNormalSend(fmt.Sprintf("企业[%d]开启[%s]组件", s.CompanyId, mtype.CompanyMadeMarkLvApi))
return
}
if made != nil && s.Open == 0 {
err = provider.NewCompanyMade(s.ctx, s.CompanyId).Del(mtype.CompanyMadeMarkLvApi)
app.FeishuNormalSend(fmt.Sprintf("企业[%d]关闭[%s]组件", s.CompanyId, mtype.CompanyMadeMarkLvApi))
return
}
}
type openFissionTemp struct {
ctx context.Context
taskId string
CompanyId int64 `json:"company_id"`
Temp []string `json:"temp"`
}
func (s openFissionTemp) openFissionTemp() {
made, err := cache.NewCompanyMade(s.ctx).FindByUniqId(s.CompanyId, mtype.CompanyMadeMarkFissionTemp)
if err != nil {
return
}
if len(s.Temp) > 0 {
err = provider.NewCompanyMade(s.ctx, s.CompanyId).SetMake(mtype.CompanyMadeMarkFissionTemp, s.Temp)
app.FeishuNormalSend(fmt.Sprintf("企业[%d]开启[%s]组件, 模板:%+v", s.CompanyId, mtype.CompanyMadeMarkFissionTemp, s.Temp))
return
}
if made != nil && len(s.Temp) == 0 {
err = provider.NewCompanyMade(s.ctx, s.CompanyId).Del(mtype.CompanyMadeMarkFissionTemp)
app.FeishuNormalSend(fmt.Sprintf("企业[%d]关闭[%s]组件", s.CompanyId, mtype.CompanyMadeMarkFissionTemp))
return
}
}
type pushWaitReward struct {
ctx context.Context
taskId string
CampaignId int64 `json:"campaign_id"`
}
func (s pushWaitReward) pushWaitReward() {
m := dao.FissionRewardRecord.SubTable(s.CampaignId)
list, err := m.WithContext(s.ctx).Where(m.CampaignID.Eq(s.CampaignId), m.Status.Eq(mtype.FissionRewardRecordStatusWait)).Find()
if err != nil {
return
}
for _, record := range list {
producer.NewCampaignNotice(s.ctx).CampaignRewardNotify(types.CampaignRewardNotify{
CampaignId: record.CampaignID,
UserId: record.UserID,
UserRewardId: record.ID,
})
}
}
type statCampaign struct {
ctx context.Context
taskId string
BehaviorType int32 `json:"behavior_type"`
IpAddress string `json:"ip_address"`
UserID string `json:"user_id"`
DeviceID string `json:"device_id"`
Event string `json:"event"`
EventData []types.EventData `json:"event_data"`
ProjectID int64 `json:"project_id"`
Hid int64 `json:"hid"`
TsHID string `json:"ts_hid"` //任务中心hash_id
Language string `json:"language"` // 语言
}
func (s statCampaign) statCampaign() {
p := producer.NewStatCampaign(s.ctx)
p.StatCampaign(types.StatCampaignValue{
BehaviorType: s.BehaviorType,
BehaviorTime: time.Now().Unix(),
IpAddress: s.IpAddress,
Os: "ios",
OsVersion: "16.3",
DeviceModel: "iphone",
DeviceID: s.DeviceID,
UserID: s.UserID,
Event: s.Event,
EventData: s.EventData,
ProjectID: s.ProjectID,
Language: s.Language,
})
}