Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View File

@@ -0,0 +1,35 @@
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/job/main/videoup-report/cmd:all-srcs",
"//app/job/main/videoup-report/conf:all-srcs",
"//app/job/main/videoup-report/dao/archive:all-srcs",
"//app/job/main/videoup-report/dao/data:all-srcs",
"//app/job/main/videoup-report/dao/email:all-srcs",
"//app/job/main/videoup-report/dao/hbase:all-srcs",
"//app/job/main/videoup-report/dao/manager:all-srcs",
"//app/job/main/videoup-report/dao/mission:all-srcs",
"//app/job/main/videoup-report/dao/redis:all-srcs",
"//app/job/main/videoup-report/dao/tag:all-srcs",
"//app/job/main/videoup-report/http:all-srcs",
"//app/job/main/videoup-report/model/archive:all-srcs",
"//app/job/main/videoup-report/model/data:all-srcs",
"//app/job/main/videoup-report/model/email:all-srcs",
"//app/job/main/videoup-report/model/manager:all-srcs",
"//app/job/main/videoup-report/model/mission:all-srcs",
"//app/job/main/videoup-report/model/monitor:all-srcs",
"//app/job/main/videoup-report/model/task:all-srcs",
"//app/job/main/videoup-report/model/utils:all-srcs",
"//app/job/main/videoup-report/service:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,225 @@
#### videoup-report-job
##### Versio 1.5.38
>1.使用up-service grpc
##### Version 1.5.37
>1.移除无用报表释放redis资源
##### Version 1.5.36
>1.激励回查添加错误重试
##### Version 1.5.35
>1.account使用grpc
##### Version 1.5.34
>1.规范化waitGroup使用
##### Version 1.5.33
> 1.修复up group返回json格式解析失败的问题
##### Version 1.5.32
> 1.修复UP Group API链接的bug
##### Version 1.5.31
> 1.增加激励回查白名单逻辑
##### Version 1.5.30
> 1.消费二审消息支持邮件开关
##### Version 1.5.29
> 1.修复复审任务删除失败
##### Version 1.5.28
> 1.增加激励回查逻辑
##### Version 1.5.27
> 1.记录任务的参数typeid,upfrom,upgroup到缓存,方便任务复审判断
##### Version 1.5.26
> 1.取消稿件活动的同时把活动tag也去掉
##### Version 1.5.25
> 1.添加视频monitor日志有些视频不出-30的问题
##### Version 1.5.24
> 1.修复因稿件addit为空导致不统计的bug
##### Version 1.5.23
> 1.稿件监控忽略PGC稿件
##### Version 1.5.22
> 1.增加邮件超限队列的消耗机会
##### Version 1.5.21
> 1.修改task使用secondary redis
> 1.权重参数从hash改为string
##### Version 1.5.20
> 1.增加视频审核监控
##### Version 1.5.19
> 1.增加权重前后时间日志
##### Version 1.5.18
> 1.订阅二审消息去重复开评论
##### Version 1.5.17
> 1.去除多次与list
##### Version 1.5.16
> 1.修复评论冻结问题
##### Version 1.5.15
> 1.状态改变会联动评论开关
##### Version 1.5.14
> 1.邮件从videoup-job迁移过来
> 2.邮件快慢分离且统一控制发送api调用频率为5s/次
##### Version 1.5.13
> 1.hbase v2
##### Version 1.5.12
> 1.修改频道回查rpc的返回结构
##### Version 1.5.11
> 1.增加稿件状态停留统计
##### Version 1.5.10
>1.feature: 升级bm初始化使用engine.Start
##### Version 1.5.9
> 1.定时发布表增加软删除字段deleted_at
##### Version 1.5.8
> 1.将已回查、待回查的日志记录到archive_oper的remark字段与频道回查一致方便统计报表
##### Version 1.5.7
> 1.tag同步绑定一级、二级分区名
> 2.videoup-job的tag同步全部迁移到本项目
> 3.编辑稿件时,分区修改触发tag同步
> 4.活动稿件不进入频道回查
##### Version 1.5.6
> 1.热门回查稿件忽略已存在的aid
##### Version 1.5.5
> 1.添加稿件热门回查功能
##### Version 1.5.4
> 1.去掉redis的大key: task_weight
> 2.生成任务记录日志不使用事务,允许日志记录失败
##### Version 1.5.3
> 1.基础库升级
##### Version 1.5.2
> 1.add_archive/modify_archive消息触发tag同步、频道回查落库、开启频道禁止
##### Version 1.5.1
> 1.完全迁移一审任务
##### Version 1.5.0
> 1.迁移一审任务
##### Version 1.4.10
> 1.修复report-job redis zadd hot empty key
##### Version 1.4.9
> 1.调整关闭顺序,避免日志遗漏
##### Version 1.4.8
> 1.使用blademaster
##### Version 1.4.7
> 1.archive_track.remark新增动态描述记录
##### Version 1.4.6
> 1.修复掉SQL中有or导致任务等待时候报表数据错误
##### Version 1.4.5
> 1.从一审任务等待时长报表中去掉定时发布的数据
##### Version 1.4.4
> 1.fix map 并发写panic
> 2.调整视频吞吐报表落库频率为5分钟一次
##### Version 1.4.3
> 1.fix close channel bug
##### Version 1.4.2
> 1.迁移path main
##### Version 1.4.1
> 1.去除statsd
##### Version 1.4.0
> 1.迁入稿件追踪和分发打点
##### Version 1.3.10
> 1.添加视频审核耗时的redis缓存
##### Version 1.3.9
> 1.添加统计10分钟内视频审核总耗时总耗时=一转耗时+一审耗时+二转耗时+分发耗时
##### Version 1.3.8
> 1.解决视频进审数据统计bug
> 2.解决databus old message json.Unmarshal error bug
##### Version 1.3.7
> 1.使用监听binlog的方式统计一转、二转、分发耗时
##### Version 1.3.6
> 1.添加了一转、二转、分发耗时统计
##### Version 1.3.5
> 1.给一二三查打点数据添加uid字段
##### Version 1.3.4
> 1.修改archive的state字段类型
##### Version 1.3.3
> 1.从archive_oper表获取进入一二三查的时间
##### Version 1.3.2
> 1.添加一二三查耗时打点
##### Version 1.3.1
> 1.修复panic
##### Version 1.3.0
> 1.into kratos
##### Version 1.2.0
> 1.给map增加并发互斥锁
##### Version 1.1.1
> 1.增加二审稿件移区统计
##### Version 1.1.0
> 1.增加一审待审进审量统计
##### Version 1.0.0
> 1.增加一审 task 等待耗时数据打点

View File

@@ -0,0 +1,10 @@
# Owner
shencen
wangzhe01
# Author
chenjianrong
liusiming
# Reviewer
chenjianrong

View File

@@ -0,0 +1,16 @@
# See the OWNERS docs at https://go.k8s.io/owners
approvers:
- chenjianrong
- liusiming
- shencen
- wangzhe01
labels:
- job
- job/main/videoup-report
- main
options:
no_parent_owners: true
reviewers:
- chenjianrong
- liusiming

View File

@@ -0,0 +1,44 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
)
go_binary(
name = "cmd",
embed = [":go_default_library"],
tags = ["automanaged"],
)
go_library(
name = "go_default_library",
srcs = ["main.go"],
data = ["videoup-report-job.toml"],
importpath = "go-common/app/job/main/videoup-report/cmd",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/job/main/videoup-report/conf:go_default_library",
"//app/job/main/videoup-report/http:go_default_library",
"//app/job/main/videoup-report/service:go_default_library",
"//library/log:go_default_library",
"//library/net/trace:go_default_library",
"//library/queue/databus/report:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,51 @@
package main
import (
"flag"
"os"
"os/signal"
"syscall"
"time"
"go-common/app/job/main/videoup-report/conf"
"go-common/app/job/main/videoup-report/http"
"go-common/app/job/main/videoup-report/service"
"go-common/library/log"
"go-common/library/net/trace"
"go-common/library/queue/databus/report"
)
func main() {
flag.Parse()
if err := conf.Init(); err != nil {
log.Error("conf.Init() error(%v)", err)
panic(err)
}
// init log
log.Init(conf.Conf.Xlog)
report.InitManager(nil)
trace.Init(conf.Conf.Tracer)
defer trace.Close()
defer log.Close()
// service init
svr := service.New(conf.Conf)
http.Init(conf.Conf, svr)
// init signal
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
for {
s := <-c
log.Info("videoup-report-job get a signal %s", s.String())
switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
svr.Close()
time.Sleep(1 * time.Second)
return
case syscall.SIGHUP:
// TODO reload
default:
return
}
}
}

View File

@@ -0,0 +1,322 @@
# This is a TOML document. Boom.
[host]
data = "http://data-test.bilibili.co"
api = "http://api.bilibili.co"
archive = "http://uat-archive.api.bilibili.co"
profit = "http://up-profit.bilibili.co"
www = "http://www.bilibili.com"
[xlog]
dir = "/data/log/videoup-report-job/"
[xlog.elk]
project = "videoup-report-job"
addr = "172.18.20.17:8520"
chanSize = 10240
[archiveSub]
key = "0Pub71WwEMKXu63qtztu"
secret = "0Pub71WwEMKXu63qtztv"
group = "ArchiveBinlog-ReportJob-S"
topic = "Archive-T"
action = "sub"
name = "videoup-report-job/archivesub"
proto = "tcp"
addr = "172.16.33.158:6205"
idle = 100
active = 100
dialTimeout = "1s"
readTimeout = "60s"
writeTimeout = "1s"
idleTimeout = "10s"
[archiveResultSub]
key = "0Pub71WwEMKXu63qtztu"
secret = "0Pub71WwEMKXu63qtztv"
group = "ArchiveNotify-MainArchive-ReportJob-S"
topic = "ArchiveNotify-T"
action = "sub"
name = "videoup-report-job/archive-result-sub"
proto = "tcp"
addr = "172.18.33.50:6205"
idle = 100
active = 100
dialTimeout = "1s"
readTimeout = "60s"
writeTimeout = "1s"
idleTimeout = "10s"
[videoupSub]
key = ""
secret = ""
group = "Videoup2Bvc-MainArchive-ReportJob-S"
topic = "Videoup2Bvc"
action = "sub"
offset = "old"
buffer = 128
name = "videoup-job/bvc-sub"
proto = "tcp"
addr = "172.18.33.50:6205"
active = 1
idle = 1
dialTimeout = "1s"
readTimeout = "60s"
writeTimeout = "1s"
idleTimeout = "10s"
[managerDBSub]
key = ""
secret = ""
group = "ManagerBinLog-MainArchive-S"
topic = "ManagerBinLog-T"
action = "sub"
name = "videoup-report-job/databus"
proto = "tcp"
addr = "172.18.33.50:6205"
active = 1
idle = 1
dialTimeout = "1s"
readTimeout = "60s"
writeTimeout = "1s"
idleTimeout = "10s"
[app]
key = "c05dd4e1638a8af0"
secret = "7daa7f8c06cd33c5c3067063c746fdcb"
[httpClient]
[httpClient.read]
key = "6aa4286456d16b97"
secret = "351cf022e1ae8296109c3c524faafcc8"
dial = "1s"
timeout = "1s"
keepAlive = "60s"
timer = 1000
[httpClient.read.breaker]
window = "10s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[httpClient.write]
key = "6aa4286456d16b97"
secret = "351cf022e1ae8296109c3c524faafcc8"
dial = "50s"
timeout = "3s"
keepAlive = "60s"
timer = 1000
[httpClient.write.breaker]
window = "10s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[bm]
addr = "0.0.0.0:6791"
maxListen = 1000
timeout = "1s"
[db]
[db.archive]
name = "172.16.33.54:3306"
dsn = "test:test@tcp(172.16.33.205:3308)/bilibili_archive?timeout=5s&readTimeout=5s&writeTimeout=5s&parseTime=true&loc=Local&charset=utf8,utf8mb4"
readDSN = ["test:test@tcp(172.16.33.205:3308)/bilibili_archive?timeout=5s&readTimeout=5s&writeTimeout=5s&parseTime=true&loc=Local&charset=utf8,utf8mb4"]
active = 5
idle = 2
queryTimeout = "10s"
execTimeout = "10s"
tranTimeout = "10s"
[db.archive.breaker]
window = "3s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[db.manager]
name = "172.16.33.54:3306"
dsn = "test:test@tcp(172.16.33.54:3306)/bilibili_manager?timeout=5s&readTimeout=5s&writeTimeout=5s&parseTime=true&loc=Local&charset=utf8"
active = 5
idle = 2
idleTimeout ="4h"
queryTimeout = "100ms"
execTimeout = "100ms"
tranTimeout = "200ms"
[db.manager.breaker]
window = "3s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[redis]
[redis.track]
name = "video-admin/track"
proto = "tcp"
addr = "172.16.33.54:6381"
idle = 10
active = 10
dialTimeout = "1s"
readTimeout = "1s"
writeTimeout = "1s"
idleTimeout = "10s"
expire = "10s"
[redis.mail]
name = "video-admin/track"
proto = "tcp"
addr = "172.16.33.54:6381"
idle = 10
active = 10
dialTimeout = "1s"
readTimeout = "1s"
writeTimeout = "1s"
idleTimeout = "10s"
[redis.secondary]
name = "videoup-report-job/secondary"
proto = "unix"
addr = "172.22.33.137:6835"
active = 10
idle = 2
dialTimeout = "1s"
readTimeout = "1s"
writeTimeout = "1s"
idleTimeout = "80s"
[archiveRPCGroup2]
timeout = "1s"
[hbase]
master = ""
meta = ""
dialTimeout = "5s"
readTimeout = "10s"
readsTimeout = "10s"
writeTimeout = "10s"
writesTimeout = "10s"
[hbase.zookeeper]
root = ""
addrs = ["172.18.33.131:2181","172.18.33.168:2181","172.18.33.169:2181"]
timeout = "30s"
[tagDisRPC]
timeout = "1s"
[mail]
host = "smtp.exmail.qq.com"
port = 465
username = "2333@bilibili.com"
password = "2333"
speedThreshold = 3
overspeedThreshold = 2
[[mail.addr]]
type = "4"
desc = "游戏"
addr = []
[[mail.addr]]
type = "11"
desc = "电视剧"
addr = []
[[mail.addr]]
type = "1"
desc = "动画"
addr = []
[[mail.addr]]
type = "23"
desc = "电影"
addr = []
[[mail.addr]]
type = "119"
desc = "鬼畜"
addr = []
[[mail.addr]]
type = "155"
desc = "时尚"
addr = []
[[mail.addr]]
type = "160"
desc = "生活"
addr = []
[[mail.addr]]
type = "36"
desc = "科技"
addr = []
[[mail.addr]]
type = "5"
desc = "娱乐"
addr = []
[[mail.addr]]
type = "3"
desc = "音乐"
addr = []
[[mail.addr]]
type = "129"
desc = "舞蹈"
addr = []
[[mail.addr]]
type = "13"
desc = "番剧"
addr = []
[[mail.addr]]
type = "167"
desc = "国创"
addr = []
[[mail.addr]]
type = "181"
desc = "影视"
addr = []
[[mail.addr]]
type = "177"
desc = "纪录片"
addr = []
[[mail.addr]]
type = "signed"
desc = "签约up主"
addr = []
[[mail.privateAddr]]
type = "155"
desc = "时尚"
addr = []
[[mail.privateAddr]]
type = "160"
desc = "生活"
addr = []
[[mail.privateAddr]]
type = "119"
desc = "鬼畜"
addr = []
[[mail.privateAddr]]
type = "36"
desc = "科技"
addr = []
[[mail.privateAddr]]
type = "3"
desc = "音乐"
addr = []
[[mail.privateAddr]]
type = "129"
desc = "舞蹈"
addr = []
[[mail.privateAddr]]
type = "4"
desc = "游戏"
addr = []
[[mail.privateAddr]]
type = "181"
desc = "影视"
addr = []
[[mail.privateAddr]]
type = "1"
desc = "动画"
addr = []
[[mail.privateAddr]]
type = "CC"
desc = "抄送列表"
addr = []
[grpc]
[grpc.accRPC]
timeout = "1s"
[grpc.upsRPC]
timeout = "1s"

View File

@@ -0,0 +1,42 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["conf.go"],
importpath = "go-common/app/job/main/videoup-report/conf",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/cache/redis:go_default_library",
"//library/conf:go_default_library",
"//library/database/hbase.v2:go_default_library",
"//library/database/sql:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/rpc:go_default_library",
"//library/net/rpc/warden:go_default_library",
"//library/net/trace:go_default_library",
"//library/queue/databus:go_default_library",
"//library/time:go_default_library",
"//vendor/github.com/BurntSushi/toml:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,178 @@
package conf
import (
"errors"
"flag"
"go-common/library/cache/redis"
"go-common/library/conf"
"go-common/library/database/sql"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/rpc"
"go-common/library/net/rpc/warden"
"go-common/library/net/trace"
"go-common/library/queue/databus"
"go-common/library/time"
"github.com/BurntSushi/toml"
"go-common/library/database/hbase.v2"
)
var (
confPath string
// Conf .
Conf = &Config{}
client *conf.Client
)
// Config config struct .
type Config struct {
// API host
Host *Host
// channal len
ChanSize int
BeginOffset int64
// log
Xlog *log.Config
// http
BM *bm.ServerConfig
// tracer
Tracer *trace.Config
// tick load pgc
Tick time.Duration
// db
DB *DB
// redis
Redis *Redis
// hbase
Hbase *hbaseConf
// http client test
HTTPClient HTTPClient
// databus
ArchiveSub *databus.Config
ArchiveResultSub *databus.Config
VideoupSub *databus.Config
ManagerDBSub *databus.Config
// ChanSize aid%ChanSize
ArchiveRPCGroup2 *rpc.ClientConfig
TagDisConf *rpc.ClientConfig
//grpc
GRPC *GRPC
// mail
Mail *mail
}
//GRPC .
type GRPC struct {
AccRPC *warden.ClientConfig
UpsRPC *warden.ClientConfig
}
type hbaseConf struct {
hbase.Config
ReadTimeout time.Duration
ReadsTimeout time.Duration
WriteTimeout time.Duration
WritesTimeout time.Duration
}
// Host for httpclient
type Host struct {
Data string
API string
Archive string
Profit string
WWW string
}
// DB db struct
type DB struct {
Archive *sql.Config
Manager *sql.Config
}
// Redis redis struct
type Redis struct {
Track *struct {
*redis.Config
Expire time.Duration
}
Mail *redis.Config
Secondary *struct {
*redis.Config
Expire time.Duration
}
}
// HTTPClient http client struct
type HTTPClient struct {
Read *bm.ClientConfig
Write *bm.ClientConfig
}
//mail 邮件配置
type mail struct {
Host string
Port, SpeedThreshold, OverspeedThreshold int
Username, Password string
Addr, PrivateAddr []*MailElemenet
}
//MailElemenet 邮件接收人配置
type MailElemenet struct {
Type string
Desc string
Addr []string
}
func init() {
flag.StringVar(&confPath, "conf", "", "default config path")
}
// Init init conf
func Init() (err error) {
if confPath != "" {
return local()
}
return remote()
}
func local() (err error) {
_, err = toml.DecodeFile(confPath, &Conf)
return
}
func remote() (err error) {
if client, err = conf.New(); err != nil {
return
}
if err = load(); err != nil {
return
}
go func() {
for range client.Event() {
log.Info("config reload")
if load() != nil {
log.Error("config reload error (%v)", err)
}
}
}()
return
}
func load() (err error) {
var (
s string
ok bool
tmpConf *Config
)
if s, ok = client.Toml2(); !ok {
return errors.New("load config center error")
}
if _, err = toml.Decode(s, &tmpConf); err != nil {
return errors.New("could not decode config")
}
*Conf = *tmpConf
return
}

View File

