All checks were successful
Build image / build (push) Successful in 2m26s
- 实现定时抓取供应商商品信息功能 - 添加供应商配置变更监听及处理逻辑 - 完善商品价格计算及更新机制 - 添加商品库存跟踪功能 - 实现商品详情抓取及更新接口 - 优化错误处理及日志记录 - 添加服务就绪状态检查 - 完善数据库迁移及初始化逻辑"
100 lines
2.0 KiB
Go
100 lines
2.0 KiB
Go
package watcher
|
|
|
|
import (
|
|
"slices"
|
|
"sync"
|
|
|
|
"gitea.timerzz.com/kedaya_haitao/common/structs/storage"
|
|
v2 "gitea.timerzz.com/kedaya_haitao/common/structs/v2"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
type Watcher struct {
|
|
pArticle *v2.ProviderArticle
|
|
watching bool //是不是正在抓
|
|
}
|
|
|
|
type Watchers struct {
|
|
m sync.RWMutex
|
|
list []*Watcher
|
|
|
|
providerId v2.ProviderId
|
|
storage *storage.Storage
|
|
ready bool
|
|
}
|
|
|
|
func NewWatchers(storage *storage.Storage, providerId v2.ProviderId) *Watchers {
|
|
return &Watchers{
|
|
storage: storage,
|
|
providerId: providerId,
|
|
list: make([]*Watcher, 0),
|
|
}
|
|
}
|
|
|
|
func (w *Watchers) Add(article *v2.ProviderArticle) {
|
|
w.m.Lock()
|
|
defer w.m.Unlock()
|
|
if !slices.ContainsFunc(w.list, func(item *Watcher) bool {
|
|
return item.pArticle.SkuID == article.SkuID
|
|
}) {
|
|
w.list = append(w.list, &Watcher{pArticle: article})
|
|
}
|
|
}
|
|
|
|
func (w *Watchers) Remove(skuID string) {
|
|
for i, item := range w.list {
|
|
if item.pArticle.SkuID == skuID {
|
|
w.m.Lock()
|
|
w.list = append(w.list[:i], w.list[i+1:]...)
|
|
w.m.Unlock()
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
func (w *Watchers) Range(filter func(watcher *Watcher) bool, do func(watcher *Watcher)) {
|
|
w.m.RLock()
|
|
defer w.m.RUnlock()
|
|
for _, item := range w.list {
|
|
if filter(item) {
|
|
do(item)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (w *Watchers) Exist(skuID string) bool {
|
|
w.m.RLock()
|
|
defer w.m.RUnlock()
|
|
for _, item := range w.list {
|
|
if item.pArticle.SkuID == skuID {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (w *Watchers) Load() (err error) {
|
|
var articles []*v2.ProviderArticle
|
|
articles, err = w.storage.ProviderArticle().Find(
|
|
storage.NewGetProviderArticleQuery().
|
|
SetProviderId(w.providerId).
|
|
SetWatch(true),
|
|
)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
w.m.Lock()
|
|
defer w.m.Unlock()
|
|
for _, article := range articles {
|
|
w.list = append(w.list, &Watcher{pArticle: article})
|
|
}
|
|
logrus.Infof("共加载%d个需要蹲货的商品\n", len(w.list))
|
|
w.ready = true
|
|
return
|
|
}
|
|
|
|
// 返回ready
|
|
func (w *Watchers) Ready() bool {
|
|
return w.ready
|
|
}
|