147 lines
4.5 KiB
Go
147 lines
4.5 KiB
Go
|
// Package asUser -----------------------------
|
|||
|
// @file : artistInfoScript.go
|
|||
|
// @author : JJXu
|
|||
|
// @contact : wavingbear@163.com
|
|||
|
// @time : 2024/1/16 11:08
|
|||
|
// -------------------------------------------
|
|||
|
package asUser
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
"dubbo.apache.org/dubbo-go/v3/common/logger"
|
|||
|
"errors"
|
|||
|
"fmt"
|
|||
|
"github.com/fonchain_enterprise/fonchain-main/api/artist"
|
|||
|
"github.com/fonchain_enterprise/fonchain-main/api/artistInfoUser"
|
|||
|
"github.com/fonchain_enterprise/fonchain-main/pkg/e"
|
|||
|
"github.com/fonchain_enterprise/fonchain-main/pkg/service"
|
|||
|
"github.com/gin-gonic/gin"
|
|||
|
"sync"
|
|||
|
"time"
|
|||
|
)
|
|||
|
|
|||
|
func SyncLowArtistHandler(c *gin.Context) {
|
|||
|
//全量更新DynamicUserData中的数据
|
|||
|
err := DynamicUserService.SyncAllOfDynamicUserData()
|
|||
|
if err != nil {
|
|||
|
service.Error(c, e.Failed, err, "同步失败")
|
|||
|
return
|
|||
|
}
|
|||
|
service.Success(c, map[string]any{
|
|||
|
"isUpdateCompleted": DynamicUserService.CompleteState.IsUpdateCompleted(),
|
|||
|
"latestUpdateTime": DynamicUserService.CompleteState.LatestUpdateTime(),
|
|||
|
"err": fmt.Sprintf("%v", err),
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
// dynamicUser视图更新状态
|
|||
|
type dynamicUserUpdateState struct {
|
|||
|
updateCompleted bool
|
|||
|
latestUpdateTime *time.Time
|
|||
|
rwLock sync.RWMutex
|
|||
|
}
|
|||
|
|
|||
|
func (d *dynamicUserUpdateState) SetCompleteState(completed bool) {
|
|||
|
d.rwLock.Lock()
|
|||
|
d.updateCompleted = completed
|
|||
|
d.rwLock.Unlock()
|
|||
|
}
|
|||
|
func (d *dynamicUserUpdateState) IsUpdateCompleted() bool {
|
|||
|
d.rwLock.RLock()
|
|||
|
defer d.rwLock.RUnlock()
|
|||
|
return d.updateCompleted
|
|||
|
}
|
|||
|
func (d *dynamicUserUpdateState) LatestUpdateTime() *time.Time {
|
|||
|
d.rwLock.RLock()
|
|||
|
defer d.rwLock.RUnlock()
|
|||
|
return d.latestUpdateTime
|
|||
|
}
|
|||
|
|
|||
|
var DynamicUserService *dynamicUserService
|
|||
|
|
|||
|
func NewDynamicUserService() {
|
|||
|
DynamicUserService = &dynamicUserService{artistUidChan: make(chan string, 100), userIdChan: make(chan int64, 100)}
|
|||
|
go DynamicUserService.Run()
|
|||
|
}
|
|||
|
|
|||
|
type dynamicUserService struct {
|
|||
|
artistUidChan chan string
|
|||
|
userIdChan chan int64
|
|||
|
syncDynamicUserDataLock sync.Mutex
|
|||
|
CompleteState dynamicUserUpdateState //物理视图更新状态
|
|||
|
}
|
|||
|
|
|||
|
func (d *dynamicUserService) Run() {
|
|||
|
for {
|
|||
|
select {
|
|||
|
case uid := <-d.artistUidChan:
|
|||
|
if uid == "" {
|
|||
|
break
|
|||
|
}
|
|||
|
_, err := service.GrpcArtistInfoUserImpl.SyncDynamicUser(context.Background(), &artistInfoUser.SyncDynamicUserRequest{ArtistUid: uid})
|
|||
|
if err != nil {
|
|||
|
logger.Errorf("同步画家[artistUid:%s]物理视图失败,系统将切换至user_view视图。err:%v", uid, err.Error())
|
|||
|
d.CompleteState.SetCompleteState(false)
|
|||
|
}
|
|||
|
case userId := <-d.userIdChan:
|
|||
|
_, err := service.GrpcArtistInfoUserImpl.SyncDynamicUser(context.Background(), &artistInfoUser.SyncDynamicUserRequest{UserId: userId})
|
|||
|
if err != nil {
|
|||
|
logger.Errorf("同步画家[userId:%s]物理视图失败,系统将切换至user_view视图。err:%v", userId, err.Error())
|
|||
|
d.CompleteState.SetCompleteState(false)
|
|||
|
}
|
|||
|
default:
|
|||
|
time.Sleep(200 * time.Millisecond)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
func (d *dynamicUserService) UpdateUserWistArtistUid(artistUidList ...string) {
|
|||
|
for _, artistUid := range artistUidList {
|
|||
|
d.artistUidChan <- artistUid
|
|||
|
}
|
|||
|
}
|
|||
|
func (d *dynamicUserService) UpdateUserWithUserId(userIds ...int64) {
|
|||
|
for _, userId := range userIds {
|
|||
|
d.userIdChan <- userId
|
|||
|
}
|
|||
|
}
|
|||
|
func (d *dynamicUserService) SyncAllOfDynamicUserData() error {
|
|||
|
if d.syncDynamicUserDataLock.TryLock() {
|
|||
|
return errors.New("任务正在执行中,请稍后再试")
|
|||
|
}
|
|||
|
d.CompleteState.SetCompleteState(false)
|
|||
|
defer d.syncDynamicUserDataLock.Unlock()
|
|||
|
var ctx = context.Background()
|
|||
|
lowList, err := service.GrpcArtistImpl.LowArtistList(ctx, &artist.LowArtistListReq{
|
|||
|
Page: 1,
|
|||
|
PageSize: -1,
|
|||
|
})
|
|||
|
defer func() {
|
|||
|
if err != nil {
|
|||
|
d.CompleteState.SetCompleteState(false)
|
|||
|
} else {
|
|||
|
d.CompleteState.SetCompleteState(true)
|
|||
|
}
|
|||
|
}()
|
|||
|
if err != nil {
|
|||
|
return errors.New("获取低优先级画家失败,err:" + err.Error())
|
|||
|
}
|
|||
|
var nameList []string
|
|||
|
for _, v := range lowList.Data {
|
|||
|
nameList = append(nameList, v.RealName)
|
|||
|
}
|
|||
|
_, err = service.GrpcArtistInfoUserImpl.UpdateLowArtistList(ctx, &artistInfoUser.UpdateLowArtistListRequest{ArtistNameList: nameList})
|
|||
|
if err != nil {
|
|||
|
return errors.New("更新低优先级画家失败,err:" + err.Error())
|
|||
|
}
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
func (d *dynamicUserService) UpdateDynamicUserData(artistUserList ...string) error {
|
|||
|
if d.syncDynamicUserDataLock.TryLock() {
|
|||
|
d.CompleteState.SetCompleteState(false)
|
|||
|
}
|
|||
|
d.syncDynamicUserDataLock.Unlock()
|
|||
|
_, err := service.GrpcArtistInfoUserImpl.SyncDynamicUser(context.Background(), &artistInfoUser.SyncDynamicUserRequest{ArtistUidList: artistUserList})
|
|||
|
return err
|
|||
|
}
|