@@ -0,0 +1,87 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = [
"addit_test.go",
"archive_oper_test.go",
"archive_recheck_test.go",
"archive_test.go",
"audit_test.go",
"config_test.go",
"dao_test.go",
"flow_design_test.go",
"task_test.go",
"type_test.go",
"video_test.go",
"video_track_test.go",
],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/job/main/videoup-report/conf:go_default_library",
"//app/job/main/videoup-report/model/archive:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"addit.go",
"archive.go",
"archive_delay.go",
"archive_oper.go",
"archive_recheck.go",
"audit.go",
"config.go",
"dao.go",
"flow_design.go",
"report.go",
"task.go",
"task_consumer.go",
"task_dispatch.go",
"task_dispatch_done.go",
"task_dispatch_extend.go",
"task_json_config.go",
"task_oper_history.go",
"track.go",
"type.go",
"video.go",
"video_track.go",
],
importpath = "go-common/app/job/main/videoup-report/dao/archive",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/job/main/videoup-report/conf:go_default_library",
"//app/job/main/videoup-report/model/archive:go_default_library",
"//app/job/main/videoup-report/model/task:go_default_library",
"//app/job/main/videoup-report/model/utils:go_default_library",
"//library/database/sql:go_default_library",
"//library/log:go_default_library",
"//library/xstr:go_default_library",
"//vendor/github.com/dgryski/go-farm:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,54 @@
package archive
import (
"context"
"fmt"
"go-common/app/job/main/videoup-report/model/archive"
"go-common/library/database/sql"
"go-common/library/log"
"go-common/library/xstr"
)
const (
_additSQL = "SELECT id,aid,source,redirect_url,mission_id,up_from,order_id,dynamic FROM archive_addit WHERE aid=?"
_additsSQL = "SELECT id,aid,source,redirect_url,mission_id,up_from,order_id,dynamic FROM archive_addit WHERE aid IN (%s)"
)
// Addit get archive addit.
func (d *Dao) Addit(c context.Context, aid int64) (addit *archive.Addit, err error) {
row := d.db.QueryRow(c, _additSQL, aid)
addit = &archive.Addit{}
if err = row.Scan(&addit.ID, &addit.Aid, &addit.Source, &addit.RedirectURL, &addit.MissionID, &addit.UpFrom, &addit.OrderID, &addit.Dynamic); err != nil {
if err == sql.ErrNoRows {
addit = nil
err = nil
} else {
log.Error("row.Scan error(%v)", err)
}
}
return
}
// Addits batch get archive addit.
func (d *Dao) Addits(c context.Context, aids []int64) (addits map[int64]*archive.Addit, err error) {
addits = make(map[int64]*archive.Addit)
if len(aids) < 1 {
return
}
rows, err := d.db.Query(c, fmt.Sprintf(_additsSQL, xstr.JoinInts(aids)))
if err != nil {
log.Error("d.db.Query(%s) error(%v)", fmt.Sprintf(_additsSQL, xstr.JoinInts(aids)), err)
return
}
defer rows.Close()
for rows.Next() {
addit := &archive.Addit{}
if err = rows.Scan(&addit.ID, &addit.Aid, &addit.Source, &addit.RedirectURL, &addit.MissionID, &addit.UpFrom, &addit.OrderID, &addit.Dynamic); err != nil {
log.Error("row.Scan error(%v)", err)
return
}
addits[addit.Aid] = addit
}
return
}

View File

@@ -0,0 +1,16 @@
package archive
import (
"context"
"testing"
. "github.com/smartystreets/goconvey/convey"
)
func Test_Addit(t *testing.T) {
Convey("Addit", t, func() {
addit, err := d.Addit(context.TODO(), 1)
So(err, ShouldBeNil)
Println(addit)
})
}

View File

@@ -0,0 +1,76 @@
package archive
import (
"context"
"fmt"
"time"
"go-common/app/job/main/videoup-report/model/archive"
"go-common/library/log"
)
const (
_archiveByAidSQL = "SELECT id,mid,typeid,copyright,author,title,cover,content,duration,round,attribute,access,state,tag,pubtime,ctime,mtime FROM archive WHERE id=? "
_arcNoteSQL = "SELECT coalesce(note,'') from archive where id=?"
_upOriginalAids = "SELECT " +
"a.id,a.mid,a.typeid,a.copyright,a.author,a.title,a.cover,a.content,a.duration,a.round,a.attribute,a.access,a.state,a.tag,a.pubtime,a.ctime,a.mtime " +
"FROM archive AS a LEFT JOIN archive_delay as delay ON delay.aid = a.id " +
"WHERE a.mid=? AND a.copyright=? AND a.ctime>=? AND a.ctime<? AND (a.state >= 0 OR delay.state >= 0)"
_upArcTagSQL = "UPDATE archive SET tag=? WHERE id=?"
)
// ArchiveByAid get archive by aid
func (d *Dao) ArchiveByAid(c context.Context, aid int64) (arc *archive.Archive, err error) {
row := d.db.QueryRow(c, _archiveByAidSQL, aid)
arc = &archive.Archive{}
if err = row.Scan(&arc.ID, &arc.Mid, &arc.TypeID, &arc.Copyright, &arc.Author, &arc.Title, &arc.Cover, &arc.Desc, &arc.Duration,
&arc.Round, &arc.Attribute, &arc.Access, &arc.State, &arc.Tag, &arc.PTime, &arc.CTime, &arc.MTime); err != nil {
log.Error("row.Scan error(%v)", err)
}
return
}
//ArchiveNote 稿件审核的备注字段可能为NIL
func (d *Dao) ArchiveNote(c context.Context, aid int64) (note string, err error) {
if err = d.db.QueryRow(c, _arcNoteSQL, aid).Scan(&note); err != nil {
log.Error("ArchiveNote db.row.Scan error(%v), aid(%d)", err, aid)
}
return
}
// ExcitationArchivesByTime 获取Up主过审的自制稿件
func (d *Dao) ExcitationArchivesByTime(c context.Context, mid int64, bt, et time.Time) (archives []*archive.Archive, err error) {
archives = []*archive.Archive{}
if mid < 1 {
err = fmt.Errorf("wrong mid(%d)", mid)
return
}
rows, err := d.db.Query(c, _upOriginalAids, mid, archive.CopyrightOriginal, bt, et)
if err != nil {
log.Error("d.db.Query(%s,%d,%d,%v,%v) error(%v)", _upOriginalAids, mid, archive.CopyrightOriginal, bt, et)
return
}
defer rows.Close()
for rows.Next() {
arc := &archive.Archive{}
if err = rows.Scan(&arc.ID, &arc.Mid, &arc.TypeID, &arc.Copyright, &arc.Author, &arc.Title, &arc.Cover, &arc.Desc, &arc.Duration,
&arc.Round, &arc.Attribute, &arc.Access, &arc.State, &arc.Tag, &arc.PTime, &arc.CTime, &arc.MTime); err != nil {
log.Error("rows.Scan() error(%v)", err)
return
}
archives = append(archives, arc)
}
return
}
//UpTag update archive tag
func (d *Dao) UpTag(c context.Context, aid int64, tags string) (rows int64, err error) {
res, err := d.db.Exec(c, _upArcTagSQL, tags, aid)
if err != nil {
log.Error("d.UpTag.Exec() error(%v)", err)
return
}
rows, err = res.RowsAffected()
return
}

View File

@@ -0,0 +1,28 @@
package archive
import (
"context"
"go-common/app/job/main/videoup-report/model/archive"
"go-common/library/database/sql"
"go-common/library/log"
)
const (
_delaysSQL = "SELECT id,aid,dtime,type,state FROM archive_delay WHERE aid=? AND deleted_at = 0 ORDER BY dtime DESC LIMIT 1"
)
// Delay get delay by aid
func (d *Dao) Delay(c context.Context, aid int64) (delay *archive.Delay, err error) {
rows := d.db.QueryRow(c, _delaysSQL, aid)
delay = &archive.Delay{}
if err = rows.Scan(&delay.ID, &delay.Aid, &delay.DTime, &delay.Type, &delay.State); err != nil {
if err == sql.ErrNoRows {
delay = nil
err = nil
} else {
log.Error("row.Scan error(%v)", err)
}
}
return
}

View File

@@ -0,0 +1,81 @@
package archive
import (
"context"
"database/sql"
"go-common/app/job/main/videoup-report/model/archive"
"go-common/library/log"
)
const (
_operLastRoundSQL = "SELECT id,aid,uid,typeid,state,round,attribute,last_id,ctime,mtime FROM archive_oper WHERE aid = ? AND round = ? ORDER BY id DESC LIMIT 1"
_operNextRoundSQL = "SELECT id,aid,uid,typeid,state,round,attribute,last_id,ctime,mtime FROM archive_oper WHERE id > ? AND aid = ? AND round != ? ORDER BY id ASC LIMIT 1"
_operInsertSQL = "INSERT INTO archive_oper(aid,uid,typeid,state,content,round,attribute,last_id,remark) VALUES(?,399,?,?,?,?,?,?,?)"
_lastArcOperSQL = "SELECT aid,uid,typeid,content,round,attribute,last_id,remark FROM archive_oper WHERE aid=? AND uid!=399 ORDER BY mtime DESC LIMIT 1"
_lastVideoOperUIDSQL = "SELECT uid FROM archive_video_oper WHERE vid=? AND uid != 399 ORDER BY mtime DESC LIMIT 1;"
_lastVideoOperSQL = "SELECT aid, uid, vid, status, content, attribute, last_id, remark FROM archive_video_oper WHERE vid=? AND uid != 399 ORDER BY mtime DESC LIMIT 1;"
)
// LastRoundOper get last archive round record.
func (d *Dao) LastRoundOper(c context.Context, aid int64, round int8) (oper *archive.Oper, err error) {
row := d.db.QueryRow(c, _operLastRoundSQL, aid, round)
oper = &archive.Oper{}
if err = row.Scan(&oper.ID, &oper.AID, &oper.UID, &oper.TypeID, &oper.State, &oper.Round, &oper.Attribute, &oper.LastID, &oper.CTime, &oper.MTime); err != nil {
log.Error("row.Scan error(%v)", err)
return
}
return
}
// NextRoundOper get next archive round record.
func (d *Dao) NextRoundOper(c context.Context, id int64, aid int64, round int8) (oper *archive.Oper, err error) {
row := d.db.QueryRow(c, _operNextRoundSQL, id, aid, round)
oper = &archive.Oper{}
if err = row.Scan(&oper.ID, &oper.AID, &oper.UID, &oper.TypeID, &oper.State, &oper.Round, &oper.Attribute, &oper.LastID, &oper.CTime, &oper.MTime); err != nil {
log.Error("row.Scan error(%v)", err)
return
}
return
}
// AddArchiveOper add archive operate log
func (d *Dao) AddArchiveOper(c context.Context, aid int64, attribute int32, typeid int16, state int, round int8, lastID int64, content, remark string) (id int64, err error) {
var (
res sql.Result
)
if res, err = d.db.Exec(c, _operInsertSQL, aid, typeid, state, content, round, attribute, lastID, remark); err != nil {
log.Error("AddArchiveOper(%d,%d,%d,%d,%s,%d,%d,%d,%s) error(%v)", aid, typeid, state, content, round, attribute, lastID, remark, err)
return
}
id, err = res.LastInsertId()
return
}
//LastVideoOperUID get the last manual-operate operator id by vid
func (d *Dao) LastVideoOperUID(c context.Context, vid int64) (uid int64, err error) {
if err = d.db.QueryRow(c, _lastVideoOperUIDSQL, vid).Scan(&uid); err != nil {
log.Error("LastVideoOperUID db.row.Scan error(%v) vid(%d)", err, vid)
}
return
}
//LastVideoOper get the last manual-operate record by vid
func (d *Dao) LastVideoOper(c context.Context, vid int64) (oper *archive.VideoOper, err error) {
oper = &archive.VideoOper{}
if err = d.db.QueryRow(c, _lastVideoOperSQL, vid).Scan(&oper.AID, &oper.UID, &oper.VID, &oper.Status, &oper.Content, &oper.Attribute, &oper.LastID, &oper.Remark); err != nil {
log.Error("LastVideoOper db.row.Scan error(%v), vid(%d)", err, vid)
}
return
}
// LastArcOper get a archive last history.
func (d *Dao) LastArcOper(c context.Context, aid int64) (re *archive.Oper, err error) {
re = &archive.Oper{}
if err = d.db.QueryRow(c, _lastArcOperSQL, aid).Scan(&re.AID, &re.UID, &re.TypeID, &re.Content, &re.Round, &re.Attribute, &re.LastID, &re.Remark); err != nil {
log.Error(" LastArcOper db.row.Scan error(%v) aid(%d)", err, aid)
}
return
}

View File

@@ -0,0 +1,45 @@
package archive
import (
"context"
"testing"
. "github.com/smartystreets/goconvey/convey"
"go-common/app/job/main/videoup-report/model/archive"
)
func TestDao_AddArchiveOper(t *testing.T) {
Convey("AddArchiveOper", t, func() {
c := context.TODO()
a, _ := d.ArchiveByAid(c, 1)
id, err := d.AddArchiveOper(context.TODO(), a.ID, a.Attribute, a.TypeID, a.State, a.Round, 0, "随意一个变更", "测试啦")
So(err, ShouldBeNil)
Println(id)
})
}
func Test_LastVideoOperUID(t *testing.T) {
var (
c = context.TODO()
err error
sub int64
)
Convey("LastVideoOperUID", t, func() {
sub, err = d.LastVideoOperUID(c, 2333)
So(err, ShouldNotBeNil)
So(sub, ShouldBeZeroValue)
})
}
func Test_LastVideoOper(t *testing.T) {
var (
c = context.TODO()
err error
sub *archive.VideoOper
)
Convey("LastVideoOper", t, func() {
sub, err = d.LastVideoOper(c, 2333)
So(err, ShouldNotBeNil)
So(sub, ShouldNotBeNil)
})
}

View File

@@ -0,0 +1,111 @@
package archive
import (
"context"
sql2 "database/sql"
"go-common/app/job/main/videoup-report/model/archive"
"go-common/library/database/sql"
"go-common/library/log"
)
const (
_recheckByAid = "SELECT id,type,aid,uid,state,ctime,mtime FROM archive_recheck WHERE aid =? and type = ?"
_inRecheck = "INSERT INTO archive_recheck (type,aid) VALUES (?,?)"
_upRecheckState = "UPDATE archive_recheck SET state=? WHERE aid =? and type = ?"
_upMidRecheckState = "UPDATE archive_recheck as r LEFT JOIN archive AS a ON a.id = r.aid SET r.state=? WHERE a.mid =? and r.type = ? AND r.state = ?"
)
// AddRecheckAids add recheck aids
func (d *Dao) AddRecheckAids(c context.Context, tp int, aids []int64, ignRechecked bool) (err error) {
for _, aid := range aids {
recheck, _ := d.RecheckByAid(c, tp, aid)
if recheck != nil {
if ignRechecked && recheck.State != archive.RecheckStateIgnore {
continue
}
if recheck.State == archive.RecheckStateWait {
log.Info("d.AddRecheckAids(%d) already in recheck", aid)
continue
}
if err = d.UpdateRecheckState(c, tp, aid, archive.RecheckStateWait); err != nil {
log.Error("d.UpdateRecheckState error(%v)", err)
continue
}
} else if _, err = d.db.Exec(c, _inRecheck, tp, aid); err != nil {
log.Error("d.AddRecheckAids.Exec error(%v)", err)
continue
}
a, err := d.ArchiveByAid(c, aid)
if err != nil {
log.Error("d.ArchiveByAid error(%v)", err)
err = nil
continue
}
tpStr := archive.RecheckType(tp)
if tpStr != "" {
d.AddArchiveOper(c, aid, a.Attribute, a.TypeID, a.State, a.Round, 0, "", "待"+tpStr)
}
}
return
}
// UpdateMidRecheckState 设置某个UP主的未回查稿件回查状态
func (d *Dao) UpdateMidRecheckState(c context.Context, tp int, mid int64, state int8) (err error) {
if _, err = d.db.Exec(c, _upMidRecheckState, state, mid, tp, archive.RecheckStateWait); err != nil {
log.Error("d.updateRecheckState.Exec error(%v)", err)
return
}
return
}
// TxAddRecheckAID add recheck aid to db
func (d *Dao) TxAddRecheckAID(tx *sql.Tx, tp int, aid int64) (id int64, err error) {
var (
res sql2.Result
)
if res, err = tx.Exec(_inRecheck, tp, aid); err != nil {
log.Error("TxAddRecheckAID error(%v) type(%d) aid(%d)", err, tp, aid)
return
}
id, err = res.LastInsertId()
return
}
// UpdateRecheckState update recheck state
func (d *Dao) UpdateRecheckState(c context.Context, tp int, aid int64, state int8) (err error) {
if _, err = d.db.Exec(c, _upRecheckState, state, aid, tp); err != nil {
log.Error("d.updateRecheckState.Exec error(%v)", err)
return
}
return
}
//TxUpRecheckState update recheck state
func (d *Dao) TxUpRecheckState(tx *sql.Tx, tp int, aid int64, state int8) (row int64, err error) {
var res sql2.Result
if res, err = tx.Exec(_upRecheckState, state, aid, tp); err != nil {
log.Error("d.TxUpRecheckState.Exec error(%v)", err)
return
}
row, err = res.RowsAffected()
return
}
// RecheckByAid find archive recheck
func (d *Dao) RecheckByAid(c context.Context, tp int, aid int64) (recheck *archive.Recheck, err error) {
row := d.db.QueryRow(c, _recheckByAid, aid, tp)
recheck = &archive.Recheck{}
if err = row.Scan(&recheck.ID, &recheck.Type, &recheck.Aid, &recheck.UID, &recheck.State, &recheck.CTime, &recheck.MTime); err != nil {
if err == sql.ErrNoRows {
err = nil
} else {
log.Error("row.Scan error(%v)", err)
}
recheck = nil
return
}
return
}

View File

@@ -0,0 +1,22 @@
package archive
import (
"context"
"testing"
. "github.com/smartystreets/goconvey/convey"
"go-common/app/job/main/videoup-report/model/archive"
)
func TestDao_TxAddRecheckAID(t *testing.T) {
Convey("TxAddRecheckAID", t, func() {
c := context.TODO()
a, _ := d.ArchiveByAid(c, 1)
tx, _ := d.BeginTran(c)
id, err := d.TxAddRecheckAID(tx, archive.TypeChannelRecheck, a.ID)
tx.Commit()
So(err, ShouldBeNil)
Println(id)
})
}

View File

@@ -0,0 +1,27 @@
package archive
import (
"context"
"testing"
. "github.com/smartystreets/goconvey/convey"
"time"
)
func Test_Archive(t *testing.T) {
Convey("ArchiveByAid", t, func() {
archive, err := d.ArchiveByAid(context.TODO(), 1)
So(err, ShouldBeNil)
Println(archive)
})
}
func Test_ExcitationArchivesByTime(t *testing.T) {
Convey("ExcitationArchivesByTime", t, func() {
now := time.Now()
st := now.Add(-1680000 * time.Hour)
archives, err := d.ExcitationArchivesByTime(context.TODO(), 27515256, st, now)
So(err, ShouldBeNil)
Println(archives)
})
}

View File

@@ -0,0 +1,19 @@
package archive
import (
"context"
"go-common/library/log"
)
const (
_seNoteSQL = "SELECT note FROM archive_video_audit WHERE vid=?;"
)
//VideoAuditNote get note by vid
func (d *Dao) VideoAuditNote(c context.Context, vid int64) (note string, err error) {
if err = d.db.QueryRow(c, _seNoteSQL, vid).Scan(&note); err != nil {
log.Error("VideoAuditNote db.row.scan error(%v) vid(%d)", err, vid)
}
return
}

View File

@@ -0,0 +1,21 @@
package archive
import (
"context"
. "github.com/smartystreets/goconvey/convey"
"testing"
)
func Test_VideoAuditNote(t *testing.T) {
var (
c = context.TODO()
err error
sub string
)
Convey("VideoAuditNote", t, func() {
sub, err = d.VideoAuditNote(c, 2333)
So(err, ShouldNotBeNil)
So(sub, ShouldBeEmpty)
})
}

View File

@@ -0,0 +1,72 @@
package archive
import (
"context"
"database/sql"
"encoding/json"
"go-common/app/job/main/videoup-report/model/task"
"go-common/library/log"
"go-common/library/xstr"
)
const (
_confSQL = "SELECT value FROM archive_config WHERE state=0 AND name=?"
_confForAuditType = "wait_audit_arctype"
_confForWeightValue = "weight_conf_values"
)
// AuditTypesConf get audit conf
func (d *Dao) AuditTypesConf(c context.Context) (atps map[int16]struct{}, err error) {
row := d.db.QueryRow(c, _confSQL, _confForAuditType)
var (
value string
typeIDs []int64
)
if err = row.Scan(&value); err != nil {
if err == sql.ErrNoRows {
err = nil
} else {
log.Error("row.Scan error(%v)", err)
}
return
}
typeIDs, err = xstr.SplitInts(value)
if err != nil {
log.Error("archive_config value(%s) xstr.SplitInts error(%v)", value, err)
return
}
atps = map[int16]struct{}{}
for _, typeid := range typeIDs {
atps[int16(typeid)] = struct{}{}
}
return
}
//WeightValueConf 权重数值配置
func (d *Dao) WeightValueConf(c context.Context) (wvconf *task.WeightValueConf, err error) {
var value []byte
if err = d.db.QueryRow(c, _confSQL, _confForWeightValue).Scan(&value); err != nil {
if err == sql.ErrNoRows {
err = nil
} else {
log.Error("row.Scan() error(%v)", err)
}
return
}
wvconf = new(task.WeightValueConf)
if err = json.Unmarshal(value, wvconf); err != nil {
log.Error("json.Unmarshal error(%v)", err)
wvconf = nil
return
}
wvconf.Nsum9 = wvconf.Nlv5 * 3
wvconf.Nsum15 = (wvconf.Nlv1 * 2) + wvconf.Nsum9
wvconf.Nsum27 = (wvconf.Nlv2 * 4) + wvconf.Nsum15
wvconf.Nsum45 = (wvconf.Nlv3 * 6) + wvconf.Nsum27
wvconf.Tsum2h = wvconf.Tlv1 * 40
wvconf.Tsum1h = (wvconf.Tlv2 * 20) + wvconf.Tsum2h
wvconf.MinWeight = -(wvconf.Tsum1h + wvconf.Tlv3*10)
return
}

View File

@@ -0,0 +1,16 @@
package archive
import (
"context"
"testing"
. "github.com/smartystreets/goconvey/convey"
)
func Test_AuditTypesConf(t *testing.T) {
Convey("AuditTypesConf", t, func() {
configs, err := d.AuditTypesConf(context.TODO())
So(err, ShouldBeNil)
Println(configs)
})
}

View File

@@ -0,0 +1,42 @@
package archive
import (
"context"
"go-common/app/job/main/videoup-report/conf"
"go-common/library/database/sql"
)
// Dao is redis dao.
type Dao struct {
c *conf.Config
// db
db *sql.DB
}
// New new a dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
c: c,
db: sql.NewMySQL(c.DB.Archive),
}
// select
return d
}
// BeginTran begin transcation.
func (d *Dao) BeginTran(c context.Context) (tx *sql.Tx, err error) {
return d.db.Begin(c)
}
// Close close dao.
func (d *Dao) Close() {
if d.db != nil {
d.db.Close()
}
}
// Ping ping cpdb
func (d *Dao) Ping(c context.Context) (err error) {
return d.db.Ping(c)
}

View File

@@ -0,0 +1,19 @@
package archive
import (
"flag"
"path/filepath"
"go-common/app/job/main/videoup-report/conf"
)
var (
d *Dao
)
func init() {
dir, _ := filepath.Abs("../../cmd/videoup-report-job.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
}

View File

@@ -0,0 +1,80 @@
package archive
import (
"context"
"go-common/app/job/main/videoup-report/model/archive"
"go-common/library/database/sql"
"go-common/library/log"
)
const (
_oidFlowCount = "SELECT COUNT(*) as count FROM flow_design WHERE state = 0 AND pool = ? AND group_id = ? AND oid = ?"
_inFlowSQL = "INSERT into flow_design(pool,oid,group_id,uid,remark) VALUES (?,?,?,?,?)"
_inFlowLogSQL = "INSERT into flow_design_log(pool,oid,group_id,uid,action,remark) VALUES (?,?,?,?,?,?)"
_upFlowStateSQL = "UPDATE flow_design SET state=? WHERE id=?"
_flowUniqueSQL = "SELECT id,pool,oid,group_id,parent,state FROM flow_design WHERE oid=? AND pool=? AND group_id=? LIMIT 1"
)
// HasFlowGroup check if has flow group record
func (d *Dao) HasFlowGroup(c context.Context, pool int, gid, oid int64) (has bool, err error) {
var (
count int
)
row := d.db.QueryRow(c, _oidFlowCount, pool, gid, oid)
if err = row.Scan(&count); err != nil {
log.Error("d.hasFlowGroup err(%v)", err)
return
}
has = count > 0
return
}
// TxAddFlow tx add flow_design.
func (d *Dao) TxAddFlow(tx *sql.Tx, pool int8, oid, uid, groupID int64, remark string) (id int64, err error) {
res, err := tx.Exec(_inFlowSQL, pool, oid, groupID, uid, remark)
if err != nil {
log.Error("d.TxAddFlow.Exec() error(%v)", err)
return
}
id, err = res.LastInsertId()
return
}
// TxAddFlowLog tx add flow_design log.
func (d *Dao) TxAddFlowLog(tx *sql.Tx, pool, action int8, oid, uid, groupID int64, remark string) (id int64, err error) {
res, err := tx.Exec(_inFlowLogSQL, pool, oid, groupID, uid, action, remark)
if err != nil {
log.Error("d._inFlowLog.Exec() error(%v)", err)
return
}
id, err = res.LastInsertId()
return
}
// TxUpFlowState 更新pool!=1的流量套餐资源的状态
// return int64, error/nil
func (d *Dao) TxUpFlowState(tx *sql.Tx, id int64, state int8) (rows int64, err error) {
res, err := tx.Exec(_upFlowStateSQL, state, id)
if err != nil {
log.Error("TxUpFlowState.Exec() error(%v)", err)
return
}
rows, err = res.RowsAffected()
return
}
// FlowUnique 获取命中 指定流量套餐的记录
// return *archive.FlowData/nil, error/nil
func (d *Dao) FlowUnique(c context.Context, oid, groupID int64, pool int8) (f *archive.FlowData, err error) {
f = &archive.FlowData{}
if err = d.db.QueryRow(context.TODO(), _flowUniqueSQL, oid, pool, groupID).Scan(&f.ID, &f.Pool, &f.OID, &f.GroupID, &f.Parent, &f.State); err != nil {
if err == sql.ErrNoRows {
err = nil
f = nil
} else {
log.Error("row.Scan error(%v)", err)
}
}
return
}

View File

@@ -0,0 +1,51 @@
package archive
import (
"context"
"testing"
. "github.com/smartystreets/goconvey/convey"
"go-common/app/job/main/videoup-report/model/archive"
)
func TestDao_TxAddFlow(t *testing.T) {
Convey("TxAddFlow", t, func() {
c := context.TODO()
tx, _ := d.BeginTran(c)
fid, err := d.TxAddFlow(tx, archive.PoolArcForbid, 1, 0, archive.FLowGroupIDChannel, "测试添加")
tx.Commit()
So(err, ShouldBeNil)
Println(fid)
})
}
func TestDao_TxAddFlowLog(t *testing.T) {
Convey("TxAddFlowLog", t, func() {
c := context.TODO()
tx, _ := d.BeginTran(c)
id, err := d.TxAddFlowLog(tx, archive.PoolArcForbid, archive.FlowLogAdd, 1, 0, archive.FLowGroupIDChannel, "测试添加")
tx.Commit()
So(err, ShouldBeNil)
Println(id)
})
}
func TestDao_TxUpFlowState(t *testing.T) {
Convey("TxUpFlowState", t, func() {
c := context.TODO()
tx, _ := d.BeginTran(c)
id, err := d.TxUpFlowState(tx, 551, archive.FlowDelete)
tx.Commit()
So(err, ShouldBeNil)
Println(id)
})
}
func TestDao_FlowUnique(t *testing.T) {
Convey("FlowUnique", t, func() {
c := context.TODO()
f, err := d.FlowUnique(c, 1, archive.FLowGroupIDChannel, archive.PoolArcForbid)
So(err, ShouldBeNil)
Println(f)
})
}

View File

@@ -0,0 +1,62 @@
package archive
import (
"context"
"time"
"go-common/app/job/main/videoup-report/model/archive"
"go-common/library/database/sql"
"go-common/library/log"
)
const (
_reportAddByTypeIDSQL = "INSERT INTO archive_report_sum(content,ctime,mtime,type) VALUE(?,?,?,?)"
_reportGetByTypeIDSQL = "SELECT id,content,ctime,mtime,type FROM archive_report_sum WHERE type=? AND mtime>=? AND mtime<=?"
_reportLastByTypeIDSQL = "SELECT id,content,ctime,mtime,type FROM archive_report_sum WHERE type=? ORDER BY id DESC LIMIT 1"
)
// ReportLast get last inserted report
func (d *Dao) ReportLast(c context.Context, typeid int8) (report *archive.Report, err error) {
row := d.db.QueryRow(c, _reportLastByTypeIDSQL, typeid)
report = &archive.Report{}
if err = row.Scan(&report.ID, &report.Content, &report.CTime, &report.MTime, &report.TypeID); err != nil {
if err == sql.ErrNoRows {
report = nil
err = nil
} else {
log.Error("row.Scan error(%v)", err)
}
return
}
return
}
// ReportAdd report add of typeid
func (d *Dao) ReportAdd(c context.Context, typeid int8, content string, ctime, mtime time.Time) (lastID int64, err error) {
res, err := d.db.Exec(c, _reportAddByTypeIDSQL, content, ctime, mtime, typeid)
if err != nil {
log.Error("d.TaskTookAddStmt.Exec error(%v)", err)
return
}
lastID, err = res.LastInsertId()
return
}
// Reports report get of typeid
func (d *Dao) Reports(c context.Context, typeid int8, stime, etime time.Time) (reports []*archive.Report, err error) {
rows, err := d.db.Query(c, _reportGetByTypeIDSQL, typeid, stime, etime)
if err != nil {
log.Error("d.Reports.Query error(%v)", err)
return
}
defer rows.Close()
for rows.Next() {
report := &archive.Report{}
if err = rows.Scan(&report.ID, &report.Content, &report.CTime, &report.MTime, &report.TypeID); err != nil {
log.Error("rows.Scan error(%v)", err)
return
}
reports = append(reports, report)
}
return
}

View File

@@ -0,0 +1,143 @@
package archive
import (
"context"
"time"
"go-common/app/job/main/videoup-report/model/archive"
"go-common/library/database/sql"
"go-common/library/log"
)
const (
// task
_taskByMtimeSQL = "SELECT id,state,ctime,mtime FROM task_dispatch WHERE mtime>? and ptime=0"
_taskDoneByMtimeSQL = "SELECT id,state,ctime,mtime FROM task_dispatch_done WHERE mtime>? and ptime=0"
_taskByUntreatedSQL = "SELECT id,state,ctime,mtime FROM task_dispatch WHERE (state=0 OR state=1) and ptime=0"
// task took in and sel
_addTaskTookSQL = "INSERT INTO task_dispatch_took(m50,m60,m80,m90,type,ctime,mtime) VALUE(?,?,?,?,?,?,?)"
_taskTooksSQL = "SELECT id,m50,m60,m80,m90,type,ctime,mtime FROM task_dispatch_took WHERE type=1 AND ctime>?"
_taskTookByHalfHourSQL = "SELECT id,m50,m60,m80,m90,type,ctime,mtime FROM task_dispatch_took WHERE type=2 ORDER BY ctime DESC LIMIT 1"
_taskTooksByHalfHourSQL = "SELECT id,m50,m60,m80,m90,type,ctime,mtime FROM task_dispatch_took WHERE type=2 AND ctime>=? AND ctime<=? ORDER BY ctime ASC"
)
// TaskByMtime gets to took the task by mtime
func (d *Dao) TaskByMtime(c context.Context, stime time.Time) (tasks []*archive.Task, err error) {
rows, err := d.db.Query(c, _taskByMtimeSQL, stime)
if err != nil {
log.Error("d.taskStmt.Query(%v) error(%v)", stime, err)
return
}
defer rows.Close()
for rows.Next() {
task := &archive.Task{}
if err = rows.Scan(&task.ID, &task.State, &task.Ctime, &task.Mtime); err != nil {
log.Error("rows.Scan error(%v)", err)
return
}
tasks = append(tasks, task)
}
return
}
// TaskDoneByMtime gets to took the task done by mtime
func (d *Dao) TaskDoneByMtime(c context.Context, stime time.Time) (tasks []*archive.Task, err error) {
rows, err := d.db.Query(c, _taskDoneByMtimeSQL, stime)
if err != nil {
log.Error("d.taskStmt.Query(%v) error(%v)", stime, err)
return
}
defer rows.Close()
for rows.Next() {
task := &archive.Task{}
if err = rows.Scan(&task.ID, &task.State, &task.Ctime, &task.Mtime); err != nil {
log.Error("rows.Scan error(%v)", err)
return
}
tasks = append(tasks, task)
}
return
}
// TaskByUntreated gets to took the task by untreated
func (d *Dao) TaskByUntreated(c context.Context) (tasks []*archive.Task, err error) {
rows, err := d.db.Query(c, _taskByUntreatedSQL)
if err != nil {
log.Error("d.taskStmt.Query error(%v)", err)
return
}
defer rows.Close()
for rows.Next() {
task := &archive.Task{}
if err = rows.Scan(&task.ID, &task.State, &task.Ctime, &task.Mtime); err != nil {
log.Error("rows.Scan error(%v)", err)
return
}
tasks = append(tasks, task)
}
return
}
// AddTaskTook add TaskTook
func (d *Dao) AddTaskTook(c context.Context, took *archive.TaskTook) (lastID int64, err error) {
res, err := d.db.Exec(c, _addTaskTookSQL, took.M50, took.M60, took.M80, took.M90, took.TypeID, took.Ctime, took.Mtime)
if err != nil {
log.Error("d.TaskTookAddStmt.Exec error(%v)", err)
return
}
lastID, err = res.LastInsertId()
return
}
// TaskTooks gets TaskTook by ctime
func (d *Dao) TaskTooks(c context.Context, stime time.Time) (tooks []*archive.TaskTook, err error) {
rows, err := d.db.Query(c, _taskTooksSQL, stime)
if err != nil {
log.Error("d.TaskTookStmt.Query() error(%v)", err)
return
}
defer rows.Close()
for rows.Next() {
took := &archive.TaskTook{}
if err = rows.Scan(&took.ID, &took.M50, &took.M60, &took.M80, &took.M90, &took.TypeID, &took.Ctime, &took.Mtime); err != nil {
log.Error("rows.Scan error(%v)", err)
return
}
tooks = append(tooks, took)
}
return
}
// TaskTookByHalfHour get TaskTook by half hour
func (d *Dao) TaskTookByHalfHour(c context.Context) (took *archive.TaskTook, err error) {
row := d.db.QueryRow(c, _taskTookByHalfHourSQL)
took = &archive.TaskTook{}
if err = row.Scan(&took.ID, &took.M50, &took.M60, &took.M80, &took.M90, &took.TypeID, &took.Ctime, &took.Mtime); err != nil {
if err == sql.ErrNoRows {
took = nil
err = nil
} else {
log.Error("row.Scan error(%v)", err)
}
}
return
}
// TaskTooksByHalfHour get TaskTooks by half hour
func (d *Dao) TaskTooksByHalfHour(c context.Context, stime time.Time, etime time.Time) (tooks []*archive.TaskTook, err error) {
rows, err := d.db.Query(c, _taskTooksByHalfHourSQL, stime, etime)
if err != nil {
log.Error("d.TaskTooksByHalfHour.Query(%v,%v) error(%v)", stime, etime, err)
return
}
defer rows.Close()
for rows.Next() {
took := &archive.TaskTook{}
if err = rows.Scan(&took.ID, &took.M50, &took.M60, &took.M80, &took.M90, &took.TypeID, &took.Ctime, &took.Mtime); err != nil {
log.Error("rows.Scan error(%v)", err)
return
}
tooks = append(tooks, took)
}
return
}

View File

@@ -0,0 +1,32 @@
package archive
import (
"context"
"fmt"
"go-common/library/log"
)
const (
_consumerOnlineSQL = "SELECT uid FROM task_consumer WHERE uid IN (%s) AND state=1"
)
//ConsumerOnline get online task_consumer
func (d *Dao) ConsumerOnline(c context.Context, uids string) (ids []int64, err error) {
rows, err := d.db.Query(c, fmt.Sprintf(_consumerOnlineSQL, uids))
if err != nil {
log.Error("d.db.Query(%s, %v) error(%v)", _consumerOnlineSQL, uids, err)
return
}
defer rows.Close()
for rows.Next() {
var id int64
if err = rows.Scan(&id); err != nil {
log.Error("rows.Scan error(%v)", err)
return
}
ids = append(ids, id)
}
return
}

View File

@@ -0,0 +1,117 @@
package archive
import (
"context"
"time"
"go-common/app/job/main/videoup-report/model/task"
"go-common/library/database/sql"
"go-common/library/log"
)
const (
_dispatchSQL = "SELECT id,state FROM task_dispatch WHERE aid=? AND cid=? ORDER BY id DESC"
_inDispatchSQL = "INSERT INTO task_dispatch(pool,subject,adminid,aid,cid,uid,state,conf_id,conf_state,conf_weight,upspecial,cftime,ptime) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)"
_delDispatchSQL = "UPDATE task_dispatch SET state=? WHERE aid=? AND cid=? AND state!=?"
_delDispatchByAidSQL = "UPDATE task_dispatch SET state=? WHERE aid=? AND state IN (?,?,?)"
_delDispatchByTimeSQL = "DELETE FROM task_dispatch WHERE mtime>=? AND mtime<=? AND state in (2,6)"
_taskIDforWeightSQL = "SELECT id FROM task_dispatch WHERE state=0 AND id>? ORDER BY id ASC limit 1000"
_upTaskWeightSQL = "UPDATE task_dispatch set weight=?,uptime=now() where id=? and state=0"
_upSpecialSQL = "UPDATE task_dispatch SET upspecial=? WHERE id=?"
)
// DispatchState get dipatch state.
func (d *Dao) DispatchState(c context.Context, aid, cid int64) (id int64, state int8, err error) {
row := d.db.QueryRow(c, _dispatchSQL, aid, cid)
if err = row.Scan(&id, &state); err != nil {
if err == sql.ErrNoRows {
err = nil
return
}
log.Error("row.Scan(%d) error(%v)", err)
return
}
return
}
// AddDispatch add task dispatch
func (d *Dao) AddDispatch(c context.Context, t *task.Task) (lastID int64, err error) {
res, err := d.db.Exec(c, _inDispatchSQL, t.Pool, t.Subject, t.AdminID, t.Aid, t.Cid, t.UID, t.State,
t.ConfigID, t.ConfigState, t.ConfigWeight, t.UPSpecial, t.CFtime, t.Ptime)
if err != nil {
log.Error("d.db.Exec(%s) error(%v)", _inDispatchSQL, err)
return
}
return res.LastInsertId()
}
// DelDispatch del dispatch.
func (d *Dao) DelDispatch(c context.Context, aid, cid int64) (rows int64, err error) {
res, err := d.db.Exec(c, _delDispatchSQL, task.StateForTaskUserDeleted, aid, cid, task.StateForTaskUserDeleted)
if err != nil {
log.Error("d.db.Exec(%s, %d, %d) error(%v)", _delDispatchSQL, aid, cid, err)
return
}
return res.RowsAffected()
}
// DelDispatchByAid del dispatch by aid.
func (d *Dao) DelDispatchByAid(c context.Context, aid int64) (rows int64, err error) {
res, err := d.db.Exec(c, _delDispatchByAidSQL, task.StateForTaskUserDeleted, aid, task.StateForTaskDefault, task.StateForTaskWork, task.StateForTaskDelay)
if err != nil {
log.Error("d.db.Exec(%s, %d, %d) error(%v)", _delDispatchByAidSQL, aid, err)
return
}
return res.RowsAffected()
}
// TxDelDispatchByTime del dispatch by time segment
func (d *Dao) TxDelDispatchByTime(c context.Context, tx *sql.Tx, startTime, endTime time.Time) (rows int64, err error) {
res, err := tx.Exec(_delDispatchByTimeSQL, startTime.Format("2006-01-02 15:04:05"), endTime.Format("2006-01-02 15:04:05"))
if err != nil {
log.Error("tx.Exec(%s, %s, %s) error(%v)", _delDispatchByTimeSQL, startTime.Format("2006-01-02 15:04:05"), endTime.Format("2006-01-02 15:04:05"), err)
return
}
return res.RowsAffected()
}
// TaskIDforWeight 获取需要更新权重的任务id(用于给redis批量读取)
func (d *Dao) TaskIDforWeight(c context.Context, lastid int64) (ids []int64, last int64, err error) {
rows, err := d.db.Query(c, _taskIDforWeightSQL, lastid) //获取一批待审核任务
if err != nil {
log.Error("d.db.Query(%s, %d) error(%v)", _taskIDforWeightSQL, lastid, err)
return
}
defer rows.Close()
for rows.Next() {
var id int64
if err = rows.Scan(&id); err != nil {
log.Error("rows.Scan error(%v)", err)
return
}
ids = append(ids, id)
last = id
}
return
}
// UpTaskWeight 更新单条权重
func (d *Dao) UpTaskWeight(c context.Context, taskid int64, weight int64) (rows int64, err error) {
res, err := d.db.Exec(c, _upTaskWeightSQL, weight, taskid)
if err != nil {
log.Error("d.db.Exec(%s,%d,%d) error(%v)", _upTaskWeightSQL, weight, taskid, err)
return
}
return res.RowsAffected()
}
// SetUpSpecial 更新单条权重
func (d *Dao) SetUpSpecial(c context.Context, taskid int64, special int8) (rows int64, err error) {
res, err := d.db.Exec(c, _upSpecialSQL, special, taskid)
if err != nil {
log.Error("d.db.Exec(%s,%d,%d) error(%v)", _upSpecialSQL, special, taskid, err)
return
}
return res.RowsAffected()
}

View File

@@ -0,0 +1,46 @@
package archive
import (
"context"
"time"
"go-common/library/database/sql"
"go-common/library/log"
)
const (
_inDispatchDoneSQL = `INSERT IGNORE INTO task_dispatch_done(task_id,pool,subject,adminid,aid,cid,uid,state,utime,ctime,mtime,dtime,gtime,weight,conf_id,conf_state,conf_weight,upspecial,ptime,uptime,cftime)
SELECT id,pool,subject,adminid,aid,cid,uid,state,utime,ctime,mtime,dtime,gtime,weight,conf_id,conf_state,conf_weight,upspecial,ptime,uptime,cftime FROM task_dispatch WHERE mtime>=? AND mtime<=? AND state IN (2,6);`
_delTaskDoneBeforeSQL = "DELETE FROM task_dispatch_done WHERE mtime<=? LIMIT ?"
_delTaskBeforeSQL = "DELETE FROM task_dispatch WHERE mtime<=? LIMIT ?"
)
// TxAddDispatchDone add task dispatch done
func (d *Dao) TxAddDispatchDone(c context.Context, tx *sql.Tx, startTime, endTime time.Time) (rows int64, err error) {
res, err := tx.Exec(_inDispatchDoneSQL, startTime.Format("2006-01-02 15:04:05"), endTime.Format("2006-01-02 15:04:05"))
if err != nil {
log.Error("tx.Exec(%s, %s, %s) error(%v)", _inDispatchDoneSQL, startTime.Format("2006-01-02 15:04:05"), endTime.Format("2006-01-02 15:04:05"), err)
return
}
return res.RowsAffected()
}
// DelTaskDoneBefore del task_dispatch_done
func (d *Dao) DelTaskDoneBefore(c context.Context, before time.Time, limit int64) (rows int64, err error) {
res, err := d.db.Exec(c, _delTaskDoneBeforeSQL, before.Format("2006-01-02 15:04:05"), limit)
if err != nil {
log.Error("d.db.Exec(%s, %s, %d) error(%v)", _delTaskDoneBeforeSQL, before, limit, err)
return
}
return res.RowsAffected()
}
// DelTaskBefore del task_dispatch
func (d *Dao) DelTaskBefore(c context.Context, before time.Time, limit int64) (rows int64, err error) {
res, err := d.db.Exec(c, _delTaskBeforeSQL, before.Format("2006-01-02 15:04:05"), limit)
if err != nil {
log.Error("d.db.Exec(%s, %s, %d) error(%v)", _delTaskBeforeSQL, before, limit, err)
return
}
return res.RowsAffected()
}

View File

@@ -0,0 +1,71 @@
package archive
import (
"context"
"database/sql"
"encoding/json"
"time"
"go-common/app/job/main/videoup-report/model/task"
xsql "go-common/library/database/sql"
"go-common/library/log"
)
const (
_getTaskWeight = "SELECT t.id,t.state,a.mid,t.ctime,t.upspecial,t.ptime,e.description FROM `task_dispatch` AS t " +
"LEFT JOIN `task_dispatch_extend` AS e ON t.id=e.task_id INNER JOIN archive as a ON a.id=t.aid WHERE t.state=0 AND t.id>? LIMIT 1000"
_inDispatchExtendSQL = "INSERT INTO task_dispatch_extend(task_id,description) VALUE (?,?)"
_delTaskExtendSQL = "DELETE FROM task_dispatch_extend WHERE mtime < ? LIMIT ?"
)
// GetTaskWeight 从数据库读取权重配置
func (d *Dao) GetTaskWeight(c context.Context, lastid int64) (mcases map[int64]*task.WeightParams, err error) {
var (
rows *xsql.Rows
desc sql.NullString
)
if rows, err = d.db.Query(c, _getTaskWeight, lastid); err != nil {
log.Error("d.db.Query(%s, %d) error(%v)", _getTaskWeight, lastid, err)
return
}
defer rows.Close()
mcases = make(map[int64]*task.WeightParams)
for rows.Next() {
tp := new(task.WeightParams)
if err = rows.Scan(&tp.TaskID, &tp.State, &tp.Mid, &tp.Ctime, &tp.Special, &tp.Ptime, &desc); err != nil {
log.Error("rows.Scan error(%v)", err)
return
}
if desc.Valid && len(desc.String) > 0 {
arr := []*task.ConfigItem{}
if err = json.Unmarshal([]byte(desc.String), &arr); err != nil {
arr = nil
log.Error("json.Unmarshal error(%v)", err)
continue
}
tp.CfItems = arr
}
mcases[tp.TaskID] = tp
}
return
}
// InDispatchExtend 扩展表,记录权重配置信息
func (d *Dao) InDispatchExtend(c context.Context, taskid int64, desc string) (lastid int64, err error) {
res, err := d.db.Exec(c, _inDispatchExtendSQL, taskid, desc)
if err != nil {
log.Error("tx.Exec(%s, %d, %v) error(%v)", _inDispatchExtendSQL, taskid, desc, err)
return
}
return res.LastInsertId()
}
// DelTaskExtend del task_dispatch_extend
func (d *Dao) DelTaskExtend(c context.Context, before time.Time, limit int64) (rows int64, err error) {
res, err := d.db.Exec(c, _delTaskExtendSQL, before.Format("2006-01-02 15:04:05"), limit)
if err != nil {
log.Error("d.db.Exec(%s, %s, %d) error(%v)", _delTaskExtendSQL, before, limit, err)
return
}
return res.RowsAffected()
}

View File

@@ -0,0 +1,142 @@
package archive
import (
"context"
"encoding/json"
"fmt"
tmod "go-common/app/job/main/videoup-report/model/task"
"go-common/app/job/main/videoup-report/model/utils"
"go-common/library/database/sql"
"go-common/library/log"
"go-common/library/xstr"
)
const (
_assignConfigsSQL = "SELECT id,uids,pool,config_mids,config_tids,config_time,adminid,state,stime,etime FROM task_config WHERE state=0"
_delAConfsSQL = "UPDATE task_config SET state=1 WHERE id IN (%s)"
_weightConfSQL = "SELECT id,description,mtime FROM task_weight_config WHERE state=0" // 查
_delWConfsSQL = "UPDATE task_weight_config SET state=1 WHERE id IN (%s)"
)
//AssignConfigs take config
func (d *Dao) AssignConfigs(c context.Context) (tasks map[int64]*tmod.AssignConfig, err error) {
rows, err := d.db.Query(c, _assignConfigsSQL)
if err != nil {
log.Error("d.db.Query error(%v)", err)
return
}
tasks = make(map[int64]*tmod.AssignConfig)
defer rows.Close()
for rows.Next() {
var (
midStr string
uidsStr string
tidStr string
durationStr string
mids []int64
tids []int64
durations []int64
)
t := &tmod.AssignConfig{}
if err = rows.Scan(&t.ID, &uidsStr, &t.Pool, &midStr, &tidStr, &durationStr, &t.AdminID, &t.State, &t.STime, &t.ETime); err != nil {
log.Error("rows.Scan error(%v)", err)
continue
}
if uidsStr != "" {
if t.UIDs, err = xstr.SplitInts(uidsStr); err != nil {
log.Error("xstr.SplitInts(%s) errror(%v)", uidsStr, err)
err = nil
continue
}
}
if midStr != "" {
if mids, err = xstr.SplitInts(midStr); err != nil {
log.Error("xstr.SplitInts(%s) error(%v)", midStr, err)
err = nil
continue
}
t.MIDs = make(map[int64]struct{}, len(mids))
for _, mid := range mids {
t.MIDs[mid] = struct{}{}
}
}
if tidStr != "" {
if tids, err = xstr.SplitInts(tidStr); err != nil {
log.Error("xstr.SplitInts(%s) error(%v)", tidStr, err)
err = nil
continue
}
t.TIDs = make(map[int16]struct{}, len(tids))
for _, tid := range tids {
t.TIDs[int16(tid)] = struct{}{}
}
}
if durationStr != "" {
if durations, err = xstr.SplitInts(durationStr); err != nil || len(durations) != 2 {
log.Error("xstr.SplitInts(%s) error(%v)", durationStr, err)
err = nil
continue
}
t.MinDuration = durations[0]
t.MaxDuration = durations[1]
}
if len(t.UIDs) > 0 {
tasks[t.ID] = t
}
}
return
}
// DelAssignConfs 删除指派配置
func (d *Dao) DelAssignConfs(c context.Context, ids []int64) (rows int64, err error) {
sqlstring := fmt.Sprintf(_delAConfsSQL, xstr.JoinInts(ids))
res, err := d.db.Exec(c, sqlstring)
if err != nil {
log.Error("d.db.Exec(%s) error(%v)", sqlstring, err)
return
}
return res.RowsAffected()
}
// WeightConf 所有有效的配置(用于检测是否和以及有的配置冲突)
func (d *Dao) WeightConf(c context.Context) (items []*tmod.ConfigItem, err error) {
var (
id int64
descb []byte
rows *sql.Rows
wci *tmod.ConfigItem
mtime utils.FormatTime
)
if rows, err = d.db.Query(c, _weightConfSQL); err != nil {
log.Error("d.db.Query(%s) error(%v)", _weightConfSQL, err)
return
}
defer rows.Close()
for rows.Next() {
wci = new(tmod.ConfigItem)
if err = rows.Scan(&id, &descb, &mtime); err != nil {
log.Error("rows.Scan error(%v)", err)
return
}
if err = json.Unmarshal(descb, wci); err != nil {
log.Error("json.Unmarshal(%s) error(%v)", string(descb), err)
continue
}
wci.Mtime = mtime
wci.ID = id
items = append(items, wci)
}
return
}
// DelWeightConfs 删除权重配置
func (d *Dao) DelWeightConfs(c context.Context, ids []int64) (rows int64, err error) {
sqlstring := fmt.Sprintf(_delWConfsSQL, xstr.JoinInts(ids))
res, err := d.db.Exec(c, sqlstring)
if err != nil {
log.Error("d.db.Exec(%s) error(%v)", sqlstring, err)
return
}
return res.RowsAffected()
}

View File

@@ -0,0 +1,56 @@
package archive
import (
"context"
"time"
"go-common/library/database/sql"
"go-common/library/log"
)
const (
_inTaskHisSQL = "INSERT INTO task_oper_history(pool,action,task_id,cid,uid,result,reason) VALUE (?,?,?,?,?,?,?);"
_mvTaskOperHisSQL = "INSERT IGNORE INTO task_oper_history_done(id,pool,action,task_id,cid,uid,result,reason,utime,ctime,mtime) SELECT id,pool,action,task_id,cid,uid,result,reason,utime,ctime,mtime FROM task_oper_history WHERE mtime < ? LIMIT ?"
_delTaskOperHisSQL = "DELETE FROM task_oper_history WHERE mtime < ? LIMIT ?"
_delTaskHistoryDoneSQL = "DELETE FROM task_oper_history_done WHERE mtime < ? LIMIT ?"
)
// AddTaskHis add task oper history
func (d *Dao) AddTaskHis(c context.Context, pool int8, action int8, taskID int64, cid int64, uid int64, result int16, reason string) (rows int64, err error) {
res, err := d.db.Exec(c, _inTaskHisSQL, pool, action, taskID, cid, uid, result, reason)
if err != nil {
log.Error("d.db.Exec(%s) error(%v)", _inTaskHisSQL, err)
return
}
return res.RowsAffected()
}
// TxMoveTaskOperDone select into from task_oper_history to task_oper_history_done before t.
func (d *Dao) TxMoveTaskOperDone(tx *sql.Tx, t time.Time, limit int64) (rows int64, err error) {
res, err := tx.Exec(_mvTaskOperHisSQL, t, limit)
if err != nil {
log.Error("tx.Exec(%s, %s, %d) error(%v)", _mvTaskOperHisSQL, t, limit, err)
return
}
return res.RowsAffected()
}
// TxDelTaskOper delete from task_oper_history before t.
func (d *Dao) TxDelTaskOper(tx *sql.Tx, t time.Time, limit int64) (rows int64, err error) {
res, err := tx.Exec(_delTaskOperHisSQL, t, limit)
if err != nil {
log.Error("tx.Exec(%s, %s, %d) error(%v)", _delTaskOperHisSQL, t, limit, err)
return
}
return res.RowsAffected()
}
// DelTaskHistoryDone del oper done
func (d *Dao) DelTaskHistoryDone(c context.Context, before time.Time, limit int64) (rows int64, err error) {
res, err := d.db.Exec(c, _delTaskHistoryDoneSQL, before.Format("2006-01-02 15:04:05"), limit)
if err != nil {
log.Error("d.db.Exec(%s, %s, %d) error(%v)", _delTaskHistoryDoneSQL, before, limit, err)
return
}
return res.RowsAffected()
}

View File

@@ -0,0 +1,24 @@
package archive
import (
"context"
"testing"
. "github.com/smartystreets/goconvey/convey"
)
func Test_TaskByUntreated(t *testing.T) {
Convey("TaskByUntreated", t, func() {
configs, err := d.TaskByUntreated(context.TODO())
So(err, ShouldBeNil)
Println(configs)
})
}
func Test_TaskTookByHalfHour(t *testing.T) {
Convey("TaskTookByHalfHour", t, func() {
configs, err := d.TaskTookByHalfHour(context.TODO())
So(err, ShouldBeNil)
Println(configs)
})
}

View File

@@ -0,0 +1,22 @@
package archive
import (
"context"
"go-common/library/log"
)
const (
_inArcHis = "INSERT INTO archive_track(aid,state,round,attribute,remark,ctime,mtime) VALUES(?,?,?,?,?,?,?)"
)
// AddTrack insert archive track history
func (d *Dao) AddTrack(c context.Context, aid int64, state int, round int8, attr int32, remark string, ctime, mtime string) (rows int64, err error) {
rs, err := d.db.Exec(c, _inArcHis, aid, state, round, attr, remark, ctime, mtime)
if err != nil {
log.Error("d.inArcHisStmt.Exec(%d, %d, %d, %s, %s, %s) error(%v)", aid, state, round, attr, remark, ctime, mtime, err)
return
}
rows, err = rs.RowsAffected()
return
}

View File

@@ -0,0 +1,32 @@
package archive
import (
"context"
"go-common/app/job/main/videoup-report/model/archive"
"go-common/library/log"
)
const (
_tpsSQL = "SELECT id,pid,name FROM archive_type"
)
// TypeMapping is second types opposite first types.
func (d *Dao) TypeMapping(c context.Context) (rmap map[int16]*archive.Type, err error) {
rows, err := d.db.Query(c, _tpsSQL)
if err != nil {
log.Error("d.tpsStmt.Query error(%v)", err)
return
}
defer rows.Close()
rmap = map[int16]*archive.Type{}
for rows.Next() {
tp := &archive.Type{}
if err = rows.Scan(&tp.ID, &tp.PID, &tp.Name); err != nil {
log.Error("rows.Scan error(%v)", err)
return
}
rmap[tp.ID] = tp
}
return
}

View File

@@ -0,0 +1,15 @@
package archive
import (
"context"
"testing"
. "github.com/smartystreets/goconvey/convey"
)
func Test_TypeMapping(t *testing.T) {
Convey("TypeMapping", t, func() {
_, err := d.TypeMapping(context.TODO())
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,85 @@
package archive
import (
"context"
"go-common/library/log"
"time"
"database/sql"
"go-common/app/job/main/videoup-report/model/archive"
farm "github.com/dgryski/go-farm"
)
const (
_updatedFilenamesByTime = "SELECT filename FROM video WHERE mtime >= ? AND mtime < ?"
_videos2SQL = `SELECT vr.id,v.filename,vr.cid,vr.aid,vr.title,vr.description,v.src_type,v.duration,v.filesize,v.resolutions,
v.playurl,v.failcode,vr.index_order,v.attribute,v.xcode_state,v.status,vr.state,vr.ctime,vr.mtime FROM archive_video_relation AS vr JOIN video AS v ON vr.cid=v.id WHERE vr.aid=? ORDER BY vr.index_order`
_newVideoByFnSQL = `SELECT avr.id,v.filename,avr.cid,avr.aid,avr.title,avr.description,v.src_type,v.duration,v.filesize,v.resolutions,v.playurl,v.failcode,
avr.index_order,v.attribute,v.xcode_state,avr.state,v.status,avr.ctime,avr.mtime FROM archive_video_relation avr JOIN video v on avr.cid = v.id
WHERE hash64=? AND filename=?`
)
// UpdatedFilenames Get updated video's filename between stime and etime.
func (d *Dao) UpdatedFilenames(c context.Context, stime, etime time.Time) (fns []string, err error) {
rows, err := d.db.Query(c, _updatedFilenamesByTime, stime, etime)
if err != nil {
log.Error("d.UpdatedFilenames.Query(%v,%v) error(%v)", stime, etime, err)
return
}
defer rows.Close()
for rows.Next() {
fn := ""
if err = rows.Scan(&fn); err != nil {
log.Error("rows.Scan error(%v)", err)
return
}
fns = append(fns, fn)
}
return
}
// Videos2 get videos by 2 table em.......
func (d *Dao) Videos2(c context.Context, aid int64) (vs []*archive.Video, err error) {
rows, err := d.db.Query(c, _videos2SQL, aid)
if err != nil {
log.Error("d.db.Query(%s, %d) error(%v)", _videos2SQL, aid, err)
return
}
defer rows.Close()
for rows.Next() {
v := &archive.Video{}
if err = rows.Scan(&v.ID, &v.Filename, &v.Cid, &v.Aid, &v.Title, &v.Desc, &v.SrcType, &v.Duration, &v.Filesize, &v.Resolutions,
&v.Playurl, &v.FailCode, &v.Index, &v.Attribute, &v.XcodeState, &v.Status, &v.State, &v.CTime, &v.MTime); err != nil {
log.Error("rows.Scan error(%v)", err)
return
}
vs = append(vs, v)
}
return
}
// NewVideo get video info by filename.
func (d *Dao) NewVideo(c context.Context, filename string) (v *archive.Video, err error) {
hash64 := int64(farm.Hash64([]byte(filename)))
row := d.db.QueryRow(c, _newVideoByFnSQL, hash64, filename)
v = &archive.Video{}
var avrState, vState int16
if err = row.Scan(&v.ID, &v.Filename, &v.Cid, &v.Aid, &v.Title, &v.Desc, &v.SrcType, &v.Duration, &v.Filesize, &v.Resolutions,
&v.Playurl, &v.FailCode, &v.Index, &v.Attribute, &v.XcodeState, &avrState, &vState, &v.CTime, &v.MTime); err != nil {
if err == sql.ErrNoRows {
v = nil
err = nil
} else {
log.Error("row.Scan error(%v)", err)
}
return
}
// 2 state map to 1
if avrState == archive.VideoStatusDelete {
v.Status = archive.VideoStatusDelete
} else {
v.Status = vState
}
return
}

View File

@@ -0,0 +1,15 @@
package archive
import (
"context"
"testing"
. "github.com/smartystreets/goconvey/convey"
)
func Test_Videos2(t *testing.T) {
Convey("Videos2", t, func() {
_, err := d.Videos2(context.TODO(), 1)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,22 @@
package archive
import (
"context"
"go-common/library/log"
)
const (
_inVideoHis = "INSERT INTO archive_video_track(aid,filename,status,xcode_state,remark,ctime,mtime) VALUES(?,?,?,?,?,?,?)"
)
// AddVideoTrack insert video track history
func (d *Dao) AddVideoTrack(c context.Context, aid int64, filename string, status int16, xcodeState int8, remark string, ctime, mtime string) (rows int64, err error) {
rs, err := d.db.Exec(c, _inVideoHis, aid, filename, status, xcodeState, remark, ctime, mtime)
if err != nil {
log.Error("d.inVideoHisStmt.Exec(%d, %s, %d, %d, %s, %s, %s) error(%v)", aid, filename, status, xcodeState, remark, ctime, mtime, err)
return
}
rows, err = rs.RowsAffected()
return
}

View File

@@ -0,0 +1,15 @@
package archive
import (
"context"
"testing"
. "github.com/smartystreets/goconvey/convey"
)
func Test_AddVideoTrack(t *testing.T) {
Convey("AddVideoTrack", t, func() {
_, err := d.AddVideoTrack(context.TODO(), 1, "Test_InVideoHis", 0, 0, "", "", "")
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,61 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = [
"admin_test.go",
"dao_test.go",
"reply_test.go",
],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/job/main/videoup-report/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"admin.go",
"dao.go",
"profit.go",
"reply.go",
"uper.go",
],
importpath = "go-common/app/job/main/videoup-report/dao/data",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/job/main/videoup-report/conf:go_default_library",
"//app/job/main/videoup-report/model/archive:go_default_library",
"//app/job/main/videoup-report/model/data:go_default_library",
"//app/job/main/videoup-report/model/manager:go_default_library",
"//app/job/main/videoup-report/model/monitor:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,22 @@
package data
import (
"context"
"errors"
"go-common/app/job/main/videoup-report/model/monitor"
)
func (d *Dao) MonitorNotify(c context.Context) (data []*monitor.RuleResultData, err error) {
var (
res = &monitor.RuleResultRes{}
)
if err = d.client.Get(c, d.moniNotifyURL, "", nil, &res); err != nil {
return
}
if res == nil || res.Data == nil {
err = errors.New("监控结果获取失败")
return
}
data = res.Data
return
}

View File

@@ -0,0 +1,14 @@
package data
import (
"context"
. "github.com/smartystreets/goconvey/convey"
"testing"
)
func TestDao_MonitorNotify(t *testing.T) {
Convey("MonitorNotify", t, func() {
_, err := d.MonitorNotify(context.TODO())
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,61 @@
package data
import (
"context"
"errors"
"go-common/app/job/main/videoup-report/conf"
"go-common/app/job/main/videoup-report/model/data"
"go-common/library/ecode"
"go-common/library/log"
xhttp "go-common/library/net/http/blademaster"
)
const (
_hotArc = "/data/rank/reco-app-remen-pre.json"
_monitorNotify = "/va/monitor/notify"
_replyChange = "/x/internal/v2/reply/subject/state"
_replyInfo = "/x/internal/v2/reply/subject"
_profitUpState = "/allowance/api/x/admin/growup/up/account/state"
)
//Dao dao
type Dao struct {
c *conf.Config
moniNotifyURL string
hotArcURL, replyInfoURL, replyChangeURL, upProfitState string
client, clientWriter *xhttp.Client
}
//New new
func New(c *conf.Config) (d *Dao) {
d = &Dao{
c: c,
hotArcURL: c.Host.Data + _hotArc,
moniNotifyURL: c.Host.Archive + _monitorNotify,
replyInfoURL: c.Host.API + _replyInfo,
replyChangeURL: c.Host.API + _replyChange,
upProfitState: c.Host.Profit + _profitUpState,
client: xhttp.NewClient(c.HTTPClient.Read),
clientWriter: xhttp.NewClient(c.HTTPClient.Write),
}
return
}
// HotArchive get hot archives which need rechecking
func (d *Dao) HotArchive(c context.Context) (aids []int64, err error) {
res := &data.HotArchiveRes{}
if err = d.client.Get(c, d.hotArcURL, "", nil, &res); err != nil {
log.Error("d.HotArchive() error(%v)", err)
return
}
if res.Code != ecode.OK.Code() {
err = errors.New("data api bad response")
log.Error("d.HotArchive() bad code(%d)", res.Code)
return
}
for _, item := range res.List {
aids = append(aids, item.Aid)
}
return
}

View File

@@ -0,0 +1,35 @@
package data
import (
"flag"
"go-common/app/job/main/videoup-report/conf"
"os"
"testing"
)
var (
d *Dao
)
func TestMain(m *testing.M) {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "videoup-report")
flag.Set("conf_token", "")
flag.Set("tree_id", "")
flag.Set("conf_version", "server-1")
flag.Set("deploy_env", "uat")
flag.Set("conf_host", "config.bilibili.co")
flag.Set("conf_path", "/tmp")
flag.Set("region", "sh")
flag.Set("zone", "sh001")
} else {
flag.Set("conf", "../../cmd/videoup-report-job.toml")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
m.Run()
os.Exit(0)
}

View File

@@ -0,0 +1,40 @@
package data
import (
"context"
"errors"
"go-common/library/log"
"net/url"
"strconv"
)
const UpProfitStateSigned = 3 //激励计划签约状态
// UpProfitState 获取UP主激励计划状态
// 返回State
// 1: 未申请; 2: 待审核; 3: 已签约; 4.已驳回; 5.主动退出; 6:被动退出; 7:封禁
func (d *Dao) UpProfitState(c context.Context, mid int64) (state int8, err error) {
params := url.Values{}
params.Set("mid", strconv.FormatInt(mid, 10))
params.Set("type", "0")
var res struct {
Code int `json:"code"`
Msg string `json:"message"`
Data *struct {
Mid int64 `json:"mid"`
State int8 `json:"state"`
} `json:"data"`
}
if err = d.client.Get(c, d.upProfitState, "", params, &res); err != nil {
log.Error("UpProfitState(%d) error(%v)", mid, err)
return
}
if res.Data == nil {
err = errors.New("UP主激励计划状态获取失败")
log.Error("UpProfitState(%d) nil response(%v)", res)
return
}
state = res.Data.State
return
}

View File

@@ -0,0 +1,101 @@
package data
import (
"context"
"fmt"
"net/url"
"strconv"
"go-common/app/job/main/videoup-report/model/archive"
"go-common/library/ecode"
"go-common/library/log"
)
// OpenReply change subject state to open
func (d *Dao) OpenReply(c context.Context, aid int64, mid int64) (err error) {
params := url.Values{}
// guanguan admin id
params.Set("adid", "399")
params.Set("mid", strconv.FormatInt(mid, 10))
params.Set("oid", strconv.FormatInt(aid, 10))
params.Set("type", "1")
params.Set("state", "0")
var res struct {
Code int `json:"code"`
Message string `json:"message"`
}
if err = d.clientWriter.Post(c, d.replyChangeURL, "", params, &res); err != nil {
log.Error("OpenReply url(%s) error(%v)", d.replyChangeURL+"?"+params.Encode(), err)
return
}
if res.Code != 0 {
log.Error("OpenReply url(%s) code(%d) msg(%s)", d.replyChangeURL+"?"+params.Encode(), res.Code, res.Message)
if res.Code == ecode.ReplySubjectExist.Code() || res.Code == ecode.ReplySubjectFrozen.Code() || res.Code == ecode.ReplyIllegalSubState.Code() || res.Code == ecode.ReplyIllegalSubType.Code() {
return
}
err = fmt.Errorf("OpenReply call failed")
}
return
}
// CloseReply change subject state to close
func (d *Dao) CloseReply(c context.Context, aid int64, mid int64) (err error) {
params := url.Values{}
// guanguan admin id
params.Set("adid", "399")
params.Set("mid", strconv.FormatInt(mid, 10))
params.Set("oid", strconv.FormatInt(aid, 10))
params.Set("type", "1")
params.Set("state", "1")
var res struct {
Code int `json:"code"`
Message string `json:"message"`
}
if err = d.clientWriter.Post(c, d.replyChangeURL, "", params, &res); err != nil {
log.Error("CloseReply url(%s) error(%v)", d.replyChangeURL+"?"+params.Encode(), err)
return
}
if res.Code != 0 {
log.Error("CloseReply url(%s) code(%d) msg(%s)", d.replyChangeURL+"?"+params.Encode(), res.Code, res.Message)
if res.Code == ecode.ReplySubjectExist.Code() || res.Code == ecode.ReplySubjectFrozen.Code() || res.Code == ecode.ReplyIllegalSubState.Code() || res.Code == ecode.ReplyIllegalSubType.Code() {
return
}
err = fmt.Errorf("CloseReply call failed")
}
return
}
// CheckReply get subject state
func (d *Dao) CheckReply(c context.Context, aid int64) (replyState int64, err error) {
params := url.Values{}
// guanguan admin id
params.Set("adid", "399")
params.Set("oid", strconv.FormatInt(aid, 10))
params.Set("type", "1")
var res struct {
Code int `json:"code"`
Data *struct {
Oid int64 `json:"oid"`
Mid int64 `json:"mid"`
State int8 `json:"state"`
} `json:"data"`
Message string `json:"message"`
}
if err = d.client.Get(c, d.replyInfoURL, "", params, &res); err != nil {
replyState = archive.ReplyDefault
log.Error("CheckReply url(%s) error(%v)", d.replyInfoURL+"?"+params.Encode(), err)
return
}
if res.Code != 0 {
replyState = archive.ReplyDefault
log.Info("CheckReply url(%s) code(%d)", d.replyInfoURL+"?"+params.Encode(), res.Code)
return
}
if res.Data == nil {
replyState = archive.ReplyDefault
log.Info("CheckReply url(%s) code(%d) data(%v)", d.replyInfoURL+"?"+params.Encode(), res.Code, res.Data)
return
}
replyState = int64(res.Data.State)
return
}

View File

@@ -0,0 +1,51 @@
package data
import (
"context"
"testing"
"github.com/smartystreets/goconvey/convey"
)
var (
aid = int64(10098208)
mid = int64(10920044)
)
func TestDataOpenReply(t *testing.T) {
var (
c = context.TODO()
)
convey.Convey("OpenReply", t, func(ctx convey.C) {
err := d.OpenReply(c, aid, mid)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
}
func TestDataCloseReply(t *testing.T) {
var (
c = context.TODO()
)
convey.Convey("CloseReply", t, func(ctx convey.C) {
err := d.CloseReply(c, aid, mid)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
}
func TestDataCheckReply(t *testing.T) {
var (
c = context.TODO()
)
convey.Convey("CheckReply", t, func(ctx convey.C) {
replyState, err := d.CheckReply(c, aid)
t.Logf("%d", replyState)
ctx.Convey("Then err should be nil.replyState should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(replyState, convey.ShouldNotBeNil)
})
})
}

View File

@@ -0,0 +1,37 @@
package data
import (
"context"
"go-common/app/job/main/videoup-report/model/manager"
"go-common/library/log"
"net/url"
"strconv"
)
const (
_midGroupsURI = "/x/internal/uper/special/get_by_mid"
)
// UpGroups get all up groups
func (d *Dao) MidGroups(c context.Context, mid int64) (groups map[int64]*manager.UpGroup, err error) {
groups = make(map[int64]*manager.UpGroup)
params := url.Values{}
params.Set("mid", strconv.FormatInt(mid, 10))
var res struct {
Code int `json:"code"`
Msg string `json:"message"`
Data []*manager.UpGroup `json:"data"`
}
if err = d.client.Get(c, d.c.Host.API+_midGroupsURI, "", params, &res); err != nil {
log.Error("d.UpGroups() error(%v)", err)
return
}
if res.Data == nil {
log.Warn("MidGroups(%d) error when get up groups", mid)
return
}
for _, v := range res.Data {
groups[v.GroupID] = v
}
return
}

View File

@@ -0,0 +1,62 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = [
"dao_test.go",
"email_template_test.go",
"email_test.go",
"redis_list_test.go",
],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/job/main/videoup-report/conf:go_default_library",
"//app/job/main/videoup-report/model/archive:go_default_library",
"//app/job/main/videoup-report/model/email:go_default_library",
"//library/cache/redis:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"dao.go",
"email.go",
"email_template.go",
"redis_list.go",
],
importpath = "go-common/app/job/main/videoup-report/dao/email",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/job/main/videoup-report/conf:go_default_library",
"//app/job/main/videoup-report/model/email:go_default_library",
"//library/cache/redis:go_default_library",
"//library/log:go_default_library",
"//library/queue/databus/report:go_default_library",
"//vendor/gopkg.in/gomail.v2:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,70 @@
package email
import (
"crypto/tls"
"go-common/app/job/main/videoup-report/conf"
"go-common/app/job/main/videoup-report/model/email"
"go-common/library/cache/redis"
gomail "gopkg.in/gomail.v2"
)
// Dao is redis dao.
type Dao struct {
c *conf.Config
redis *redis.Pool
email *gomail.Dialer
FansAddr map[int16][]string
emailAddr map[string][]string
PrivateAddr map[string][]string
//fast behavior detector
detector *email.FastDetector
//快速通道token
fastChan chan int
//邮件发送api的频率token发送邮件5s后插入
controlChan chan int64
}
// New is new redis dao.
func New(c *conf.Config) (d *Dao) {
emailAddr := make(map[string][]string)
for _, v := range c.Mail.Addr {
emailAddr[v.Type] = v.Addr
}
privateMail := make(map[string][]string)
for _, v := range c.Mail.PrivateAddr {
privateMail[v.Type] = v.Addr
}
d = &Dao{
c: c,
redis: redis.NewPool(c.Redis.Mail),
email: gomail.NewDialer(c.Mail.Host, c.Mail.Port, c.Mail.Username, c.Mail.Password),
emailAddr: emailAddr,
PrivateAddr: privateMail,
detector: email.NewFastDetector(c.Mail.SpeedThreshold, c.Mail.OverspeedThreshold),
fastChan: make(chan int, 10240),
controlChan: make(chan int64, 1),
}
d.email.TLSConfig = &tls.Config{
InsecureSkipVerify: true,
}
d.fastChan <- 1
d.controlChan <- 1
return d
}
//Close close
func (d *Dao) Close() (err error) {
if d.redis != nil {
err = d.redis.Close()
}
return
}
//FastChan get fast channel
func (d *Dao) FastChan() <-chan int {
return d.fastChan
}

View File

@@ -0,0 +1,35 @@
package email
import (
"flag"
"go-common/app/job/main/videoup-report/conf"
"os"
"testing"
)
var (
d *Dao
)
func TestMain(m *testing.M) {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "videoup-report")
flag.Set("conf_token", "")
flag.Set("tree_id", "")
flag.Set("conf_version", "server-1")
flag.Set("deploy_env", "uat")
flag.Set("conf_host", "config.bilibili.co")
flag.Set("conf_path", "/tmp")
flag.Set("region", "sh")
flag.Set("zone", "sh001")
} else {
flag.Set("conf", "../../cmd/videoup-report-job.toml")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
m.Run()
os.Exit(0)
}

View File

@@ -0,0 +1,139 @@
package email
import (
"context"
"encoding/json"
"fmt"
"strings"
"time"
"go-common/app/job/main/videoup-report/model/email"
"go-common/library/log"
"go-common/library/queue/databus/report"
gomail "gopkg.in/gomail.v2"
)
//SendMail send the email
func (d *Dao) SendMail(tpl *email.Template) {
var err error
headers := tpl.Headers
if len(headers[email.FROM]) == 0 || len(headers[email.TO]) == 0 || len(headers[email.SUBJECT]) == 0 {
log.Error("email lack From/To/Subject: emailTemplate(%+v)", *tpl)
return
}
if len(tpl.ContentType) == 0 {
tpl.ContentType = "text/plain"
}
log.Info("start send mail: emailTemplate(%+v)", *tpl)
msg := gomail.NewMessage()
msg.SetHeaders(headers)
msg.SetBody(tpl.ContentType, tpl.Body)
result := email.EmailResOK
if err = d.email.DialAndSend(msg); err != nil {
result = email.EmailResFail
log.Error("s.email.DialAndSend error(%v) emailTemplate(%+v)", err, tpl)
}
d.sendEmailLog(tpl, headers[email.TO], headers[email.CC], result)
//retry
if err != nil {
address := headers[email.TO]
if len(headers[email.CC]) > 0 {
address = append(address, headers[email.CC]...)
msg.SetHeader(email.CC)
}
for _, addr := range address {
msg.SetHeader(email.TO, addr)
result = email.EmailResOK
if err = d.email.DialAndSend(msg); err != nil {
result = email.EmailResFail
log.Error("s.email.DialAndSend error(%v) to(%s) emailTemplate(%+v)", err, addr, tpl)
}
d.sendEmailLog(tpl, []string{addr}, []string{}, result)
time.Sleep(time.Second * 5)
}
}
}
func (d *Dao) sendEmailLog(tpl *email.Template, to []string, cc []string, result string) {
if tpl == nil || len(tpl.Headers) <= 0 || len(tpl.Headers[email.SUBJECT]) <= 0 {
log.Error("sendEmailLog tpl nil | no headers, tpl(%+v)", tpl)
return
}
address := fmt.Sprintf("to: %s", strings.Join(to, ","))
if len(cc) > 0 {
address = fmt.Sprintf("%s\ncc: %s", address, strings.Join(cc, ","))
}
item := &report.ManagerInfo{
Uname: tpl.Username,
UID: tpl.UID,
Business: email.LogBusEmail,
Type: email.LogTypeEmailJob,
Oid: tpl.AID,
Action: tpl.Type,
Ctime: time.Now(),
Content: map[string]interface{}{
"subject": tpl.Headers[email.SUBJECT][0],
"body": tpl.Body,
"address": address,
"department": tpl.Department,
"result": result,
},
}
report.Manager(item)
log.Info("sendEmailLog template(%+v) result(%s) log.content(%+v)", tpl, result, item.Content)
}
//PushToRedis start to push email to redis according to speed
func (d *Dao) PushToRedis(c context.Context, tpl *email.Template) (isFast bool, key string, err error) {
if tpl == nil {
return
}
//探查发邮件速度快慢
isFast = d.detector.Detect(tpl.UID)
//超限名单只能被回落或下一次超限名单替代
if d.detector.IsFastUnique(tpl.UID) {
key = email.MailFastKey
d.fastChan <- 1
} else {
key = email.MailKey
}
if err = d.PushRedis(c, tpl, key); err != nil {
log.Error("PushToRedis d.PushRedis error(%v) key(%s), tpl(%+v) ", err, key, tpl)
}
return
}
//Start get email from redis and send
func (d *Dao) Start(key string) (err error) {
var (
bs []byte
tpl = &email.Template{}
)
bs, err = d.PopRedis(context.TODO(), key)
if err != nil || bs == nil {
time.Sleep(5 * time.Second)
return
}
err = json.Unmarshal(bs, tpl)
if err != nil {
log.Error("email Start json.unmarshal error(%v) template(%s)", err, string(bs))
return
}
//控制邮件发送频率
st := <-d.controlChan
d.SendMail(tpl)
time.Sleep(time.Second * 5)
d.controlChan <- st
return
}

View File

@@ -0,0 +1,130 @@
package email
import (
"fmt"
"strconv"
"go-common/app/job/main/videoup-report/model/email"
"go-common/library/log"
)
//NotifyEmailTemplate 优质UP主/时政UP主/企业UP主/十万粉丝报备邮件
func (d *Dao) NotifyEmailTemplate(params map[string]string) (tpl *email.Template) {
headers := map[string][]string{
email.FROM: {d.c.Mail.Username},
}
//to
typeIDStr := params["typeId"]
if len(d.emailAddr[typeIDStr]) == 0 {
log.Info("archive(%s) type(%s) don't config email address.", params["aid"], typeIDStr)
return
}
headers[email.TO] = d.emailAddr[typeIDStr]
//subject
headers[email.SUBJECT] = []string{fmt.Sprintf("优质/十万粉稿件处理报备[%s]--操作人: %s[%s]", params["upName"], params["username"], params["department"])}
//body
body := `
稿件标题:%s
up主%s
稿件链接http://www.bilibili.com/video/av%s
触发条件:%s
处理操作:%s
`
body = fmt.Sprintf(body, params["title"], params["upName"], params["aid"], params["condition"], params["change"])
fromVideo, err := strconv.ParseBool(params["fromVideo"])
if err != nil {
log.Error("NotifyEmailTemplate get email template: strconv.ParseBool error(%v) aid(%s) fromVideo(%s)", err, params["aid"], params["fromVideo"])
return
}
//视频追踪信息还没上线,先不写
if !fromVideo {
body += fmt.Sprintf("稿件追踪http://manager.bilibili.co/#!/archive_utils/arc-track?aid=%s", params["aid"])
}
aid, _ := strconv.ParseInt(params["aid"], 10, 64)
uid, _ := strconv.ParseInt(params["uid"], 10, 64)
tpl = &email.Template{
Headers: headers,
Body: body,
ContentType: "text/plain",
Type: email.EmailUP,
AID: aid,
UID: uid,
Username: params["username"],
Department: params["department"],
}
log.Info("NotifyEmailTemplate: email template(%+v)", tpl)
return
}
//PrivateEmailTemplate 私单报备邮件模板
func (d *Dao) PrivateEmailTemplate(params map[string]string) (tpl *email.Template) {
headers := map[string][]string{
email.FROM: {d.c.Mail.Username},
}
//to
to := d.PrivateAddr[params["typeId"]]
if len(to) == 0 {
log.Error("PrivateEmailTemplate lack email address config: typeId(%s), params(%v)", params["typeId"], params)
return
}
headers[email.TO] = to
//cc
cc := d.PrivateAddr["CC"]
if len(cc) > 0 {
headers[email.CC] = cc
}
subject := fmt.Sprintf("私单稿件报备_%s_av%s", params["upName"], params["aid"])
headers[email.SUBJECT] = []string{subject}
body := `稿件标题: %s
稿件状态: %s
禁止项状态: 排行禁止:%s ;动态禁止:%s 推荐禁止:%s
UP主 %s
粉丝量:%s
操作人: %s [%s]
备注: %s`
body = fmt.Sprintf(body, params["arcTitle"], params["arcState"], params["noRankAttr"], params["noDynamicAttr"], params["noRecommendAttr"],
params["upName"], params["upFans"], params["mngName"], params["mngDepartment"], params["note"])
aid, _ := strconv.ParseInt(params["aid"], 10, 64)
uid, _ := strconv.ParseInt(params["uid"], 10, 64)
tpl = &email.Template{
Headers: headers,
Body: body,
ContentType: "text/plain",
Type: params["emailType"],
AID: aid,
UID: uid,
Username: params["mngName"],
Department: params["mngDepartment"],
}
log.Info("PrivateEmailTemplate: email template(%+v)", tpl)
return
}
// MinitorNotifyTeamplate 审核监控报警邮件模板
func (d *Dao) MonitorNotifyTemplate(subject string, body string, toEmails []string) (tpl *email.Template) {
headers := map[string][]string{
email.FROM: {d.c.Mail.Username},
}
headers[email.TO] = toEmails
headers[email.SUBJECT] = []string{subject}
tpl = &email.Template{
Headers: headers,
Body: body,
ContentType: "text/plain",
Type: email.EmailMonitor,
AID: 0,
UID: 0,
Username: "",
Department: "",
}
log.Info("MinitorNotifyTeamplate: email template(%+v)", tpl)
return
}

View File

@@ -0,0 +1,53 @@
package email
import (
"testing"
"github.com/smartystreets/goconvey/convey"
)
func TestEmailNotifyEmailTemplate(t *testing.T) {
var (
params = map[string]string{
"aid": "444",
"title": "随意一个标题",
"upName": "随意一个up主昵称",
"condition": "优质up主",
"change": "",
"username": "cxxx",
"department": "r&d",
"typeId": "4",
"fromVideo": "false",
"uid": "441",
}
)
convey.Convey("NotifyEmailTemplate", t, func(ctx convey.C) {
tpl := d.NotifyEmailTemplate(params)
ctx.Convey("Then tpl should not be nil.", func(ctx convey.C) {
ctx.So(tpl, convey.ShouldNotBeNil)
})
})
}
func TestEmailPrivateEmailTemplate(t *testing.T) {
var (
params = map[string]string{
"aid": "444",
"title": "随意一个标题",
"upName": "随意一个up主昵称",
"condition": "优质up主",
"change": "",
"username": "cxxx",
"department": "r&d",
"typeId": "4",
"fromVideo": "false",
"uid": "441",
}
)
convey.Convey("PrivateEmailTemplate", t, func(ctx convey.C) {
tpl := d.PrivateEmailTemplate(params)
ctx.Convey("Then tpl should not be nil.", func(ctx convey.C) {
ctx.So(tpl, convey.ShouldNotBeNil)
})
})
}

View File

@@ -0,0 +1,165 @@
package email
import (
"context"
"github.com/smartystreets/goconvey/convey"
"testing"
"time"
"go-common/app/job/main/videoup-report/model/email"
"go-common/library/cache/redis"
"sync"
)
var tplTest = &email.Template{
Headers: map[string][]string{
email.TO: {"chenxi01@bilibili.com"},
email.SUBJECT: {"nothing at all"},
},
Body: "testhahaha",
ContentType: "text/plain",
}
func TestEmailSendMail(t *testing.T) {
convey.Convey("SendMail", t, func(ctx convey.C) {
tplTest.Headers[email.FROM] = []string{d.email.Username}
d.SendMail(tplTest)
ctx.Convey("No return values", func(ctx convey.C) {
})
})
}
func TestEmailsendEmailLog(t *testing.T) {
var (
to = []string{"chenxi01@bilibili.com"}
cc = []string{""}
result = "成功"
)
convey.Convey("sendEmailLog", t, func(ctx convey.C) {
d.sendEmailLog(tplTest, to, cc, result)
ctx.Convey("No return values", func(ctx convey.C) {
})
})
}
//分片
func batch(tk []int64, length int) (path [][]int64) {
ll := len(tk) / length
if len(tk)%length > 0 {
ll++
}
path = [][]int64{}
item := []int64{}
for i := 0; i < len(tk); i++ {
if i > 0 && i%length == 0 {
path = append(path, item)
item = []int64{}
}
item = append(item, tk[i])
}
if len(item) > 0 {
path = append(path, item)
}
return
}
func TestEmailPushToRedis(t *testing.T) {
uid := int64(123)
uids := []int64{}
speedThreshold := d.c.Mail.SpeedThreshold
overlimit := speedThreshold * d.c.Mail.OverspeedThreshold
for i := 0; i < overlimit*2; i++ {
uids = append(uids, uid)
}
tplTest.UID = uid
path := batch(uids, speedThreshold)
len1 := len(uids)
path = append(path, batch(uids, speedThreshold-1)...)
len2 := 2 * len1
path = append(path, batch(uids, speedThreshold)...)
cnt := 0
convey.Convey("连续发送邮件,间隔出现超限名额", t, func(ctx convey.C) {
tplTest.Headers[email.FROM] = []string{d.email.Username}
for index, task := range path {
now := time.Now().UnixNano()
for i := range task {
cnt++
isfast, key, err := d.PushToRedis(context.TODO(), tplTest)
//_, _, err := d.PushToRedis(context.email.TODO(), tplTest)
convey.So(err, convey.ShouldBeNil)
t.Logf("cnt=%d,index=%d, i=%d, detector=%+v", cnt, index, i, d.detector)
if cnt < overlimit+speedThreshold { //快速,探查阶段
convey.So(isfast, convey.ShouldEqual, false)
convey.So(key, convey.ShouldEqual, email.MailKey)
} else if cnt == overlimit+speedThreshold { //快速,确认为超限,提供超限名单
convey.So(isfast, convey.ShouldEqual, true)
convey.So(key, convey.ShouldEqual, email.MailFastKey)
} else if cnt < len1+speedThreshold { //快速,探查阶段,保留上一次的超限名单
convey.So(isfast, convey.ShouldEqual, false)
convey.So(key, convey.ShouldEqual, email.MailFastKey)
} else if cnt < len2+overlimit+speedThreshold { //慢速/快速探查阶段,第一次慢速时清空上一次的超限名单
convey.So(isfast, convey.ShouldEqual, false)
convey.So(key, convey.ShouldEqual, email.MailKey)
} else if cnt == len2+overlimit+speedThreshold { //快速,确认为超限,提供超限名单
convey.So(isfast, convey.ShouldEqual, true)
convey.So(key, convey.ShouldEqual, email.MailFastKey)
} else { //快速,探查阶段,保留上一次的超限名单
convey.So(isfast, convey.ShouldEqual, false)
convey.So(key, convey.ShouldEqual, email.MailFastKey)
}
}
if diff := now + 1e9 - time.Now().UnixNano(); diff > 0 {
time.Sleep(time.Duration(diff))
}
}
})
}
func TestEmailStart(t *testing.T) {
convey.Convey("email Start", t, func(ctx convey.C) {
err := d.Start(email.MailKey)
convey.So(err, convey.ShouldBeNil)
err = d.Start(email.MailKey + "_1")
convey.So(err, convey.ShouldEqual, redis.ErrNil)
})
}
func TestEmailBatchStart(t *testing.T) {
wg := sync.WaitGroup{}
convey.Convey("email Start\r\n", t, func(ctx convey.C) {
wg.Add(1)
go func() {
defer wg.Done()
for {
err := d.Start(email.MailKey)
t.Logf("start to push normal email, time=%d\r\n", time.Now().Unix())
if err == redis.ErrNil {
t.Logf("normal email stopped\r\n")
break
}
ctx.So(err, convey.ShouldBeNil)
}
}()
go func() {
defer wg.Done()
for {
err := d.Start(email.MailFastKey)
t.Logf("start to push fast email, time=%d\r\n", time.Now().Unix())
if err == redis.ErrNil {
t.Logf("fast email stopped\r\n")
break
}
ctx.So(err, convey.ShouldBeNil)
}
}()
wg.Wait()
t.Logf("end")
})
}

View File

@@ -0,0 +1,66 @@
package email
import (
"context"
"encoding/json"
"go-common/library/cache/redis"
"go-common/library/log"
)
// PushRedis rpush fail item to redis
func (d *Dao) PushRedis(c context.Context, a interface{}, key string) (err error) {
var (
conn = d.redis.Get(c)
bs []byte
)
defer conn.Close()
if bs, err = json.Marshal(a); err != nil {
log.Error("json.Marshal(%v) error(%v) key(%s)", a, err, key)
return
}
if _, err = conn.Do("RPUSH", key, bs); err != nil {
log.Error("conn.Do(RPUSH, %s, %s) error(%v)", key, bs, err)
}
return
}
// PopRedis lpop fail item from redis
func (d *Dao) PopRedis(c context.Context, key string) (bs []byte, err error) {
var conn = d.redis.Get(c)
defer conn.Close()
if bs, err = redis.Bytes(conn.Do("LPOP", key)); err != nil && err != redis.ErrNil {
log.Error("redis.Bytes(conn.Do(LPOP, %s)) error(%v)", key, err)
}
return
}
//RemoveRedis lrem an element from redis list
func (d *Dao) RemoveRedis(c context.Context, key string, member ...interface{}) (reply int, err error) {
var (
lmem = len(member)
conn redis.Conn
)
if lmem < 1 {
return
}
conn = d.redis.Get(c)
defer conn.Close()
if lmem == 1 {
reply, err = redis.Int(conn.Do("LREM", key, 0, member[0]))
} else {
lua := "local a=0;for k in pairs(ARGV) do a=a+redis.call('LREM',KEYS[1],0,ARGV[k]) end;return a;"
args := []interface{}{lua, 1, key}
args = append(args, member...)
reply, err = redis.Int(conn.Do("EVAL", args...))
}
if err != nil {
log.Error("RemoveRedis conn.Do(%s) member(%+v) error(%v)", key, member, err)
}
return
}

View File

@@ -0,0 +1,111 @@
package email
import (
"context"
"encoding/json"
"testing"
"github.com/smartystreets/goconvey/convey"
"go-common/app/job/main/videoup-report/model/archive"
"go-common/app/job/main/videoup-report/model/email"
"go-common/library/cache/redis"
)
var member = email.Retry{
Action: email.RetryActionReply,
AID: 11,
Flag: archive.ReplyOn,
FlagA: archive.ReplyDefault,
}
var key = email.RetryListKey
func TestEmailPushRedis(t *testing.T) {
var (
c = context.TODO()
)
convey.Convey("PushRedis", t, func(ctx convey.C) {
err := d.PushRedis(c, member, key)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
}
func TestEmailPopRedis(t *testing.T) {
var (
c = context.TODO()
)
TestEmailPushRedis(t)
convey.Convey("PopRedis", t, func(ctx convey.C) {
bs, err := d.PopRedis(c, key)
ctx.Convey("Then err should be nil.bs should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(bs, convey.ShouldNotBeNil)
})
})
}
func TestEmailRemoveRedis1(t *testing.T) {
var (
c = context.TODO()
)
TestEmailPushRedis(t)
convey.Convey("RemoveRedis a member", t, func(ctx convey.C) {
bs, _ := json.Marshal(member)
reply, err := d.RemoveRedis(c, key, string(bs))
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(reply, convey.ShouldBeGreaterThan, 0)
})
})
}
func TestEmailRemoveRedis2(t *testing.T) {
var (
c = context.TODO()
err error
reply int
)
key1 := "list"
bsList := []interface{}{"ah1", "ah3", "ah5"}
reply, err = d.RemoveRedis(c, key1, bsList...)
t.Logf("function reply(%v) err(%v)", reply, err)
//多个元素删除
var bs []byte
list := []interface{}{}
old := []int64{-1, 0, 1}
nw := []int64{0, 1}
for _, v := range old {
for _, j := range nw {
m := email.Retry{
AID: member.AID,
Action: member.Action,
Flag: j,
FlagA: v,
}
if bs, err = json.Marshal(m); err != nil {
continue
}
list = append(list, string(bs))
}
}
TestEmailPushRedis(t)
member.Flag = 1
TestEmailPushRedis(t)
convey.Convey("RemoveRedis many member", t, func(ctx convey.C) {
reply, err = d.RemoveRedis(c, key, list...)
t.Logf("member reply(%d) error(%v)", reply, err)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
bs, err := d.PopRedis(c, key)
convey.So(err, convey.ShouldEqual, redis.ErrNil)
convey.So(bs, convey.ShouldBeNil)
})
}

View File

@@ -0,0 +1,51 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["dao_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/job/main/videoup-report/conf:go_default_library",
"//app/job/main/videoup-report/model/task:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"dao.go",
"weightlog.go",
],
importpath = "go-common/app/job/main/videoup-report/dao/hbase",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/job/main/videoup-report/conf:go_default_library",
"//app/job/main/videoup-report/model/task:go_default_library",
"//library/database/hbase.v2:go_default_library",
"//library/log:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,25 @@
package hbase
import (
"go-common/app/job/main/videoup-report/conf"
"go-common/library/database/hbase.v2"
)
// Dao is redis dao.
type Dao struct {
c *conf.Config
hbase *hbase.Client
}
// New new a archive dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
c: c,
hbase: hbase.NewClient(&c.Hbase.Config),
}
return d
}
// Close fn
func (d *Dao) Close() {
}

View File

@@ -0,0 +1,31 @@
package hbase
import (
"context"
"flag"
"path/filepath"
"testing"
"go-common/app/job/main/videoup-report/conf"
"go-common/app/job/main/videoup-report/model/task"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func init() {
dir, _ := filepath.Abs("../../cmd/videoup-report-job.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
}
func Test_AddLog(t *testing.T) {
Convey("AddLog", t, func() {
err := d.AddLog(context.TODO(), &task.WeightLog{TaskID: 44441})
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,51 @@
package hbase
import (
"context"
"crypto/md5"
"encoding/binary"
"encoding/json"
"fmt"
"strconv"
"time"
"go-common/app/job/main/videoup-report/model/task"
"go-common/library/log"
)
var (
tableInfo = "ugc:ArchiveTaskWeight"
family = "weightlog"
)
// hashRowKey create rowkey(md5(tid)[:2]+tid) for track by tid.
func hashRowKey(tid int64) string {
var bs = make([]byte, 8)
binary.LittleEndian.PutUint64(bs, uint64(tid))
rk := md5.Sum(bs)
return fmt.Sprintf("%x%d", rk[:2], tid)
}
// AddLog task weight log.
func (d *Dao) AddLog(c context.Context, alog *task.WeightLog) (err error) {
var (
value []byte
fvalues = make(map[string][]byte)
column string
key = hashRowKey(alog.TaskID)
)
column = strconv.FormatInt(int64(alog.Uptime.TimeValue().Unix()), 10)
if value, err = json.Marshal(alog); err != nil {
log.Error("json.Marshal(%v) error(%v)", value, err)
return
}
fvalues[column] = value
values := map[string]map[string][]byte{family: fvalues}
ctx, cancel := context.WithTimeout(c, time.Duration(d.c.Hbase.WriteTimeout))
defer cancel()
// hbase info
if _, err = d.hbase.PutStr(ctx, tableInfo, key, values); err != nil {
log.Error("d.hbase.PutStr(%s,%s,%+v) error(%v)", tableInfo, key, values, err)
}
return
}

View File

@@ -0,0 +1,50 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["dao_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/job/main/videoup-report/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"dao.go",
"user.go",
],
importpath = "go-common/app/job/main/videoup-report/dao/manager",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/job/main/videoup-report/conf:go_default_library",
"//app/job/main/videoup-report/model/manager:go_default_library",
"//library/database/sql:go_default_library",
"//library/log:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,43 @@
package manager
import (
"context"
"go-common/app/job/main/videoup-report/conf"
xsql "go-common/library/database/sql"
"go-common/library/log"
)
// Dao is manager dao.
type Dao struct {
c *conf.Config
db *xsql.DB
}
// New new a manager dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
c: c,
db: xsql.NewMySQL(c.DB.Manager),
}
return d
}
//Ping ping
func (d *Dao) Ping(c context.Context) (err error) {
if err = d.db.Ping(c); err != nil {
log.Error("manager ping error(%v)", err)
}
return
}
//Close close
func (d *Dao) Close() (err error) {
if d.db != nil {
err = d.db.Close()
}
if err != nil {
log.Error("manager close error(%v)", err)
}
return
}

View File

@@ -0,0 +1,40 @@
package manager
import (
"context"
"flag"
"path/filepath"
"testing"
. "github.com/smartystreets/goconvey/convey"
"go-common/app/job/main/videoup-report/conf"
)
var (
d *Dao
)
func init() {
dir, _ := filepath.Abs("../../cmd/videoup-report-job.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
}
func WithDao(f func(d *Dao)) func() {
return func() {
f(d)
}
}
func Test_User(t *testing.T) {
var (
c = context.TODO()
)
Convey("User", t, WithDao(func(d *Dao) {
um, err := d.User(c, 421)
So(err, ShouldBeNil)
So(um, ShouldNotBeNil)
}))
}

View File

@@ -0,0 +1,21 @@
package manager
import (
"context"
"go-common/app/job/main/videoup-report/model/manager"
"go-common/library/log"
)
const (
_userSQL = "SELECT u.id,u.username,d.name as department FROM user u left join user_department d on d.id=u.department_id where u.id=?"
)
// User get manager user profile
func (d *Dao) User(c context.Context, id int64) (user *manager.User, err error) {
user = &manager.User{}
if err = d.db.QueryRow(c, _userSQL, id).Scan(&user.ID, &user.Username, &user.Department); err != nil {
log.Error("User db.row.Scan error(%v) uid(%d)", err, id)
}
return
}

View File

@@ -0,0 +1,52 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["dao_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/job/main/videoup-report/conf:go_default_library",
"//app/job/main/videoup-report/model/mission:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"dao.go",
"mission.go",
],
importpath = "go-common/app/job/main/videoup-report/dao/mission",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/job/main/videoup-report/conf:go_default_library",
"//app/job/main/videoup-report/model/mission:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,32 @@
package mission
import (
"context"
"go-common/app/job/main/videoup-report/conf"
bm "go-common/library/net/http/blademaster"
)
// Dao is mission dao.
type Dao struct {
c *conf.Config
httpR *bm.Client
missAllURL string
}
// New new a mission dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
c: c,
// client
httpR: bm.NewClient(c.HTTPClient.Read),
// uri
missAllURL: c.Host.WWW + _msAllURL,
}
return d
}
// Ping ping success.
func (d *Dao) Ping(c context.Context) (err error) {
return
}

View File

@@ -0,0 +1,45 @@
package mission
import (
"context"
"flag"
"path/filepath"
"testing"
"go-common/app/job/main/videoup-report/conf"
"go-common/app/job/main/videoup-report/model/mission"
. "github.com/smartystreets/goconvey/convey"
)
var (
d *Dao
)
func init() {
dir, _ := filepath.Abs("../../cmd/videoup-report-job.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
}
func WithDao(f func(d *Dao)) func() {
return func() {
Reset(func() {})
f(d)
}
}
func Test_Missions(t *testing.T) {
var (
c = context.TODO()
err error
mm map[int]*mission.Mission
)
Convey("Missions", t, WithDao(func(d *Dao) {
mm, err = d.Missions(c)
So(err, ShouldBeNil)
So(mm, ShouldNotBeNil)
So(len(mm), ShouldBeGreaterThanOrEqualTo, 0)
}))
}

View File

@@ -0,0 +1,46 @@
package mission
import (
"context"
"time"
"go-common/app/job/main/videoup-report/model/mission"
"go-common/library/ecode"
"go-common/library/log"
)
const (
_msAllURL = "/activity/list/videoall"
)
// Missions get missions.
func (d *Dao) Missions(c context.Context) (mm map[int]*mission.Mission, err error) {
var res struct {
Code int `json:"code"`
Data []*struct {
ID int `json:"id"`
Name string `json:"name"`
ETime string `json:"etime"`
Tags string `json:"tags"`
} `json:"data"`
}
if err = d.httpR.Get(c, d.missAllURL, "", nil, &res); err != nil {
log.Error("videoup mission list error(%v) | missAllURL(%s)", err, d.missAllURL)
return
}
if res.Code != 0 {
log.Error("videoup mission list res.Code nq zero error(%v) | missAllURL(%s) res(%v)", res.Code, d.missAllURL, res)
err = ecode.CreativeActivityErr
return
}
mm = make(map[int]*mission.Mission, len(res.Data))
for _, m := range res.Data {
miss := &mission.Mission{}
miss.ID = m.ID
miss.Name = m.Name
miss.ETime, _ = time.Parse("2006-01-02 15:04:05", m.ETime)
miss.Tags = m.Tags
mm[miss.ID] = miss
}
return
}

View File

@@ -0,0 +1,56 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = [
"dao_test.go",
"redis_test.go",
],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/job/main/videoup-report/conf:go_default_library",
"//app/job/main/videoup-report/model/task:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"dao.go",
"monitor.go",
"redis.go",
"task.go",
],
importpath = "go-common/app/job/main/videoup-report/dao/redis",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/job/main/videoup-report/conf:go_default_library",
"//app/job/main/videoup-report/model/task:go_default_library",
"//library/cache/redis:go_default_library",
"//library/log:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,31 @@
package redis
import (
"go-common/app/job/main/videoup-report/conf"
"go-common/library/cache/redis"
)
// Dao is redis dao.
type Dao struct {
c *conf.Config
redis *redis.Pool
secondary *redis.Pool
}
// New new a archive dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
c: c,
redis: redis.NewPool(c.Redis.Track.Config),
secondary: redis.NewPool(c.Redis.Secondary.Config),
}
return d
}
// Close close the redis connection
func (d *Dao) Close() (err error) {
if err = d.secondary.Close(); err != nil {
return
}
return d.redis.Close()
}

View File

@@ -0,0 +1,19 @@
package redis
import (
"flag"
"path/filepath"
"go-common/app/job/main/videoup-report/conf"
)
var (
d *Dao
)
func init() {
dir, _ := filepath.Abs("../../cmd/videoup-report-job.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
}

View File

@@ -0,0 +1,52 @@
package redis
import (
"context"
"go-common/library/log"
"time"
)
// AddMonitorStats add stay stats
func (d *Dao) AddMonitorStats(c context.Context, key string, oid int64) (err error) {
var (
conn = d.secondary.Get(c)
now = time.Now().Unix()
age = 7 * 24 * 60 * 60
)
defer conn.Close()
if _, err = conn.Do("ZADD", key, now, oid); err != nil {
log.Error("conn.Do(ZADD, %s, %d, %d) error(%v)", key, now, oid, err)
return
}
if _, err = conn.Do("EXPIRE", key, age); err != nil {
log.Error("conn.Do(EXPIRE, %s, %d) error(%v)", key, age, err)
}
return
}
// RemMonitorStats remove stay stats
func (d *Dao) RemMonitorStats(c context.Context, key string, oid int64) (err error) {
var (
conn = d.secondary.Get(c)
)
defer conn.Close()
if _, err = conn.Do("ZREM", key, oid); err != nil {
log.Error("conn.Do(ZREM, %s, %d) error(%v)", key, oid, err)
}
return
}
// ClearMonitorStats clear expire stats
func (d *Dao) ClearMonitorStats(c context.Context, key string) (err error) {
var (
conn = d.secondary.Get(c)
now = time.Now().Unix()
min int64
max = now - 7*24*60*60
)
defer conn.Close()
if _, err = conn.Do("ZREMRANGEBYSCORE", key, min, max); err != nil {
log.Error("conn.Do(ZREMRANGEBYSCORE, %s, %d, %d) error(%v)", key, min, max, err)
}
return
}

View File

@@ -0,0 +1,91 @@
package redis
import (
"context"
"fmt"
"go-common/library/log"
"time"
)
const (
_videoJamTime = "va_v_jam_time"
)
// SetVideoJam set video traffic jam time
func (d *Dao) SetVideoJam(c context.Context, jamTime int) (err error) {
var conn = d.redis.Get(c)
defer conn.Close()
if _, err = conn.Do("SET", _videoJamTime, jamTime); err != nil {
log.Error("conn.Do(SET, %s, %d) error(%v)", _videoJamTime, jamTime, err)
}
return
}
// TrackAddRedis add track redis
func (d *Dao) TrackAddRedis(c context.Context, key, value string) (err error) {
if key == "" {
log.Warn("TrackAddRedis add empty key(%s) value(%v)", key, value)
return fmt.Errorf("empty key")
}
var conn = d.redis.Get(c)
defer conn.Close()
if _, err = conn.Do("ZADD", key, time.Now().Unix(), value); err != nil {
log.Error("conn.Do(ZADD, %s, %s) error(%v)", key, value, err)
}
return
}
// TrackAddVideosRedis add track video redis
func (d *Dao) TrackAddVideosRedis(c context.Context, keys []string, value string) (err error) {
var conn = d.redis.Get(c)
defer conn.Close()
for _, key := range keys {
if err = conn.Send("ZADD", key, time.Now().Unix(), value); err != nil {
log.Error("conn.Send(ZADD, %s, %s) error(%v)", key, value, err)
}
}
if err = conn.Flush(); err != nil {
log.Error("add conn.Flush error(%v)", err)
return
}
for i := 0; i < len(keys); i++ {
if _, err = conn.Receive(); err != nil {
log.Error("add conn.Receive(%d) error(%v)", i+1, err)
return
}
}
return
}
// TrackRemRedis remove track redis
func (d *Dao) TrackRemRedis(c context.Context, key, value string) (err error) {
var conn = d.redis.Get(c)
defer conn.Close()
if _, err = conn.Do("ZREM", key, value); err != nil {
log.Error("conn.Do(ZREM, %s, %s) error(%v)", key, value, err)
}
return
}
// TrackRemVideosRedis remove video track redis
func (d *Dao) TrackRemVideosRedis(c context.Context, keys []string, value string) (err error) {
var conn = d.redis.Get(c)
defer conn.Close()
for _, key := range keys {
if err = conn.Send("ZREM", key, value); err != nil {
log.Error("conn.Send(ZREM, %s, %s) error(%v)", key, value, err)
}
}
if err = conn.Flush(); err != nil {
log.Error("add conn.Flush error(%v)", err)
return
}
for i := 0; i < len(keys); i++ {
if _, err = conn.Receive(); err != nil {
log.Error("add conn.Receive(%d) error(%v)", i+1, err)
return
}
}
return
}

View File

@@ -0,0 +1,47 @@
package redis
import (
"context"
"testing"
tmod "go-common/app/job/main/videoup-report/model/task"
. "github.com/smartystreets/goconvey/convey"
)
func Test_SetVideoJam(t *testing.T) {
Convey("SetVideoJam", t, func() {
_ = d.SetVideoJam(context.TODO(), 1)
})
}
func Test_TrackAddRedis(t *testing.T) {
Convey("TrackAddRedis", t, func() {
err := d.TrackAddRedis(context.TODO(), "", "")
So(err, ShouldNotBeNil)
})
}
func Test_SetWeight(t *testing.T) {
Convey("SetWeight", t, func() {
err := d.SetWeight(context.TODO(), map[int64]*tmod.WeightParams{
1: &tmod.WeightParams{
TaskID: 1,
Weight: 1,
},
2: &tmod.WeightParams{
TaskID: 2,
Weight: 2,
},
})
So(err, ShouldBeNil)
})
}
func Test_GetWeight(t *testing.T) {
Convey("GetWeight", t, func() {
mcases, err := d.GetWeight(context.TODO(), []int64{1, 2})
So(err, ShouldBeNil)
So(mcases, ShouldNotBeNil)
})
}

View File

@@ -0,0 +1,85 @@
package redis
import (
"context"
"encoding/json"
"fmt"
"time"
tmod "go-common/app/job/main/videoup-report/model/task"
"go-common/library/cache/redis"
"go-common/library/log"
)
const (
_twexpire = 24 * 60 * 60 // 1 day
)
func key(id int64) string {
return fmt.Sprintf("tw_%d", id)
}
//SetWeight 设置权重配置
func (d *Dao) SetWeight(c context.Context, mcases map[int64]*tmod.WeightParams) (err error) {
conn := d.secondary.Get(c)
defer conn.Close()
log.Info("SetWeight before len(%d) time(%v)", len(mcases), time.Now())
for tid, mcase := range mcases {
var bs []byte
key := key(tid)
if bs, err = json.Marshal(mcase); err != nil {
log.Error("json.Marshal(%+v) error(%v)", mcase, err)
continue
}
if err = conn.Send("SET", key, bs); err != nil {
log.Error("SET error(%v)", err)
continue
}
if err = conn.Send("EXPIRE", key, _twexpire); err != nil {
log.Error("EXPIRE error(%v)", err)
continue
}
}
if err = conn.Flush(); err != nil {
log.Error("conn.Flush error(%v)", err)
return
}
for i := 0; i < 2*len(mcases); i++ {
if _, err = conn.Receive(); err != nil {
log.Error("conn.Receive() error(%v)", err)
return
}
}
log.Info("SetWeight end len(%d) time(%v)", len(mcases), time.Now())
return
}
//GetWeight 获取实时任务的权重配置
func (d *Dao) GetWeight(c context.Context, ids []int64) (mcases map[int64]*tmod.WeightParams, err error) {
conn := d.secondary.Get(c)
defer conn.Close()
mcases = make(map[int64]*tmod.WeightParams)
for _, id := range ids {
var bs []byte
key := key(int64(id))
if bs, err = redis.Bytes(conn.Do("GET", key)); err != nil {
if err == redis.ErrNil {
err = nil
} else {
log.Error("conn.Do(GET, %v) error(%v)", key, err)
}
continue
}
p := &tmod.WeightParams{}
if err = json.Unmarshal(bs, p); err != nil {
log.Error("json.Unmarshal(%s) error(%v)", string(bs), err)
err = nil
continue
}
mcases[int64(id)] = p
}
return
}

View File

@@ -0,0 +1,56 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = [
"channel_test.go",
"dao_test.go",
],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/job/main/videoup-report/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"channel.go",
"dao.go",
"tag.go",
],
importpath = "go-common/app/job/main/videoup-report/dao/tag",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/tag/model:go_default_library",
"//app/interface/main/tag/rpc/client:go_default_library",
"//app/job/main/videoup-report/conf:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/xstr:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,33 @@
package tag
import (
"context"
"go-common/app/interface/main/tag/model"
"go-common/library/log"
"go-common/library/xstr"
)
//CheckChannelReview check whether archive in channel review list
func (d *Dao) CheckChannelReview(c context.Context, aid int64) (in bool, channelIDs string, err error) {
var res map[int64]*model.ResChannelCheckBack
arg := &model.ArgResChannel{
Oids: []int64{aid},
Type: 3,
}
if res, err = d.tagDisRPC.ResChannelCheckBack(c, arg); err != nil {
log.Error("CheckChannelReview d.tagDisRPC.ResChannelCheckBack error(%v) aid(%d)", err, aid)
return
}
if res != nil && res[aid] != nil {
in = res[aid].CheckBack == 1
ids := []int64{}
for cid := range res[aid].Channels {
ids = append(ids, cid)
}
channelIDs = xstr.JoinInts(ids)
} else {
log.Warn("CheckChannelReview response(%+v) for aid(%d) is nil", res, aid)
}
return
}

View File

@@ -0,0 +1,16 @@
package tag
import (
"context"
"testing"
"github.com/smartystreets/goconvey/convey"
)
func TestDao_CheckChannelReview(t *testing.T) {
convey.Convey("实时查询稿件所绑定频道,是否需要回查", t, WithDao(func(d *Dao) {
in, ids, err := d.CheckChannelReview(context.TODO(), 1)
t.Logf("in(%v) ids(%s) err(%v)", in, ids, err)
convey.So(err, convey.ShouldBeNil)
}))
}

View File

@@ -0,0 +1,27 @@
package tag
import (
tagClient "go-common/app/interface/main/tag/rpc/client"
"go-common/app/job/main/videoup-report/conf"
bm "go-common/library/net/http/blademaster"
)
//Dao tag dao
type Dao struct {
c *conf.Config
client *bm.Client
upBindURL, adminBindURL string
tagDisRPC *tagClient.Service
}
// New new a dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
c: c,
client: bm.NewClient(c.HTTPClient.Write),
upBindURL: c.Host.API + _upBindURI,
adminBindURL: c.Host.API + _adminBindURI,
tagDisRPC: tagClient.New2(c.TagDisConf),
}
return d
}

View File

@@ -0,0 +1,46 @@
package tag
import (
"context"
"flag"
. "github.com/smartystreets/goconvey/convey"
"math/rand"
"path/filepath"
"testing"
"time"
"go-common/app/job/main/videoup-report/conf"
)
var (
d *Dao
)
func init() {
dir, _ := filepath.Abs("../../cmd/videoup-report-job.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
rand.Seed(time.Now().UnixNano())
}
func WithDao(f func(d *Dao)) func() {
return func() {
Reset(func() {})
f(d)
}
}
func TestDao_UpBind(t *testing.T) {
Convey("upbind", t, WithDao(func(d *Dao) {
err := d.UpBind(context.TODO(), 176, 1, "haha", "日常", "")
So(err, ShouldBeNil)
}))
}
func TestDao_AdminBind(t *testing.T) {
Convey("adminbind", t, WithDao(func(d *Dao) {
err := d.AdminBind(context.TODO(), 176, 2, "haha", "日常", "")
So(err, ShouldBeNil)
}))
}

View File

@@ -0,0 +1,61 @@
package tag
import (
"context"
"fmt"
"net/url"
"strconv"
"go-common/library/log"
)
const (
_upBindURI = "/x/internal/tag/archive/upbind"
_adminBindURI = "/x/internal/tag/archive/adminbind"
)
// UpBind update bind tag.
func (d *Dao) UpBind(c context.Context, mid, aid int64, tags, regionName, ip string) (err error) {
params := url.Values{}
params.Set("mid", strconv.FormatInt(mid, 10))
params.Set("aid", strconv.FormatInt(aid, 10))
params.Set("tnames", tags)
params.Set("region_name", regionName)
var res struct {
Code int `json:"code"`
}
if err = d.client.Post(c, d.upBindURL, ip, params, &res); err != nil {
log.Error("UpBind d.client.Post(%s) error(%v)", d.upBindURL+"?"+params.Encode(), err)
return
}
log.Info("UpBind url(%s) code(%d)", d.upBindURL+"?"+params.Encode(), res.Code)
if res.Code != 0 {
log.Error("UpBind url(%s) code(%d)", d.upBindURL+"?"+params.Encode(), res.Code)
err = fmt.Errorf("UpBind response code(%d)!=0", res.Code)
}
return
}
// AdminBind update bind tag.
func (d *Dao) AdminBind(c context.Context, mid, aid int64, tags, regionName, ip string) (err error) {
params := url.Values{}
params.Set("mid", strconv.FormatInt(mid, 10))
params.Set("aid", strconv.FormatInt(aid, 10))
params.Set("tnames", tags)
params.Set("region_name", regionName)
var res struct {
Code int `json:"code"`
}
if err = d.client.Post(c, d.adminBindURL, ip, params, &res); err != nil {
log.Error("AdminBind d.client.Post(%s) error(%v)", d.adminBindURL+"?"+params.Encode(), err)
return
}
log.Info("AdminBind url(%s) code(%d)", d.adminBindURL+"?"+params.Encode(), res.Code)
if res.Code != 0 {
log.Error("AdminBind url(%s) code(%d)", d.adminBindURL+"?"+params.Encode(), res.Code)
err = fmt.Errorf("AdminBind response code(%d)!=0", res.Code)
}
return
}

View File

@@ -0,0 +1,41 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"archive.go",
"http.go",
"task.go",
"video.go",
],
importpath = "go-common/app/job/main/videoup-report/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/job/main/videoup-report/conf:go_default_library",
"//app/job/main/videoup-report/model/archive:go_default_library",
"//app/job/main/videoup-report/service:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,62 @@
package http
import (
"time"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
//moveType get archive move type stats api
func moveType(c *bm.Context) {
req := c.Request
param := req.Form
stimeStr := param.Get("stime")
etimeStr := param.Get("etime")
if stimeStr == "" {
stimeStr = time.Now().Format("2006-01-02") + " 00:00:00"
}
if etimeStr == "" {
etimeStr = time.Now().Format("2006-01-02") + " 00:00:00"
}
local, _ := time.LoadLocation("Local")
stime, err := time.ParseInLocation("2006-01-02 15:04:05", stimeStr, local)
if stime.Unix() < 1 || err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
etime, err := time.ParseInLocation("2006-01-02 15:04:05", etimeStr, local)
if etime.Unix() < 1 || err != nil {
c.JSONMap(map[string]interface{}{"message": err.Error()}, ecode.RequestErr)
return
}
c.JSON(vdaSvc.MoveType(c, stime, etime))
}
// roundFlow get archive round flow stats api
func roundFlow(c *bm.Context) {
req := c.Request
param := req.Form
stimeStr := param.Get("stime")
etimeStr := param.Get("etime")
if stimeStr == "" {
stimeStr = time.Now().Format("2006-01-02") + " 00:00:00"
}
if etimeStr == "" {
etimeStr = time.Now().Format("2006-01-02") + " 00:00:00"
}
local, _ := time.LoadLocation("Local")
stime, err := time.ParseInLocation("2006-01-02 15:04:05", stimeStr, local)
if stime.Unix() < 1 || err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
etime, err := time.ParseInLocation("2006-01-02 15:04:05", etimeStr, local)
if etime.Unix() < 1 || err != nil {
c.JSONMap(map[string]interface{}{"message": err.Error()}, ecode.RequestErr)
return
}
c.JSON(vdaSvc.RoundFlow(c, stime, etime))
}

View File

@@ -0,0 +1,58 @@
package http
import (
"go-common/app/job/main/videoup-report/conf"
"go-common/app/job/main/videoup-report/service"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"net/http"
)
var (
vdaSvc *service.Service
)
// Init http server
func Init(c *conf.Config, s *service.Service) {
vdaSvc = s
// init internal router
engine := bm.DefaultServer(c.BM)
innerRouter(engine)
// init internal server
if err := engine.Start(); err != nil {
log.Error("engine.Start error(%v)", err)
panic(err)
}
}
// innerRouter
func innerRouter(e *bm.Engine) {
e.GET("/monitor/ping", ping)
g := e.Group("/x/videoup/report")
{
task := g.Group("/task")
{
task.GET("/tooks", taskTooks)
}
video := g.Group("/video")
{
video.GET("/audit", videoAudit)
video.GET("/xcode", videoXcode)
}
archive := g.Group("/archive")
{
archive.GET("/movetype", moveType)
archive.GET("/roundflow", roundFlow)
}
}
}
// ping check server ok.
func ping(c *bm.Context) {
var err error
if err = vdaSvc.Ping(c); err != nil {
log.Error("videoup-report-job ping error(%v)", err)
c.AbortWithStatus(http.StatusServiceUnavailable)
}
}

View File

@@ -0,0 +1,34 @@
package http
import (
"time"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
func taskTooks(c *bm.Context) {
req := c.Request
params := req.Form
stimeStr := params.Get("stime")
etimeStr := params.Get("etime")
if stimeStr == "" {
stimeStr = time.Now().Format("2006-01-02") + " 00:00:00"
}
if etimeStr == "" {
etimeStr = time.Now().Format("2006-01-02 15:04:05")
}
local, _ := time.LoadLocation("Local")
stime, err := time.ParseInLocation("2006-01-02 15:04:05", stimeStr, local)
if stime.Unix() < 1 || err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
etime, err := time.ParseInLocation("2006-01-02 15:04:05", etimeStr, local)
if etime.Unix() < 1 || err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(vdaSvc.TaskTooksByHalfHour(c, stime, etime))
}

View File

@@ -0,0 +1,46 @@
package http
import (
"time"
"go-common/app/job/main/videoup-report/model/archive"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
// reportsByType request report by type
func reportsByType(c *bm.Context, t int8) {
req := c.Request
params := req.Form
stimeStr := params.Get("stime")
etimeStr := params.Get("etime")
if stimeStr == "" {
stimeStr = time.Now().Format("2006-01-02") + " 00:00:00"
}
if etimeStr == "" {
etimeStr = time.Now().Format("2006-01-02 15:04:05")
}
local, _ := time.LoadLocation("Local")
stime, err := time.ParseInLocation("2006-01-02 15:04:05", stimeStr, local)
if stime.Unix() < 1 || err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
etime, err := time.ParseInLocation("2006-01-02 15:04:05", etimeStr, local)
if etime.Unix() < 1 || err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(vdaSvc.VideoReports(c, t, stime, etime))
}
// videoAudit get video audit reports
func videoAudit(c *bm.Context) {
reportsByType(c, archive.ReportTypeVideoAudit)
}
// videoXcode get video xcode reports
func videoXcode(c *bm.Context) {
reportsByType(c, archive.ReportTypeXcode)
}

View File

@@ -0,0 +1,41 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"addit.go",
"archive.go",
"databus.go",
"delay.go",
"flow.go",
"oper.go",
"recheck.go",
"report.go",
"task.go",
"track.go",
"video.go",
],
importpath = "go-common/app/job/main/videoup-report/model/archive",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = ["//library/time:go_default_library"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,27 @@
package archive
const (
//UpFromPGC pgc
UpFromPGC = 1
//UpFromPGCSecret pgc secret
UpFromPGCSecret = 5
//UpFromCoopera pgc cooperate
UpFromCoopera = 6
)
// Addit addit struct
type Addit struct {
ID int64
Aid int64
Source string
RedirectURL string
MissionID int64
UpFrom int8
OrderID int
Dynamic string
}
//IsPGC is archive from pgc
func (addit *Addit) IsPGC() bool {
return addit.UpFrom == UpFromPGC || addit.UpFrom == UpFromPGCSecret || addit.UpFrom == UpFromCoopera
}

View File

@@ -0,0 +1,246 @@
package archive
import (
"sync"
"time"
)
const (
//StateOpen state open
StateOpen = 0
//StateOrange 橙色通过
StateOrange = 1
//StateForbidWait 待审
StateForbidWait = -1
//StateForbidRecicle 打回
StateForbidRecicle = -2
//StateForbidPolice 网警锁定
StateForbidPolice = -3
//StateForbidLock 锁定
StateForbidLock = -4
//StateForbidFixed 修复待审
StateForbidFixed = -6
//StateForbidLater 暂缓待审
StateForbidLater = -7
//StateForbidXcodeFail 转码失败
StateForbidXcodeFail = -16
//StateForbidSubmit 创建提交
StateForbidSubmit = -30
//StateForbidUserDelay 定时
StateForbidUserDelay = -40
//StateForbidUpDelete 删除
StateForbidUpDelete = -100
//RoundBegin 开始流转
RoundBegin = 0
//RoundAuditSecond 二审选定分区的多P稿件 及 PGC/活动的单P多P稿件
RoundAuditSecond = 10
//RoundAuditThird 三审:选定分区/PGC/活动 的单P多P稿件
RoundAuditThird = 20
//RoundReviewFirst 分区回查:粉丝小于配置阈值 如 5000 且 指定分区
RoundReviewFirst = 30
//RoundReviewFirstWaitTrigger 点击/粉丝 等待触发中间状态7天内达到阈值进列表未达到自动变99
RoundReviewFirstWaitTrigger = 31
//RoundReviewSecond 社区回查:粉丝大于配置阈值 如 5000 或 优质高危up
RoundReviewSecond = 40
//RoundTriggerFans 粉丝回查:粉丝量达到配置阈值
RoundTriggerFans = 80
//RoundTriggerClick 点击回查:点击量达到配置阈值
RoundTriggerClick = 90
//RoundEnd 流转结束
RoundEnd = 99
//AccessDefault access
AccessDefault = int16(0)
//AccessMember 会员可见
AccessMember = int16(10000)
//CopyrightUnknow copyright
CopyrightUnknow = 0
//CopyrightOriginal 原创
CopyrightOriginal = 1
//CopyrightCopy 转载
CopyrightCopy = 2
//AttrYes attribute yes
AttrYes = int32(1)
//AttrNo attribute no
AttrNo = int32(0)
//AttrBitNoRank 禁止排序
AttrBitNoRank = uint(0)
//AttrBitNoDynamic 禁止动态
AttrBitNoDynamic = uint(1)
//AttrBitNoWeb 禁止web
AttrBitNoWeb = uint(2)
//AttrBitNoMobile 禁止手机端
AttrBitNoMobile = uint(3)
//AttrBitNoSearch 禁止搜索
AttrBitNoSearch = uint(4)
//AttrBitOverseaLock 禁止海外
AttrBitOverseaLock = uint(5)
//AttrBitNoRecommend 禁止推荐
AttrBitNoRecommend = uint(6)
// AttrBitHideCoins = uint(7)
//AttrBitHasHD5 是否高清
AttrBitHasHD5 = uint(8)
// AttrBitVisitorDm = uint(9)
//AttrBitAllowBp 允许承包
AttrBitAllowBp = uint(10)
//AttrBitIsBangumi 番剧
AttrBitIsBangumi = uint(11)
//AttrBitIsPOrder 是否私单
AttrBitIsPOrder = uint(12)
//AttrBitHideClick 点击
AttrBitHideClick = uint(13)
//AttrBitAllowTag 允许操作tag
AttrBitAllowTag = uint(14)
// AttrBitIsFromArcApi = uint(15)
//AttrBitJumpURL 跳转
AttrBitJumpURL = uint(16)
//AttrBitIsMovie is movie
AttrBitIsMovie = uint(17)
//AttrBitBadgepay 付费
AttrBitBadgepay = uint(18)
//ReplyDefault 默认评论状态
ReplyDefault = int64(-1)
//ReplyOn 开评论
ReplyOn = int64(0)
//ReplyOff 关评论
ReplyOff = int64(1)
//LogBusJob 稿件后台任务日志bus
LogBusJob = 211
//LogTypeReply 稿件后台任务type评论
LogTypeReply = 1
)
//ReplyState 评论开关状态
var ReplyState = []int64{
ReplyDefault,
ReplyOn,
ReplyOff,
}
//ReplyDesc 评论状态描述
var ReplyDesc = map[int64]string{
ReplyDefault: "未知状态",
ReplyOn: "开",
ReplyOff: "关",
}
//UpInfo up info
type UpInfo struct {
Nw *Archive
Old *Archive
}
// Oper is archive operate model.
type Oper struct {
ID int64 `json:"id"`
AID int64 `json:"aid"`
UID int64 `json:"uid"`
TypeID int16 `json:"typeid"`
State int `json:"state"`
Content string `json:"-"`
Round int8 `json:"round"`
Attribute int32 `json:"attribute"`
LastID int64 `json:"last_id"`
Remark string `json:"-"`
CTime time.Time `json:"ctime"`
MTime time.Time `json:"mtime"`
}
// ArcMoveTypeCache archive move typeid count
type ArcMoveTypeCache struct {
Data map[int8]map[int16]map[string]int
sync.Mutex
}
// ArcRoundFlowCache archive round flow record
type ArcRoundFlowCache struct {
Data map[int8]map[int64]map[string]int
sync.Mutex
}
//Archive archive
type Archive struct {
ID int64 `json:"id"`
AID int64 `json:"aid"` //result库binlog={id:0,aid:xxx}
Mid int64 `json:"mid"`
TypeID int16 `json:"typeid"`
HumanRank int `json:"humanrank"`
Duration int `json:"duration"`
Desc string `json:"desc"`
Title string `json:"title"`
Cover string `json:"cover"`
Content string `json:"content"`
Tag string `json:"tag"`
Attribute int32 `json:"attribute"`
Copyright int8 `json:"copyright"`
AreaLimit int8 `json:"arealimit"`
State int `json:"state"`
Author string `json:"author"`
Access int `json:"access"`
Forward int `json:"forward"`
PubTime string `json:"pubtime"`
Reason string `json:"reject_reason"`
Round int8 `json:"round"`
CTime string `json:"ctime"`
MTime string `json:"mtime"`
PTime string `json:"ptime"`
}
//IsSyncState can archive sync
func (a *Archive) IsSyncState() bool {
if a.State >= 0 || a.State == StateForbidUserDelay || a.State == StateForbidUpDelete || a.State == StateForbidRecicle || a.State == StateForbidPolice ||
a.State == StateForbidLock {
return true
}
return false
}
//ArgStat arg state
type ArgStat struct {
Aid int64
Field int
Value int
RealIP string
}
// AttrVal get attribute value.
func (a *Archive) AttrVal(bit uint) int32 {
return (a.Attribute >> bit) & int32(1)
}
//NormalState normal state
func NormalState(state int) bool {
return state == StateOpen || state == StateOrange
}
//Type archive_type
type Type struct {
ID int16 `json:"id"`
PID int16 `json:"pid"`
Name string `json:"name"`
}
// StateMean the mean for archive state
var StateMean = map[int]string{
StateOpen: "开放浏览",
StateOrange: "橙色通过",
// forbid state
StateForbidWait: "待审",
StateForbidRecicle: "打回",
StateForbidPolice: "网警锁定",
StateForbidLock: "锁定稿件",
StateForbidFixed: "修复待审",
StateForbidLater: "暂缓审核",
//StateForbidAdminDelay: "延迟发布",
StateForbidXcodeFail: "转码失败",
StateForbidSubmit: "创建提交",
StateForbidUserDelay: "用户定时发布",
StateForbidUpDelete: "UP主删除",
}

View File

@@ -0,0 +1,96 @@
package archive
import "encoding/json"
const (
//RouteFirstRound 一转
RouteFirstRound = "first_round"
//RouteUGCFirstRound 一转
RouteUGCFirstRound = "ugc_first_round"
//RouteSecondRound 二转
RouteSecondRound = "second_round"
//RouteAddArchive 新增稿件
RouteAddArchive = "add_archive"
//RouteModifyArchive 稿件编辑
RouteModifyArchive = "modify_archive"
//RouteAutoOpen 自动开放
RouteAutoOpen = "auto_open"
//RouteDelayOpen 定时开放
RouteDelayOpen = "delay_open"
//RoutePostFirstRound first_round后续处理
RoutePostFirstRound = "post_first_round"
)
// Message databus message
type Message struct {
Action string `json:"action"`
Table string `json:"table"`
New json.RawMessage `json:"new"`
Old json.RawMessage `json:"old"`
}
//VideoupMsg msg
type VideoupMsg struct {
Route string `json:"route"`
Filename string `json:"filename"`
Timestamp int64 `json:"timestamp"`
// cid
Cid int64 `json:"cid,omitempty"`
DMIndex string `json:"dm_index,omitempty"`
SendEmail bool `json:"send_email"`
// encode
Xcode int8 `json:"xcode"`
EncodePurpose string `json:"encode_purpose,omitempty"`
EncodeRegionID int16 `json:"encode_region_id,omitempty"`
EncodeTypeID int16 `json:"encode_type_id,omitempty"`
VideoDesign *VideoDesign `json:"video_design,omitempty"`
Status int16 `json:"status,omitempty"`
// add or modify archive
Aid int64 `json:"aid,omitempty"`
EditArchive bool `json:"edit_archive,omitempty"`
EditVideo bool `json:"edit_video,omitempty"`
// ChangeTypeID
ChangeTypeID bool `json:"change_typeid"`
// ChangeCopyright
ChangeCopyright bool `json:"change_copyright"`
// ChangeCover
ChangeCover bool `json:"change_cover"`
// ChangeTitle
ChangeTitle bool `json:"change_title"`
// Notify
Notify bool `json:"send_notify"`
// MissionID
MissionID int64 `json:"mission_id,omitempty"`
// AdminChange
AdminChange bool `json:"admin_change,omitempty"`
FromList string `json:"from_list"`
TagChange bool `json:"tag_change,omitempty"`
AddVideos bool `json:"add_videos,omitempty"`
}
//VideoDesign 自定义马赛克和水印
type VideoDesign struct {
Mosaic []*Mosaic `json:"mosaic,omitempty"`
WaterMark []*WaterMark `json:"watermark,omitempty"`
}
//Mosaic 马赛克
type Mosaic struct {
X int64 `json:"x"`
Y int64 `json:"y"`
W int64 `json:"w"`
H int64 `json:"h"`
Start int64 `json:"start"`
End int64 `json:"end"`
}
//WaterMark 水印
type WaterMark struct {
LOC int8 `json:"loc,omitempty"`
URL string `json:"url,omitempty"`
MD5 string `json:"md5,omitempty"`
Start int64 `json:"start,omitempty"`
End int64 `json:"end,omitempty"`
X int64 `json:"x,omitempty"`
Y int64 `json:"y,omitempty"`
}

View File

@@ -0,0 +1,18 @@
package archive
import "time"
//定时发布类型
const (
DelayTypeForAdmin = int8(1)
DelayTypeForUser = int8(2)
)
//Delay 定时发布结构
type Delay struct {
ID int64
Aid int64
DTime time.Time
Type int8
State int8
}

View File

@@ -0,0 +1,65 @@
package archive
import (
"encoding/json"
"time"
)
const (
//FlowPoolRecheck 回查pool含热门回查、频道回查
FlowPoolRecheck = 4
//FLowGroupIDChannel 频道回查的流量控制分组id
FLowGroupIDChannel = 23
//FlowGroupIDHot 热门回查的流量控制分组id
FlowGroupIDHot = 24
//FlowOpen 开启
FlowOpen = int8(0)
//FlowDelete 取消
FlowDelete = int8(1)
//FlowLogAdd 流量添加日志
FlowLogAdd = int8(1)
//FlowLogUpdate 流量更新日志
FlowLogUpdate = int8(2)
//FlowLogDel 流量删除日志
FlowLogDel = int8(3)
//PoolArc 稿件流量
PoolArc = int8(0)
//PoolUp up主流量
PoolUp = int8(1)
//PoolPrivateOrder 私单流量
PoolPrivateOrder = int8(2)
//PoolArticle 专栏流量
PoolArticle = int8(3)
//PoolArcForbid 稿件禁止流量
PoolArcForbid = int8(4)
)
// Flow info
type Flow struct {
ID int64 `json:"id"`
Remark string `json:"remark"`
Rank int64 `json:"rank"`
Type int8 `json:"type"`
Value json.RawMessage `json:"value"`
CTime time.Time `json:"ctime"`
Pool int8 `json:"pool"`
State int8 `json:"state"`
}
//FlowData Flow data
type FlowData struct {
ID int64 `json:"id"`
Pool int8 `json:"pool"`
OID int64 `json:"oid"`
UID int64 `json:"uid"`
Parent int8 `json:"parent"`
GroupID int64 `json:"group_id"`
Remark string `json:"remark"`
State int8 `json:"state"`
CTime time.Time `json:"ctime"`
MTime time.Time `json:"mtime"`
GroupValue []byte `json:"group_value"`
}

View File

@@ -0,0 +1,47 @@
package archive
import "fmt"
const (
//OperTypeNoChannel oper type
OperTypeNoChannel = int8(1)
// OperStyleOne 操作展示类型1[%s]从[%v]设为[%v]
OperStyleOne = int8(1)
// OperStyleTwo 操作展示类型2[%s]%v:%v
OperStyleTwo = int8(2)
)
var (
//FlowOperType type
FlowOperType = map[int64]int8{
FLowGroupIDChannel: OperTypeNoChannel,
}
_operType = map[int8]string{
OperTypeNoChannel: "频道禁止",
}
)
// Operformat oper format.
func Operformat(tagID int8, old, new interface{}, style int8) (cont string) {
var template string
switch style {
case OperStyleOne:
template = "[%s]从[%v]设为[%v]"
case OperStyleTwo:
template = "[%s]%v:%v"
}
cont = fmt.Sprintf(template, _operType[tagID], old, new)
return
}
//VideoOper 视频审核记录结构
type VideoOper struct {
AID int64
UID int64
VID int64
Status int
Content string
Attribute int32
LastID int64
Remark string
}

View File

@@ -0,0 +1,56 @@
package archive
import (
"time"
)
const (
//TypeHotRecheck 热门回查
TypeHotRecheck = 1
//TypeChannelRecheck 频道回查
TypeChannelRecheck = 0
//TypeExcitationRecheck 激励回查
TypeExcitationRecheck = 2
//RecheckStateWait 待回查
RecheckStateWait = int8(-1)
//RecheckStateNoForbid 已回查,且没有禁止(热门) 已回查(频道)
RecheckStateNoForbid = int8(0)
//RecheckStateForbid 已回查,且禁止(热门)
RecheckStateForbid = int8(1)
//RecheckStateIgnore 被忽略不需要回查的状态
RecheckStateIgnore = int8(-2)
// FromListChannelReview 从频道回查列表提交的数据
FromListChannelReview = "channel_review"
// FromListHotReview 从热门回查列表提交的数据
FromListHotReview = "hot_review"
// FromListExcitation 从激励回查列表提交的数据
FromListExcitation = "excitation_list"
)
var (
_recheckTypes = map[int]string{
//TypeChannelRecheck: "频道回查",
TypeHotRecheck: "热门回查",
TypeExcitationRecheck: "激励回查",
}
)
// Recheck archive recheck
type Recheck struct {
ID int64 `json:"id"`
Type int `json:"type"`
Aid int64 `json:"aid"`
UID int64 `json:"uid"`
State int8 `json:"state"`
Remark string `json:"remark"`
CTime time.Time `json:"ctime"`
MTime time.Time `json:"mtime"`
}
//RecheckType get recheck type name
func RecheckType(tp int) (str string) {
return _recheckTypes[tp]
}

View File

@@ -0,0 +1,27 @@
package archive
import (
"encoding/json"
"time"
)
// 1 耗时 2 耗时(30分钟) 3 视频进审/过审分布
var (
ReportArchiveRound = map[int8]string{30: "30", 40: "40", 90: "90"}
ReportTypeTookMinute = int8(1)
ReportTypeTookHalfHour = int8(2)
ReportTypeVideoAudit = int8(3)
ReportTypeArcMoveType = int8(4)
ReportTypeArcRoundFlow = int8(5)
ReportTypeXcode = int8(6) //video sd_finish,hd_finish,dispatch take time
ReportTypeTraffic = int8(7) //视频审核耗时统计。10分钟聚合的一转、一审、二转、分发耗时结果
)
// Report struct
type Report struct {
ID int64 `json:"-"`
TypeID int8 `json:"type"`
Content json.RawMessage `json:"content"`
CTime time.Time `json:"ctime"`
MTime time.Time `json:"mtime"`
}

Some files were not shown because too many files have changed in this diff Show More